questboard.txt 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. //===== rAthena Script =======================================
  2. //= tr0n's Questboard
  3. //===== By: ==================================================
  4. //= tr0n
  5. //===== Current Version: =====================================
  6. //= 1.6.6
  7. //===== Description: =========================================
  8. //= Easily add collection and hunting quests.
  9. //===== Changelogs: ==========================================
  10. // 1.0.0 Release
  11. // 1.1.0 Added zeny reward
  12. // 1.2.0 Rewrote checkmob and killcounter
  13. // 1.3.1 Added level restriction
  14. // 1.3.4 Added Reward Item Amount
  15. // 1.4.4 Added Quest delay
  16. // 1.5.4 Added repeatable Quests
  17. // 1.6.4 Added party support
  18. // 1.6.5 Bug fixes for party support
  19. // 1.6.6 Bug fixes for delay time does not appear [mazvi]
  20. //============================================================
  21. prontera,129,215,5 script Questboard 4_BOARD3,{
  22. if(c_run==true){
  23. mes "[^FF7700Questboard^000000]";
  24. mes "^0000FF"+getd("." + currentquest$ + "_collectionname$")+"^000000";
  25. mes "--------------------------------";
  26. set .@size, getarraysize(getd("."+ currentquest$ + "_collectionitem"));
  27. for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
  28. mes "^FF0000"+getitemname(getd("."+currentquest$+"_collectionitem["+.@j+"]"))+" - "+countitem(getd("."+currentquest$+"_collectionitem["+.@j+"]"))+"/"+getd("."+currentquest$+"_collectionitem["+(.@j+1)+"]")+" ea.^000000";
  29. }
  30. mes "--------------------------------";
  31. mes "[Reward]";
  32. mes "Item: ^0000FF"+((getd("." +currentquest$+"_collectionprize"))?getitemname(getd("." +currentquest$+"_collectionprize"))+" - "+getd("." +currentquest$+"_collectionamount")+" ea.^000000":"Nothing^000000");
  33. mes "Zeny: ^0000FF"+getd("." +currentquest$+"_collectionzeny")+"^000000";
  34. mes "Base EXP: ^0000FF"+getd("." +currentquest$+"_collectionexp["+0+"]")+"^000000";
  35. mes "Job EXP: ^0000FF"+getd("." +currentquest$+"_collectionexp["+1+"]")+"^000000";
  36. next;
  37. if(select("Finish:Abort") == 2){
  38. mes "[^FF7700Questboard^000000]";
  39. mes "Quest aborted.";
  40. set currentquest$, "";
  41. set c_run, false;
  42. close;
  43. }
  44. goto L_checkitems;
  45. }
  46. if(h_run==true){
  47. mes "[^FF7700Questboard^000000]";
  48. mes "^0000FF"+getd("." + currentquest$ + "_huntingname$")+"^000000";
  49. mes "--------------------------------";
  50. set .@size, getarraysize(getd("."+ currentquest$ + "_huntingmob"));
  51. for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
  52. set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@j)+"]");
  53. mes "^FF0000"+getmonsterinfo(getd("."+currentquest$+"_huntingmob["+.@j+"]"), MOB_NAME)+" - "+getd(currentquest$+"_"+.@currentmob+"_"+(.@j+1)+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+(.@j+1)+"]")+" ea.^000000";
  54. }
  55. mes "--------------------------------";
  56. mes "[Reward]";
  57. mes "Item: ^0000FF"+((getd("." +currentquest$+"_huntingprize"))?getitemname(getd("." +currentquest$+"_huntingprize"))+" - "+getd("." +currentquest$+"_huntingamount")+" ea.^000000":"Nothing^000000");
  58. mes "Zeny: ^0000FF"+getd("." +currentquest$+"_huntingzeny")+"^000000";
  59. mes "Base EXP: ^0000FF"+getd("." +currentquest$+"_huntingexp["+0+"]")+"^000000";
  60. mes "Job EXP: ^0000FF"+getd("." +currentquest$+"_huntingexp["+1+"]")+"^000000";
  61. next;
  62. if(select("Finish:Abort") == 2){
  63. mes "[^FF7700Questboard^000000]";
  64. mes "Quest aborted.";
  65. for(set .@x, 1; .@x < .@size; set .@x,.@x+2){
  66. set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@x-1)+"]");
  67. setd(currentquest$+"_"+.@currentmob+"_"+.@x+"_killcount", 0);
  68. }
  69. set currentquest$, "";
  70. set h_run, false;
  71. close;
  72. }
  73. goto L_checkmobs;
  74. }
  75. mes "[^FF7700Questboard^000000]";
  76. mes "Select category:";
  77. next;
  78. switch(select((.collection)?"Collection Quests":"",
  79. (.hunting)?"Hunting Quests":"",
  80. "Exit")) {
  81. case 1:
  82. set .@collectmenu$, "";
  83. for( set .@i,0; .@i < .collectionquestcount; set .@i,.@i+1){
  84. if (.@i) set .@collectmenu$,.@collectmenu$+":";
  85. set .@collectmenu$, .@collectmenu$ + "[" + getd("." +(.@i+1)+"_collectionmin") + " - " + getd("." +(.@i+1)+"_collectionmax") + "] " + getd("." + (.@i+1) + "_collectionname$");
  86. }
  87. set .@selection,select(.@collectmenu$);
  88. if(.quest_repeat == true){
  89. if(gettimetick(2) < getd(.@selection + "_collection_delay")){
  90. mes "[^FF7700Questboard^000000]";
  91. mes "You have to wait ^0000FF"+Time2Str(getd(.@selection + "_collection_delay"))+"^000000 to do this quest again.";
  92. close;
  93. }
  94. }
  95. else{
  96. if(getd(.@selection + "_collection_repeat") == true){
  97. mes "[^FF7700Questboard^000000]";
  98. mes "You already did this quest.";
  99. mes "Please choose another one.";
  100. close;
  101. }
  102. }
  103. mes "[^FF7700Questboard^000000]";
  104. mes "^0000FF"+getd("." + .@selection + "_collectionname$")+"^000000";
  105. mes "--------------------------------";
  106. set .@size, getarraysize(getd("."+ .@selection + "_collectionitem"));
  107. for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
  108. mes "^FF0000"+getitemname(getd("."+.@selection+"_collectionitem["+.@j+"]"))+" - "+getd("."+.@selection+"_collectionitem["+(.@j+1)+"]")+" ea.^000000";
  109. }
  110. mes "--------------------------------";
  111. mes "[Reward]";
  112. mes "Item: ^0000FF"+((getd("." +.@selection+"_collectionprize"))?getitemname(getd("." +.@selection+"_collectionprize"))+" - "+getd("." +.@selection+"_collectionamount")+" ea.^000000":"Nothing^000000");
  113. mes "Zeny: ^0000FF"+getd("." +.@selection+"_collectionzeny")+"^000000";
  114. mes "Base EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+0+"]")+"^000000";
  115. mes "Job EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+1+"]")+"^000000";
  116. next;
  117. if(select("Accept:Decline") == 2){
  118. close;
  119. }
  120. if(BaseLevel >= getd("." +.@selection+"_collectionmin") && BaseLevel <= getd("." +.@selection+"_collectionmax")){
  121. mes "[^FF7700Questboard^000000]";
  122. mes "Quest accepted.";
  123. set c_run, true;
  124. set currentquest$, .@selection;
  125. close;
  126. }
  127. else{
  128. mes "[^FF7700Questboard^000000]";
  129. mes "You don't have the required";
  130. mes "level to do this quest.";
  131. close;
  132. }
  133. case 2:
  134. set .@huntmenu$, "";
  135. for( set .@i,0; .@i < .huntingquestcount; set .@i,.@i+1){
  136. if (.@i) set .@huntmenu$,.@huntmenu$+":";
  137. set .@huntmenu$, .@huntmenu$ + "[" + getd("." +(.@i+1)+"_huntingmin") + " - " + getd("." +(.@i+1)+"_huntingmax") + "] " + getd("." + (.@i+1) + "_huntingname$");
  138. }
  139. set .@selection,select(.@huntmenu$);
  140. if(.quest_repeat == true){
  141. if(gettimetick(2) < getd(.@selection + "_hunting_delay")){
  142. mes "[^FF7700Questboard^000000]";
  143. mes "You have to wait ^0000FF"+Time2Str(getd(.@selection + "_hunting_delay"))+"^000000 to do this quest again.";
  144. close;
  145. }
  146. }
  147. else{
  148. if(getd(.@selection + "_hunting_repeat") == true){
  149. mes "[^FF7700Questboard^000000]";
  150. mes "You already did this quest.";
  151. mes "Please choose another one.";
  152. close;
  153. }
  154. }
  155. mes "[^FF7700Questboard^000000]";
  156. mes "^0000FF"+getd("." + .@selection + "_huntingname$")+"^000000";
  157. mes "--------------------------------";
  158. set .@size, getarraysize(getd("."+ .@selection + "_huntingmob"));
  159. for( set .@j, 0; .@j < .@size; set .@j,.@j+2){
  160. mes "^FF0000"+getmonsterinfo(getd("."+.@selection+"_huntingmob["+.@j+"]"), MOB_NAME)+" - "+getd("."+.@selection+"_huntingmob["+(.@j+1)+"]")+" ea.^000000";
  161. }
  162. mes "--------------------------------";
  163. mes "[Reward]";
  164. mes "Item: ^0000FF"+((getd("." +.@selection+"_huntingprize"))?getitemname(getd("." +.@selection+"_huntingprize"))+" - "+getd("." +.@selection+"_huntingamount")+" ea.^000000":"Nothing^000000");
  165. mes "Zeny: ^0000FF"+getd("." +.@selection+"_huntingzeny")+"^000000";
  166. mes "Base EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+0+"]")+"^000000";
  167. mes "Job EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+1+"]")+"^000000";
  168. next;
  169. if(select("Accept:Decline") == 2){
  170. close;
  171. }
  172. if(BaseLevel >= getd("." +.@selection+"_huntingmin") && BaseLevel <= getd("." +.@selection+"_huntingmax")){
  173. mes "[^FF7700Questboard^000000]";
  174. mes "Quest accepted.";
  175. set h_run, true;
  176. set currentquest$, .@selection;
  177. close;
  178. }
  179. else{
  180. mes "[^FF7700Questboard^000000]";
  181. mes "You don't have the required";
  182. mes "level to do this quest.";
  183. close;
  184. }
  185. case 3:
  186. close;
  187. }
  188. L_checkitems:
  189. set .@size, getarraysize(getd("."+currentquest$+"_collectionitem"));
  190. for( set .@k,0; .@k < .@size; set .@k,.@k+2){
  191. if(countitem(getd("."+currentquest$+"_collectionitem["+.@k+"]"))>=getd("."+currentquest$+"_collectionitem["+(.@k+1)+"]")){
  192. set .@checkitem,.@checkitem+2;
  193. }
  194. }
  195. if(.@checkitem<.@size){
  196. mes "[^FF7700Questboard^000000]";
  197. mes "You don't have everything.";
  198. close;
  199. }
  200. for( set .@delcount,0; .@delcount < .@size; set .@delcount,.@delcount+2){
  201. delitem getd("."+currentquest$+"_collectionitem["+.@delcount+"]"),getd("."+currentquest$+"_collectionitem["+(.@delcount+1)+"]");
  202. }
  203. mes "[^FF7700Questboard^000000]";
  204. mes "Congratulation! Here is your Reward.";
  205. if(getd("." +currentquest$+"_collectionprize")!=0) getitem(getd("." +currentquest$+"_collectionprize"),getd("." +currentquest$+"_collectionamount"));
  206. set Zeny,Zeny+getd("." +currentquest$+"_collectionzeny");
  207. getexp getd("." +currentquest$+"_collectionexp["+0+"]"),getd("." +currentquest$+"_collectionexp["+1+"]");
  208. setd(currentquest$ + "_collection_delay"),gettimetick(2)+.quest_delay;
  209. setd(currentquest$ + "_collection_repeat"),true;
  210. set currentquest$, "";
  211. set c_run, false;
  212. close;
  213. L_checkmobs:
  214. set .@size, getarraysize(getd("."+currentquest$+"_huntingmob"));
  215. set .@goal, .@size/2;
  216. for(set .@i, 1; .@i < .@size; set .@i,.@i+2){
  217. set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]");
  218. if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")==getd("."+currentquest$+"_huntingmob["+.@i+"]")){
  219. set .@checkmonster, .@checkmonster+1;
  220. if(.@checkmonster==.@goal){
  221. goto L_checkmobs2;
  222. }
  223. continue;
  224. }
  225. goto L_checkmobs2;
  226. }
  227. L_checkmobs2:
  228. if(.@checkmonster<.@goal){
  229. mes "[^FF7700Questboard^000000]";
  230. mes "You didn't kill everything.";
  231. close;
  232. }
  233. mes "[^FF7700Questboard^000000]";
  234. mes "Congratulation! Here is your Reward.";
  235. set .@size, getarraysize(getd("."+currentquest$+"_huntingmob"));
  236. for(set .@x, 1; .@x < .@size; set .@x,.@x+2){
  237. set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@x-1)+"]");
  238. setd(currentquest$+"_"+.@currentmob+"_"+.@x+"_killcount", 0);
  239. }
  240. if(getd("." +currentquest$+"_huntingprize")!=0) getitem(getd("." +currentquest$+"_huntingprize"),getd("." +currentquest$+"_huntingamount"));
  241. set Zeny, Zeny+getd("." +currentquest$+"_huntingzeny");
  242. getexp getd("." +currentquest$+"_huntingexp["+0+"]"),getd("." +currentquest$+"_huntingexp["+1+"]");
  243. setd(currentquest$ + "_hunting_delay"),gettimetick(2)+.quest_delay;
  244. setd(currentquest$ + "_hunting_repeat"),true;
  245. set currentquest$, "";
  246. set h_run, false;
  247. close;
  248. OnNPCKillEvent:
  249. if(h_run!=true) end;
  250. set .@size, getarraysize(getd("."+currentquest$+"_huntingmob"));
  251. for(set .@i, 1; .@i < .@size; set .@i,.@i+2){
  252. if(killedrid==getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]")){
  253. set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]");
  254. if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")<getd("."+currentquest$+"_huntingmob["+.@i+"]")){
  255. setd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+1);
  256. dispbottom getd("."+currentquest$+"_huntingname$")+": ["+getmonsterinfo(.@currentmob, MOB_NAME)+"] ("+ getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+.@i+"]")+")";
  257. }
  258. if(getcharid(1) != 0 && .party_support == true){
  259. getmapxy(.@map1$,.@x1,.@y1);
  260. set .@killerid, getcharid(3);
  261. set .@currentquest$, currentquest$;
  262. getpartymember getcharid(1),1;
  263. getpartymember getcharid(1),2;
  264. for(set .@j, 0; .@j < $@partymembercount; .@j++){
  265. if(isloggedin($@partymemberaid[.@j], $@partymembercid[.@j])){
  266. if(h_run==true && $@partymemberaid[.@j] != .@killerid && .@currentquest$ == getvar(currentquest$, $@partymembercid[.@j]) && readparam(HP, $@partymembercid[.@j]) > 0){
  267. getmapxy(.@map2$,.@x2,.@y2,BL_PC,rid2name($@partymemberaid[.@j]));
  268. if(.@map1$ == .@map2$ && distance(.@x1,.@y1,.@x2,.@y2) < .party_range){
  269. set .@kill_amt,getvar(getd(.@currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount"), $@partymembercid[.@j]);
  270. set .@kill_goal,getd("."+.@currentquest$+"_huntingmob["+.@i+"]");
  271. if(.@kill_amt<.@kill_goal)
  272. {
  273. setd(.@currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", .@kill_amt+1, $@partymembercid[.@j]);
  274. dispbottom getd("."+.@currentquest$+"_huntingname$")+": ["+getmonsterinfo(.@currentmob, MOB_NAME)+"] ("+(.@kill_amt+1)+"/"+.@kill_goal+")", 0xB6FF00, $@partymembercid[.@j];
  275. }
  276. }
  277. }
  278. }
  279. }
  280. }
  281. break;
  282. }
  283. }
  284. end;
  285. OnInit:
  286. function AddCollection;
  287. function AddHunting;
  288. //Activate/Deactivate quest categories (true/1 - activated, false/0 - deactivated)
  289. set .collection, true;
  290. set .hunting, true;
  291. //Quest Delay (seconds)
  292. //24 hours = 86400 seconds
  293. set .quest_delay, 0;
  294. //Activate/Deactivate repeatable quests (true/1 - activated, false/0 - deactivated)
  295. set .quest_repeat, true;
  296. //Activate/Deactivate party support (true/1 - activated, false/0 - deactivated)
  297. set .party_support, true;
  298. //Max range for party support (+- x & y coordinations)
  299. set .party_range, 25;
  300. //Checks if quests are loaded (prevents out of index)
  301. if(.questsloaded==true) end;
  302. set .questsloaded, true;
  303. //Add Collection Quests here (You can add as many required items as you want)
  304. //AddCollection("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Item ID>,<Item Amount>,...);
  305. //Add Hunting Quests here (You can add as many required mobs as you want)
  306. //AddHunting("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Monster ID>,<Monster Amount>,...);
  307. end;
  308. function AddCollection{
  309. set .collectionquestcount,.collectionquestcount+1;
  310. setd ("." +.collectionquestcount+"_collectionname$", getarg(0));
  311. setd ("." +.collectionquestcount+"_collectionmin", getarg(1));
  312. setd ("." +.collectionquestcount+"_collectionmax", getarg(2));
  313. setd ("." +.collectionquestcount+"_collectionprize", getarg(3));
  314. setd ("." +.collectionquestcount+"_collectionamount", getarg(4));
  315. setd ("." +.collectionquestcount+"_collectionzeny", getarg(5));
  316. set .@argcount, 6;
  317. set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionexp"));
  318. setd ("." +.collectionquestcount+"_collectionexp["+.@size+"]",getarg(.@argcount));
  319. setd ("." +.collectionquestcount+"_collectionexp["+(.@size+1)+"]",getarg(.@argcount+1));
  320. set .@argcount, .@argcount+2;
  321. set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionitem"));
  322. while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1){
  323. setd ("."+.collectionquestcount+"_collectionitem["+.@size+"]",getarg(.@argcount));
  324. setd ("."+.collectionquestcount+"_collectionitem["+(.@size+1)+"]",getarg(.@argcount+1));
  325. set .@argcount,.@argcount+2;
  326. set .@size, .@size+2;
  327. }
  328. return;
  329. }
  330. function AddHunting{
  331. set .huntingquestcount,.huntingquestcount+1;
  332. setd ("." +.huntingquestcount+"_huntingname$", getarg(0));
  333. setd ("." +.huntingquestcount+"_huntingmin", getarg(1));
  334. setd ("." +.huntingquestcount+"_huntingmax", getarg(2));
  335. setd ("." +.huntingquestcount+"_huntingprize", getarg(3));
  336. setd ("." +.huntingquestcount+"_huntingamount", getarg(4));
  337. setd ("." +.huntingquestcount+"_huntingzeny", getarg(5));
  338. set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingexp"));
  339. set .@argcount, 6;
  340. setd ("." +.huntingquestcount+"_huntingexp["+.@size+"]",getarg(.@argcount));
  341. setd ("." +.huntingquestcount+"_huntingexp["+(.@size+1)+"]",getarg(.@argcount+1));
  342. set .@argcount, .@argcount+2;
  343. set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingmob"));
  344. while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1){
  345. setd ("."+.huntingquestcount+"_huntingmob["+.@size+"]",getarg(.@argcount));
  346. setd ("."+.huntingquestcount+"_huntingmob["+(.@size+1)+"]",getarg(.@argcount+1));
  347. set .@argcount, .@argcount+2;
  348. set .@size, .@size+2;
  349. }
  350. return;
  351. }
  352. }