Pontos de MVP
/*
- :
- _______________________ _______________________ :
- |_________ _________| |_________ _________| :
- |_________ _________| |_________ _________| :
- | | | | :
- | | | | :
- | | | | :
- | | | | :
- | | | | :
- | | | | :
- |___| |___| :
- :
Script: Sistema Passe de batalha 1.0
Autor: Desconhecido
Update: Dev TT
Data: 10-11-2023
Insira no seu banco de dados:
CREATE TABLE `mvpladder` ( `id` int(11) NOT NULL AUTO_INCREMENT, `char_id` int(11) unsigned NOT NULL default '0', `mob_id` INT NOT NULL, `kills` INT DEFAULT 0,
PRIMARY KEY (`id`),
INDEX (`char_id`), INDEX (`mob_id`), INDEX (`kills`) ) ENGINE=MyISAM AUTO_INCREMENT=1;
- /
//---- MvP Ladder Logic Script
- script MVPLadder -1,{
OnInit: // Config .map_killannounce = 1; // anuncia quando o MVP está morto no mapa onde o MVP foi morto: 0 - OFF, 1 - ON .killannounce = 0; // anunciar quando o MVP está morto globalmente: 0 - OFF, 1 - ON .gmnokill = 0; // GMs não devem matar MVP. Um GM com este nível ou superior não recebe nada
// .min_gm_menu = 90; // O nível mínimo de GM pode usar o menu GM na escada NPC
.showtotal = 40; // Mostre o comprimento da escada. .showpage = 20; // Defina as visualizações por página.
.showstatue = 3; // Número de estátuas. Deve corresponder ao número de duplicatas no final do script .fix_custom_sprite = false; // Se seu servidor tiver sprite animada personalizada bugando em estátuas, ative isso
// Para evitar bug if (.gmnokill <= 0) .gmnokill = 100;
sleep 1;
OnTimer1700000: // Atualize as estátuas (timer original do script) .@query$ = "SELECT `char`.`char_id`, `char`.`name`, `char`.`guild_id`, `char`.`class`, " + "`char`.`sex`, `char`.`hair`, `char`.`hair_color`, `char`.`clothes_color`, " + "`char`.`body`, `char`.`head_top`, `char`.`head_mid`, `char`.`head_bottom`, `char`.`robe`, " + "SUM(`mvpladder`.`kills`) as `orderKills` " + "FROM `char` RIGHT JOIN `mvpladder` ON `char`.`char_id` = `mvpladder`.`char_id` " + "GROUP BY `char`.`char_id` ORDER BY `orderKills` DESC LIMIT " + .showstatue;
.@nb = query_sql(.@query$, .@cid, .@name$, .@guild_id, .@class, .@sex$, .@hair, .@hair_color, .@clothes_color, .@body, .@head_top, .@head_mid, .@head_bottom, .@robe, .@kills);
if (.fix_custom_sprite) { for (.@i = 0; .@i < .@nb; ++.@i) { setunitdata .statue[.@i + 1], UNPC_HEADTOP, 0; setunitdata .statue[.@i + 1], UNPC_HEADMIDDLE, 0; setunitdata .statue[.@i + 1], UNPC_HEADBOTTOM, 0; setunitdata .statue[.@i + 1], UNPC_ROBE, 0; } }
for (.@i = 0; .@i < .@nb; ++.@i) { setunitdata .statue[.@i + 1], UNPC_CLASS, .@class[.@i]; setunitdata .statue[.@i + 1], UNPC_SEX, (.@sex$[.@i] == "F") ? SEX_FEMALE : SEX_MALE; setunitdata .statue[.@i + 1], UNPC_HAIRSTYLE, .@hair[.@i]; setunitdata .statue[.@i + 1], UNPC_HAIRCOLOR, .@hair_color[.@i]; setunitdata .statue[.@i + 1], UNPC_CLOTHCOLOR, .@clothes_color[.@i]; setunitdata .statue[.@i + 1], UNPC_BODY2, .@body[.@i]; setunitdata .statue[.@i + 1], UNPC_HEADTOP, .@head_top[.@i]; setunitdata .statue[.@i + 1], UNPC_HEADMIDDLE, .@head_mid[.@i]; setunitdata .statue[.@i + 1], UNPC_HEADBOTTOM, .@head_bottom[.@i]; setunitdata .statue[.@i + 1], UNPC_ROBE, .@robe[.@i];
setnpcdisplay "mvp_ladder_statue#" + (.@i + 1), .@name$[.@i];
.statue_name$[.@i + 1] = .@name$[.@i]; .statue_guild$[.@i + 1] = getguildname(.@guild_id[.@i]); .statue_kills[.@i + 1] = .@kills[.@i]; }
for (.@i = .@nb; .@i < .showstatue; ++.@i) setunitdata .statue[.@i + 1], UNPC_CLASS, HIDDEN_WARP_NPC;
// ===================================================================== // EFEITO SOMENTE NO TOP 1 (statue[1]) - 100% garantido (aplica no refresh) // ===================================================================== // Limpa de todas as estátuas (pra não "grudar" quando trocar ranking) for (.@i = 1; .@i <= .showstatue; ++.@i) { if (.statue[.@i]) { hateffect_npc 174, false, .statue[.@i]; setunitdata .statue[.@i], UNPC_GROUP_ID, 0; } } // Aplica somente no Top 1 if (.statue[1]) { hateffect_npc 174, true, .statue[1]; // id hateffect setunitdata .statue[1], UNPC_GROUP_ID, 52; // emblema no nome do npc }
initnpctimer; end;
OnNPCKillEvent: // Lógica para detectar quando um MVP é morto if (getmonsterinfo(killedrid, MOB_MVPEXP) > 0) { .@selectIfKillExistQuery$ = "SELECT char_id, mob_id, kills FROM mvpladder WHERE char_id = '" + getcharid(0) + "' AND mob_id = '" + killedrid + "';"; .@nb = query_sql(.@selectIfKillExistQuery$, .@char_id, .@mob_id, .@kills);
if (.@nb > 0) { // Já existe registro desse MVP para esse char .@updateLadderQuery$ = "UPDATE mvpladder SET kills = kills + 1 WHERE char_id = '" + getcharid(0) + "' AND mob_id = '" + killedrid + "'"; } else { // Cria um novo registro para esse MVP específico .@updateLadderQuery$ = "INSERT INTO mvpladder (`char_id`, `mob_id`, `kills`) VALUES ('" + getcharid(0) + "','" + killedrid + "','1');"; }
query_sql(.@updateLadderQuery$); } end; }
//---- MvP Ladder Info NPC
prontera,127,190,5 script Ranking MVP 19337,{ .@npcname$ = strnpcinfo(0); while (1) { query_sql("SELECT SUM(kills) FROM mvpladder;", .@killCount);
set .@name$, "^0099FF[ " + strnpcinfo(1) + " ]^000000"; mes "Olá ^108AE1" + strcharinfo(0) + "^000000, seja bem-vindo!"; mes "Veio verificar como anda o Ranking MvP?"; mes "^996600==> ^006699Total de MvP's Mortos [^FF0000" + .@killCount[0] + "^00AA00]^000000"; next;
switch (select("^00CC00•^000000 Verificar Ranking MvP","^00CC00•^000000 Total de MvP Mortos","^00CC00•^000000 Minhas informações")) { set .@name$, "^0099FF[ " + strnpcinfo(1) + " ]^000000";
case 1: .@queryKillerList$ = "SELECT t1.char_id, SUM(t1.kills) as `orderKills`, t2.name " + "FROM `mvpladder` t1 " + "INNER JOIN `char` t2 " + "ON t1.char_id = t2.char_id " + "GROUP BY t1.char_id " + "ORDER BY `orderKills` DESC " + "LIMIT " + getvariableofnpc(.showtotal, "MVPLadder") + ";"; .@nb = query_sql(.@queryKillerList$, .@charid, .@kills, .@name$); if (!.@nb) { set .@name$, "^0099FF[ " + strnpcinfo(1) + " ]^000000"; mes "Sem ranking atualmente..."; next; }
for (.@j = 0; .@j < .@nb; .@j += getvariableofnpc(.showpage,"MVPLadder")) { for (.@i = .@j; .@i < (getvariableofnpc(.showpage,"MVPLadder") + .@j) && .@i < .@nb; ++.@i) mes "^996600" + (.@i+1) + " ^000000 : ^006699" + .@name$[.@i] + " ^00AA00| ^006699Matou:^000000 ^ff0000" + .@kills[.@i] + "^000000 ^00AA00MvP's^000000"; mes " ^108AE1====================^000000"; next; } break;
case 2: .@queryKilledList$ = "SELECT char_id, mob_id, SUM(kills) as `orderKills` " + "FROM `mvpladder` " + "GROUP BY mob_id " + "ORDER BY `orderKills` DESC " + "LIMIT " + getvariableofnpc(.showtotal, "MVPLadder") + ";"; .@nb = query_sql(.@queryKilledList$, .@charid, .@mobid, .@kills); if (!.@nb) { set .@name$, "^0099FF[ " + strnpcinfo(1) + " ]^000000"; mes "Sem ranking atualmente..."; next; }
for (.@j = 0; .@j < .@nb; .@j += getvariableofnpc(.showpage,"MVPLadder")) { for (.@i = .@j; .@i < (getvariableofnpc(.showpage,"MVPLadder") + .@j) && .@i < .@nb; ++.@i) mes "^996600" + (.@i+1) + ": ^006699" + strmobinfo(1, .@mobid[.@i]) + " ^FF0000MvP : ^00AA00[Morto ^FF0000" + .@kills[.@i] + " ^00AA00vezes]^000000"; next; }
query_sql("SELECT SUM(kills) FROM mvpladder;", .@killCount); set .@name$, "^0099FF[ " + strnpcinfo(1) + " ]^000000"; mes "^996600==> ^006699Total de MvP's Mortos [^FF0000" + .@killCount[0] + "^00AA00]^000000"; break;
case 3: .@queryOwnLadder$ = "SELECT char_id, mob_id, SUM(kills) as `orderKills` " + "FROM `mvpladder` " + "WHERE char_id = '" + getcharid(0) + "'" + "ORDER BY `orderKills` DESC;"; .@nb = query_sql(.@queryOwnLadder$, .@charid, .@mobid, .@kills);
if (!.@nb) { set .@name$, "^0099FF[ " + strnpcinfo(1) + " ]^000000"; mes "Sem ranking atualmente..."; next; }
.@totalKillCount = 0; for (.@i = 0; .@i < .@nb; ++.@i) .@totalKillCount += .@kills[.@i];
mes "^996600==> ^006699Você matou no total: [^FF0000" + .@totalKillCount + " ^00AA00MvP^000000^006699]^000000"; break; }
OnInit: initnpctimer; end;
OnTimer1000: showscript("Top Ranking [MvP]"); setnpctimer 0; end; } close; }
//---- MSG board NPCs
- script mvp_ladder_statue -1,{ .@id = getelementofarray(getvariableofnpc(.npcgid, "MVPLadder"), getnpcid(0)); set .@name$, "^0099FF[ " + strnpcinfo(1) + " ]^000000"; mes "^006699Top Ranking: ^ff0000" + .@id + " "; mes "^006699Nome : " + getelementofarray(getvariableofnpc(.statue_name$, "MVPLadder"), .@id);
.@guildname$ = getelementofarray(getvariableofnpc(.statue_guild$, "MVPLadder"), .@id); mes "^00AAAAGuilda : " + ((.@guildname$ == "null") ? "^AAAAAANenhuma" : .@guildname$);
mes "^00AA00Total MVP Kills :^000000 ^FF0000[" + getelementofarray(getvariableofnpc(.statue_kills, "MVPLadder"), .@id) + "]"; close;
OnInit: .@id = strnpcinfo(2); .@npc_id = getnpcid(0);
// IMPORTANTE: sem efeito aqui. // O efeito do Top 1 é aplicado 100% no refresh do MVPLadder (OnTimer1700000) set getvariableofnpc(.statue[.@id], "MVPLadder"), .@npc_id; set getvariableofnpc(.npcgid[.@npc_id], "MVPLadder"), .@id; end; }
prontera,122,190,5 duplicate(mvp_ladder_statue) mvp_ladder_statue#1 1_F_MARIA prontera,120,190,5 duplicate(mvp_ladder_statue) mvp_ladder_statue#2 1_F_MARIA prontera,124,190,5 duplicate(mvp_ladder_statue) mvp_ladder_statue#3 1_F_MARIA
//|==============================================================| //|===== rAthena Script =========================================| //|===== Créditos: ==============================================| //|= KyoSasuke | //|===== Versao do NPC: =========================================| //|= 1.0 | //|===== Tabela SQL: ============================================| /* CREATE TABLE IF NOT EXISTS `mvp_ranking` (
`char_id` int(11) unsigned NOT NULL DEFAULT '0', `name` varchar(30) NOT NULL DEFAULT , `mvp_death` int(11) unsigned NOT NULL default '0', PRIMARY KEY (`char_id`)
) ENGINE=MyISAM;
- /
//===== Lojas de Pontos MVP: ==============================================| - pointshop mvp_shop_utilidades -1,#MVPOINTS,22507:1,11593:1,11595:1,11592:1,22751:2,12662:2,12658:2,22752:2,12664:2,22753:2,12661:2,12660:2,22754:2,12663:2,12659:2,22750:2,22755:2,22999:2,40049:2,12883:2,100008:2,23227:5,12922:5,12210:5 - pointshop mvp_shop_equips -1,#MVPOINTS,15052:2,5490:5,5363:5,22228:20,19498:20,18574:20,2177:20,32258:25,28565:25,19436:30,19285:35,28531:45,460046:50,460079:50,19380:50 - pointshop mvp_shop_visuais -1,#MVPOINTS,31325:10,31331:10,31332:10,20432:10,31205:10,20268:10,20167:10,20175:10,20393:10,15847:10,15889:10,19546:10,19587:10
//===== Script NPC Gestor dos Pontos MVP ===============================| prt_in,136,28,2 script Pontos MVP 3746,{ goto NPC_RANK;
OnInit: .npc$ = "^0099FF[ Gestor dos Pontos ]^000000"; .topMvP = 10; .ChatNpc = 0; while(1) { showscript "Loja pontos [MvP] "; sleep 1000; } if (.ChatNpc) waitingroom "Ranking MvP",0,"",0; end;
//==============================================================| NPC_RANK: mes .npc$; mes (gettime(3)>= 6 && gettime(3)<= 12 ? "Bom-dia" : (gettime(3)>=13 && gettime(3)<=18 ? "Boa-tarde" : "Boa-noite")) + ", ^108AE1" + strcharinfo(0) + "^000000 !"; mes "Você possui ^ff0000" + #MVPOINTS + "^000000 Pontos ^00AA00MvP^000000"; query_sql "select `name`, `mvp_death` from `mvp_ranking` ORDER BY `mvp_death` DESC LIMIT " + .topmvp + "", .@name$, .@mvpkills; next;
// MENU VISUAL 3 LOJAS + SAIR + (GM) RESET .@menu$ = "^00CC00•^000000 Loja de Utilidades:^00CC00•^000000 Loja de Equipamentos:^00CC00•^000000 Loja de Visuais:^00CC00•^000000 Sair"; if (getgroupid() >= 90) .@menu$ = .@menu$ + ":^00CC00•^000000 Resetar tabela";
switch(select(.@menu$)){ case 1: callshop "mvp_shop_utilidades"; end; case 2: callshop "mvp_shop_equips"; end; case 3: callshop "mvp_shop_visuais"; end; case 4: clear; mes .npc$; mes "Ok, volte quando precisar de meus serviços."; end;
case 5: // Apenas GM switch(select("^00CC00•^000000 Resetar tabela de rank:^00CC00•^000000 Resetar pontos mvp:^00CC00•^000000 Cancelar")){ case 1: query_sql "select `name` from `mvp_ranking` ORDER BY `name` DESC LIMIT " + .topmvp + "", .@name$; if(.@name$ == ""){ clear; mes .npc$; mes " ^108AE1====================^000000"; mes "A tabela de rank MvP já foi resetada."; end; }else{ query_sql("TRUNCATE mvp_ranking"); clear; mes .npc$; mes " ^108AE1====================^000000"; mes "Tabela de rank MvP foi resetada com sucesso."; end; } break;
case 2: query_sql "SELECT `key` FROM `acc_reg_num` WHERE `key` = '#MVPOINTS'", @mvppoints$; if(@mvppoints$ == ""){ clear; mes .npc$; mes " ^108AE1====================^000000"; mes "Os pontos MvP já foram resetados."; end; }else{ query_sql("DELETE FROM `acc_reg_num` WHERE `key` = '#MVPOINTS'"); set #MVPOINTS, 0; clear; mes .npc$; mes " ^108AE1====================^000000"; mes "Tabela de Pontos MvP foi resetada com sucesso."; end; } break;
case 3: clear; mes .npc$; mes " ^108AE1====================^000000"; mes "Ok, volte quando precisar de meus serviços."; end; } end; } }
//==============================================================| //==============================================================| //==============================================================| - script MvP_System -1,{
OnInit: // ========================================================== // Whitelist: SOMENTE estes IDs vão contar pontos/ranking // ========================================================== setarray .mvp_whitelist[0], 1087,2094,1147,1190,1086,1115,1806,1511,1159,1389,1150,1688,1039,1980,1251,2068,2194,1885,1252,2131, 1583,1038,1046,1059,1157,1957,1112,2156,1373,1272,1630,1623,1492,2187,2188,1418,1312,1785,2317,2022, 2087,2253,2321,1929,1779,1708,1956,2202,1734,1685,1719,1768,3757,2189,2190,1658,2255,2251,2319,1871, 2165,1751,2249,1832,1874,1917,1647,1649,1650,1651,1648,1646, 22394,22404; // <- extras também precisam estar na whitelist pra contar
// ========================================================== // MVPs extras: ganham 3 pontos (somente estes 2) // ========================================================== setarray .mvp_special[0], 22394,22404;
set .anuncio, 1; // Anunciar quem matou o MvP e qual MvP e qual mapa [0 OFF - 1 ON] end;
OnNPCKillEvent:
// ========================================================== // 1) Se NÃO está na whitelist, não conta nada. // ========================================================== if (inarray(.mvp_whitelist, killedrid) < 0) end;
// ========================================================== // 2) Define pontos (3 se for "extra", senão 1) // ========================================================== .@pontos = (inarray(.mvp_special, killedrid) >= 0) ? 3 : 1;
// ========================================================== // 3) Atualiza ranking do NPC (mvp_ranking) // ========================================================== query_sql "INSERT INTO `mvp_ranking` (`char_id`,`name`,`mvp_death`) " + "VALUES (" + getcharid(0) + ", '" + escape_sql(strcharinfo(0)) + "', 1) " + "ON DUPLICATE KEY UPDATE `mvp_death` = `mvp_death` + 1";
// ========================================================== // 4) Atualiza ranking do SITE (mvp_rank) // ========================================================== query_sql "INSERT INTO `mvp_rank` (`char_id`,`mvp_kills`) " + "VALUES (" + getcharid(0) + ", 1) " + "ON DUPLICATE KEY UPDATE `mvp_kills` = `mvp_kills` + 1";
// ========================================================== // 5) Atualiza pontos / contador // ========================================================== #MVPOINTS += .@pontos; MVPKills += 1;
// ========================================================== // 6) Mensagens // ========================================================== dispbottom "================================================", 0xFFC300; if (.@pontos == 3) dispbottom "Você matou um MvP EXTRA (+3). Total kills: [" + MVPKills + "] | Pontos: [" + #MVPOINTS + "]", 0x00F7FF; else dispbottom "Você matou um MvP (+1). Total kills: [" + MVPKills + "] | Pontos: [" + #MVPOINTS + "]", 0x00F7FF; dispbottom "================================================", 0xFFC300;
end; }