mvp_ladder.txt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. //===== rAthena Script =======================================
  2. //= MVP Ladder Game
  3. //===== By: ==================================================
  4. //= aftermath, AnnieRuru (rewrite)
  5. //===== Current Version: =====================================
  6. //= 1.0
  7. //===== Compatible With: =====================================
  8. //= rAthena Project
  9. //===== Description: =========================================
  10. //= Gather a party and kill every MVP in ascending order.
  11. //===== Additional Comments: =================================
  12. //= 1.0 First version, edited. [Euphy]
  13. //============================================================
  14. prontera,164,171,3 script MvP Ladder Warper 56,{
  15. mes "[MvP Ladder Warper]";
  16. mes "Say... do you want to play the MvP Ladder game?";
  17. next;
  18. switch(select("Yes, let's get it on!:Information.:Show me the best record.:No.")) {
  19. case 1:
  20. break;
  21. case 2:
  22. mes "[MvP Ladder Warper]";
  23. mes "In this game, your party has to kill every single MvP monster in ascending order, from the weakest to strongest.";
  24. if ( .finish_item_amount )
  25. mes "If your party can finish the MVP ladder game, each member will earn "+ callfunc("F_InsertPlural", .finish_item_amount, getitemname( .finish_item_id )) +".";
  26. if ( .register_cost )
  27. mes "But the entrance fee is "+ callfunc( "F_InsertComma", .register_cost ) +" zeny.";
  28. next;
  29. mes "[MvP Ladder Warper]";
  30. mes "You lose the game if you can't finish in "+ .timeout +" minutes, or if your entire party is killed.";
  31. mes "Good luck!";
  32. close;
  33. case 3:
  34. mes "[MvP Ladder Warper]";
  35. if ( !$mvpladdderparty_time ) {
  36. mes "Nobody has finished this game yet.";
  37. close;
  38. }
  39. mes "The best record is";
  40. mes "[ "+( $mvpladdderparty_time / 60 )+" min "+( $mvpladdderparty_time % 60 )+" sec ]";
  41. mes "By the party ^FF0000"+ $mvpladdderparty_name$ +"^000000.";
  42. .@size = getarraysize( $mvpladderparty_member$ );
  43. for ( .@i = 0; .@i < .@size; .@i++ )
  44. mes "^000000"+ ( .@i +1 ) +". ^0000FF"+ $mvpladderparty_member$[.@i];
  45. if ( getgmlevel() < .gmlvlreset ) close;
  46. next;
  47. if ( select( "Close.", "Reset the record." ) == 1 ) close;
  48. if ( select( "Never mind.", "I really want to reset it." ) == 1 ) close;
  49. $mvpladdderparty_time = 0;
  50. $mvpladdderparty_name$ = "";
  51. deletearray $mvpladderparty_member$[.@i];
  52. mes "[MvP Ladder Warper]";
  53. mes "Record reset successfully.";
  54. close;
  55. case 4:
  56. mes "[MvP Ladder Warper]";
  57. mes "When you are strong enough to complete the game, please come back.";
  58. close;
  59. }
  60. if ( !getcharid(1) ) {
  61. mes "[MvP Ladder Warper]";
  62. mes "You have to form a party to play.";
  63. close;
  64. }
  65. if ( is_party_leader() == false ) {
  66. mes "[MvP Ladder Warper]";
  67. mes "Only the party leader can register.";
  68. close;
  69. }
  70. .@origin = getcharid(3);
  71. getpartymember getcharid(1), 1;
  72. getpartymember getcharid(1), 2;
  73. for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
  74. if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
  75. attachrid $@partymemberaid[.@i];
  76. if ( strcharinfo(3) == strnpcinfo(4) )
  77. .@online++;
  78. }
  79. }
  80. attachrid .@origin;
  81. if ( $@partymembercount != .register_min ) {
  82. mes "[MvP Ladder Warper]";
  83. mes "You have to form a party with exactly "+ .register_min +" members to play.";
  84. close;
  85. }
  86. else if ( .@online != .register_min ) {
  87. mes "[MvP Ladder Warper]";
  88. mes "Your party must have "+ .register_min +" members online on map '"+ strnpcinfo(4) +"'.";
  89. close;
  90. }
  91. else if ( .register_cost && Zeny < .register_cost ) {
  92. mes "[MvP Ladder Warper]";
  93. mes "You don't have enough zeny. Please come back when you do.";
  94. close;
  95. }
  96. else if ( .party_id ) {
  97. mes "[MvP Ladder Warper]";
  98. mes "I'm sorry, but a party is currently playing the game. Please standby until the party is finished.";
  99. mes "Thank you.";
  100. close;
  101. }
  102. Zeny -= .register_cost;
  103. announce "The party ["+ strcharinfo(1) +"] has started the MvP ladder game.", bc_all;
  104. set .party_id, getcharid(1);
  105. set .@time_enter, gettimetick(2);
  106. for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
  107. if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
  108. attachrid $@partymemberaid[.@i];
  109. if ( strcharinfo(3) == strnpcinfo(4) ) {
  110. announce "You have "+ .timeout +" minutes to complete "+ .totalround +" rounds.", bc_self;
  111. .@name$[.@c] = strcharinfo(0);
  112. .@c++;
  113. }
  114. }
  115. }
  116. cleanmap .eventmap$;
  117. warpparty .eventmap$, 0,0, .party_id, strnpcinfo(4);
  118. donpcevent strnpcinfo(0)+"::OnMvpDead";
  119. sleep .timeout * 60000;
  120. if ( .round == .totalround +1 ) {
  121. getpartymember .party_id, 1;
  122. getpartymember .party_id, 2;
  123. mapannounce .eventmap$, "Congratulations... You were able to defeat all the MVPs!", bc_map;
  124. for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
  125. if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
  126. attachrid $@partymemberaid[.@i];
  127. if ( strcharinfo(3) == .eventmap$ )
  128. getitem .finish_item_id, .finish_item_amount;
  129. }
  130. }
  131. set .@timeused, gettimetick(2) - .@time_enter;
  132. if ( .bonus_item_amount && .@timeused < .bonus_time * 60 ) {
  133. mapannounce .eventmap$, "You are rewarded a bonus item for completing the ladder within "+ .bonus_time +" minutes.", bc_map;
  134. for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
  135. if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
  136. attachrid $@partymemberaid[.@i];
  137. if ( strcharinfo(3) == .eventmap$ )
  138. getitem .bonus_item_id, .bonus_item_amount;
  139. }
  140. }
  141. }
  142. if ( !$mvpladdderparty_time || .@timeused < $mvpladdderparty_time ) {
  143. mapannounce .eventmap$, "And you broke the record! [ "+( .@timeused / 60 )+" min "+( .@timeused % 60 )+" sec ]", bc_map;
  144. set $mvpladdderparty_time, .@timeused;
  145. set $mvpladdderparty_name$, getpartyname( .party_id );
  146. copyarray $mvpladderparty_member$, .@name$, .register_min;
  147. }
  148. else
  149. mapannounce .eventmap$, "Time used [ "+( .@timeused / 60 )+" min "+( .@timeused % 60 )+" sec ]", bc_map;
  150. sleep 10000;
  151. announce "The party ["+ getpartyname( .party_id ) +"] has finished the MvP ladder game!", bc_all;
  152. }
  153. else
  154. announce "The party ["+ getpartyname( .party_id ) +"] has failed to finish the MvP ladder game.", bc_all;
  155. mapwarp .eventmap$, .map$, .x, .y;
  156. killmonsterall .eventmap$;
  157. .party_id = .round = 0;
  158. end;
  159. OnMvpDead:
  160. getpartymember .party_id, 1;
  161. getpartymember .party_id, 2;
  162. .round++;
  163. if ( .round >= 2 && .round != .totalround +1 && .round_item_amount ) {
  164. for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
  165. if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
  166. attachrid $@partymemberaid[.@i];
  167. if ( strcharinfo(3) == .eventmap$ )
  168. getitem .round_item_id, .round_item_amount;
  169. }
  170. }
  171. }
  172. if ( .round == .totalround +1 ) {
  173. awake strnpcinfo(0);
  174. end;
  175. }
  176. else if ( .round == .totalround )
  177. mapannounce .eventmap$, "The final Round will begin in "+ .delay +" seconds...", bc_map;
  178. else
  179. mapannounce .eventmap$, "Starting round "+ .round +" in "+ .delay +" seconds...", bc_map;
  180. sleep .delay * 1000;
  181. if ( .mvpid[.round] == 1646 ) // pick random Bio3 MVP
  182. .mvpid[.round] = rand(1646,1651);
  183. monster .eventmap$,0,0, "--ja--", .mvpid[.round], 1, strnpcinfo(0)+"::OnMvpDead";
  184. mapannounce .eventmap$, getmonsterinfo( .mvpid[.round], MOB_NAME ) +" has spawned!", bc_map|bc_blue;
  185. end;
  186. OnPCLogoutEvent:
  187. if ( hp > 0 )
  188. .@less_one = 1;
  189. else
  190. end;
  191. OnPCDieEvent:
  192. if ( strcharinfo(3) != .eventmap$ || !getcharid(1) ) end;
  193. if ( getcharid(1) != .party_id ) end;
  194. getpartymember .party_id, 1;
  195. getpartymember .party_id, 2;
  196. for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
  197. if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
  198. attachrid $@partymemberaid[.@i];
  199. if ( strcharinfo(3) == .eventmap$ && hp > 0 )
  200. .@alive++;
  201. }
  202. }
  203. if ( .@less_one )
  204. .@alive--;
  205. if ( !.@alive ) {
  206. mapannounce .eventmap$, "Party wiped!", bc_map;
  207. sleep 10000;
  208. awake strnpcinfo(0);
  209. }
  210. end;
  211. OnInit:
  212. // Configurations -----------------------------------------------------
  213. // Time limit (in minutes)
  214. // When time runs out, all players inside the room will be kicked out.
  215. // Do NOT set this to zero!
  216. set .timeout, 60;
  217. // entrance fee (in Zeny)
  218. set .register_cost, 100000;
  219. // exact amount of party members needed to start the game
  220. set .register_min, 2;
  221. // id of each mvp. you can add more
  222. setarray .mvpid[1],
  223. 1086,// Golden Thief Bug 64
  224. 1115,// Eddga 65
  225. 1150,// Moonlight Flower 67
  226. 1159,// Phreeoni 69
  227. 1112,// Drake 70
  228. 1583,// Tao Gunka 70
  229. 1492,// Incantation Samurai 71
  230. 1046,// Doppelgangger 72
  231. 1252,// Garm 73
  232. 1418,// Evil Snake Lord 73
  233. 1059,// Mistress 74
  234. 1190,// Orc Lord 74
  235. 1087,// Orc Hero 77
  236. 1251,// Knight of Windstorm 77
  237. 1038,// Osiris 78
  238. 1658,// Ygnizem 79
  239. 1272,// Dark Lord 80
  240. 1871,// Fallen Bishop 80
  241. 1039,// Baphomet 81
  242. 1147,// Maya 81
  243. 1785,// Atroce 82
  244. 1389,// Dracula 85
  245. 1630,// Bacsojin 85
  246. 1885,// Gorynych 85
  247. 1623,// RSX 0806 86
  248. 1511,// Amon Ra 88
  249. 1688,// Lady Tanee 89
  250. 1768,// Gloom Under Night 89
  251. 1719,// Datale 90
  252. 1734,// Kiel D-01 90
  253. 1157,// Pharaoh 93
  254. 1373,// Lord of Death 94
  255. 1312,// Turtle General 97
  256. 1779,// Ktullanux 98
  257. 1874,// Beelzebub 98
  258. 1646,// Bio3 placeholder 99
  259. 1708,// Thanatos 99
  260. 1751,// Valkyrie Randgris 99
  261. 1832;// Ifrit 99
  262. // number of rounds (default: 39)
  263. set .totalround, getarraysize(.mvpid) -1;
  264. // item reward for completing each round
  265. set .round_item_id, 512;
  266. set .round_item_amount, 1;
  267. // item reward for completing the entire ladder
  268. set .finish_item_id, 501;
  269. set .finish_item_amount, 10;
  270. // bonus reward if ladder completed within a certain time (in minutes)
  271. set .bonus_time, 45; // if completed within 45 minutes, this reward is given
  272. set .bonus_item_id, 504;
  273. set .bonus_item_amount, 10;
  274. // time delay between rounds, in seconds (default: 3)
  275. set .delay, 5;
  276. // minimum GM level to reset the best record
  277. set .gmlvlreset, 99;
  278. // event map
  279. set .eventmap$, "guild_vs2-2";
  280. // mapflag configuration
  281. setarray .@mapflag,
  282. mf_nowarp,
  283. mf_nowarpto,
  284. mf_nosave,
  285. mf_nomemo,
  286. mf_noteleport,
  287. // mf_nopenalty, // disable exp loss
  288. mf_noreturn,
  289. // mf_nobranch,
  290. // mf_nomobloot, // disable monster drop loots,
  291. // mf_nomvploot, // 2 of these
  292. mf_partylock;
  293. // Config Ends --------------------------------------------------------------
  294. mapannounce .eventmap$, "An administrator has refreshed the server. Please re-register. We apologize for the inconvenience.", bc_map;
  295. getmapxy .map$, .x, .y, BL_NPC;
  296. mapwarp .eventmap$, .map$, .x, .y;
  297. killmonsterall .eventmap$;
  298. .@size = getarraysize( .@mapflag );
  299. for ( .@i = 0; .@i < .@size; .@i++ )
  300. setmapflag .eventmap$, .@mapflag[.@i];
  301. end;
  302. }