summaryrefslogtreecommitdiff
path: root/npc/custom/Lance/FR_HallOfFame.c
diff options
context:
space:
mode:
Diffstat (limited to 'npc/custom/Lance/FR_HallOfFame.c')
-rw-r--r--npc/custom/Lance/FR_HallOfFame.c297
1 files changed, 297 insertions, 0 deletions
diff --git a/npc/custom/Lance/FR_HallOfFame.c b/npc/custom/Lance/FR_HallOfFame.c
new file mode 100644
index 000000000..8799ce0a2
--- /dev/null
+++ b/npc/custom/Lance/FR_HallOfFame.c
@@ -0,0 +1,297 @@
+//===== 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 PCLoginEvent -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;
+
+} \ No newline at end of file