//===== eAthena Script ======================================
//= Hall of Fame
//===========================================================
//===== By ==================================================
//= [Lance]
//= Idea from emilylee78
//===== Version =============================================
//= 2.3 FINAL
//===== Compatible With =====================================
//= eAthena SVN and Freya SVN
//===== Description =========================================
//= A Hall of Fame framework. Will update the list on every
//= login and logout in a safe manner.
//=
//= Usage: callfunc "printHallOfFame", $;
//= $ - Can be either 0 or 1.
//= 0 - Display the current rankings.
//= 1 - Display last week's rankings.
//= Note : Remember to put a close; after calling it.
//===== Comments ============================================
//= 1.0 - Initial beta release [Lance]
//= 1.1 - Fixed typos. Optimized a teeny bit. [Lance]
//= 1.2 - Bug fixes. [Lance]
//= 1.3 - Added a more realistic shuffling. [Lance]
//= 1.4 - Added Weekly Top 10 list. [Lance]
//= 1.5 - Friggin typos =< + Better shuffling [Lance]
//= 1.6 - Bugfixes [Lance]
//= 1.7 - More bugfixes. Type mismatch =P [Lance]
//= 2.0 - Exclude GMs and add recovery plan.
//= Suggested by EvilPoringOfDooom. [Lance]
//= 2.1 - Typo.. again.. T_T [Lance]
//= 2.2 - Minor updates and added Jury [Lance]
//= 2.3 - Utilizing eAthena's new scripting engine [Lance]
//===========================================================
prontera.gat,0,0,0 script OnPCLoginEvent -1,{
callfunc "HallOfFameInit";
end;
OnInit:
// Total Number of Players in Hall of Fame
// =======================================
set $HoF_totalCount, 10;
// Reshuffle (Will affect perfomance) ====
set $HoF_reshuffle, 1;
// Minimum GM Lvl to be excluded from HoF=
set $HoF_minGMLvl, 99;
// Recovery Plan to Remove GMs ============
set $@HoF_recovery, 0;
// =======================================
set $HoF_totalCount, $HoF_totalCount - 1;
set $@FebruaryD, 28;
if((gettime(7) % 4) == 0) {
set $@FebruaryD, 29;
}
setarray $@MonthDayThing[1],31, $@FebruaryD,31,30,31,30,31,31,30,31,30,31;
set $@HoF_TimeUpdateD, $HoF_LastUpdateD;
set $@HoF_TimeUpdateM, $HoF_LastUpdateM;
set $@HoF_TimeUpdateY, $HoF_LastUpdateY;
// Time to do some maths
set $@TimeNowD, gettime(5);
set $@TimeNowM, gettime(6);
set $@TimeNowY, gettime(7);
// Debug Message --
debugmes "[Hall of Fame] Last Update is Year " + $@HoF_TimeUpdateY + " Month " + $@HoF_TimeUpdateM + " Day " + $@HoF_TimeUpdateD;
debugmes "[Hall of Fame] Today is Year " + $@TimeNowY + " Month " + $@TimeNowM + " Day " + $@TimeNowD;
if(($@TimeNowD - $@HoF_TimeUpdateD) < 0){
set $@TimeNowD, $@TimeNowD + $@MonthDayThing[$@TimeNowM];
set $@TimeNowM, $@TimeNowM - 1;
}
set $@GapD, $@TimeNowD - $@HoF_TimeUpdateD;
if(($@TimeNowM - $@HoF_TimeUpdateM) < 0){
set $@TimeNowM, $@TimeNowM + 12;
set $@TimeNowY, $@TimeNowY - 1;
}
set $@GapM, $@TimeNowM - $@HoF_TimeUpdateM;
set $@GapY, $@TimeNowY - $@HoF_TimeUpdateY;
debugmes "[Hall of Fame] Gap is " + $@GapY + " Years " + $@GapM + " Months " + $@GapD + " Days.";
if($@GapY > 0 || $@GapM > 0 || $@GapD >= 7) {
callfunc "hallOfFameReset"; // Phew..
}
end;
OnClock0000:
set $HoF_UpdateCount, $HoF_UpdateCount + 1;
if($HoF_UpdateCount == 7) {
callfunc "hallOfFameReset";
}
end;
}
prontera.gat,0,0,0 script PCLogoutEvent -1,{
callfunc "HallOfFameInit";
end;
}
function script hallOfFameReset {
copyarray $HoF_LadderNameO$[0], $HoF_LadderName$[0], $HoF_totalCount;
copyarray $HoF_LadderBLevelO[0], $HoF_LadderBLevel[0], $HoF_totalCount;
copyarray $HoF_LadderJLevelO[0], $HoF_LadderJLevel[0], $HoF_totalCount;
copyarray $HoF_LadderZenyO[0], $HoF_LadderZeny[0], $HoF_totalCount;
set $@number, $HoF_totalCount + 1;
deletearray $HoF_LadderName$[0], $@number;
deletearray $HoF_LadderBLevel[0], $@number;
deletearray $HoF_LadderJLevel[0], $@number;
deletearray $HoF_LadderZeny[0], $@number;
set $HoF_LastUpdateD, gettime(5);
set $HoF_LastUpdateM, gettime(6);
set $HoF_LastUpdateY, gettime(7);
set $HoF_UpdateCount, 0;
debugmes "[Hall of Fame] System Reset Invoked!";
return;
}
function script HallOfFameInit {
if(getgmlevel() >= $HoF_minGMLvl && $@HoF_recovery != 1) {
set PCLogoutEvent, 0;
} else {
set PCLogoutEvent, 1;
callfunc "updateHallofFame", $HoF_reshuffle;
}
return;
}
function script updateHallofFame {
set @i, 0;
if(getarg(0) == 1){
goto L_ShuffleName;
}
if(BaseLevel >= $HoF_LadderBLevel[$HoF_totalCount]){
goto L_checkBase;
}
goto L_End;
L_ShuffleName:
if($HoF_LadderName$[@i] == strcharinfo(0)) {
goto L_ShuffleScore;
}
if(@i == $HoF_totalCount) {
goto L_checkEntry;
}
set @i, @i + 1;
goto L_ShuffleName;
L_ShuffleScore:
deletearray $HoF_LadderName$[@i],1;
deletearray $HoF_LadderZeny[@i],1;
deletearray $HoF_LadderJLevel[@i],1;
deletearray $HoF_LadderBLevel[@i],1;
goto L_ShuffleName;
L_checkEntry:
if(getgmlevel() >= $HoF_minGMLvl){
end;
}
set @i, 0;
goto L_checkBase;
L_checkBase:
if(BaseLevel >= $HoF_LadderBLevel[@i]) {
goto L_BaseOK;
} else {
goto L_Increment;
}
L_BaseOK:
if(BaseLevel == $HoF_LadderBLevel[@i]){
goto L_BaseSameLoop;
} else {
goto L_NewEntry;
}
L_BaseSameLoop:
if(JobLevel >= $HoF_LadderJLevel[@i]) {
goto L_JobOK;
} else if(Zeny >= $HoF_LadderZeny[@i]) {
goto L_ZenyOK;
}
goto L_Increment;
L_JobOK:
if(JobLevel == $HoF_LadderJLevel[@i]) {
goto L_JobSame;
} else {
goto L_NewEntry;
}
L_ZenyOK:
if(Zeny == $HoF_LadderZeny[@i]){
goto L_Increment;
} else {
goto L_NewEntry;
}
L_JobSame:
if(Zeny >= $HoF_LadderZeny[@i]) {
goto L_ZenyOK;
} else {
goto L_Increment;
}
L_NewEntry:
callfunc "hallOfFameNewEntry", @i, strcharinfo(0), BaseLevel, JobLevel, Zeny;
end;
L_Increment:
if(@i == $HoF_totalCount) {
goto L_End;
} else {
set @i, @i + 1;
goto L_checkBase;
}
L_End:
return;
}
function script hallOfFameNewEntry {
if(getarg(0) == 0 || getarg(1) != $HoF_LadderName$[getarg(0) - 1]) {
set @startPos, getarg(0);
copyarray @HoF_LadderNameB$[0], $HoF_LadderName$[@startPos], $HoF_totalCount;
copyarray @HoF_LadderBLevelB[0], $HoF_LadderBLevel[@startPos], $HoF_totalCount;
copyarray @HoF_LadderJLevelB[0], $HoF_LadderJLevel[@startPos], $HoF_totalCount;
copyarray @HoF_LadderZenyB[0], $HoF_LadderZeny[@startPos], $HoF_totalCount;
set $HoF_LadderName$[@startPos], getarg(1);
set $HoF_LadderBLevel[@startPos], getarg(2);
set $HoF_LadderJLevel[@startPos], getarg(3);
set $HoF_LadderZeny[@startPos], getarg(4);
set @startPos, @startPos + 1;
set @limitPos, $HoF_totalCount - @startPos;
copyarray $HoF_LadderName$[@startPos], @HoF_LadderNameB$[0], @limitPos;
copyarray $HoF_LadderBLevel[@startPos], @HoF_LadderBLevelB[0], @limitPos;
copyarray $HoF_LadderJLevel[@startPos], @HoF_LadderJLevelB[0], @limitPos;
copyarray $HoF_LadderZeny[@startPos], @HoF_LadderZenyB[0], @limitPos;
announce "[Hall of Fame] " + getarg(1) + " has made his/herself onto the No. " + @startPos + " ranking in Hall of Fame!", bc_all;
}
return;
}
function script printHallOfFame {
if(getarg(0) == 1) {
mes "[Hall of Fame] - Last Week's Rankings";
for(set @loop, 0; @loop < $HoF_totalCount; set @loop, @loop + 1){
mes "^ff0000";
mes "Position No. " + (@loop + 1) + ":^0000ff";
mes "+================================+";
mes "^000000Name :" + $HoF_LadderNameO$[@loop];
mes "BLvl :" + $HoF_LadderBLevelO[@loop];
mes "JLvl :" + $HoF_LadderJLevelO[@loop];
mes "Zeny :" + $HoF_LadderZenyO[@loop] + "^0000ff";
mes "+================================+^000000";
}
} else {
mes "[Hall of Fame] - Current Rankings";
for(set @loop, 0; @loop < $HoF_totalCount; set @loop, @loop + 1){
mes "^ff0000";
mes "Position No. " + (@loop + 1) + ":^0000ff";
mes "+================================+";
mes "^000000Name :" + $HoF_LadderName$[@loop];
mes "BLvl :" + $HoF_LadderBLevel[@loop];
mes "JLvl :" + $HoF_LadderJLevel[@loop];
mes "Zeny :" + $HoF_LadderZeny[@loop] + "^0000ff";
mes "+================================+^000000";
}
}
return;
}
prontera.gat,180,200,4 script Jury 109,{
mes "[Jury]";
mes "Good day. Would you like to view the Hall of Fame?";
next;
menu "Yes",L_OK,"No",L_QUIT;
L_OK:
mes "[Jury]";
mes "Would you like to view the current or the past rankings?";
L_MENU:
next;
menu "Current", L_CUR, "Past", -,"Nevermind",L_QUIT;
callfunc "printHallOfFame",1;
goto L_MENU;
L_CUR:
callfunc "printHallOfFame",0;
goto L_MENU;
L_QUIT:
mes "[Jury]";
mes "Have a nice day then.";
close;
}