Skip to content

Instantly share code, notes, and snippets.

Created February 18, 2018 07:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/2d431bb9752e5d0f88978cdd4e728d18 to your computer and use it in GitHub Desktop.
Save anonymous/2d431bb9752e5d0f88978cdd4e728d18 to your computer and use it in GitHub Desktop.
Dota Pvp
//===== eAthena Script =======================================================
//= PVP ladder script with dota announcement ( SQL only )
//===== By: ==================================================================
//= ~AnnieRuru~
//===== Current Version: =====================================================
//= 2.9
//===== Compatible With: =====================================================
//= eAthena SQL 14279, with MySQL 5.1
//===== Description: =========================================================
//= PVP ladder store in SQL table
//= plus anti-sit-killer feature
//===== Topic ================================================================
//= http://www.eathena.ws/board/index.php?showtopic=177918
//===== Additional Comments: =================================================
//= still don't have modify value option, will be done ... in next year ...
//============================================================================
// add all the maps that you want this script to trigger ... all pvp and event maps perhaps ?
// but if you already enable "all" maps, then can comment all these
guild_vs3 mapflag loadevent
guild_vs3 mapflag loadevent
pvp_n_2-5 mapflag loadevent
pvp_y_1-2 mapflag loadevent
aldeg_cas01 mapflag loadevent
aldeg_cas02 mapflag loadevent
aldeg_cas03 mapflag loadevent
aldeg_cas04 mapflag loadevent
aldeg_cas05 mapflag loadevent
gefg_cas01 mapflag loadevent
gefg_cas02 mapflag loadevent
gefg_cas03 mapflag loadevent
gefg_cas04 mapflag loadevent
gefg_cas05 mapflag loadevent
payg_cas01 mapflag loadevent
payg_cas02 mapflag loadevent
payg_cas03 mapflag loadevent
payg_cas04 mapflag loadevent
payg_cas05 mapflag loadevent
prtg_cas01 mapflag loadevent
prtg_cas02 mapflag loadevent
prtg_cas03 mapflag loadevent
prtg_cas04 mapflag loadevent
prtg_cas05 mapflag loadevent
schg_cas01 mapflag loadevent
schg_cas02 mapflag loadevent
schg_cas03 mapflag loadevent
schg_cas04 mapflag loadevent
schg_cas05 mapflag loadevent
arug_cas01 mapflag loadevent
arug_cas02 mapflag loadevent
arug_cas03 mapflag loadevent
arug_cas04 mapflag loadevent
arug_cas05 mapflag loadevent
- script DOTAPVP -1,{
OnInit:
// Config
set .sound, 0; // soundeffect : 0 - disable, 1 - play soundeffect to all players on map, 2 - play soundeffect to an area around the killer, 3 - play soundeffect to killer only
set .announce, 0; // announce to : 0 - global, 1 - map
set .announcemap, 1; // announce the map name in the announcement ? : 0 - off, 1 - on
set .announcekill, 1; // announce who pawn who's head : 0 - off, 1 - on
set .msg_die, 1; // show message who kill you when die : 0 - off, 1 - on
set .msg_kill, 1; // show message you kill who when killed someone : 0 - off, 1 - on
set .gmnokill, 99; // GMs are not suppose to kill players. A GM with <this number> level or higher will do nothing. IF set to 60, GM60 and above kill any player will not get anything : 0 - off
set .killingspree, 3;
set .dominating, 4;
set .megakill, 5;
set .unstoppable, 6;
set .wickedsick, 7;
set .monsterkill, 8;
set .godlike, 9;
set .holyshit, 10;
set .continue, 1; // after beyond-godlike, every <this number> kills will make announcement again
set .owned, 5; // how many times the party/guild has to kill to announce ownage
set .owncontinue, 1; // after ownage, every <this number> party/guild cumulative kills will make ownage announce again
set .min_gm_menu, 99; // minimum level of GM can use the GM menu on ladder npc
set .showtotal, 30; // show the length of ladder. Note : Maximum value = 128
set .showpage, 10; // set the views per page. Note : Maximum value = 128
set .loweststreak, 3; // mininum streak count allow to show in highest streak ladder. Default 3 means must at least have killing spree streak to display in ladder
set .lowestownage, 5; // mininum ownage count allow to show in longest ownage ladder. Default 5 means must at least have 5 ownage counts to display in ladder
setarray .maptrigger$, // only these maps will trigger this script
// "all", // uncomment this to allow load all maps
"guild_vs3",
"guild_vs3",
"pvp_n_2-5",
"pvp_y_1-2",
"aldeg_cas01",
"aldeg_cas02",
"aldeg_cas03",
"aldeg_cas04",
"aldeg_cas05",
"gefg_cas01",
"gefg_cas02",
"gefg_cas03",
"gefg_cas04",
"gefg_cas05",
"payg_cas01",
"payg_cas02",
"payg_cas03",
"payg_cas04",
"payg_cas05",
"prtg_cas01",
"prtg_cas02",
"prtg_cas03",
"prtg_cas04",
"prtg_cas05",
"schg_cas01",
"schg_cas02",
"schg_cas03",
"schg_cas04",
"schg_cas05",
"arug_cas01",
"arug_cas02",
"arug_cas03",
"arug_cas04",
"arug_cas05";
// anti-sit-killer system
// a player must kill another player with this minimum <this number> base level to get the announcement and in the ladder.
// Otherwise only have streak ended announcement and killed player's streak reset.
// Its possible for a level 1 novice to kill a level 99 player and he/she will still get in the ladder
// but a level 99 kill a level 1 player will get nothing
// 0 - off this system ( default is 55, pk setting )
set .lvltokill, 0;
// when a player kill another same player <this number> times in a row, the player is warp back to save point.
// and the player's streak, kills, and ownage count will deduct accordingly
// 0 - off this system
set .counttopunish, 6;
// minimum level range to kill another player
// eg. when set to 20, player level 99 needs to kill another player with minimum level of 79 to get announcement and increase the kill rank.
// but a player with base level 50 kills a level 99 will also get the announcement
// higher base level cannot kill lower level, but lower level can kill higher level
// 0 - off this system
set .minlvlrange, 0;
// Config ends ------------------------------------------------------------------------------------------
// to prevent bug happen
if ( .announce < 0 || .announce > 1 ) set .announce, 0;
if ( .continue < 1 ) set .continue, 1;
if ( .owncontinue < 1 ) set .owncontinue, 1;
if ( .gmnokill <= 0 ) set .gmnokill, 100;
if ( .lvltokill <= 1 ) set .lvltokill, 0;
if ( .counttopunish <= 1 ) set .counttopunish, 0;
set .maptriggersize, getarraysize(.maptrigger$);
end;
// script start.
OnPCKillEvent:
if ( getgmlevel() >= .gmnokill ) end;
getmapxy .@map$, .@x, .@y, 0;
if ( .maptrigger$ != "all" ) {
for ( set .@i, 0; .@i < .maptriggersize; set .@i, .@i +1 ) {
if ( .@map$ == .maptrigger$[.@i] ) break;
}
if ( .@i == .maptriggersize ) end;
}
attachrid killedrid;
if ( killerrid != getcharid(3) && ( .msg_die || .msg_kill ) ) {
if ( .msg_die ) message strcharinfo(0),"You have been killed by "+ rid2name(killerrid);
if ( .msg_kill ) message rid2name(killerrid),"You just killed "+ strcharinfo(0);
}
if ( @PlayersKilledStreak >= .holyshit )
set .@streakname$,"Beyond Godlike";
else if ( @PlayersKilledStreak >= .godlike )
set .@streakname$,"Godlike";
else if ( @PlayersKilledStreak >= .monsterkill )
set .@streakname$,"Monster Kill";
else if ( @PlayersKilledStreak >= .wickedsick )
set .@streakname$,"Wicked Sick";
else if ( @PlayersKilledStreak >= .unstoppable )
set .@streakname$,"Unstoppable";
else if ( @PlayersKilledStreak >= .megakill )
set .@streakname$,"Mega-kill";
else if ( @PlayersKilledStreak >= .dominating )
set .@streakname$,"Dominating";
else if ( @PlayersKilledStreak >= .killingspree )
set .@streakname$,"Killing Spree";
if ( @PlayersKilledStreak >= .killingspree && killerrid == getcharid(3) )
announce strcharinfo(0) +" has ended "+( (Sex)?"him":"her" )+" own "+ .@streakname$ +"["+ @PlayersKilledStreak +"] streak "+( (.announcemap)?("at "+ .@map$):""),16|.announce;
else if ( @PlayersKilledStreak >= .killingspree )
announce rid2name(killerrid) +" has ended "+ strcharinfo(0) +"'s "+ .@streakname$ +"["+ @PlayersKilledStreak +"] streak "+( (.announcemap)?("at "+ .@map$):""),16|.announce;
else if ( .announcekill && killerrid != getcharid(3) )
announce rid2name(killerrid) +" has pawned "+ strcharinfo(0) +"'s head "+( (.announcemap)?("at "+ .@map$):""),16|.announce;
set @PlayersKilledStreak,0;
set @dota_sql_deaths, @dota_sql_deaths +1;
set @dota_multikills,0;
query_sql "replace into pvpladder values ( "+ getcharid(0) +", '"+ escape_sql(strcharinfo(0)) +"', "+ @dota_sql_streaks +", "+ @dota_sql_kills +", "+ @dota_sql_deaths +", from_unixtime("+ @dota_sql_streaktime +") )";
set .@killed_gid, getcharid(2);
if ( .@killed_gid ) {
setd ".dota_sql_"+ .@killed_gid +"_c", 0;
if ( getd(".dota_sql_"+ .@killed_gid +"_h") )
query_sql "replace into ownladder values ( "+ .@killed_gid +", '"+ escape_sql(getguildname(.@killed_gid)) +"', "+ getd(".dota_sql_"+ .@killed_gid +"_c") +", "+ getd(".dota_sql_"+ .@killed_gid +"_h") +", from_unixtime("+ getd(".dota_sql_"+ .@killed_gid +"_t") +") )";
}
if ( killerrid == getcharid(3) || BaseLevel < .lvltokill ) end;
if ( .minlvlrange ) set .@killedlvl, BaseLevel;
attachrid killerrid;
if ( .minlvlrange && .@killedlvl + .minlvlrange < BaseLevel ) end;
if ( .counttopunish ) {
if ( @sitkillminute != gettime(2) ) {
deletearray @sitkillid, 128;
deletearray @sitkilltimes, 128;
set @sitkillminute, gettime(2);
}
set .@sitkillsize, getarraysize(@sitkillid);
for ( set .@i,0; .@i < .@sitkillsize; set .@i, .@i +1 ) {
if ( @sitkillid[.@i] != killedrid ) continue;
else {
set @sitkilltimes[.@i], @sitkilltimes[.@i] +1 ;
if ( @sitkilltimes[.@i] >= .counttopunish ) {
warp "SavePoint",0,0;
announce strcharinfo(0) +" , Stop killing "+ rid2name(killedrid) + " !!!",0;
debugmes strcharinfo(0) +" is sit-killing "+ rid2name(killedrid) +" for "+ @sitkilltimes[.@i] + " times";
logmes "is sit-killing "+ rid2name(killedrid) +" for "+ @sitkilltimes[.@i] +" times";
if ( @PlayersKilledStreak == @dota_sql_streaks ) {
set @dota_sql_streaks, @dota_sql_streaks +1 - .counttopunish;
set @dota_sql_streaktime, gettimetick(2);
}
set @PlayersKilledStreak, @PlayersKilledStreak +1 - .counttopunish;
set @dota_sql_kills, @dota_sql_kills +1 - .counttopunish;
query_sql "replace into pvpladder values ( "+ getcharid(0) +", '"+ escape_sql(strcharinfo(0)) +"', "+ @dota_sql_streaks +", "+ @dota_sql_kills +", "+ @dota_sql_deaths +", from_unixtime("+ @dota_sql_streaktime +") )";
set .@killer_gid, getcharid(2);
if ( .@killer_gid ) {
if ( getd(".dota_sql_"+ .@killer_gid +"_c") == getd(".dota_sql_"+ .@killer_gid +"_h") ) {
setd ".dota_sql_"+ .@killer_gid +"_h", getd(".dota_sql_"+ .@killer_gid +"_h") +1 - .counttopunish;
setd ".dota_sql_"+ .@killer_gid +"_t", gettimetick(2);
}
setd (".dota_sql_"+ .@killer_gid +"_c"), getd(".dota_sql_"+ .@killer_gid +"_c") +1 - .counttopunish;
query_sql "replace into ownladder values ( "+ .@killer_gid +", '"+ escape_sql(getguildname(.@killer_gid)) +"', "+ getd(".dota_sql_"+ .@killer_gid +"_c") +", "+ getd(".dota_sql_"+ .@killer_gid +"_h") +", from_unixtime("+ getd(".dota_sql_"+ .@killer_gid +"_t") +") )";
}
end;
}
break;
}
}
if ( .@i == .@sitkillsize ) {
set @sitkillid[.@i], killedrid;
set @sitkilltimes[.@i], 1;
}
}
set @PlayersKilledStreak, @PlayersKilledStreak +1 ;
set @dota_sql_kills, @dota_sql_kills +1 ;
if ( @PlayersKilledStreak > @dota_sql_streaks ) {
set @dota_sql_streaks, @PlayersKilledStreak;
set @dota_sql_streaktime, gettimetick(2);
}
query_sql "replace into pvpladder values ( "+ getcharid(0) +", '"+ escape_sql(strcharinfo(0)) +"', "+ @dota_sql_streaks +", "+ @dota_sql_kills +", "+ @dota_sql_deaths +", from_unixtime("+ @dota_sql_streaktime +") )";
if ( @PlayersKilledStreak == .killingspree )
setarray .@streakname$,"killingspree.wav","is on a KILLING SPREE","!";
else if ( @PlayersKilledStreak == .dominating )
setarray .@streakname$,"dominating.wav","is DOMINATING","!";
else if ( @PlayersKilledStreak == .megakill )
setarray .@streakname$,"megakill.wav","has a MEGA KILL","!";
else if ( @PlayersKilledStreak == .unstoppable )
setarray .@streakname$,"unstoppable.wav","is UNSTOPPABLE","!!";
else if ( @PlayersKilledStreak == .wickedsick )
setarray .@streakname$,"wickedsick.wav","is WICKED SICK","!!";
else if ( @PlayersKilledStreak == .monsterkill )
setarray .@streakname$,"monsterkill.wav","has a MONSTER KILL","!!";
else if ( @PlayersKilledStreak == .godlike )
setarray .@streakname$,"godlike.wav","is GODLIKE","!!!";
else if ( @PlayersKilledStreak >= .holyshit && ( (@PlayersKilledStreak - .holyshit) % .continue == 0 ) )
setarray .@streakname$,"holyshit.wav","is BEYOND GODLIKE",". Someone KILL "+( (Sex)?"HIM":"HER" ) +"!!!!!!";
if ( .@streakname$[1] != "" ) {
announce strcharinfo(0) +" "+ .@streakname$[1] +"["+ @PlayersKilledStreak +"] "+( (.announcemap)?("at "+ .@map$):"") + .@streakname$[2],16|.announce;
if ( .sound == 1 ) soundeffectall .@streakname$[0],0,.@map$;
else if ( .sound == 2 ) soundeffectall .@streakname$[0],0;
else if ( .sound == 3 ) soundeffect .@streakname$[0],0;
}
set @dota_multikills, @dota_multikills + 1;
deltimer "DOTAPVP::OnStreakReset";
addtimer 18000,"DOTAPVP::OnStreakReset";
set .@killer_gid, getcharid(2);
if ( .@killer_gid && .@killer_gid != .@killed_gid ) {
setd ".dota_sql_"+ .@killer_gid +"_c", getd(".dota_sql_"+ .@killer_gid +"_c") +1 ;
if ( getd(".dota_sql_"+ .@killer_gid +"_c") > getd(".dota_sql_"+ .@killer_gid +"_h") ) {
setd ".dota_sql_"+ .@killer_gid +"_h", getd(".dota_sql_"+ .@killer_gid +"_c");
setd ".dota_sql_"+ .@killer_gid +"_t", gettimetick(2);
}
query_sql "replace into ownladder values ( "+ .@killer_gid +", '"+ escape_sql(getguildname(.@killer_gid)) +"', "+ getd(".dota_sql_"+ .@killer_gid +"_c") +", "+ getd(".dota_sql_"+ .@killer_gid +"_h") +", from_unixtime("+ getd(".dota_sql_"+ .@killer_gid +"_t") +") )";
}
set .@dota_multikills, @dota_multikills;
set .@origin, getcharid(3);
sleep 1500;
if ( .@killer_gid && .@killer_gid != .@killed_gid && getd(".dota_sql_"+ .@killer_gid +"_c") >= .owned && ( ( getd(".dota_sql_"+ .@killer_gid +"_c") - .owned ) % .owncontinue == 0 ) ) {
if ( .announce ) mapannounce .@map$, "The guild ["+ getguildname(.@killer_gid) +"] is OWNING["+ getd(".dota_sql_"+ .@killer_gid +"_c") +"] !!!",16;
else announce "The guild ["+ getguildname(.@killer_gid) +"] is OWNING["+ getd(".dota_sql_"+ .@killer_gid +"_c") +"] !!!",16;
if ( .sound == 1 ) soundeffectall "ownage.wav",0,.@map$;
else if ( .sound == 2 ) soundeffectall "ownage.wav",0;
else if ( .sound == 3 && attachrid(.@origin) ) soundeffect "ownage.wav",0;
}
sleep 1250;
if ( !attachrid(.@origin) ) end;
if ( .@dota_multikills == 2 ) {
if ( .announce ) mapannounce .@map$, strcharinfo(0) +" just got a Double Kill !",16;
else announce strcharinfo(0) +" just got a Double Kill !",16;
if ( .sound == 1 ) soundeffectall "doublekill.wav",0,.@map$;
else if ( .sound == 2 ) soundeffectall "doublekill.wav",0;
else if ( .sound == 3 ) soundeffect "doublekill.wav",0;
}
else if ( .@dota_multikills == 3 ) {
if ( .announce ) mapannounce .@map$, strcharinfo(0) +" just got a Triple Kill !!!",16;
else announce strcharinfo(0) +" just got a Triple Kill !!!",16;
if ( .sound == 1 ) soundeffectall "triplekill.wav",0,.@map$;
else if ( .sound == 2 ) soundeffectall "triplekill.wav",0;
else if ( .sound == 3 ) soundeffect "triplekill.wav",0;
}
else if ( .@dota_multikills == 4 ) {
if ( .announce ) mapannounce .@map$, strcharinfo(0) +" just got a Ultra Kill !!!",16;
else announce strcharinfo(0) +" just got a Ultra Kill !!!",16;
if ( .sound == 1 ) soundeffectall "ultrakill.wav",0,.@map$;
else if ( .sound == 2 ) soundeffectall "ultrakill.wav",0;
else if ( .sound == 3 ) soundeffect "ultrakill.wav",0;
}
else if ( .@dota_multikills >= 5 ) {
if ( .announce ) mapannounce .@map$, strcharinfo(0) +" is on a Rampage !!!",16;
else announce strcharinfo(0) +" is on a Rampage !!!",16;
if ( .sound == 1 ) soundeffectall "rampage.wav",0,.@map$;
else if ( .sound == 2 ) soundeffectall "rampage.wav",0;
else if ( .sound == 3 ) soundeffect "rampage.wav",0;
}
end;
OnStreakReset:
set @dota_multikills, 0;
end;
OnWhisperGlobal:
if ( @spam_dotapvp + 3 >= gettimetick(2) ) // 3 seconds interval so player don spam this command
end;
set @spam_dotapvp, gettimetick(2);
if ( @dota_sql_kills == 0 && @dota_sql_deaths == 0 )
query_sql "select kills, deaths, streaks, unix_timestamp(streaktime) from pvpladder where char_id = "+ getcharid(0), @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaks, @dota_sql_streaktime;
if ( @dota_sql_kills || @dota_sql_deaths ) {
dispbottom "Your current Streak : "+ @PlayersKilledStreak;
dispbottom "Your total Kills : "+ @dota_sql_kills;
dispbottom "Your total Deaths : "+ @dota_sql_deaths;
dispbottom "Your highest Streak : "+ @dota_sql_streaks;
query_sql "select date_format( from_unixtime("+ @dota_sql_streaktime +"),'%a %e/%c/%y %r')", .@time1$;
dispbottom "Your highest Streak on : "+ .@time1$;
}
else
dispbottom "You are not in the pvp ladder yet.";
if ( getcharid(2) ) {
if ( getd(".dota_sql_"+ getcharid(2) +"_h") == 0 ) {
query_sql "select currentown, highestown, unix_timestamp(owntime) from ownladder where guild_id = "+ getcharid(2), .@c, .@h, .@t;
setd ".dota_sql_"+ getcharid(2) +"_c", .@c;
setd ".dota_sql_"+ getcharid(2) +"_h", .@h;
setd ".dota_sql_"+ getcharid(2) +"_t", .@t;
}
if ( getd(".dota_sql_"+ getcharid(2) +"_h") ) {
dispbottom "Your guild current Own : "+ getd(".dota_sql_"+ getcharid(2) +"_c");
dispbottom "Your guild highest Own : "+ getd(".dota_sql_"+ getcharid(2) +"_h");
query_sql "select date_format( from_unixtime("+ getvariableofnpc( getd(".dota_sql_"+ getcharid(2) +"_t"), "DOTAPVP" ) +"),'%a %e/%c/%y %r')", .@time2$;
dispbottom "Your guild highest Own on : "+ .@time2$;
}
else
dispbottom "Your guild is not in the ladder yet.";
}
end;
OnPCLoginEvent:
if ( .maptrigger$ != "all" ) end;
OnPCLoadMapEvent:
if ( @dota_sql_kills == 0 && @dota_sql_deaths == 0 ) {
if ( .maptrigger$ != "all" ) {
getmapxy .@map$, .@x, .@y, 0;
for ( set .@i, 0; .@i < .maptriggersize; set .@i, .@i +1 ) {
if ( .@map$ == .maptrigger$[.@i] ) break;
}
if ( .@i == .maptriggersize ) end;
}
query_sql "select kills, deaths, streaks, unix_timestamp(streaktime) from pvpladder where char_id = "+ getcharid(0), @dota_sql_kills, @dota_sql_deaths, @dota_sql_streaks, @dota_sql_streaktime;
}
if ( getcharid(2) && getd(".dota_sql_"+ getcharid(2) +"_h") == 0 ) {
query_sql "select currentown, highestown, unix_timestamp(owntime) from ownladder where guild_id = "+ getcharid(2), .@c, .@h, .@t;
setd ".dota_sql_"+ getcharid(2) +"_c", .@c;
setd ".dota_sql_"+ getcharid(2) +"_h", .@h;
setd ".dota_sql_"+ getcharid(2) +"_t", .@t;
}
end;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment