FR_HallOfFame.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. //===== eAthena Script ======================================
  2. //= Hall of Fame
  3. //===========================================================
  4. //===== By ==================================================
  5. //= [Lance]
  6. //= Idea from emilylee78
  7. //===== Version =============================================
  8. //= 2.4 FINAL
  9. //===== Compatible With =====================================
  10. //= eAthena SVN and Freya SVN
  11. //===== Description =========================================
  12. //= A Hall of Fame framework. Will update the list on every
  13. //= login and logout in a safe manner.
  14. //=
  15. //= Usage: callfunc "printHallOfFame", $;
  16. //= $ - Can be either 0 or 1.
  17. //= 0 - Display the current rankings.
  18. //= 1 - Display last week's rankings.
  19. //= Note : Remember to put a close; after calling it.
  20. //===== Comments ============================================
  21. //= 1.0 - Initial beta release [Lance]
  22. //= 1.1 - Fixed typos. Optimized a teeny bit. [Lance]
  23. //= 1.2 - Bug fixes. [Lance]
  24. //= 1.3 - Added a more realistic shuffling. [Lance]
  25. //= 1.4 - Added Weekly Top 10 list. [Lance]
  26. //= 1.5 - Friggin typos =< + Better shuffling [Lance]
  27. //= 1.6 - Bugfixes [Lance]
  28. //= 1.7 - More bugfixes. Type mismatch =P [Lance]
  29. //= 2.0 - Exclude GMs and add recovery plan.
  30. //= Suggested by EvilPoringOfDooom. [Lance]
  31. //= 2.1 - Typo.. again.. T_T [Lance]
  32. //= 2.2 - Minor updates and added Jury [Lance]
  33. //= 2.3 - Utilizing eAthena's new scripting engine [Lance]
  34. //= 2.4 - Minor bug fix with event script label (bugport:722) [Samura22]
  35. //===========================================================
  36. prontera,0,0,0 script OnPCLoginEvent -1,{
  37. OnPCLoginEvent:
  38. callfunc "HallOfFameInit";
  39. end;
  40. OnInit:
  41. // Total Number of Players in Hall of Fame
  42. // =======================================
  43. set $HoF_totalCount, 10;
  44. // Reshuffle (Will affect perfomance) ====
  45. set $HoF_reshuffle, 1;
  46. // Minimum GM Lvl to be excluded from HoF=
  47. set $HoF_minGMLvl, 99;
  48. // Recovery Plan to Remove GMs ============
  49. set $@HoF_recovery, 0;
  50. // =======================================
  51. //set $HoF_totalCount, $HoF_totalCount - 1;
  52. set $@FebruaryD, 28;
  53. if((gettime(7) % 4) == 0) {
  54. set $@FebruaryD, 29;
  55. }
  56. setarray $@MonthDayThing[1],31, $@FebruaryD,31,30,31,30,31,31,30,31,30,31;
  57. set $@HoF_TimeUpdateD, $HoF_LastUpdateD;
  58. set $@HoF_TimeUpdateM, $HoF_LastUpdateM;
  59. set $@HoF_TimeUpdateY, $HoF_LastUpdateY;
  60. // Time to do some maths
  61. set $@TimeNowD, gettime(5);
  62. set $@TimeNowM, gettime(6);
  63. set $@TimeNowY, gettime(7);
  64. // Debug Message --
  65. debugmes "[Hall of Fame] Last Update is Year " + $@HoF_TimeUpdateY + " Month " + $@HoF_TimeUpdateM + " Day " + $@HoF_TimeUpdateD;
  66. debugmes "[Hall of Fame] Today is Year " + $@TimeNowY + " Month " + $@TimeNowM + " Day " + $@TimeNowD;
  67. if(($@TimeNowD - $@HoF_TimeUpdateD) < 0){
  68. set $@TimeNowD, $@TimeNowD + $@MonthDayThing[$@TimeNowM];
  69. set $@TimeNowM, $@TimeNowM - 1;
  70. }
  71. set $@GapD, $@TimeNowD - $@HoF_TimeUpdateD;
  72. if(($@TimeNowM - $@HoF_TimeUpdateM) < 0){
  73. set $@TimeNowM, $@TimeNowM + 12;
  74. set $@TimeNowY, $@TimeNowY - 1;
  75. }
  76. set $@GapM, $@TimeNowM - $@HoF_TimeUpdateM;
  77. set $@GapY, $@TimeNowY - $@HoF_TimeUpdateY;
  78. debugmes "[Hall of Fame] Gap is " + $@GapY + " Years " + $@GapM + " Months " + $@GapD + " Days.";
  79. if($@GapY > 0 || $@GapM > 0 || $@GapD >= 7) {
  80. callfunc "hallOfFameReset"; // Phew..
  81. }
  82. end;
  83. OnClock0000:
  84. set $HoF_UpdateCount, $HoF_UpdateCount + 1;
  85. if($HoF_UpdateCount == 7) {
  86. callfunc "hallOfFameReset";
  87. }
  88. end;
  89. }
  90. prontera,0,0,0 script PCLogoutEvent -1,{
  91. OnPCLogoutEvent:
  92. callfunc "HallOfFameInit";
  93. end;
  94. }
  95. function script hallOfFameReset {
  96. copyarray $HoF_LadderNameO$[0], $HoF_LadderName$[0], $HoF_totalCount;
  97. copyarray $HoF_LadderBLevelO[0], $HoF_LadderBLevel[0], $HoF_totalCount;
  98. copyarray $HoF_LadderJLevelO[0], $HoF_LadderJLevel[0], $HoF_totalCount;
  99. copyarray $HoF_LadderZenyO[0], $HoF_LadderZeny[0], $HoF_totalCount;
  100. deletearray $HoF_LadderName$[0], $HoF_totalCount;
  101. deletearray $HoF_LadderBLevel[0], $HoF_totalCount;
  102. deletearray $HoF_LadderJLevel[0], $HoF_totalCount;
  103. deletearray $HoF_LadderZeny[0], $HoF_totalCount;
  104. set $HoF_LastUpdateD, gettime(5);
  105. set $HoF_LastUpdateM, gettime(6);
  106. set $HoF_LastUpdateY, gettime(7);
  107. set $HoF_UpdateCount, 0;
  108. debugmes "[Hall of Fame] System Reset Invoked!";
  109. return;
  110. }
  111. function script HallOfFameInit {
  112. if(getgmlevel() >= $HoF_minGMLvl && $@HoF_recovery != 1) {
  113. set PCLogoutEvent, 0;
  114. } else {
  115. set PCLogoutEvent, 1;
  116. callfunc "updateHallofFame", $HoF_reshuffle;
  117. }
  118. return;
  119. }
  120. function script updateHallofFame {
  121. set @i, 0;
  122. if(getarg(0) == 1){
  123. goto L_ShuffleName;
  124. }
  125. if(BaseLevel >= $HoF_LadderBLevel[$HoF_totalCount-1]){
  126. goto L_checkBase;
  127. }
  128. goto L_End;
  129. L_ShuffleName:
  130. if($HoF_LadderName$[@i] == strcharinfo(0)) {
  131. goto L_ShuffleScore;
  132. }
  133. if(@i == $HoF_totalCount-1) {
  134. goto L_checkEntry;
  135. }
  136. set @i, @i + 1;
  137. goto L_ShuffleName;
  138. L_ShuffleScore:
  139. deletearray $HoF_LadderName$[@i],1;
  140. deletearray $HoF_LadderZeny[@i],1;
  141. deletearray $HoF_LadderJLevel[@i],1;
  142. deletearray $HoF_LadderBLevel[@i],1;
  143. goto L_ShuffleName;
  144. L_checkEntry:
  145. if(getgmlevel() >= $HoF_minGMLvl){
  146. end;
  147. }
  148. set @i, 0;
  149. goto L_checkBase;
  150. L_checkBase:
  151. if(BaseLevel >= $HoF_LadderBLevel[@i]) {
  152. goto L_BaseOK;
  153. } else {
  154. goto L_Increment;
  155. }
  156. L_BaseOK:
  157. if(BaseLevel == $HoF_LadderBLevel[@i]){
  158. goto L_BaseSameLoop;
  159. } else {
  160. goto L_NewEntry;
  161. }
  162. L_BaseSameLoop:
  163. if(JobLevel >= $HoF_LadderJLevel[@i]) {
  164. goto L_JobOK;
  165. } else if(Zeny >= $HoF_LadderZeny[@i]) {
  166. goto L_ZenyOK;
  167. }
  168. goto L_Increment;
  169. L_JobOK:
  170. if(JobLevel == $HoF_LadderJLevel[@i]) {
  171. goto L_JobSame;
  172. } else {
  173. goto L_NewEntry;
  174. }
  175. L_ZenyOK:
  176. if(Zeny == $HoF_LadderZeny[@i]){
  177. goto L_Increment;
  178. } else {
  179. goto L_NewEntry;
  180. }
  181. L_JobSame:
  182. if(Zeny >= $HoF_LadderZeny[@i]) {
  183. goto L_ZenyOK;
  184. } else {
  185. goto L_Increment;
  186. }
  187. L_NewEntry:
  188. callfunc "hallOfFameNewEntry", @i, strcharinfo(0), BaseLevel, JobLevel, Zeny;
  189. end;
  190. L_Increment:
  191. if(@i == $HoF_totalCount-1) {
  192. goto L_End;
  193. } else {
  194. set @i, @i + 1;
  195. goto L_checkBase;
  196. }
  197. L_End:
  198. return;
  199. }
  200. function script hallOfFameNewEntry {
  201. if(getarg(0) == 0) goto L_New_Entry;
  202. else if(getarg(1) != $HoF_LadderName$[getarg(0) - 1]) goto L_New_Entry;
  203. return;
  204. L_New_Entry:
  205. set @startPos, getarg(0);
  206. copyarray @HoF_LadderNameB$[0], $HoF_LadderName$[@startPos], $HoF_totalCount;
  207. copyarray @HoF_LadderBLevelB[0], $HoF_LadderBLevel[@startPos], $HoF_totalCount;
  208. copyarray @HoF_LadderJLevelB[0], $HoF_LadderJLevel[@startPos], $HoF_totalCount;
  209. copyarray @HoF_LadderZenyB[0], $HoF_LadderZeny[@startPos], $HoF_totalCount;
  210. setarray $HoF_LadderName$[@startPos], getarg(1);
  211. setarray $HoF_LadderBLevel[@startPos], getarg(2);
  212. setarray $HoF_LadderJLevel[@startPos], getarg(3);
  213. setarray $HoF_LadderZeny[@startPos], getarg(4);
  214. set @startPos, @startPos + 1;
  215. set @limitPos, $HoF_totalCount - @startPos;
  216. copyarray $HoF_LadderName$[@startPos], @HoF_LadderNameB$[0], @limitPos;
  217. copyarray $HoF_LadderBLevel[@startPos], @HoF_LadderBLevelB[0], @limitPos;
  218. copyarray $HoF_LadderJLevel[@startPos], @HoF_LadderJLevelB[0], @limitPos;
  219. copyarray $HoF_LadderZeny[@startPos], @HoF_LadderZenyB[0], @limitPos;
  220. announce "[Hall of Fame] " + getarg(1) + " has made his/herself onto the No. " + @startPos + " ranking in Hall of Fame!", bc_all;
  221. return;
  222. }
  223. function script printHallOfFame {
  224. if(getarg(0) == 1) {
  225. mes "[Hall of Fame] - Last Week's Rankings";
  226. for(set @loop, 0; @loop < $HoF_totalCount; set @loop, @loop + 1){
  227. mes "^ff0000";
  228. mes "Position No. " + (@loop + 1) + ":^0000ff";
  229. mes "+================================+";
  230. mes "^000000Name :" + $HoF_LadderNameO$[@loop];
  231. mes "BLvl :" + $HoF_LadderBLevelO[@loop];
  232. mes "JLvl :" + $HoF_LadderJLevelO[@loop];
  233. mes "Zeny :" + $HoF_LadderZenyO[@loop] + "^0000ff";
  234. mes "+================================+^000000";
  235. }
  236. } else {
  237. mes "[Hall of Fame] - Current Rankings";
  238. for(set @loop, 0; @loop < $HoF_totalCount; set @loop, @loop + 1){
  239. mes "^ff0000";
  240. mes "Position No. " + (@loop + 1) + ":^0000ff";
  241. mes "+================================+";
  242. mes "^000000Name :" + $HoF_LadderName$[@loop];
  243. mes "BLvl :" + $HoF_LadderBLevel[@loop];
  244. mes "JLvl :" + $HoF_LadderJLevel[@loop];
  245. mes "Zeny :" + $HoF_LadderZeny[@loop] + "^0000ff";
  246. mes "+================================+^000000";
  247. }
  248. }
  249. return;
  250. }
  251. prontera,164,134,2 script Jury 109,{
  252. mes "[Jury]";
  253. mes "Good day. Would you like to view the Hall of Fame?";
  254. next;
  255. menu "Yes",L_OK,"No",L_QUIT;
  256. L_OK:
  257. mes "[Jury]";
  258. mes "Would you like to view the current or the past rankings?";
  259. L_MENU:
  260. next;
  261. menu "Current", L_CUR, "Past", -,"Nevermind",L_QUIT;
  262. callfunc "printHallOfFame",1;
  263. goto L_MENU;
  264. L_CUR:
  265. callfunc "printHallOfFame",0;
  266. goto L_MENU;
  267. L_QUIT:
  268. mes "[Jury]";
  269. mes "Have a nice day then.";
  270. close;
  271. }