Advertisement
Guest User

Untitled

a guest
Feb 15th, 2016
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 53.80 KB | None | 0 0
  1. - script mission_board -1,{
  2. .@gm_level = getgmlevel();
  3. .@npc_name$ = strnpcinfo(1);
  4. .@mission_npc_num = atoi( strnpcinfo(2) );
  5.  
  6. // check npc if it's a valid npc with number 1 ~ 500
  7. if( !.@mission_npc_num || .@mission_npc_num > 500 ){
  8. message strcharinfo(0),"This NPC isnt working, invalid <'"+strnpcinfo(2)+"'>";
  9. disablenpc strnpcinfo(0);
  10. end;
  11. }
  12.  
  13. // to assign offset index.
  14. .@mission_npc_num--;
  15. query_sql( "SELECT COUNT(`id`) FROM `mission_board` WHERE `npc_id` LIKE '%|"+.@mission_npc_num+"|%' ",.@mission_count );
  16. query_sql( "SELECT `id`,`mission_id`,`mob_hunt`,`expire` FROM `player_mission` WHERE `mission_id` IN ( SELECT `id` FROM `mission_board` WHERE `npc_id` LIKE '%|"+.@mission_npc_num+"|%' ) AND `cid` = "+getcharid(0)+" AND `completion` = '0000-00-00 00:00:00' ",.@id,.@mission_id,.@mob_hunt$,.@expire );
  17. .@current_mission_size = getarraysize( .@id );
  18.  
  19. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  20. mes "A mission board may provide various missions for adventures. Each players may pick ";
  21. mes " ^FF0000"+.max_mission_per_char+" missions^000000";
  22. mes "from each mission npc.";
  23. next;
  24. switch( select( ( .@current_mission_size )?"Submit Mission":"",
  25. ( .@current_mission_size < .max_mission_per_char )?"Pick Mission":"",
  26. ( .@current_mission_size )?"Drop Mission":"",
  27. ( .@gm_level < .gm_level || !.@mission_count )?"":"^FF0000[GM] Update Mission^000000",
  28. ( .@gm_level < .gm_level )?"":"^FF0000[GM] Setup Mission^000000",
  29. ( .@gm_level < .gm_level || !.@mission_count )?"":"^FF0000[GM] Delete Mission^000000" ) ){
  30. case 1:
  31. .@current_time = gettimetick(2);
  32. query_sql( "SELECT `id`,`title`,`min_lv`,`max_lv` FROM `mission_board` WHERE `npc_id` LIKE '%|"+.@mission_npc_num+"|%' AND `id` IN ( SELECT `mission_id` FROM `player_mission` WHERE `cid` = "+getcharid(0)+" AND `completion` = '0000-00-00 00:00:00' )",.@mission_id,.@title$,.@min_lv,.@max_lv );
  33. .@size = getarraysize( .@mission_id );
  34. for( .@i = 0; .@i < .@size; .@i++ ){
  35. if( .@expire[.@i] && .@expire[.@i] < .@current_time )
  36. .@submit_menu$ = .@submit_menu$ + "^FF0000[Expired]^000000";
  37. .@submit_menu$ = .@submit_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
  38. }
  39. .@i = select( .@submit_menu$ ) - 1;
  40.  
  41. if( .@expire[.@i] && .@expire[.@i] < .@current_time ){
  42. dispbottom " ~ Mission expired "+callsub( OnTime2Str,( gettimetick(2) + ( .@current_time - .@expire[.@i] ) ) )+" ago.";
  43. dispbottom " ~ You may drop this mission.";
  44. close;
  45. }
  46.  
  47. // get mission data from sql
  48. query_sql( "SELECT * FROM `mission_board` WHERE `id` = "+.@mission_id[.@i]+" LIMIT 1",
  49. .@mission_id,
  50. .@title$,
  51. .@description$,
  52. .@mob_list$,
  53. .@mob_qty$,
  54. .@item_list$,
  55. .@item_qty$,
  56. .@base_job_bitmask,
  57. .@job_branch_bitmask,
  58. .@min_lv,
  59. .@max_lv,
  60. .@repeatable,
  61. .@timelimit,
  62. .@reward_list$,
  63. .@reward_qty$,
  64. .@baseexp,
  65. .@jobexp,
  66. .@zeny,
  67. .@cash,
  68. .@aid,
  69. .@name$,
  70. .@time_update$,
  71. .@npc_id$,
  72. .@redo_delay
  73. );
  74.  
  75. // explode all saved strings to array value.
  76. .@monster_size = callsub( OnExplodeArray,.@mob_list$,.@monster_list,0 );
  77. if( .@monster_size )
  78. callsub( OnExplodeArray,.@mob_qty$,.@monster_qty,0 );
  79.  
  80. .@item_size = callsub( OnExplodeArray,.@item_list$,.@item_list,0 );
  81. if( .@item_size )
  82. callsub( OnExplodeArray,.@item_qty$,.@item_qty,0 );
  83.  
  84. .@reward_size = callsub( OnExplodeArray,.@reward_list$,.@reward_list,0 );
  85. if( .@reward_size )
  86. callsub( OnExplodeArray,.@reward_qty$,.@reward_qty,0 );
  87.  
  88. .@selected_npc_size = callsub( OnExplodeArray,.@npc_id$,.@selected_npc_array$,1 );
  89.  
  90. setarray .@level_range,.@min_lv,.@max_lv;
  91.  
  92. // display the information of mission
  93. .@result = callsub( OnDisplayMissionInfo,
  94. .@mission_id,
  95. .@title$,
  96. .@description$,
  97. .@level_range,
  98. .@repeatable,
  99. .@expire[.@i],
  100. .@monster_list,
  101. .@monster_qty,
  102. .@item_list,
  103. .@item_qty,
  104. .@base_job_bitmask,
  105. .@job_branch_bitmask,
  106. .@baseexp,
  107. .@jobexp,
  108. .@cash,
  109. .@zeny,
  110. .@reward_list,
  111. .@reward_qty,
  112. .@selected_npc_array$,
  113. .@time_update$,
  114. .@redo_delay,
  115. 1|2|4|8
  116. );
  117.  
  118. // submit mission or not
  119. if( .@result ){
  120. message strcharinfo(0),"Failed to submit this mission.";
  121. }else{
  122. next;
  123. if( select( "Submit Completed Mission","Cancel" ) == 1 ){
  124. for( .@ms = ( @ms_size - 1 ); .@ms >= 0; .@ms-- )
  125. if( @ms_list$[.@ms] == ""+.@mission_id ){
  126. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  127. query_sql( "UPDATE `player_mission` SET `completion` = NOW() WHERE `cid` = "+getcharid(0)+" AND `mission_id` = "+.@mission_id +" AND `completion` = '0000-00-00 00:00:00'" );
  128. mes "Mission accomplished.";
  129. @ms_size--;
  130.  
  131. // clear requirement.
  132. setd( "@ms_"+.@mission_id+"_expire" ),0;
  133. deletearray getd( "@ms_"+.@mission_id+"_list" );
  134. deletearray getd( "@ms_"+.@mission_id+"_qty" );
  135. deletearray getd( "@ms_"+.@mission_id+"_hunt" );
  136. if( .@item_size )
  137. for( .@i = 0; .@i < .@item_size; .@i++ ){
  138. // debugmes getitemname( .@item_list[.@i] )+" - "+.@item_qty[.@i];
  139. delitem .@item_list[.@i],.@item_qty[.@i];
  140. }
  141.  
  142. mes "Gained some mission's rewards.";
  143. // rewards
  144. getexp .@baseexp,.@jobexp;
  145. if( .@reward_size )
  146. for( .@i = 0; .@i < .@reward_size; .@i++ )
  147. getitem .@reward_list[.@i],.@reward_qty[.@i];
  148. #CASHPOINTS += .@cash;
  149. Zeny += .@zeny;
  150. break;
  151. }
  152. mes "Something went wrong ..";
  153. }
  154. }
  155. break;
  156. case 2:
  157. // get info from SQL.
  158. do{
  159. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  160. deletearray .@id;
  161. query_sql( "SELECT `id`,`title`,`min_lv`,`max_lv` FROM `mission_board` WHERE `npc_id` LIKE '%|"+.@mission_npc_num+"|%' AND `id` NOT IN ( SELECT `mission_id` FROM `player_mission` WHERE `cid` = "+getcharid(0)+" AND `completion` = '0000-00-00 00:00:00' ) LIMIT "+.max_page_size+" OFFSET "+.@offset,.@id,.@title$,.@min_lv,.@max_lv );
  162. .@offset += .max_page_size;
  163. .@size = getarraysize( .@id );
  164. if( !.@size ){
  165. mes "There are no other available missions to pick.";
  166. close;
  167.  
  168. }else{
  169. mes "Pick a mission.";
  170. .@mission_menu$ = "";
  171. for( .@i = 0; .@i < .@size; .@i++ )
  172. .@mission_menu$ = .@mission_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
  173. }
  174. next;
  175. .@i = select( .@mission_menu$+ ( ( .@size < .max_page_size )?"":"- next page" ) ) - 1;
  176. }while( .@i == .@size );
  177.  
  178. query_sql( "SELECT * FROM `mission_board` WHERE `id` = "+.@id[.@i]+" LIMIT 1",
  179. .@mission_id,
  180. .@title$,
  181. .@description$,
  182. .@mob_list$,
  183. .@mob_qty$,
  184. .@item_list$,
  185. .@item_qty$,
  186. .@base_job_bitmask,
  187. .@job_branch_bitmask,
  188. .@min_lv,
  189. .@max_lv,
  190. .@repeatable,
  191. .@timelimit,
  192. .@reward_list$,
  193. .@reward_qty$,
  194. .@baseexp,
  195. .@jobexp,
  196. .@zeny,
  197. .@cash,
  198. .@aid,
  199. .@name$,
  200. .@time_update$,
  201. .@npc_id$,
  202. .@redo_delay
  203. );
  204.  
  205. // explode all saved strings to array value.
  206. .@monster_size = callsub( OnExplodeArray,.@mob_list$,.@monster_list,0 );
  207. .@monster_size = callsub( OnExplodeArray,.@mob_qty$,.@monster_qty,0 );
  208.  
  209. .@item_size = callsub( OnExplodeArray,.@item_list$,.@item_list,0 );
  210. .@item_size = callsub( OnExplodeArray,.@item_qty$,.@item_qty,0 );
  211.  
  212. .@reward_size = callsub( OnExplodeArray,.@reward_list$,.@reward_list,0 );
  213. .@reward_size = callsub( OnExplodeArray,.@reward_qty$,.@reward_qty,0 );
  214.  
  215. .@selected_npc_size = callsub( OnExplodeArray,.@npc_id$,.@selected_npc_array$,1 );
  216.  
  217. setarray .@level_range,.@min_lv,.@max_lv;
  218.  
  219. // display the information of mission
  220. .@result = callsub( OnDisplayMissionInfo,
  221. .@mission_id,
  222. .@title$,
  223. .@description$,
  224. .@level_range,
  225. .@repeatable,
  226. ( .@timelimit + gettimetick(2) ),
  227. .@monster_list,
  228. .@monster_qty,
  229. .@item_list,
  230. .@item_qty,
  231. .@base_job_bitmask,
  232. .@job_branch_bitmask,
  233. .@baseexp,
  234. .@jobexp,
  235. .@cash,
  236. .@zeny,
  237. .@reward_list,
  238. .@reward_qty,
  239. .@selected_npc_array$,
  240. .@time_update$,
  241. .@redo_delay,
  242. 1|8
  243. );
  244.  
  245. // check completed how many times.
  246. if ( .@repeatable ) {
  247. query_sql "select count(id) from player_mission where mission_id = "+ .@id[.@i] +" and completion != '0000-00-00 00:00:00' and cid = "+ getcharid(0), .@mission_completed;
  248. if( .@mission_completed >= .@repeatable ) {
  249. next;
  250. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  251. mes " ";
  252. mes "You cant pick this mission, you have mission completion reach the max repeatable attempt of "+.@mission_completed+" times.";
  253. close;
  254. }
  255. }
  256.  
  257. if ( .@redo_delay ) {
  258. query_sql "select timestampdiff( hour, completion, now() ), unix_timestamp( date_add( completion, interval "+ .@redo_delay +" hour ) ) from player_mission where cid = "+ getcharid(0) +" and mission_id = "+ .@id[.@i] +" order by completion desc limit 1", .@diff_delay, .@deny_time;
  259. if ( .@diff_delay < .@redo_delay ) {
  260. next;
  261. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  262. mes " ";
  263. mes "You cant pick this mission, you have mission redo delay isnt finish yet.";
  264. mes "^FF0000"+ callfunc( "Time2Str", .@deny_time ) +"^000000";
  265. close;
  266. }
  267. }
  268.  
  269. if( .@result ){
  270. message strcharinfo(0),"Failed to pick this mission.";
  271. }else{
  272. if( select( "Pick Mission","Cancel" ) == 1 ){
  273. query_sql( "INSERT INTO `player_mission` VALUES ( "+gettimetick(2)+","+.@mission_id+","+getcharid(3)+","+getcharid(0)+",'"+escape_sql( strcharinfo(0) )+"','',"+( ( .@timelimit )? ( .@timelimit + gettimetick(2) ) : 0 )+",NOW(),'0000-00-00 00:00:00' );" );
  274. message strcharinfo(0),"Picked Mission # "+.@mission_id;
  275.  
  276. @ms_list$[ @ms_size ] = ""+.@mission_id;
  277. @ms_size++;
  278.  
  279. copyarray getd( "@ms_"+.@mission_id+"_list[0]" ),.@monster_list[0],.@monster_size;
  280. copyarray getd( "@ms_"+.@mission_id+"_qty[0]" ),.@monster_qty[0],.@monster_size;
  281. deletearray getd( "@ms_"+.@mission_id+"_hunt" );
  282. if ( .@timelimit ) {
  283. setd( "@ms_"+.@mission_id+"_expire" ),( .@timelimit + gettimetick(2) );
  284. addtimer ( .@timelimit * 1000 ),.npc_name$+"::OnTimeCheck";
  285. }
  286. }
  287. }
  288. break;
  289. case 3:
  290. query_sql( "SELECT `id`,`title`,`min_lv`,`max_lv` FROM `mission_board` WHERE `npc_id` LIKE '%|"+.@mission_npc_num+"|%' AND `id` IN ( SELECT `mission_id` FROM `player_mission` WHERE `cid` = "+getcharid(0)+" AND `completion` = '0000-00-00 00:00:00' )",.@id,.@title$,.@min_lv,.@max_lv );
  291. .@id_size = getarraysize( .@id );
  292. for( .@i = 0; .@i < .@id_size; .@i++ )
  293. .@mission_menu$ = .@mission_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
  294. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  295. mes "Pick a Mission to remove.";
  296. next;
  297. .@i = select( .@mission_menu$ ) - 1;
  298. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  299. mes "Confirm remove ^0055FFMission # "+.@id[.@i]+"^000000?";
  300. mes "Title : ^0055FF"+.@title$[.@i]+"^000000";
  301. mes "^777777( this cant be un-done )^000000";
  302. if( select( "nope","Confirm" ) == 2 ){
  303. message strcharinfo(0),"Dropped Mission # "+.@id[.@i];
  304. query_sql( "DELETE FROM `player_mission` WHERE `mission_id` = "+.@id[.@i]+" AND `cid` = "+getcharid(0)+" AND `completion` = '0000-00-00 00:00:00'" );
  305. setd( "@ms_"+.@id[.@i]+"_expire" ),0;
  306. deletearray getd( "@ms_"+.@id[.@i]+"_list" );
  307. deletearray getd( "@ms_"+.@id[.@i]+"_qty" );
  308. deletearray getd( "@ms_"+.@id[.@i]+"_hunt" );
  309. for( .@ms = 0; .@ms < @ms_size; .@ms++ )
  310. if( ""+.@id[.@i] == @ms_list$[.@ms] ){
  311. deletearray @ms_list$[.@ms],1;
  312. @ms_size--;
  313. break;
  314. }
  315. }
  316. break;
  317. case 4:
  318. // get info from SQL.
  319. do{
  320. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  321. deletearray .@id;
  322. query_sql( "SELECT `id`,`title`,`min_lv`,`max_lv` FROM `mission_board` WHERE `npc_id` LIKE '%|"+.@mission_npc_num+"|%' LIMIT "+.max_page_size+" OFFSET "+.@offset,.@id,.@title$,.@min_lv,.@max_lv );
  323. .@offset += .max_page_size;
  324. .@size = getarraysize( .@id );
  325. if( !.@size ){
  326. mes "There are no available mission to update.";
  327. close;
  328.  
  329. }else{
  330. mes "Pick a mission.";
  331. .@mission_menu$ = "";
  332. for( .@i = 0; .@i < .@size; .@i++ )
  333. .@mission_menu$ = .@mission_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
  334. }
  335. next;
  336. .@i = select( .@mission_menu$+ ( ( .@size < .max_page_size )?"":"- next page" ) ) - 1;
  337. }while( .@i == .@size );
  338. query_sql( "SELECT * FROM `mission_board` WHERE `id` = "+.@id[.@i],
  339. .@new_mission_id,
  340. .@title$,
  341. .@description$,
  342. .@mob_list$,
  343. .@mob_qty$,
  344. .@item_list$,
  345. .@item_qty$,
  346. .@base_job_bitmask,
  347. .@job_branch_bitmask,
  348. .@min_lv,
  349. .@max_lv,
  350. .@repeatable,
  351. .@timelimit,
  352. .@reward_list$,
  353. .@reward_qty$,
  354. .@baseexp,
  355. .@jobexp,
  356. .@zeny,
  357. .@cash,
  358. .@aid,
  359. .@name$,
  360. .@time_update$,
  361. .@npc_id$,
  362. .@redo_delay
  363. );
  364. // explode all saved strings to array value.
  365. .@monster_size = callsub( OnExplodeArray,.@mob_list$,.@monster_list,0 );
  366. .@monster_size = callsub( OnExplodeArray,.@mob_qty$,.@monster_qty,0 );
  367.  
  368. .@item_size = callsub( OnExplodeArray,.@item_list$,.@item_list,0 );
  369. .@item_size = callsub( OnExplodeArray,.@item_qty$,.@item_qty,0 );
  370.  
  371. .@reward_size = callsub( OnExplodeArray,.@reward_list$,.@reward_list,0 );
  372. .@reward_size = callsub( OnExplodeArray,.@reward_qty$,.@reward_qty,0 );
  373.  
  374. .@selected_npc_size = callsub( OnExplodeArray,.@npc_id$,.@selected_npc_array$,1 );
  375.  
  376. setarray .@level_range,.@min_lv,.@max_lv;
  377.  
  378. case 5:
  379. do{
  380. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  381. // display the information of mission
  382. callsub( OnDisplayMissionInfo,
  383. .@new_mission_id,
  384. .@title$,
  385. .@description$,
  386. .@level_range,
  387. .@repeatable,
  388. ( .@timelimit + gettimetick(2) ),
  389. .@monster_list,
  390. .@monster_qty,
  391. .@item_list,
  392. .@item_qty,
  393. .@base_job_bitmask,
  394. .@job_branch_bitmask,
  395. .@baseexp,
  396. .@jobexp,
  397. .@cash,
  398. .@zeny,
  399. .@reward_list,
  400. .@reward_qty,
  401. .@selected_npc_array$,
  402. .@time_update$,
  403. .@redo_delay,
  404. 0
  405. );
  406.  
  407. // check if required info complete for setup mission
  408. .@incomplete = 0;
  409. if( .@title$ == "" ) .@incomplete |= 1;
  410. if( .@description$ == "" ) .@incomplete |= 2;
  411. if( !.@monster_size && !.@item_size ) .@incomplete |= 4;
  412. if( getarraysize( .@level_range ) != 2 || !.@base_job_bitmask || !.@job_branch_bitmask ) .@incomplete |= 8;
  413. if( !.@reward_size && !.@baseexp && !.@jobexp && !.@cash && !.@zeny ) .@incomplete |= 16;
  414. if( !.@selected_npc_size ) .@incomplete |= 32;
  415.  
  416. .@main_option = select( "Edit Title "+(( .@incomplete & 1 )?"^FF0000-incomplete-^000000":"" ),
  417. "Edit Description "+(( .@incomplete & 2 )?"^FF0000-incomplete-^000000":"" ),
  418. "Edit Monster List "+(( .@incomplete & 4 )?"^FF0000-incomplete-^000000":( ( !.@monster_size )?"^777777-none-^000000":"" )),
  419. "Edit Item List "+(( .@incomplete & 4 )?"^FF0000-incomplete-^000000":( ( !.@item_size )?"^777777-none-^000000":"" )),
  420. "Edit Class/Level Limitation "+(( .@incomplete & 8 )?"^FF0000-incomplete-^000000":"" ),
  421. "Edit Time/Repeat/Mission Limitation ",
  422. "Edit Reward List "+(( .@incomplete & 16 )?"^FF0000-incomplete-^000000":"" ),
  423. "Edit NPC Limitation "+(( .@incomplete & 32 )?"^FF0000-incomplete-^000000":"" ),
  424. ( .@incomplete )?"":"^0055FF - Complete Setup Mission^000000" );
  425. next;
  426. switch( .@main_option ){
  427. case 1:
  428. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  429. mes "Enter Title";
  430. mes "^777777( Length: 4 ~ 30 )^000000";
  431. while( input( .@title$,4,30 ) );
  432. .@input_result = replacestr( .@title$,":"," " );
  433. break;
  434. case 2:
  435. .@description$ = "";
  436. do{
  437. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  438. mes "Enter Description";
  439. mes "^777777( Length: 4 ~ 255 )^000000";
  440. mes " ";
  441. mes "^0055FF"+.@description$+"^000000";
  442. .@length = getstrlen( .@description$ );
  443. do{
  444. .@input_result = input( .@temp_input$,4,255 );
  445. if( .@input_result )
  446. message strcharinfo(0),"Input length must between 4 ~ 255";
  447. }while( .@input_result );
  448. .@description$ = .@description$ + " "+ .@temp_input$;
  449. mes "^0055FF"+.@temp_input$+"^000000";
  450. .@length = getstrlen( .@description$ );
  451. next;
  452. }while( select( ( .@length >= 255 )?"":"add more ^777777( left "+( 255 - .@length )+" words )^000000","-back" ) == 1 );
  453. .@description$ = replacestr( .@description$,":"," " );
  454. break;
  455. case 3:
  456. if( .@new_mission_id ){
  457. dispbottom "Editing monster list might caused unwanted behaviours of scripts. Which may included :";
  458. dispbottom " > Script/Missions isnt working properly.";
  459. dispbottom " > Deletion of player mission's progress.";
  460. dispbottom " > etc.";
  461. dispbottom "Overall it's not suggested to edit monster list that you have set early.";
  462. dispbottom "( Recommend for Re-Adding mission, if needed )";
  463. }
  464. do{
  465. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  466. mes "Monster List:";
  467. if( .@monster_size ){
  468. .@mob_menu$ = "";
  469. .@current_mob_list$ = "|";
  470. deletearray .@current_mob$;
  471. for( .@i = 0; .@i < .@monster_size; .@i++ ){
  472. .@mob_name$ = getmonsterinfo( .@monster_list[.@i],MOB_NAME );
  473. .@mob_menu$ = .@mob_menu$ + .@monster_qty[.@i] +" x "+.@mob_name$ +":";
  474. mes " ^777777 ~ "+.@monster_qty[.@i]+" x "+.@mob_name$+"^000000";
  475. .@current_mob_list$ = .@current_mob_list$ + .@monster_list[.@i] +"|";
  476. }
  477.  
  478. }else{
  479. mes " ^777777 ~ none ^000000";
  480. }
  481. mes " ";
  482. .@option = select( ( .@monster_size >= .max_required_monster )?"":"Add Monster",( .@monster_size )?"Delete Monster":"","- Back" );
  483. switch( .@option ){
  484. case 1:
  485. mes "Enter Monster ID";
  486. do{
  487. input .@mob_id;
  488. if( !.@mob_id ) break;
  489. .@mob_name$ = getmonsterinfo( .@mob_id,MOB_NAME );
  490. }while( .@mob_name$ == "null" );
  491. if( .@mob_name$ != "null" && .@mob_id ){
  492. mes "How many "+.@mob_name$+" need to hunt ?";
  493. input .@amount,0,30000;
  494. if( .@amount ){
  495. if( compare( "|"+.@current_mob_list$+"|","|"+.@mob_id+"|" ) ){
  496. for( .@i = 0; .@i < .@monster_size; .@i++ )
  497. if( .@monster_list[.@i] == .@mob_id ){
  498. .@monster_qty[.@i] += .@amount;
  499. break;
  500. }
  501.  
  502. }else{
  503. .@monster_list[.@monster_size] = .@mob_id;
  504. .@monster_qty[.@monster_size] = .@amount;
  505. .@monster_size++;
  506. }
  507. }
  508. }
  509. break;
  510. case 2:
  511. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  512. mes "Pick a Monster to Remove.";
  513. .@i = select( .@mob_menu$+"- Back" ) - 1;
  514. if( .@i < .@monster_size ){
  515. deletearray .@monster_list[.@i],1;
  516. deletearray .@monster_qty[.@i],1;
  517. .@monster_size--;
  518. }
  519. default: break;
  520. }
  521. if( .@option < 3 ) next;
  522. }while( .@option < 3 );
  523. break;
  524. case 4:
  525. do{
  526. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  527. mes "Required Item List: ";
  528. if( .@item_size ){
  529. .@item_menu$ = "";
  530. .@current_item_list$ = "|";
  531. deletearray .@current_item$;
  532. for( .@i = 0; .@i < .@item_size; .@i++ ){
  533. .@item_name$ = getitemname( .@item_list[.@i] );
  534. .@item_menu$ = .@item_menu$ + .@item_qty[.@i] +"x "+.@item_name$ +":";
  535. mes " ^777777 ~ "+.@item_qty[.@i]+" x "+.@item_name$+"^000000";
  536. .@current_item_list$ = .@current_item_list$ + .@item_list[.@i] + "|";
  537. }
  538.  
  539. }else{
  540. mes " ^777777 ~ none ^000000";
  541. }
  542. mes " ";
  543. .@option = select( ( .@item_size >= .max_required_item )?"":"Add Item",( .@item_size )?"Delete Item":"","- Back" );
  544. switch( .@option ){
  545. case 1:
  546. do{
  547. input .@item_id;
  548. if( !.@item_id ) break;
  549. .@item_name$ = getitemname( .@item_id );
  550. }while( .@item_name$ == "null" || .@item_name$ == "" );
  551. if( .@item_id && .@item_name$ != "null" && .@item_name$ != "" ){
  552. mes "How many "+.@item_name$+" need to collect ?";
  553. input .@amount,0,30000;
  554. if( .@amount ){
  555. if( compare( "|"+.@current_item_list$+"|","|"+.@item_id+"|" ) ){
  556. for( .@i = 0; .@i < .@item_size; .@i++ )
  557. if( .@item_list[.@i] == .@item_id ){
  558. .@item_qty[.@i] += .@amount;
  559. break;
  560. }
  561. }else{
  562. .@item_list[.@item_size] = .@item_id;
  563. .@item_qty[.@item_size] = .@amount;
  564. .@item_size++;
  565. }
  566. }
  567. }
  568. break;
  569. case 2:
  570. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  571. mes "Pick an Item to Remove.";
  572. .@i = select( .@item_menu$+" - Back" ) - 1;
  573. if( .@i < .@item_size ){
  574. mes "Removed "+.@item_qty[.@i]+" x "+getitemname( .@item_list[.@i] );
  575. deletearray .@item_list[.@i],1;
  576. deletearray .@item_qty[.@i],1;
  577. .@item_size--;
  578. }
  579. default: break;
  580. }
  581. if( .@option < 3 ) next;
  582. }while( .@option < 3 );
  583. break;
  584. case 5: // class limitation
  585. if( !.@base_job_bitmask ){
  586. // enable all job by default.
  587. for( .@i = 0; .@i < .base_job_size; .@i++ ){
  588. .@bitmask_value = ( 1 << .@i );
  589. .@base_job_bitmask |= .@bitmask_value;
  590. }
  591. // enable all inherited classes by default.
  592. for( .@i = 0; .@i < .job_branch_size; .@i++ ){
  593. .@bitmask_value = ( 1 << .@i );
  594. .@job_branch_bitmask |= .@bitmask_value;
  595. }
  596. }
  597.  
  598. do{
  599. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  600. mes "Level Range : "+( ( .@level_range[1] )? "^777777"+.@level_range[0]+" ~ "+.@level_range[1]:"^FF0000-incomplete-" )+"^000000";
  601. mes "Available Job Setting";
  602. if( .@base_job_bitmask ){
  603. for( .@i = 0; .@i < .base_job_size; .@i++ )
  604. if( .@base_job_bitmask & ( 1 << .@i ) )
  605. mes " ^777777 ~ "+jobname( roclass( .base_job[.@i] ) )+" ^000000";
  606. }else{
  607. mes " ^FF0000 -incomplete-^000000";
  608. }
  609. mes " ";
  610. mes "Inherited Branch Setting";
  611. if( .@job_branch_bitmask ){
  612. for( .@i = 0; .@i < .job_branch_size; .@i++ )
  613. if( .@job_branch_bitmask & ( 1 << .@i ) )
  614. mes " ^777777 ~ "+.job_branch_name$[.@i]+" ^000000";
  615. }else{
  616. mes " ^FF0000 -incomplete-^000000";
  617. }
  618. next;
  619. .@option = select( "Edit Base Job","Edit Job Branch","Edit Level Range","- Back" );
  620. switch( .@option ){
  621. case 1:
  622. dispbottom "[ Base Job Class ] RED = Disable , GREEN = Enable";
  623. do{
  624. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  625. mes "Available Job List:";
  626. .@base_job_menu$ = "";
  627. for( .@i = 0; .@i < .base_job_size; .@i++ ){
  628. .@job_name$ = jobname( roclass( .base_job[.@i] ) );
  629. if( .@base_job_bitmask & ( 1 << .@i ) )
  630. mes " ^777777 ~ "+.@job_name$+" ^000000";
  631. .@base_job_menu$ = .@base_job_menu$ + (( .@base_job_bitmask & ( 1 << .@i ) )?"^4EEE94":"^FF0000" ) + .@job_name$ +"^000000:";
  632. }
  633. next;
  634. .@i = select( .@base_job_menu$+"- Back" ) - 1;
  635. if( .@i < .base_job_size ){
  636. .@bitmask_value = ( 1 << .@i );
  637. if( .@base_job_bitmask & .@bitmask_value )
  638. .@base_job_bitmask -= .@bitmask_value;
  639. else
  640. .@base_job_bitmask |= .@bitmask_value;
  641. }
  642. }while( .@i < .base_job_size );
  643. break;
  644. case 2:
  645. dispbottom "[ Inherited Job Branch ] RED = Disable , GREEN = Enable";
  646. do{
  647. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  648. mes "Inherited Job Branch List:";
  649. .@job_branch_menu$ = "";
  650. for( .@i = 0; .@i < .job_branch_size; .@i++ ){
  651. if( .@job_branch_bitmask & ( 1 << .@i ) )
  652. mes " ^777777 ~ "+.job_branch_name$[.@i]+" ^000000";
  653. .@job_branch_menu$ = .@job_branch_menu$ + (( .@job_branch_bitmask & ( 1 << .@i ) )?"^4EEE94":"^FF0000" ) + .job_branch_name$[.@i] +"^000000:";
  654. }
  655. next;
  656. .@i = select( .@job_branch_menu$+"- Back" ) - 1;
  657. if( .@i < .job_branch_size ){
  658. .@bitmask_value = ( 1 << .@i );
  659. if( .@job_branch_bitmask & .@bitmask_value )
  660. .@job_branch_bitmask -= .@bitmask_value;
  661. else
  662. .@job_branch_bitmask |= .@bitmask_value;
  663. }
  664. }while( .@i < .job_branch_size );
  665. break;
  666. case 3:
  667. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  668. mes "Minimum Level";
  669. input .@level_range[0],1,.server_max_level ;
  670. mes "Maximum Level";
  671. input .@level_range[1],.@level_range[0],.server_max_level;
  672. default: break;
  673. }
  674. if( .@option < 4 ) next;
  675. }while( .@option < 4 );
  676. break;
  677. case 6: // mission limitation
  678. do{
  679. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  680. mes "Repeatable: ^777777"+( ( !.@repeatable )?"unlimit":""+.@repeatable )+" time^000000";
  681. mes "Redo Delay: ^777777"+( ( !.@redo_delay )?"none":callsub( OnTime2Str,( ( .@redo_delay * 3600 ) + gettimetick(2) ) ))+"^000000";
  682. mes "Time Limit: ^777777"+( ( !.@timelimit )?"none":callsub( OnTime2Str,( .@timelimit + gettimetick(2) ) ) )+"^000000";
  683. .@option = select( "Edit Repeatable Status","Edit Time Limit","Edit Re-do Delay","Edit Required Mission","- Back" );
  684. switch( .@option ){
  685. case 1:
  686. mes "How many time can this mission repeat ??";
  687. mes "^777777( 0 = unlimited )^000000";
  688. input .@repeatable,0,100;
  689. break;
  690. case 2:
  691. mes "Time Limit of mission";
  692. mes " 1 = 1 minute";
  693. mes " 60 = 1 hour";
  694. mes "1440 = 1 day";
  695. input .@timelimit,0,50000;
  696. .@timelimit *= 60;
  697. break;
  698. case 3:
  699. mes "Time Delay to re-take the mission";
  700. mes " 1 = 1 hour";
  701. mes " 24 = 1 day";
  702. mes " 720 = 30 day";
  703. input .@redo_delay,0,50000;
  704. break;
  705. case 4:
  706. mes "This is not fully implemented yet.. still in beta test";
  707. break;
  708.  
  709. do{
  710. mes "Required Mission:";
  711. if( .@required_mission_size ){
  712. for( .@i = 0; .@i < .@required_mission_size; .@i++ ){
  713. mes " ^777777 ~ "+.@required_mission$[.@i]+"^000000";
  714. .@required_mission_menu$ = .@required_mission_menu$ + .@required_mission$[.@i] +":";
  715. }
  716.  
  717. }else{
  718. mes "^777777 none ^000000";
  719. }
  720. next;
  721. .@sub_option = select( ( .@required_mission_size < .max_required_mission )?"Add required mission":"",
  722. ( .@required_mission_size )?"Remove required mission":"",
  723. "- Back");
  724. switch( .@sub_option ){
  725. case 1:
  726. mes "Enter mission ID";
  727. mes "^777777( enter 0 to cancel )^000000";
  728. do{
  729. input .@mission_id$;
  730. if( .@mission_id$ == "0" ) break;
  731. }while( compare( "|"+.@required_mission_menu$+"|","|"+.@mission_id$+"|" ) );
  732. .@mission_id$ = replacestr( .@mission_id$,":","" );
  733. if( .@mission_id$ != "0" ){
  734. .@required_mission$[.@required_mission_size] = .@mission_id$;
  735. .@required_mission_size++;
  736. }
  737. break;
  738. case 2:
  739. mes "Select a mission to remove.";
  740. .@i = select( .@required_mission_menu$ ) - 1;
  741. deletearray .@required_mission$[.@i],1;
  742. default: break;
  743. }
  744. }while( .@sub_option < 3 );
  745. default: break;
  746. }
  747. if( .@option < 5 ) next;
  748. }while( .@option < 5 );
  749. break;
  750. case 7: // reward list
  751. do{
  752. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  753. mes " ";
  754. mes "Cash : ^777777"+( ( .@cash )? .@cash:"none" )+"^000000";
  755. mes "Zeny : ^777777"+( ( .@zeny )? .@zeny:"none" )+"^000000";
  756. mes "Reward Item List: ";
  757. if( .@reward_size ){
  758. .@reward_menu$ = "";
  759. deletearray .@current_reward$;
  760. for( .@i = 0; .@i < .@reward_size; .@i++ ){
  761. .@reward_name$ = getitemname( .@reward_list[.@i] );
  762. .@reward_menu$ = .@item_menu$ + .@reward_qty[.@i] +"x "+.@reward_name$ +":";
  763. .@current_reward$[.@i] = .@reward_name$;
  764. mes " ^777777 ~ "+.@reward_qty[.@i]+" x "+.@reward_name$+"^000000";
  765. }
  766. .@current_reward_list$ = implode( .@current_reward$,"|" );
  767.  
  768. }else{
  769. mes " ^777777 ~ none ^000000";
  770. }
  771. mes "Base EXP : ^777777"+( ( .@baseexp )? .@baseexp:"none" )+"^000000";
  772. mes "Job EXP : ^777777"+( ( .@jobexp )? .@jobexp:"none" )+"^000000";
  773. mes " ";
  774. next;
  775. .@option = select( ( .@reward_size >= .max_required_item )?"":"Add Item Reward",
  776. ( .@reward_size )?"Delete Item Reward":"",
  777. "Edit Cash Reward",
  778. "Edit Zeny Reward",
  779. "Edit Base EXP Reward",
  780. "Edit Job EXP Reward",
  781. "- Back" );
  782. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  783. switch( .@option ){
  784. case 1:
  785. mes "Enter Reward Item ID";
  786. do{
  787. input .@reward_id;
  788. if( !.@reward_id ) break;
  789. .@reward_name$ = getitemname( .@reward_id );
  790. }while( .@reward_name$ == "null" || .@reward_name$ == "" );
  791. if( .@reward_id && .@reward_name$ != "null" && .@reward_name$ != "" ){
  792. mes "How many "+.@reward_name$+" will be rewarded ?";
  793. input .@amount,0,30000;
  794. if( .@amount ){
  795. if( compare( "|"+.@current_reward_list$+"|","|"+.@reward_name$+"|" ) ){
  796. for( .@i = 0; .@i < .@reward_size; .@i++ )
  797. if( .@reward_list[.@i] == .@item_id ){
  798. .@reward_qty[.@i] += .@amount;
  799. break;
  800. }
  801. }else{
  802. .@reward_list[.@reward_size] = .@reward_id;
  803. .@reward_qty[.@reward_size] = .@amount;
  804. .@reward_size++;
  805. }
  806. }
  807. }
  808. break;
  809. case 2:
  810. mes "Pick an Reward to Remove.";
  811. .@i = select( .@reward_menu$ ) - 1;
  812. mes "Removed "+.@reward_qty[.@i]+"x "+getitemname( .@reward_list[.@i] );
  813. deletearray .@reward_list[.@i],1;
  814. deletearray .@reward_qty[.@i],1;
  815. .@reward_size--;
  816. break;
  817. case 3:
  818. mes "How many Cash will be given ?";
  819. mes "^777777( value: 0 ~ "+.max_integer_value+" )^000000";
  820. input .@cash,0,.max_integer_value;
  821. break;
  822. case 4:
  823. mes "How many Zeny will be given ?";
  824. mes "^777777( value: 0 ~ "+.max_integer_value+" )^000000";
  825. input .@zeny,0,.max_integer_value;
  826. break;
  827. case 5:
  828. mes "How many Base EXP reward ?";
  829. mes "^777777( value: 0 ~ "+.max_integer_value+" )^000000";
  830. input .@baseexp,0,.max_integer_value;
  831. break;
  832. case 6:
  833. mes "How many Job EXP reward ?";
  834. mes "^777777( value: 0 ~ "+.max_integer_value+" )^000000";
  835. input .@jobexp,0,.max_integer_value;
  836. default: break;
  837. }
  838. next;
  839. }while( .@option < 7 );
  840. break;
  841. case 8: // npc limitation
  842. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  843. mes "By default, the mission will be available from each mission board npc ^FF0000unless you have specified which NPC may offer this mission.^000000";
  844. mes " ";
  845. mes "Just pick all the NPC that may offer this mission if you wish.";
  846. next;
  847. if( !getarraysize( .@selected_npc_array$ ) )
  848. for( .@i = 0; .@i < .mission_npc_count; .@i++ ){
  849. .@selected_npc_array$[.@i] = ""+.@i;
  850. .@selected_npc_size++;
  851. }
  852. dispbottom "[ NPC Limitation ] RED = Disable , GREEN = Enable";
  853.  
  854. do{
  855. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  856. mes "Mission offered by: ";
  857. .@selected_npc_menu$ = "";
  858. if( .@selected_npc_size >= 2 ){
  859. .@selected_npc$ = "|"+implode( .@selected_npc_array$,"|" )+"|";
  860. }else{
  861. .@selected_npc$ = "|"+.@selected_npc_array$+"|";
  862. }
  863. for( .@i = 0; .@i < .mission_npc_count; .@i++ ){
  864. getmapxy( .@map$,.@x,.@y,1,.npc_unique_list$[.@i] );
  865. .@sub_npc_name$ = ( ( compare( "|"+.@selected_npc$+"|","|"+.@i+"|" ) )?"^44EE00":"^FF0000" );
  866. .@sub_npc_name$ = .@sub_npc_name$ + .npc_name_list$[.@i];
  867. mes "^777777("+.@map$+") "+.@sub_npc_name$;
  868. .@selected_npc_menu$ = .@selected_npc_menu$ + .@sub_npc_name$ +":";
  869. }
  870. next;
  871. .@option = select( .@selected_npc_menu$+"^000000- Back" ) - 1;
  872. if( .@option < .mission_npc_count ){
  873. if( compare( "|"+.@selected_npc$+"|","|"+.@option+"|" ) )
  874. .@selected_npc_array$[.@option] = "";
  875. else
  876. .@selected_npc_array$[.@option] = ""+.@option;
  877. .@selected_npc_size = getarraysize( .@selected_npc_array$ );
  878. }
  879. // dispbottom "["+rand(10,99)+"] "+implode( .@selected_npc_array$,"|" );
  880. }while( .@option < .mission_npc_count );
  881. break;
  882. default: break;
  883. }
  884. next;
  885. }while( .@main_option < 9 );
  886.  
  887. // finalise all variable
  888. if( .@monster_size ){
  889. .@final_mob_list$ = "|";
  890. .@final_mob_qty$ = "|";
  891. for( .@i = 0; .@i < .@monster_size; .@i++ ){
  892. .@final_mob_list$ = .@final_mob_list$ + .@monster_list[.@i] +"|";
  893. .@final_mob_qty$ = .@final_mob_qty$ + .@monster_qty[.@i] +"|";
  894. }
  895. }
  896.  
  897. if( .@item_size ){
  898. .@final_item_list$ = "|";
  899. .@final_item_qty$ = "|";
  900. for( .@i = 0; .@i < .@item_size; .@i++ ){
  901. .@final_item_list$ = .@final_item_list$ + .@item_list[.@i] +"|";
  902. .@final_item_qty$ = .@final_item_qty$ + .@item_qty[.@i] +"|";
  903. }
  904. }
  905.  
  906. if( .@reward_size ){
  907. .@final_reward_list$ = "|";
  908. .@final_reward_qty$ = "|";
  909. for( .@i = 0; .@i < .@reward_size; .@i++ ){
  910. .@final_reward_list$ = .@final_reward_list$ + .@reward_list[.@i] +"|";
  911. .@final_reward_qty$ = .@final_reward_qty$ + .@reward_qty[.@i] +"|";
  912. }
  913. }
  914.  
  915. if( .@selected_npc_size ){
  916. .@final_npc_list$ = "|";
  917. for( .@i = 0; .@i < .@selected_npc_size; .@i++ )
  918. .@final_npc_list$ = .@final_npc_list$ + .@selected_npc_array$[.@i] +"|";
  919. }
  920.  
  921. if( !.@new_mission_id ){
  922. .@new_mission_id = gettimetick(2);
  923. message strcharinfo(0),"Mission # "+.@new_mission_id+" has been added.";
  924. }else{
  925. message strcharinfo(0),"Mission # "+.@new_mission_id+" has been updated.";
  926. // attach and inform other online players.
  927. callsub( OnRemoveMission,.@new_mission_id,"A GM updated Mission # "+.@new_mission_id );
  928. }
  929.  
  930. // add new mission into SQL
  931. query_sql(
  932. "REPLACE INTO `mission_board` VALUES ( " +
  933. .@new_mission_id+", " +
  934. "'"+escape_sql( .@title$ )+"', " +
  935. "'"+escape_sql( .@description$ )+"', " +
  936. "'"+escape_sql( .@final_mob_list$ )+"', " +
  937. "'"+escape_sql( .@final_mob_qty$ )+"', " +
  938. "'"+escape_sql( .@final_item_list$ )+"', " +
  939. "'"+escape_sql( .@final_item_qty$ )+"', " +
  940. .@base_job_bitmask+", " +
  941. .@job_branch_bitmask+", " +
  942. .@level_range[0]+", " +
  943. .@level_range[1]+", " +
  944. .@repeatable+", " +
  945. .@timelimit+", " +
  946. "'"+escape_sql( .@final_reward_list$ )+"', " +
  947. "'"+escape_sql( .@final_reward_qty$ )+"', " +
  948. .@baseexp+", " +
  949. .@jobexp+", " +
  950. .@zeny+", " +
  951. .@cash+", " +
  952. getcharid(3)+", " +
  953. "'"+escape_sql( strcharinfo(0) )+"', " +
  954. "NOW(), " +
  955. "'"+escape_sql( .@final_npc_list$ )+"', " +
  956. .@redo_delay +
  957. " ); "
  958. );
  959. break;
  960. case 6: // delete mission
  961. do{
  962. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  963. deletearray .@id;
  964. query_sql( "SELECT `id`,`title`,`min_lv`,`max_lv` FROM `mission_board` WHERE `npc_id` LIKE '%|"+.@mission_npc_num+"|%' LIMIT "+.max_page_size+" OFFSET "+.@offset,.@id,.@title$,.@min_lv,.@max_lv );
  965. .@offset += .max_page_size;
  966. .@size = getarraysize( .@id );
  967. if( !.@size ){
  968. mes "There are no available mission to update.";
  969. close;
  970.  
  971. }else{
  972. mes "Pick a mission.";
  973. for( .@i = 0; .@i < .@size; .@i++ )
  974. .@mission_menu$ = .@mission_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
  975. }
  976. next;
  977. .@i = select( .@mission_menu$+ ( ( .@size < .max_page_size )?"":"- next page" ) ) - 1;
  978. }while( .@i == .@size );
  979. .@mission_id = .@id[.@i];
  980. mes "^0055FF[ "+.@npc_name$+" ]^000000";
  981. mes "Are you sure to remove this mission ?";
  982. if( select( "nope","Delete Mission" ) == 2 ){
  983. query_sql( "DELETE FROM `mission_board` WHERE `id` = "+.@mission_id+" LIMIT 1" );
  984. mes "Removed mission from mission list.";
  985.  
  986. // attach other online players and remove the missions.
  987. callsub( OnRemoveMission,.@mission_id,"A GM removed Mission # "+.@mission_id );
  988. query_sql( "DELETE FROM `player_mission` WHERE `completion` = '0000-00-00 00:00:00' AND `mission_id` = "+.@mission_id );
  989. mes "Removed mission from all players.";
  990. }
  991. default: break;
  992. }
  993. close;
  994.  
  995. OnInit:
  996. initnpctimer "mission_board";
  997. // initialize settings
  998. if( strnpcinfo(0) == "mission_board" ){
  999.  
  1000. // gm level to access panel
  1001. .gm_level = 90;
  1002. // max no. of required monster
  1003. .max_required_monster = 10;
  1004. // max no. of required item
  1005. .max_required_item = 10;
  1006. // max no. of required mission ( un-implement yet )
  1007. .max_required_mission = 10;
  1008. // max no. of available mission
  1009. .max_mission_available = 50;
  1010. // max value of integer input
  1011. .max_integer_value = 2000000000;
  1012. // max amount of mission per page
  1013. .max_page_size = 30;
  1014. // max mission per npc take by character
  1015. .max_mission_per_char = 4;
  1016.  
  1017. // predefined values.
  1018. .npc_name$ = strnpcinfo(0);
  1019. .server_max_level = MAX_LEVEL;
  1020. setarray .base_job,
  1021. EAJ_SWORDMAN,
  1022. EAJ_MAGE,
  1023. EAJ_ARCHER,
  1024. EAJ_ACOLYTE,
  1025. EAJ_MERCHANT,
  1026. EAJ_THIEF,
  1027. EAJ_TAEKWON,
  1028. EAJ_GUNSLINGER,
  1029. EAJ_NINJA;
  1030. .base_job_size = getarraysize( .base_job );
  1031. setarray .job_branch_name$,
  1032. "2-1 Classes",
  1033. "2-2 Classes",
  1034. "Rebirth Classes",
  1035. "Baby Classes",
  1036. "Third Classes";
  1037. setarray .job_branch,
  1038. EAJL_2_1,
  1039. EAJL_2_2,
  1040. EAJL_UPPER,
  1041. EAJL_BABY,
  1042. EAJL_THIRD;
  1043. .job_branch_size = getarraysize( .job_branch );
  1044.  
  1045. bindatcmd "mission", strnpcinfo(0)+"::OnCommand";
  1046.  
  1047. }else{
  1048. // delay the process
  1049. .@num = atoi( strnpcinfo(2) );
  1050. if( .@num && .@num <= 500 && .mission_npc_count < 100 ){
  1051. sleep( .@num *10 + 10 );
  1052. .npc_name_list$[ .mission_npc_count ] = strnpcinfo(1);
  1053. .npc_unique_list$[ .mission_npc_count ] = strnpcinfo(0);
  1054. // debugmes "["+.mission_npc_count+"]"+.npc_name_list$[ .mission_npc_count ]+"|"+.npc_unique_list$[ .mission_npc_count ];
  1055. .mission_npc_count++;
  1056. end;
  1057.  
  1058. }else if( !.@num ){
  1059. debugmes "[Removed] "+strnpcinfo(0)+", invalid <num:'"+strnpcinfo(2)+"'>";
  1060. }else if( .mission_npc_count >= 100 ){
  1061. debugmes "[Skipped] "+strnpcinfo(0)+", max: 100 Total NPC.";
  1062. }
  1063. disablenpc strnpcinfo(0);
  1064. }
  1065. end;
  1066.  
  1067. // just used to display how many total Mission Board NPC.
  1068. OnTimer1000:
  1069. stopnpctimer;
  1070. debugmes "[ Mission Board ] Total NPC Loaded : "+.mission_npc_count+" ...";
  1071. end;
  1072.  
  1073. OnCommand:
  1074. if ( !strcmp( strnpcinfo(0), .npc_name$ ) ) {
  1075. if ( @ms_size ) {
  1076. for ( .@i = 0; .@i < @ms_size; .@i++ ) {
  1077. .@mob_size = getarraysize( getd( "@ms_"+ @ms_list$[.@i] +"_list" ) );
  1078. query_sql "select id, title, item_list, item_qty from mission_board where id = "+ @ms_list$[.@i], .@m_id, .@title$, .@item_id$, .@item_amount$;
  1079. if ( .@mob_size ) {
  1080. if ( getd( "@ms_"+ .@m_id +"_expire" ) )
  1081. dispbottom "[Mission '"+ .@title$ +"' Progress] Time limit -> "+ callfunc( "Time2Str", getd( "@ms_"+ .@m_id +"_expire" ) );
  1082. for ( .@j = 0; .@j < .@mob_size; .@j++ )
  1083. dispbottom "[Mission '"+ .@title$ +"' Progress] Hunted "+ getd( "@ms_"+ @ms_list$[.@i] +"_hunt["+ .@j +"]" ) +"/"+ getd( "@ms_"+ @ms_list$[.@i] +"_qty[" + .@j +"]" ) +" x "+ getmonsterinfo( getd( "@ms_"+ @ms_list$[.@i] +"_list["+ .@j +"]" ), MOB_NAME );
  1084. explode .@item_id_array$, .@item_id$, "|";
  1085. explode .@item_amount_array$, .@item_amount$, "|";
  1086. .@size = getarraysize( .@item_id_array$ );
  1087. for ( .@j = 1; .@j < .@size; .@j++ )
  1088. dispbottom "[Mission '"+ .@title$ +"' Progress] Collected "+ countitem( atoi( .@item_id_array$[.@j] ) ) +"/"+ .@item_amount_array$[.@j] +" x "+ getitemname( atoi( .@item_id_array$[.@j] ) );
  1089. }
  1090. }
  1091. }
  1092. }
  1093. end;
  1094.  
  1095. OnPCLoginEvent:
  1096. if( strnpcinfo(0) == .npc_name$ ){
  1097. .@timetick = gettimetick(2);
  1098. .@nb = query_sql( "SELECT `mission_id`,`expire`,`mob_hunt` FROM `player_mission` WHERE `completion` = '0000-00-00 00:00:00' AND `cid` = "+getcharid(0),@ms_list$,.@expire,.@mob_hunt$ );
  1099. @ms_size = .@nb;
  1100. if( @ms_size )
  1101. for( .@i = 0; .@i < @ms_size; .@i++ ) {
  1102. if ( .@expire[.@i] ) {
  1103. .@timeleft = ( .@expire[.@i] - .@timetick );
  1104. addtimer ( .@timeleft * 1000 ),.npc_name$+"::OnTimeCheck";
  1105. dispbottom "[ Mission Progress : "+@ms_list$[.@i]+" , expire in "+ callfunc( "Time2Str", .@timeleft + .@timetick )+" ]";
  1106. }
  1107. else
  1108. dispbottom "[ Mission Progress : "+@ms_list$[.@i] +" ]";
  1109. query_sql( "SELECT `mob_list`,`mob_qty` FROM `mission_board` WHERE `id` = "+@ms_list$[.@i],.@mob_list$,.@mob_qty$ );
  1110. setd( "@ms_"+@ms_list$[.@i]+"_expire" ),.@expire[.@i];
  1111. if( callsub( OnExplodeArray,.@mob_list$,getd( "@ms_"+@ms_list$[.@i]+"_list" ),0 ) ){
  1112. callsub( OnExplodeArray,.@mob_hunt$[.@i],getd( "@ms_"+@ms_list$[.@i]+"_hunt" ),0 );
  1113. .@monster_size = callsub( OnExplodeArray,.@mob_qty$,getd( "@ms_"+@ms_list$[.@i]+"_qty" ),0 );
  1114. // for( .@mob = 0; .@mob < .@monster_size; .@mob++ )
  1115. // dispbottom " ~ killed "+getd( "@ms_"+@ms_list$[.@i]+"_hunt["+.@mob+"]" )+"/"+getd( "@ms_"+@ms_list$[.@i]+"_qty["+.@mob+"]" )+" x "+getmonsterinfo( getd( "@ms_"+@ms_list$[.@i]+"_list["+.@mob+"]" ),MOB_NAME );
  1116. }
  1117. }
  1118. }
  1119. end;
  1120.  
  1121. OnPCLogoutEvent:
  1122. if( strnpcinfo(0) == .npc_name$ ){
  1123. if( @ms_size )
  1124. for( .@ms = 0; .@ms < @ms_size; .@ms++ ){
  1125. debugmes "Saving "+@ms_list$[.@ms];
  1126. .@mob_size = getarraysize( getd( "@ms_"+@ms_list$[.@ms]+"_list" ) );
  1127. if( .@mob_size ){
  1128. copyarray .@temp_array[0],getd( "@ms_"+@ms_list$[.@ms]+"_list[0]" ),.@mob_size;
  1129. .@mob_hunt$ = "|";
  1130. for( .@mob = 0; .@mob < .@mob_size; .@mob++ )
  1131. .@mob_hunt$ = .@mob_hunt$ + getd( "@ms_"+@ms_list$[.@ms]+"_hunt["+.@mob+"]" ) +"|";
  1132. query_sql( "UPDATE `player_mission` SET `mob_hunt` = '"+escape_sql( .@mob_hunt$ )+"' WHERE `mission_id` = "+@ms_list$[.@ms]+" AND `completion` = '0000-00-00 00:00:00' AND `cid` = "+getcharid(0) );
  1133. }
  1134. }
  1135. }
  1136. end;
  1137.  
  1138. OnNPCKillEvent:
  1139. if( strnpcinfo(0) == .npc_name$ ){
  1140. if( @ms_size ){
  1141. .@map$ = strcharinfo(3);
  1142.  
  1143. // by default mission wont work in PVP,GVG,Instance,Event maps
  1144. if( compare( .@map$,"@" ) || getmapflag( .@map$,mf_gvg ) || getmapflag( .@map$,mf_pvp )){
  1145. // dispbottom "[Mission Board] PvP/GvG Map , Instance Map , Event Map , include monsters will not affect Mission Progress.";
  1146. end;
  1147. }
  1148.  
  1149. .@timetick = gettimetick(2);
  1150. for( .@ms = ( @ms_size - 1 ); .@ms >= 0; .@ms-- ){
  1151. if( getd( "@ms_"+@ms_list$[.@ms]+"_expire" ) && getd( "@ms_"+@ms_list$[.@ms]+"_expire" ) < .@timetick ){
  1152. setd( "@ms_"+@ms_list$[.@ms]+"_expire" ),0;
  1153. deletearray getd( "@ms_"+@ms_list$[.@ms]+"_list" );
  1154. deletearray getd( "@ms_"+@ms_list$[.@ms]+"_qty" );
  1155. deletearray getd( "@ms_"+@ms_list$[.@ms]+"_hunt" );
  1156. dispbottom "[Mission # "+@ms_list$[.@ms]+"] Mission removed due to expired. ";
  1157. deletearray @ms_list$[.@ms],1;
  1158. @ms_size--;
  1159.  
  1160. }else{
  1161. .@mob_size = getarraysize( getd( "@ms_"+@ms_list$[.@ms]+"_list" ) );
  1162. if( .@mob_size ){
  1163. copyarray .@temp_array[0],getd( "@ms_"+@ms_list$[.@ms]+"_list[0]" ),.@mob_size;
  1164. for( .@mob = 0; .@mob < .@mob_size; .@mob++ )
  1165. if( .@temp_array[.@mob] == killedrid ){
  1166. .@value = getd( "@ms_"+@ms_list$[.@ms]+"_hunt["+.@mob+"]" ) + 1;
  1167. setd( "@ms_"+@ms_list$[.@ms]+"_hunt["+.@mob+"]" ),.@value;
  1168. if ( getd( "@ms_"+ @ms_list$[.@ms] +"_hunt["+ .@mob +"]" ) <= getd( "@ms_"+ @ms_list$[.@ms] +"_qty[" + .@mob +"]" ) ) {
  1169. // use Mission ID ...
  1170. // dispbottom "[Mission '"+ @ms_list$[.@ms] +"' Progress] Hunted "+ getd( "@ms_"+ @ms_list$[.@ms] +"_hunt["+ .@mob +"]" ) +"/"+ getd( "@ms_"+ @ms_list$[.@ms] +"_qty[" + .@mob +"]" ) +" x "+ getmonsterinfo( getd( "@ms_"+ @ms_list$[.@ms] +"_list["+ .@mob +"]" ), MOB_NAME );
  1171.  
  1172. // use Mission Name ...
  1173. // query_sql "select title from mission_board where id = "+ @ms_list$[.@ms], .@title$;
  1174. // dispbottom "[Mission '"+ .@title$ +"' Progress] Hunted "+ getd( "@ms_"+ @ms_list$[.@ms] +"_hunt["+ .@mob +"]" ) +"/"+ getd( "@ms_"+ @ms_list$[.@ms] +"_qty[" + .@mob +"]" ) +" x "+ getmonsterinfo( getd( "@ms_"+ @ms_list$[.@ms] +"_list["+ .@mob +"]" ), MOB_NAME );
  1175. }
  1176. break;
  1177. }
  1178. deletearray .@temp_array;
  1179. }
  1180. }
  1181. }
  1182. }
  1183. }
  1184. end;
  1185.  
  1186. OnTimeCheck:
  1187. if( @ms_size ){
  1188. .@timetick = gettimetick(2);
  1189. for( .@i = ( @ms_size - 1 ); .@i >= 0; .@i-- ){
  1190. if( getd( "@ms_"+@ms_list$[.@i]+"_expire" ) <= .@timetick ){
  1191. setd( "@ms_"+@ms_list$[.@i]+"_expire" ),0;
  1192. deletearray getd( "@ms_"+@ms_list$[.@i]+"_list" );
  1193. deletearray getd( "@ms_"+@ms_list$[.@i]+"_qty" );
  1194. deletearray getd( "@ms_"+@ms_list$[.@i]+"_hunt" );
  1195. dispbottom "[Mission # "+@ms_list$[.@i]+"] Mission removed due to expired. ";
  1196. deletearray @ms_list$[.@i],1;
  1197. @ms_size--;
  1198. }
  1199. }
  1200. }
  1201. end;
  1202.  
  1203. OnRemoveMission:
  1204. .@mission_id = getarg(0);
  1205. .@message$ = getarg(1);
  1206.  
  1207. query_sql( "SELECT `aid`,`cid` FROM `player_mission` WHERE `cid` IN ( SELECT `char_id` FROM `char` WHERE `online` = 1 ) AND `mission_id` = "+.@mission_id+" AND `completion` = '0000-00-00 00:00:00' LIMIT 128",.@aid,.@cid );
  1208. .@aid_size = getarraysize( .@aid );
  1209. .@i = 0;
  1210. .@origin_aid = getcharid(3);
  1211. while( .@i < .@aid_size ){
  1212. if( isloggedin( .@aid[.@i],.@cid[.@i] ) ){
  1213. attachrid( .@aid[.@i] );
  1214. for( .@ms = @ms_size; .@ms >= 0; .@ms-- )
  1215. if( @ms_list$[.@ms] == ""+.@mission_id ){
  1216. message strcharinfo(0),.@message$;
  1217. dispbottom "Please visit Mission NPC to gain latest information.";
  1218. setd( "@ms_"+@ms_list$[.@ms]+"_expire" ),0;
  1219. deletearray getd( "@ms_"+@ms_list$[.@ms]+"_list" );
  1220. deletearray getd( "@ms_"+@ms_list$[.@ms]+"_qty" );
  1221. deletearray getd( "@ms_"+@ms_list$[.@ms]+"_hunt" );
  1222. deletearray @ms_list$[.@ms],1;
  1223. @ms_size--;
  1224. break;
  1225. }
  1226. detachrid;
  1227. .@count++;
  1228. }
  1229. .@i++;
  1230. }
  1231. attachrid( .@origin_aid );
  1232. dispbottom "Total "+.@count+" online players affected.";
  1233. return;
  1234.  
  1235. // usage :
  1236. // .@timeleft = callsub( OnTime2Str,<time> );
  1237. OnTime2Str:
  1238. .@time = getarg(0);
  1239. .@left = ( .@time - gettimetick(2) );
  1240. .@hour = ( .@left / 3600 );
  1241. .@min = ( .@left % 3600 / 60 );
  1242. .@sec = ( .@left % 60 );
  1243. if( !.@left )
  1244. return "none";
  1245. else
  1246. return "^777777"+( ( .@hour )? .@hour+" hr ":"" ) + ( ( .@hour || .@min )? .@min+" min ":"" ) +.@sec+" sec^000000";
  1247.  
  1248.  
  1249. // usage :
  1250. // .@new_array_size = callsub( OnExplodeArray,<old string variable>,<new array variable>,<save '0'> );
  1251. OnExplodeArray:
  1252. .@type = getarg(2);
  1253. explode( getarg(0),getarg(0),"|" );
  1254. .@size = getarraysize( getarg(0) );
  1255. if ( !.@size )
  1256. return 0;
  1257. while( .@i < .@size ){
  1258. if( !.@type ){
  1259. .@value = atoi( getelementofarray( getarg(0),.@i ) );
  1260. if( .@value ){
  1261. set getelementofarray( getarg(1),.@new_size ),.@value;
  1262. .@new_size++;
  1263. }
  1264. }else{
  1265. set getelementofarray( getarg(1),.@new_size ),getelementofarray( getarg(0),.@i );
  1266. .@new_size++;
  1267. }
  1268. .@i++;
  1269. }
  1270.  
  1271. return .@new_size;
  1272.  
  1273.  
  1274. // display mission information + optional progress checking
  1275. OnDisplayMissionInfo:
  1276. .@mission_id = getarg(0);
  1277. .@title$ = getarg(1);
  1278. .@description$ = getarg(2);
  1279. .@repeatable = getarg(4);
  1280. .@timelimit = getarg(5);
  1281. .@monster_size = getarraysize( getarg(6) );
  1282. .@item_size = getarraysize( getarg(8) );
  1283. .@base_job_bitmask = getarg(10);
  1284. .@job_branch_bitmask = getarg(11);
  1285. .@baseexp = getarg(12);
  1286. .@jobexp = getarg(13);
  1287. .@cash = getarg(14);
  1288. .@zeny = getarg(15);
  1289. .@reward_size = getarraysize( getarg(16) );
  1290. .@selected_npc_size = getarraysize( getarg(18) );
  1291. .@time_update$ = getarg(19);
  1292. .@redo_delay = getarg(20);
  1293. .@check_progress = getarg(21);
  1294.  
  1295. if( .@check_progress & 8 )
  1296. .@eac = eaclass();
  1297.  
  1298. // display mission info
  1299. mes ""+(( .@mission_id )? "^FF0000Mission ID # "+.@mission_id:" " )+"^000000";
  1300. mes "Title : "+( ( .@title$ != "" )?"^777777"+.@title$:"^FF0000-incomplete-" )+"^000000";
  1301. mes "Description : "+( ( .@description$ != "" )?"^777777"+.@description$:"^FF0000-incomplete-" )+"^000000";
  1302. mes "Level Range : "+( ( getelementofarray( getarg(3),0 ) )? "^777777"+getelementofarray( getarg(3),0 )+" ~ "+getelementofarray( getarg(3),1 ):"^FF0000-incomplete-" )+"^000000";
  1303. if( .@check_progress & 1 )
  1304. if( BaseLevel >= getelementofarray( getarg(3),0 ) && BaseLevel <= getelementofarray( getarg(3),1 ) )
  1305. .@lv_progress = 1;
  1306.  
  1307. mes "Repeatable: ^777777"+( ( !.@repeatable )?"unlimit":.@repeatable+" time" )+"^000000";
  1308. mes "Redo Delay: ^777777"+( ( !.@redo_delay )?"none":callsub( OnTime2Str,( ( .@redo_delay * 3600 ) + gettimetick(2) ) ) )+"^000000";
  1309. mes "Expire in: ^777777"+( ( !.@timelimit )?"none":callsub( OnTime2Str,.@timelimit ) )+"^000000";
  1310. mes " ";
  1311.  
  1312. .@word$ = (( !.@monster_size && !.@item_size )?"^FF0000incomplete":"^777777none" );
  1313. mes "Monster List : "+( ( .@monster_size )?"":.@word$ )+"^000000";
  1314. if( .@monster_size )
  1315. for( .@i = 0; .@i < .@monster_size; .@i++ ){
  1316. .@mob_id = getelementofarray( getarg(6),.@i );
  1317. .@quantity = getelementofarray( getarg(7),.@i );
  1318. if( .@check_progress & 2 ){
  1319. .@killed_count = getd( "@ms_"+.@mission_id+"_hunt["+.@i+"]" );
  1320. if( .@killed_count >= .@quantity ){
  1321. .@monster_progress++;
  1322. .@temp_color$ = "44EE99";
  1323. }else{
  1324. .@temp_color$ = "FF0000";
  1325. }
  1326. }
  1327. mes " ^777777"+.@quantity+" x "+getmonsterinfo( .@mob_id,MOB_NAME )+" "+( ( .@check_progress & 2 )?"^"+.@temp_color$+"(killed "+.@killed_count+")":"" )+"^000000";
  1328. }
  1329. mes "Item List : "+( ( .@item_size )?"":.@word$ )+"^000000";
  1330. if( .@item_size )
  1331. for( .@i = 0; .@i < .@item_size; .@i++ ){
  1332. .@item_id = getelementofarray( getarg(8),.@i );
  1333. .@quantity = getelementofarray( getarg(9),.@i );
  1334. .@item_type = getiteminfo( .@item_id,2 );
  1335. if( .@check_progress & 4 ){
  1336. .@item_count = countitem( .@item_id );
  1337. if( .@item_count >= .@quantity ){
  1338. .@item_progress++;
  1339. .@temp_color$ = "44EE99";
  1340. }else{
  1341. .@temp_color$ = "FF0000";
  1342. }
  1343. }
  1344. mes " ^777777"+.@quantity+" x "+getitemname( .@item_id )+" "+( ( .@item_type == 4 || .@item_type == 5 )?"["+getitemslots( .@item_id )+"]":"" )+" "+( ( .@check_progress & 4 )?"^"+.@temp_color$+"(have "+.@item_count+")":"" )+"^000000";
  1345. }
  1346. mes " ";
  1347. mes "Available Job Classes :";
  1348. if( .@base_job_bitmask ){
  1349. deletearray .@available_job$;
  1350. deletearray .@available_branch$;
  1351. .@available_job_size = 0;
  1352. .@available_branch_size = 0;
  1353. for( .@i = 0; .@i < .base_job_size; .@i++ )
  1354. if( .@base_job_bitmask & ( 1 << .@i ) ){
  1355. .@class = roclass( .base_job[.@i] );
  1356. .@available_job$[.@available_job_size] = jobname( .@class );
  1357. if( .@check_progress & 8 && BaseClass == .@class )
  1358. .@class_progress = 1;
  1359. .@available_job_size++;
  1360. }
  1361. mes " ^777777"+implode( .@available_job$,"," )+" ^000000";
  1362. if( .@job_branch_bitmask && .@class_progress ){
  1363. for( .@i = 0; .@i < .job_branch_size; .@i++ )
  1364. if( .@job_branch_bitmask & ( 1 << .@i ) ){
  1365. if( .@check_progress & 8 && ( .@eac & .job_branch[.@i] ) )
  1366. .@branch_progress++;
  1367. .@available_branch$[.@available_branch_size] = .job_branch_name$[.@i];
  1368. .@available_branch_size++;
  1369. }
  1370. mes "Inherited: ^777777"+implode( .@available_branch$,", " )+" ^000000";
  1371. }
  1372. }else{
  1373. mes " ^FF0000-incomplete^000000";
  1374. }
  1375.  
  1376. mes " ";
  1377. mes "Reward List : ";
  1378. mes "^777777 ~ Base EXP: "+( ( .@baseexp )? .@baseexp:"none" )+"^000000";
  1379. mes "^777777 ~ Job EXP: "+( ( .@jobexp )? .@jobexp:"none" )+"^000000";
  1380. mes "^777777 ~ Cash: "+( ( .@cash )? .@cash:"none" )+"^000000";
  1381. mes "^777777 ~ Zeny: "+( ( .@zeny )? .@zeny:"none" )+"^000000";
  1382. mes "Reward Item List: "+( ( .@reward_size )?"":"^777777none" )+"^000000";
  1383. if( .@reward_size )
  1384. for( .@i = 0; .@i < .@reward_size; .@i++ ){
  1385. .@item_id = getelementofarray( getarg(16),.@i );
  1386. .@item_type = getiteminfo( .@item_id,2 );
  1387. mes " ^777777 ~ "+getelementofarray( getarg(17),.@i )+" x "+getitemname( .@item_id )+" "+( ( .@item_type == 4 || .@item_type == 5 )?"["+getitemslots( .@item_id )+"]":"" )+"^000000";
  1388. }
  1389. mes " ";
  1390.  
  1391. mes "Mission Offered by: "+( ( .@selected_npc_size )?"":"^FF0000-incomplete" )+"^000000";
  1392. if( .@selected_npc_size ){
  1393. if( .@selected_npc_size >= 2 )
  1394. .@selected_npc$ = "|"+implode( getarg(18),"|" )+"|";
  1395. else
  1396. .@selected_npc$ = "|"+getarg(18)+"|";
  1397. for( .@i = 0; .@i < .mission_npc_count; .@i++ )
  1398. if( ( compare( "|"+.@selected_npc$+"|","|"+.@i+"|" ) ) ){
  1399. getmapxy( .@map$,.@x,.@y,1,.npc_unique_list$[.@i] );
  1400. .@sub_npc_name$ = "^777777("+.@map$+") ";
  1401. .@sub_npc_name$ = .@sub_npc_name$ + .npc_name_list$[.@i] + "^000000";
  1402. mes " ~ "+.@sub_npc_name$;
  1403. }
  1404. mes " ";
  1405. }
  1406. if( .@time_update$ != "0000-00-00 00:00:00" && .@time_update$ != "" ){
  1407. mes "Last Mission Update:";
  1408. mes "^777777"+.@time_update$+"^000000";
  1409. }
  1410.  
  1411. if( .@check_progress ){
  1412. if( .@check_progress & 1 && !.@lv_progress ){
  1413. dispbottom "[Failed] Your level didnt meet the requirements.";
  1414. .@check_result |= 1;
  1415. }
  1416. if( .@check_progress & 2 && .@monster_size != .@monster_progress ){
  1417. dispbottom "[Failed] Your Monsters Hunt didnt meet the requirements.";
  1418. .@check_result |= 2;
  1419. }
  1420. if( .@check_progress & 4 && .@item_size != .@item_progress ){
  1421. dispbottom "[Failed] Your Items collecting didnt meet the requirements.";
  1422. .@check_result |= 4;
  1423. }
  1424. if( .@check_progress & 8 && ( !.@branch_progress && !.@class_progress ) ){
  1425. dispbottom "[Failed] Your Class didnt meet the requirements.";
  1426. .@check_result |= 8;
  1427. }
  1428. }
  1429. return .@check_result;
  1430. }
  1431.  
  1432.  
  1433. // the number behind the NPC name must be NUMBER with range of ( 1 ~ 500 )
  1434. // the number should stay the same for eternity, if you change it frequently, it might affect your missions for each NPC.
  1435. // ( to conclude, once you assigned the number, dont change it for the sake of your mission board ... )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement