Jump to content
  • 0

I got some warning script error but don't know what is it


zaruramen

Question


  • Group:  Members
  • Topic Count:  14
  • Topics Per Day:  0.00
  • Content Count:  41
  • Reputation:   0
  • Joined:  08/27/15
  • Last Seen:  

hello I got this error and really don't know how to fix please help me.

 

 

[ Warning] : script : getelementofarray: index out of range (-1)

[Debug] : Data: variable name='@ms_list$' index=0

[Debug] : Source (NPC) : เควสประจำวัน#1 at morocc (175,88)

 

the problem is when I take a quest at the first time it can't close the message box. So I need to close my game and login again.

 

 

and this is my script

- script mission_board -1,{
.@gm_level = getgmlevel();
.@npc_name$ = strnpcinfo(1);
.@mission_npc_num = atoi( strnpcinfo(2) );

// check npc if it's a valid npc with number 1 ~ 500
if( !.@mission_npc_num || .@mission_npc_num > 500 ){
message strcharinfo(0),"This NPC isnt working, invalid <'"+strnpcinfo(2)+"'>";
disablenpc strnpcinfo(0);
end;
}

// to assign offset index.
.@mission_npc_num--;
query_sql( "SELECT COUNT(`id`) FROM `mission_board` WHERE `npc_id` LIKE '%|"+.@mission_npc_num+"|%' ",.@mission_count );
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 );
.@current_mission_size = getarraysize( .@id );

mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "A mission board may provide various missions for adventures. Each players may pick ";
mes "   ^FF0000"+.max_mission_per_char+" missions^000000";
mes "from each mission npc.";
next;
switch( select( ( .@current_mission_size )?"Submit Mission":"",
( .@current_mission_size < .max_mission_per_char )?"Pick Mission":"",
( .@current_mission_size )?"Drop Mission":"",
( .@gm_level < .gm_level || !.@mission_count )?"":"^FF0000[GM] Update Mission^000000",
( .@gm_level < .gm_level )?"":"^FF0000[GM] Setup Mission^000000",
( .@gm_level < .gm_level || !.@mission_count  )?"":"^FF0000[GM] Delete Mission^000000" ) ){
case 1:
.@current_time = gettimetick(2);
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 );
.@size = getarraysize( .@mission_id );
for( .@i = 0; .@i < .@size; .@i++ ){
if( .@expire[.@i] && .@expire[.@i] < .@current_time )
.@submit_menu$ = .@submit_menu$ + "^FF0000[Expired]^000000";
.@submit_menu$ = .@submit_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
}
.@i = select( .@submit_menu$ ) - 1;

if( .@expire[.@i] && .@expire[.@i] < .@current_time ){
dispbottom " ~ Mission expired "+callsub( OnTime2Str,( gettimetick(2) + ( .@current_time - .@expire[.@i] ) ) )+" ago.";
dispbottom " ~ You may drop this mission.";
close;
}

// get mission data from sql
query_sql( "SELECT * FROM `mission_board` WHERE `id` = "+.@mission_id[.@i]+" LIMIT 1",
.@mission_id,
.@title$,
.@description$,
.@mob_list$,
.@mob_qty$,
.@item_list$,
.@item_qty$,
.@base_job_bitmask,
.@job_branch_bitmask,
.@min_lv,
.@max_lv,
.@repeatable,
.@timelimit,
.@reward_list$,
.@reward_qty$,
.@baseexp,
.@jobexp,
.@zeny,
.@Mission_Points,
.@aid,
.@name$,
.@time_update$,
.@npc_id$,
.@redo_delay
);

// explode all saved strings to array value.
.@monster_size = callsub( OnExplodeArray,.@mob_list$,.@monster_list,0 );
if( .@monster_size )
callsub( OnExplodeArray,.@mob_qty$,.@monster_qty,0 );

.@item_size = callsub( OnExplodeArray,.@item_list$,.@item_list,0 );
if( .@item_size )
callsub( OnExplodeArray,.@item_qty$,.@item_qty,0 );

.@reward_size = callsub( OnExplodeArray,.@reward_list$,.@reward_list,0 );
if( .@reward_size )
callsub( OnExplodeArray,.@reward_qty$,.@reward_qty,0 );

.@selected_npc_size = callsub( OnExplodeArray,.@npc_id$,.@selected_npc_array$,1 );

setarray .@level_range,.@min_lv,.@max_lv;

// display the information of mission
.@result = callsub( OnDisplayMissionInfo,
.@mission_id,
.@title$,
.@description$,
.@level_range,
.@repeatable,
.@expire[.@i],
.@monster_list,
.@monster_qty,
.@item_list,
.@item_qty,
.@base_job_bitmask,
.@job_branch_bitmask,
.@baseexp,
.@jobexp,
.@Mission_Points,
.@zeny,
.@reward_list,
.@reward_qty,
.@selected_npc_array$,
.@time_update$,
.@redo_delay,
1|2|4|8
);

// submit mission or not
if( .@result ){
message strcharinfo(0),"Failed to submit this mission.";
}else{
next;
if( select( "Submit Completed Mission","Cancel" ) == 1 ){
for( .@ms = ( @ms_size - 1 ); .@ms >= 0; .@ms-- )
if( @ms_list$[.@ms] == ""+.@mission_id ){
mes "^0055FF[ "+.@npc_name$+" ]^000000";
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'" );
mes "Mission accomplished.";
@ms_size--;

// clear requirement.
setd( "@ms_"+.@mission_id+"_expire" ),0;
deletearray getd( "@ms_"+.@mission_id+"_list" );
deletearray getd( "@ms_"+.@mission_id+"_qty" );
deletearray getd( "@ms_"+.@mission_id+"_hunt" );
if( .@item_size )
for( .@i = 0; .@i < .@item_size; .@i++ ){
// debugmes getitemname( .@item_list[.@i] )+" - "+.@item_qty[.@i];
delitem .@item_list[.@i],.@item_qty[.@i];
}

mes "Gained some mission's rewards.";
// rewards
getexp .@baseexp,.@jobexp;
if( .@reward_size )
for( .@i = 0; .@i < .@reward_size; .@i++ )
getitem .@reward_list[.@i],.@reward_qty[.@i];
#Mission_Points += .@Mission_Points;
Zeny += .@zeny;
break;
}
mes "Something went wrong ..";
}
}
break;
case 2:
// get info from SQL.
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
deletearray .@id;
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 );
.@offset += .max_page_size;
.@size = getarraysize( .@id );
if( !.@size ){
mes "There are no other available missions to pick.";
close;

}else{
mes "Pick a mission.";
.@mission_menu$ = "";
for( .@i = 0; .@i < .@size; .@i++ )
.@mission_menu$ = .@mission_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
}
next;
.@i = select( .@mission_menu$+ ( ( .@size < .max_page_size )?"":"- next page" ) ) - 1;
}while( .@i == .@size );

query_sql( "SELECT * FROM `mission_board` WHERE `id` = "+.@id[.@i]+" LIMIT 1",
.@mission_id,
.@title$,
.@description$,
.@mob_list$,
.@mob_qty$,
.@item_list$,
.@item_qty$,
.@base_job_bitmask,
.@job_branch_bitmask,
.@min_lv,
.@max_lv,
.@repeatable,
.@timelimit,
.@reward_list$,
.@reward_qty$,
.@baseexp,
.@jobexp,
.@zeny,
.@Mission_Points,
.@aid,
.@name$,
.@time_update$,
.@npc_id$,
.@redo_delay
);

// explode all saved strings to array value.
.@monster_size = callsub( OnExplodeArray,.@mob_list$,.@monster_list,0 );
.@monster_size = callsub( OnExplodeArray,.@mob_qty$,.@monster_qty,0 );

.@item_size = callsub( OnExplodeArray,.@item_list$,.@item_list,0 );
.@item_size = callsub( OnExplodeArray,.@item_qty$,.@item_qty,0 );

.@reward_size = callsub( OnExplodeArray,.@reward_list$,.@reward_list,0 );
.@reward_size = callsub( OnExplodeArray,.@reward_qty$,.@reward_qty,0 );

.@selected_npc_size = callsub( OnExplodeArray,.@npc_id$,.@selected_npc_array$,1 );

setarray .@level_range,.@min_lv,.@max_lv;

// display the information of mission
.@result = callsub( OnDisplayMissionInfo,
.@mission_id,
.@title$,
.@description$,
.@level_range,
.@repeatable,
( .@timelimit + gettimetick(2) ),
.@monster_list,
.@monster_qty,
.@item_list,
.@item_qty,
.@base_job_bitmask,
.@job_branch_bitmask,
.@baseexp,
.@jobexp,
.@Mission_Points,
.@zeny,
.@reward_list,
.@reward_qty,
.@selected_npc_array$,
.@time_update$,
.@redo_delay,
1|8
);

// check completed how many times.
if ( .@repeatable ) {
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;
if( .@mission_completed >= .@repeatable ) {
next;
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes " ";
mes "You cant pick this mission, you have mission completion reach the max repeatable attempt of "+.@mission_completed+" times.";
close;
}
}

if ( .@redo_delay ) {
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;
if (.@deny_time != 0) && ( .@diff_delay < .@redo_delay ){
next;
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "You cant pick this mission, you have mission redo delay isnt finish yet.";
mes "^FF0000"+ callfunc( "Time2Str", .@deny_time ) +"^000000";
close;
}
}


if( .@result ){
message strcharinfo(0),"Failed to pick this mission.";
}else{
if( select( "Pick Mission","Cancel" ) == 1 ){
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' );" );
message strcharinfo(0),"Picked Mission # "+.@mission_id;

@ms_list$[ @ms_size ] = ""+.@mission_id;
@ms_size++;

copyarray getd( "@ms_"+.@mission_id+"_list[0]" ),.@monster_list[0],.@monster_size;
copyarray getd( "@ms_"+.@mission_id+"_qty[0]" ),.@monster_qty[0],.@monster_size;
deletearray getd( "@ms_"+.@mission_id+"_hunt" );
if ( .@timelimit ) {
setd( "@ms_"+.@mission_id+"_expire" ),( .@timelimit + gettimetick(2) );
addtimer ( .@timelimit * 1000 ),.npc_name$+"::OnTimeCheck";
close;
}
}
close;
}
break;
case 3:
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 );
.@id_size = getarraysize( .@id );
for( .@i = 0; .@i < .@id_size; .@i++ )
.@mission_menu$ = .@mission_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Pick a Mission to remove.";
next;
.@i = select( .@mission_menu$ ) - 1;
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Confirm remove ^0055FFMission # "+.@id[.@i]+"^000000?";
mes "Title : ^0055FF"+.@title$[.@i]+"^000000";
mes "^777777( this cant be un-done )^000000";
if( select( "nope","Confirm" ) == 2 ){
message strcharinfo(0),"Dropped Mission # "+.@id[.@i];
query_sql( "DELETE FROM `player_mission` WHERE `mission_id` = "+.@id[.@i]+" AND `cid` = "+getcharid(0)+" AND `completion` = '0000-00-00 00:00:00'" );
setd( "@ms_"+.@id[.@i]+"_expire" ),0;
deletearray getd( "@ms_"+.@id[.@i]+"_list" );
deletearray getd( "@ms_"+.@id[.@i]+"_qty" );
deletearray getd( "@ms_"+.@id[.@i]+"_hunt" );
for( .@ms = 0; .@ms < @ms_size; .@ms++ )
if( ""+.@id[.@i] == @ms_list$[.@ms] ){
deletearray @ms_list$[.@ms],1;
@ms_size--;
break;
}
}
break;
case 4:
// get info from SQL.
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
deletearray .@id;
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 );
.@offset += .max_page_size;
.@size = getarraysize( .@id );
if( !.@size ){
mes "There are no available mission to update.";
close;

}else{
mes "Pick a mission.";
.@mission_menu$ = "";
for( .@i = 0; .@i < .@size; .@i++ )
.@mission_menu$ = .@mission_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
}
next;
.@i = select( .@mission_menu$+ ( ( .@size < .max_page_size )?"":"- next page" ) ) - 1;
}while( .@i == .@size );
query_sql( "SELECT * FROM `mission_board` WHERE `id` = "+.@id[.@i],
.@new_mission_id,
.@title$,
.@description$,
.@mob_list$,
.@mob_qty$,
.@item_list$,
.@item_qty$,
.@base_job_bitmask,
.@job_branch_bitmask,
.@min_lv,
.@max_lv,
.@repeatable,
.@timelimit,
.@reward_list$,
.@reward_qty$,
.@baseexp,
.@jobexp,
.@zeny,
.@Mission_Points,
.@aid,
.@name$,
.@time_update$,
.@npc_id$,
.@redo_delay
);
// explode all saved strings to array value.
.@monster_size = callsub( OnExplodeArray,.@mob_list$,.@monster_list,0 );
.@monster_size = callsub( OnExplodeArray,.@mob_qty$,.@monster_qty,0 );

.@item_size = callsub( OnExplodeArray,.@item_list$,.@item_list,0 );
.@item_size = callsub( OnExplodeArray,.@item_qty$,.@item_qty,0 );

.@reward_size = callsub( OnExplodeArray,.@reward_list$,.@reward_list,0 );
.@reward_size = callsub( OnExplodeArray,.@reward_qty$,.@reward_qty,0 );

.@selected_npc_size = callsub( OnExplodeArray,.@npc_id$,.@selected_npc_array$,1 );

setarray .@level_range,.@min_lv,.@max_lv;

case 5:
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
// display the information of mission
callsub( OnDisplayMissionInfo,
.@new_mission_id,
.@title$,
.@description$,
.@level_range,
.@repeatable,
( .@timelimit + gettimetick(2) ),
.@monster_list,
.@monster_qty,
.@item_list,
.@item_qty,
.@base_job_bitmask,
.@job_branch_bitmask,
.@baseexp,
.@jobexp,
.@Mission_Points,
.@zeny,
.@reward_list,
.@reward_qty,
.@selected_npc_array$,
.@time_update$,
.@redo_delay,
0
);

// check if required info complete for setup mission
.@incomplete = 0;
if( .@title$ == "" ) .@incomplete |= 1;
if( .@description$ == "" ) .@incomplete |= 2;
if( !.@monster_size && !.@item_size ) .@incomplete |= 4;
if( getarraysize( .@level_range ) != 2 || !.@base_job_bitmask || !.@job_branch_bitmask ) .@incomplete |= 8;
if( !.@reward_size && !.@baseexp && !.@jobexp && !.@Mission_Points && !.@zeny ) .@incomplete |= 16;
if( !.@selected_npc_size ) .@incomplete |= 32;

.@main_option = select( "Edit Title "+(( .@incomplete & 1 )?"^FF0000-incomplete-^000000":"" ),
"Edit Description "+(( .@incomplete & 2 )?"^FF0000-incomplete-^000000":"" ),
"Edit Monster List "+(( .@incomplete & 4 )?"^FF0000-incomplete-^000000"  ( !.@monster_size )?"^777777-none-^000000":"" )),
"Edit Item List "+(( .@incomplete & 4 )?"^FF0000-incomplete-^000000"  ( !.@item_size )?"^777777-none-^000000":"" )),
"Edit Class/Level Limitation "+(( .@incomplete & 8 )?"^FF0000-incomplete-^000000":"" ),
"Edit Time/Repeat/Mission Limitation ",
"Edit Reward List "+(( .@incomplete & 16 )?"^FF0000-incomplete-^000000":"" ),
"Edit NPC Limitation "+(( .@incomplete & 32 )?"^FF0000-incomplete-^000000":"" ),
( .@incomplete )?"":"^0055FF - Complete Setup Mission^000000" );
next;
switch( .@main_option ){
case 1:
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Enter Title";
mes "^777777( Length: 4 ~ 30 )^000000";
while( input( .@title$,4,30 ) );
.@input_result = replacestr( .@title$,":"," " );
break;
case 2:
.@description$ = "";
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Enter Description";
mes "^777777( Length: 4 ~ 255 )^000000";
mes " ";
mes "^0055FF"+.@description$+"^000000";
.@length = getstrlen( .@description$ );
do{
.@input_result = input( .@temp_input$,4,255 );
if( .@input_result )
message strcharinfo(0),"Input length must between 4 ~ 255";
}while( .@input_result );
.@description$ = .@description$ + " "+ .@temp_input$;
mes "^0055FF"+.@temp_input$+"^000000";
.@length = getstrlen( .@description$ );
next;
}while( select( ( .@length >= 255 )?"":"add more ^777777( left "+( 255 - .@length )+" words )^000000","-back" ) == 1 );
.@description$  = replacestr( .@description$,":"," " );
break;
case 3:
if( .@new_mission_id ){
dispbottom "Editing monster list might caused unwanted behaviours of scripts.  Which may included :";
dispbottom " > Script/Missions isnt working properly.";
dispbottom " > Deletion of player mission's progress.";
dispbottom " > etc.";
dispbottom "Overall it's not suggested to edit monster list that you have set early.";
dispbottom "( Recommend for Re-Adding mission, if needed )";
}
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Monster List:";
if( .@monster_size ){
.@mob_menu$ = "";
.@current_mob_list$ = "|";
deletearray .@current_mob$;
for( .@i = 0; .@i < .@monster_size; .@i++ ){
.@mob_name$ = getmonsterinfo( .@monster_list[.@i],MOB_NAME );
.@mob_menu$ = .@mob_menu$ + .@monster_qty[.@i] +" x "+.@mob_name$ +":";
mes " ^777777 ~ "+.@monster_qty[.@i]+" x "+.@mob_name$+"^000000";
.@current_mob_list$ = .@current_mob_list$ + .@monster_list[.@i] +"|";
}

}else{
mes " ^777777 ~ none ^000000";
}
mes " ";
.@option = select( ( .@monster_size >= .max_required_monster )?"":"Add Monster",( .@monster_size )?"Delete Monster":"","- Back" );
switch( .@option ){
case 1:
mes "Enter Monster ID";
do{
input .@mob_id;
if( !.@mob_id ) break;
.@mob_name$ = getmonsterinfo( .@mob_id,MOB_NAME );
}while( .@mob_name$ == "null" );
if( .@mob_name$ != "null" && .@mob_id ){
mes "How many "+.@mob_name$+" need to hunt ?";
input .@amount,0,30000;
if( .@amount ){
if( compare( "|"+.@current_mob_list$+"|","|"+.@mob_id+"|" ) ){
for( .@i = 0; .@i < .@monster_size; .@i++ )
if( .@monster_list[.@i] == .@mob_id ){
.@monster_qty[.@i] += .@amount;
break;
}

}else{
.@monster_list[.@monster_size] = .@mob_id;
.@monster_qty[.@monster_size] = .@amount;
.@monster_size++;
}
}
}
break;
case 2:
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Pick a Monster to Remove.";
.@i = select( .@mob_menu$+"- Back" ) - 1;
if( .@i < .@monster_size ){
deletearray .@monster_list[.@i],1;
deletearray .@monster_qty[.@i],1;
.@monster_size--;
}
default: break;
}
if( .@option < 3 ) next;
}while( .@option < 3 );
break;
case 4:
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Required Item List: ";
if( .@item_size ){
.@item_menu$ = "";
.@current_item_list$ = "|";
deletearray .@current_item$;
for( .@i = 0; .@i < .@item_size; .@i++ ){
.@item_name$ = getitemname( .@item_list[.@i] );
.@item_menu$ = .@item_menu$ + .@item_qty[.@i] +"x "+.@item_name$ +":";
mes " ^777777 ~ "+.@item_qty[.@i]+" x "+.@item_name$+"^000000";
.@current_item_list$ = .@current_item_list$ + .@item_list[.@i] + "|";
}

}else{
mes " ^777777 ~ none ^000000";
}
mes " ";
.@option = select( ( .@item_size >= .max_required_item )?"":"Add Item",( .@item_size )?"Delete Item":"","- Back" );
switch( .@option ){
case 1:
do{
input .@item_id;
if( !.@item_id ) break;
.@item_name$ = getitemname( .@item_id );
}while( .@item_name$ == "null" || .@item_name$ == "" );
if( .@item_id && .@item_name$ != "null" && .@item_name$ != "" ){
mes "How many "+.@item_name$+" need to collect ?";
input .@amount,0,30000;
if( .@amount ){
if( compare( "|"+.@current_item_list$+"|","|"+.@item_id+"|" ) ){
for( .@i = 0; .@i < .@item_size; .@i++ )
if( .@item_list[.@i] == .@item_id ){
.@item_qty[.@i] += .@amount;
break;
}
}else{
.@item_list[.@item_size] = .@item_id;
.@item_qty[.@item_size] = .@amount;
.@item_size++;
}
}
}
break;
case 2:
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Pick an Item to Remove.";
.@i = select( .@item_menu$+" - Back" ) - 1;
if( .@i < .@item_size ){
mes "Removed "+.@item_qty[.@i]+" x "+getitemname( .@item_list[.@i] );
deletearray .@item_list[.@i],1;
deletearray .@item_qty[.@i],1;
.@item_size--;
}
default: break;
}
if( .@option < 3 ) next;
}while( .@option < 3 );
break;
case 5: // class limitation
if( !.@base_job_bitmask ){
// enable all job by default.
for( .@i = 0; .@i < .base_job_size; .@i++ ){
.@bitmask_value = ( 1 << .@i );
.@base_job_bitmask |= .@bitmask_value;
}
// enable all inherited classes by default.
for( .@i = 0; .@i < .job_branch_size; .@i++ ){
.@bitmask_value = ( 1 << .@i );
.@job_branch_bitmask |= .@bitmask_value;
}
}

do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Level Range : "+( ( .@level_range[1] )? "^777777"+.@level_range[0]+" ~ "+.@level_range[1]:"^FF0000-incomplete-" )+"^000000";
mes "Available Job Setting";
if( .@base_job_bitmask ){
for( .@i = 0; .@i < .base_job_size; .@i++ )
if( .@base_job_bitmask & ( 1 << .@i ) )
mes " ^777777 ~ "+jobname( roclass( .base_job[.@i] ) )+" ^000000";
}else{
mes " ^FF0000 -incomplete-^000000";
}
mes " ";
mes "Inherited Branch Setting";
if( .@job_branch_bitmask ){
for( .@i = 0; .@i < .job_branch_size; .@i++ )
if( .@job_branch_bitmask & ( 1 << .@i ) )
mes " ^777777 ~ "+.job_branch_name$[.@i]+" ^000000";
}else{
mes " ^FF0000 -incomplete-^000000";
}
next;
.@option = select( "Edit Base Job","Edit Job Branch","Edit Level Range","- Back" );
switch( .@option ){
case 1:
dispbottom "[ Base Job Class ] RED = Disable , GREEN = Enable";
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Available Job List:";
.@base_job_menu$ = "";
for( .@i = 0; .@i < .base_job_size; .@i++ ){
.@job_name$ = jobname( roclass( .base_job[.@i] ) );
if( .@base_job_bitmask & ( 1 << .@i ) )
mes " ^777777 ~ "+.@job_name$+" ^000000";
.@base_job_menu$ = .@base_job_menu$ + (( .@base_job_bitmask & ( 1 << .@i ) )?"^4EEE94":"^FF0000" ) + .@job_name$ +"^000000:";
}
next;
.@i = select( .@base_job_menu$+"- Back" ) - 1;
if( .@i < .base_job_size ){
.@bitmask_value = ( 1 << .@i );
if( .@base_job_bitmask & .@bitmask_value )
.@base_job_bitmask -= .@bitmask_value;
else
.@base_job_bitmask |= .@bitmask_value;
}
}while( .@i < .base_job_size );
break;
case 2:
dispbottom "[ Inherited Job Branch ] RED = Disable , GREEN = Enable";
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Inherited Job Branch List:";
.@job_branch_menu$ = "";
for( .@i = 0; .@i < .job_branch_size; .@i++ ){
if( .@job_branch_bitmask & ( 1 << .@i ) )
mes " ^777777 ~ "+.job_branch_name$[.@i]+" ^000000";
.@job_branch_menu$ = .@job_branch_menu$ + (( .@job_branch_bitmask & ( 1 << .@i ) )?"^4EEE94":"^FF0000" ) + .job_branch_name$[.@i] +"^000000:";
}
next;
.@i = select( .@job_branch_menu$+"- Back" ) - 1;
if( .@i < .job_branch_size ){
.@bitmask_value = ( 1 << .@i );
if( .@job_branch_bitmask & .@bitmask_value )
.@job_branch_bitmask -= .@bitmask_value;
else
.@job_branch_bitmask |= .@bitmask_value;
}
}while( .@i < .job_branch_size );
break;
case 3:
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Minimum Level";
input .@level_range[0],1,.server_max_level ;
mes "Maximum Level";
input .@level_range[1],.@level_range[0],.server_max_level;
default: break;
}
if( .@option < 4 ) next;
}while( .@option < 4 );
break;
case 6: // mission limitation
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Repeatable: ^777777"+( ( !.@repeatable )?"unlimit":""+.@repeatable )+" time^000000";
mes "Redo Delay: ^777777"+( ( !.@redo_delay )?"none":callsub( OnTime2Str,( ( .@redo_delay * 3600 ) + gettimetick(2) ) ))+"^000000";
mes "Time Limit: ^777777"+( ( !.@timelimit )?"none":callsub( OnTime2Str,( .@timelimit + gettimetick(2) ) ) )+"^000000";
.@option = select( "Edit Repeatable Status","Edit Time Limit","Edit Re-do Delay","Edit Required Mission","- Back" );
switch( .@option ){
case 1:
mes "How many time can this mission repeat ??";
mes "^777777( 0 = unlimited )^000000";
input .@repeatable,0,100;
break;
case 2:
mes "Time Limit of mission";
mes "      1 = 1 minute";
mes "    60 = 1 hour";
mes "1440 = 1 day";
input .@timelimit,0,50000;
.@timelimit *= 60;
break;
case 3:
mes "Time Delay to re-take the mission";
mes "     1 =  1 hour";
mes "   24 =  1 day";
mes " 720 = 30 day";
input .@redo_delay,0,50000;
break;
case 4:
mes "This is not fully implemented yet.. still in beta test";
break;

do{
mes "Required Mission:";
if( .@required_mission_size ){
for( .@i = 0; .@i < .@required_mission_size; .@i++ ){
mes " ^777777 ~ "+.@required_mission$[.@i]+"^000000";
.@required_mission_menu$ = .@required_mission_menu$ + .@required_mission$[.@i] +":";
}

}else{
mes "^777777 none ^000000";
}
next;
.@sub_option = select( ( .@required_mission_size < .max_required_mission )?"Add required mission":"",
( .@required_mission_size )?"Remove required mission":"",
"- Back");
switch( .@sub_option ){
case 1:
mes "Enter mission ID";
mes "^777777( enter 0 to cancel )^000000";
do{
input .@mission_id$;
if( .@mission_id$ == "0" ) break;
}while( compare( "|"+.@required_mission_menu$+"|","|"+.@mission_id$+"|" ) );
.@mission_id$ = replacestr( .@mission_id$,":","" );
if( .@mission_id$ != "0" ){
.@required_mission$[.@required_mission_size] = .@mission_id$;
.@required_mission_size++;
}
break;
case 2:
mes "Select a mission to remove.";
.@i = select( .@required_mission_menu$ ) - 1;
deletearray .@required_mission$[.@i],1;
default: break;
}
}while( .@sub_option < 3 );
default: break;
}
if( .@option < 5 ) next;
}while( .@option < 5 );
break;
case 7: // reward list
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes " ";
mes "Mission Points : ^777777"+( ( .@Mission_Points )? .@Mission_Points:"none" )+"^000000";
mes "Zeny : ^777777"+( ( .@zeny )? .@zeny:"none" )+"^000000";
mes "Reward Item List: ";
if( .@reward_size ){
.@reward_menu$ = "";
deletearray .@current_reward$;
for( .@i = 0; .@i < .@reward_size; .@i++ ){
.@reward_name$ = getitemname( .@reward_list[.@i] );
.@reward_menu$ = .@item_menu$ + .@reward_qty[.@i] +"x "+.@reward_name$ +":";
.@current_reward$[.@i] = .@reward_name$;
mes " ^777777 ~ "+.@reward_qty[.@i]+" x "+.@reward_name$+"^000000";
}
.@current_reward_list$ = implode( .@current_reward$,"|" );

}else{
mes " ^777777 ~ none ^000000";
}
mes "Base EXP : ^777777"+( ( .@baseexp )? .@baseexp:"none" )+"^000000";
mes "Job EXP : ^777777"+( ( .@jobexp )? .@jobexp:"none" )+"^000000";
mes " ";
next;
.@option = select( ( .@reward_size >= .max_required_item )?"":"Add Item Reward",
( .@reward_size )?"Delete Item Reward":"",
"Edit Mission Points Reward",
"Edit Zeny Reward",
"Edit Base EXP Reward",
"Edit Job EXP Reward",
"- Back" );
mes "^0055FF[ "+.@npc_name$+" ]^000000";
switch( .@option ){
case 1:
mes "Enter Reward Item ID";
do{
input .@reward_id;
if( !.@reward_id ) break;
.@reward_name$ = getitemname( .@reward_id );
}while( .@reward_name$ == "null" || .@reward_name$ == "" );
if( .@reward_id && .@reward_name$ != "null" && .@reward_name$ != "" ){
mes "How many "+.@reward_name$+" will be rewarded ?";
input .@amount,0,30000;
if( .@amount ){
if( compare( "|"+.@current_reward_list$+"|","|"+.@reward_name$+"|" ) ){
for( .@i = 0; .@i < .@reward_size; .@i++ )
if( .@reward_list[.@i] == .@item_id ){
.@reward_qty[.@i] += .@amount;
break;
}
}else{
.@reward_list[.@reward_size] = .@reward_id;
.@reward_qty[.@reward_size] = .@amount;
.@reward_size++;
}
}
}
break;
case 2:
mes "Pick an Reward to Remove.";
.@i = select( .@reward_menu$ ) - 1;
mes "Removed "+.@reward_qty[.@i]+"x "+getitemname( .@reward_list[.@i] );
deletearray .@reward_list[.@i],1;
deletearray .@reward_qty[.@i],1;
.@reward_size--;
break;
case 3:
mes "How many Mission Points will be given ?";
mes "^777777( value: 0 ~ "+.max_integer_value+" )^000000";
input .@Mission_Points,0,.max_integer_value;
break;
case 4:
mes "How many Zeny will be given ?";
mes "^777777( value: 0 ~ "+.max_integer_value+" )^000000";
input .@zeny,0,.max_integer_value;
break;
case 5:
mes "How many Base EXP reward ?";
mes "^777777( value: 0 ~ "+.max_integer_value+" )^000000";
input .@baseexp,0,.max_integer_value;
break;
case 6:
mes "How many Job EXP reward ?";
mes "^777777( value: 0 ~ "+.max_integer_value+" )^000000";
input .@jobexp,0,.max_integer_value;
default: break;
}
next;
}while( .@option < 7 );
break;
case 8: // npc limitation
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "By default, the mission will be available from each mission board npc ^FF0000unless you have specified which NPC may offer this mission.^000000";
mes " ";
mes "Just pick all the NPC that may offer this mission if you wish.";
next;
if( !getarraysize( .@selected_npc_array$ ) )
for( .@i = 0; .@i < .mission_npc_count; .@i++ ){
.@selected_npc_array$[.@i] = ""+.@i;
.@selected_npc_size++;
}
dispbottom "[ NPC Limitation ] RED = Disable , GREEN = Enable";

do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Mission offered by: ";
.@selected_npc_menu$ = "";
if( .@selected_npc_size >= 2 ){
.@selected_npc$ = "|"+implode( .@selected_npc_array$,"|" )+"|";
}else{
.@selected_npc$ = "|"+.@selected_npc_array$+"|";
}
for( .@i = 0; .@i < .mission_npc_count; .@i++ ){
getmapxy( .@map$,.@x,.@y,1,.npc_unique_list$[.@i] );
.@sub_npc_name$ = ( ( compare( "|"+.@selected_npc$+"|","|"+.@i+"|" ) )?"^44EE00":"^FF0000" );
.@sub_npc_name$ = .@sub_npc_name$ + .npc_name_list$[.@i];
mes "^777777("+.@map$+") "+.@sub_npc_name$;
.@selected_npc_menu$ = .@selected_npc_menu$ + .@sub_npc_name$ +":";
}
next;
.@option = select( .@selected_npc_menu$+"^000000- Back" ) - 1;
if( .@option < .mission_npc_count ){
if( compare( "|"+.@selected_npc$+"|","|"+.@option+"|" ) )
.@selected_npc_array$[.@option] = "";
else
.@selected_npc_array$[.@option] = ""+.@option;
.@selected_npc_size = getarraysize( .@selected_npc_array$ );
}
// dispbottom "["+rand(10,99)+"] "+implode( .@selected_npc_array$,"|" );
}while( .@option < .mission_npc_count );
break;
default: break;
}
next;
}while( .@main_option < 9 );

// finalise all variable
if( .@monster_size ){
.@final_mob_list$ = "|";
.@final_mob_qty$ = "|";
for( .@i = 0; .@i < .@monster_size; .@i++ ){
.@final_mob_list$ = .@final_mob_list$ + .@monster_list[.@i] +"|";
.@final_mob_qty$ = .@final_mob_qty$ + .@monster_qty[.@i] +"|";
}
}

if( .@item_size ){
.@final_item_list$ = "|";
.@final_item_qty$ = "|";
for( .@i = 0; .@i < .@item_size; .@i++ ){
.@final_item_list$ = .@final_item_list$ + .@item_list[.@i] +"|";
.@final_item_qty$ = .@final_item_qty$ + .@item_qty[.@i] +"|";
}
}

if( .@reward_size ){
.@final_reward_list$ = "|";
.@final_reward_qty$ = "|";
for( .@i = 0; .@i < .@reward_size; .@i++ ){
.@final_reward_list$ = .@final_reward_list$ + .@reward_list[.@i] +"|";
.@final_reward_qty$ = .@final_reward_qty$ + .@reward_qty[.@i] +"|";
}
}

if( .@selected_npc_size ){
.@final_npc_list$ = "|";
for( .@i = 0; .@i < .@selected_npc_size; .@i++ )
.@final_npc_list$ = .@final_npc_list$ + .@selected_npc_array$[.@i] +"|";
}

if( !.@new_mission_id ){
.@new_mission_id = gettimetick(2);
message strcharinfo(0),"Mission # "+.@new_mission_id+" has been added.";
}else{
message strcharinfo(0),"Mission # "+.@new_mission_id+" has been updated.";
// attach and inform other online players.
callsub( OnRemoveMission,.@new_mission_id,"A GM updated Mission # "+.@new_mission_id );
}

// add new mission into SQL
query_sql( 
"REPLACE INTO `mission_board` VALUES ( " +
.@new_mission_id+", " +
"'"+escape_sql( .@title$ )+"', " +
"'"+escape_sql( .@description$ )+"', " +
"'"+escape_sql( .@final_mob_list$ )+"', " +
"'"+escape_sql( .@final_mob_qty$ )+"', " +
"'"+escape_sql( .@final_item_list$ )+"', " +
"'"+escape_sql( .@final_item_qty$ )+"', " +
.@base_job_bitmask+", " +
.@job_branch_bitmask+", " +
.@level_range[0]+", " +
.@level_range[1]+", " +
.@repeatable+", " +
.@timelimit+", " +
"'"+escape_sql( .@final_reward_list$ )+"', " +
"'"+escape_sql( .@final_reward_qty$ )+"', " +
.@baseexp+", " +
.@jobexp+", " +
.@zeny+", " +
.@Mission_Points+", " +
getcharid(3)+", " +
"'"+escape_sql( strcharinfo(0) )+"', " +
"NOW(), " +
"'"+escape_sql( .@final_npc_list$ )+"', " +
.@redo_delay +
" ); " 
);
break;
case 6: // delete mission
do{
mes "^0055FF[ "+.@npc_name$+" ]^000000";
deletearray .@id;
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 );
.@offset += .max_page_size;
.@size = getarraysize( .@id );
if( !.@size ){
mes "There are no available mission to update.";
close;

}else{
mes "Pick a mission.";
for( .@i = 0; .@i < .@size; .@i++ )
.@mission_menu$ = .@mission_menu$ + "["+.@min_lv[.@i]+"~"+.@max_lv[.@i]+"] "+.@title$[.@i] +":";
}
next;
.@i = select( .@mission_menu$+ ( ( .@size < .max_page_size )?"":"- next page" ) ) - 1;
}while( .@i == .@size );
.@mission_id = .@id[.@i];
mes "^0055FF[ "+.@npc_name$+" ]^000000";
mes "Are you sure to remove this mission ?";
if( select( "nope","Delete Mission" ) == 2 ){
query_sql( "DELETE FROM `mission_board` WHERE `id` = "+.@mission_id+" LIMIT 1" );
mes "Removed mission from mission list.";

// attach other online players and remove the missions.
callsub( OnRemoveMission,.@mission_id,"A GM removed Mission # "+.@mission_id );
query_sql( "DELETE FROM `player_mission` WHERE `completion` = '0000-00-00 00:00:00' AND `mission_id` = "+.@mission_id );
mes "Removed mission from all players.";
}
default: break;
}
close;

OnInit:
initnpctimer "mission_board";
// initialize settings
if( strnpcinfo(0) == "mission_board" ){

// gm level to access panel
.gm_level = 90;
// max no. of required monster
.max_required_monster = 10;
// max no. of required item
.max_required_item = 10;
// max no. of required mission ( un-implement yet )
.max_required_mission = 10;
// max no. of available mission
.max_mission_available = 50;
// max value of integer input
.max_integer_value = 2000000000;
// max amount of mission per page
.max_page_size = 40;
// max mission per npc take by character
.max_mission_per_char = 1;

// predefined values.
.npc_name$ = strnpcinfo(0);
.server_max_level = MAX_LEVEL;
setarray .base_job,
EAJ_SWORDMAN,
EAJ_MAGE,
EAJ_ARCHER,
EAJ_ACOLYTE,
EAJ_MERCHANT,
EAJ_THIEF,
EAJ_TAEKWON,
EAJ_GUNSLINGER,
EAJ_NINJA;
.base_job_size = getarraysize( .base_job );
setarray .job_branch_name$,
"2-1 Classes",
"2-2 Classes",
"Rebirth Classes",
"Baby Classes",
"Third Classes";
setarray .job_branch,
EAJL_2_1,
EAJL_2_2,
EAJL_UPPER,
EAJL_BABY,
EAJL_THIRD;
.job_branch_size = getarraysize( .job_branch );

bindatcmd "mission", strnpcinfo(0)+"::OnCommand";

}else{
// delay the process
.@num = atoi( strnpcinfo(2) );
if( .@num && .@num <= 500 && .mission_npc_count < 100 ){
sleep( .@num + 1 );
.npc_name_list$[ .mission_npc_count ] = strnpcinfo(1);
.npc_unique_list$[ .mission_npc_count ] = strnpcinfo(0);
// debugmes "["+.mission_npc_count+"]"+.npc_name_list$[ .mission_npc_count ]+"|"+.npc_unique_list$[ .mission_npc_count ];
.mission_npc_count++;
end;

}else if( !.@num ){
debugmes "[Removed] "+strnpcinfo(0)+", invalid <num:'"+strnpcinfo(2)+"'>";
}else if( .mission_npc_count >= 100 ){
debugmes "[Skipped] "+strnpcinfo(0)+", max: 100 Total NPC.";
}
disablenpc strnpcinfo(0);
}
end;

// just used to display how many total Mission Board NPC.
OnTimer1000:
stopnpctimer;
debugmes "[ Mission Board ] Total NPC Loaded : "+.mission_npc_count+" ...";
end;

OnCommand:
if ( !strcmp( strnpcinfo(0), .npc_name$ ) ) {
if ( @ms_size ) {
for ( .@i = 0; .@i < @ms_size; .@i++ ) {
.@mob_size = getarraysize( getd( "@ms_"+ @ms_list$[.@i] +"_list" ) );
query_sql "select id, title, item_list, item_qty from mission_board where id = "+ @ms_list$[.@i], .@m_id, .@title$, .@item_id$, .@item_amount$;
if ( .@mob_size ) {
if ( getd( "@ms_"+ .@m_id +"_expire" ) )
dispbottom "[Mission '"+ .@title$ +"' Progress] Time limit -> "+ callfunc( "Time2Str", getd( "@ms_"+ .@m_id +"_expire" ) );
for ( .@j = 0; .@j < .@mob_size; .@j++ )
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 );
explode .@item_id_array$, .@item_id$, "|";
explode .@item_amount_array$, .@item_amount$, "|";
.@size = getarraysize( .@item_id_array$ );
for ( .@j = 1; .@j < .@size; .@j++ )
dispbottom "[Mission '"+ .@title$ +"' Progress] Collected "+ countitem( atoi( .@item_id_array$[.@j] ) ) +"/"+ .@item_amount_array$[.@j] +" x "+ getitemname( atoi( .@item_id_array$[.@j] ) );
}
}
}
}
end;

OnPCLoginEvent:
if( strnpcinfo(0) == .npc_name$ ){
.@timetick = gettimetick(2);
.@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$ );
@ms_size = .@nb;
if( @ms_size )
for( .@i = 0; .@i < @ms_size; .@i++ ) {
if ( .@expire[.@i] ) {
.@timeleft = ( .@expire[.@i] - .@timetick );
addtimer ( .@timeleft * 1000 ),.npc_name$+"::OnTimeCheck";
dispbottom "[ Mission Progress : "+@ms_list$[.@i]+" , expire in "+ callfunc( "Time2Str", .@timeleft + .@timetick )+" ]";
}
else
dispbottom "[ท่านมีเควสที่ยังทำไม่เสร็จ สามารถเช็คได้ด้วย @mission]";
query_sql( "SELECT `mob_list`,`mob_qty` FROM `mission_board` WHERE `id` = "+@ms_list$[.@i],.@mob_list$,.@mob_qty$ );
setd( "@ms_"+@ms_list$[.@i]+"_expire" ),.@expire[.@i];
if( callsub( OnExplodeArray,.@mob_list$,getd( "@ms_"+@ms_list$[.@i]+"_list" ),0 ) ){
callsub( OnExplodeArray,.@mob_hunt$[.@i],getd( "@ms_"+@ms_list$[.@i]+"_hunt" ),0 );
.@monster_size = callsub( OnExplodeArray,.@mob_qty$,getd( "@ms_"+@ms_list$[.@i]+"_qty" ),0 );
// for( .@mob = 0; .@mob < .@monster_size; .@mob++ )
// 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 );
}
}
}
end;

OnPCLogoutEvent:
if( strnpcinfo(0) == .npc_name$ ){
if( @ms_size )
for( .@ms = 0; .@ms < @ms_size; .@ms++ ){
debugmes "Saving "+@ms_list$[.@ms];
.@mob_size = getarraysize( getd( "@ms_"+@ms_list$[.@ms]+"_list" ) );
if( .@mob_size ){
copyarray .@temp_array[0],getd( "@ms_"+@ms_list$[.@ms]+"_list[0]" ),.@mob_size;
.@mob_hunt$ = "|";
for( .@mob = 0; .@mob < .@mob_size; .@mob++ )
.@mob_hunt$ = .@mob_hunt$ + getd( "@ms_"+@ms_list$[.@ms]+"_hunt["+.@mob+"]" ) +"|";
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) );
}
}
}
end;

OnNPCKillEvent:
if( strnpcinfo(0) == .npc_name$ ){
if( @ms_size ){
.@map$ = strcharinfo(3);

// by default mission wont work in PVP,GVG,Instance,Event maps
if( compare( .@map$,"@" ) || getmapflag( .@map$,mf_gvg )){
// dispbottom "[Mission Board] PvP/GvG Map , Instance Map , Event Map , include monsters will not affect Mission Progress.";
end;
}

.@timetick = gettimetick(2);
for( .@ms = ( @ms_size - 1 ); .@ms >= 0; .@ms-- ){
if( getd( "@ms_"+@ms_list$[.@ms]+"_expire" ) && getd( "@ms_"+@ms_list$[.@ms]+"_expire" ) < .@timetick ){
setd( "@ms_"+@ms_list$[.@ms]+"_expire" ),0;
deletearray getd( "@ms_"+@ms_list$[.@ms]+"_list" );
deletearray getd( "@ms_"+@ms_list$[.@ms]+"_qty" );
deletearray getd( "@ms_"+@ms_list$[.@ms]+"_hunt" );
dispbottom "[Mission # "+@ms_list$[.@ms]+"] Mission removed due to expired. ";
deletearray @ms_list$[.@ms],1;
@ms_size--;

}else{
.@mob_size = getarraysize( getd( "@ms_"+@ms_list$[.@ms]+"_list" ) );
if( .@mob_size ){
copyarray .@temp_array[0],getd( "@ms_"+@ms_list$[.@ms]+"_list[0]" ),.@mob_size;
for( .@mob = 0; .@mob < .@mob_size; .@mob++ )
if( .@temp_array[.@mob] == killedrid ){
.@value = getd( "@ms_"+@ms_list$[.@ms]+"_hunt["+.@mob+"]" ) + 1;
setd( "@ms_"+@ms_list$[.@ms]+"_hunt["+.@mob+"]" ),.@value;
//dispbottom "[Mission # "+@ms_list$[.@ms]+" Progress] Hunted "+.@value+" /"+ getd( "@ms_"+ @ms_list$[.@i] +"_qty[" + .@j +"]" ) +" x "+ getmonsterinfo( getd( "@ms_"+ @ms_list$[.@i] +"_list["+ .@j +"]" ), MOB_NAME );
break;
}
deletearray .@temp_array;
}
}
}
}
}
end;

OnTimeCheck:
if( @ms_size ){
.@timetick = gettimetick(2);
for( .@i = ( @ms_size - 1 ); .@i >= 0; .@i-- ){
if( getd( "@ms_"+@ms_list$[.@i]+"_expire" ) <= .@timetick ){
setd( "@ms_"+@ms_list$[.@i]+"_expire" ),0;
deletearray getd( "@ms_"+@ms_list$[.@i]+"_list" );
deletearray getd( "@ms_"+@ms_list$[.@i]+"_qty" );
deletearray getd( "@ms_"+@ms_list$[.@i]+"_hunt" );
dispbottom "[Mission # "+@ms_list$[.@i]+"] Mission removed due to expired. ";
deletearray @ms_list$[.@i],1;
@ms_size--;
}
}
}
end;

OnRemoveMission:
.@mission_id = getarg(0);
.@message$ = getarg(1);

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 );
.@aid_size = getarraysize( .@aid );
.@i = 0;
.@origin_aid = getcharid(3);
while( .@i < .@aid_size ){
if( isloggedin( .@aid[.@i],.@cid[.@i] ) ){
attachrid( .@aid[.@i] );
for( .@ms = @ms_size; .@ms >= 0; .@ms-- )
if( @ms_list$[.@ms] == ""+.@mission_id ){
message strcharinfo(0),.@message$;
dispbottom "Please visit Mission NPC to gain latest information.";
setd( "@ms_"+@ms_list$[.@ms]+"_expire" ),0;
deletearray getd( "@ms_"+@ms_list$[.@ms]+"_list" );
deletearray getd( "@ms_"+@ms_list$[.@ms]+"_qty" );
deletearray getd( "@ms_"+@ms_list$[.@ms]+"_hunt" );
deletearray @ms_list$[.@ms],1;
@ms_size--;
break;
}
detachrid;
.@count++;
}
.@i++;
}
attachrid( .@origin_aid );
dispbottom "Total "+.@count+" online players affected.";
return;

// usage :
// .@timeleft = callsub( OnTime2Str,<time> );
OnTime2Str:
.@time = getarg(0);
.@left = ( .@time - gettimetick(2) );
.@hour = ( .@left / 3600 );
.@min = ( .@left % 3600 / 60 );
.@sec = ( .@left % 60 );
if( !.@left ) 
return "none";
else
return "^777777"+( ( .@hour )? .@hour+" hr ":"" ) + ( ( .@hour || .@min )? .@min+" min ":"" ) +.@sec+" sec^000000";


// usage : 
// .@new_array_size = callsub( OnExplodeArray,<old string variable>,<new array variable>,<save '0'> );
OnExplodeArray:
.@type = getarg(2);
explode( getarg(0),getarg(0),"|" );
.@size = getarraysize( getarg(0) );
if ( !.@size )
return 0;
while( .@i < .@size ){
if( !.@type ){
.@value = atoi( getelementofarray( getarg(0),.@i ) );
if( .@value ){
set getelementofarray( getarg(1),.@new_size ),.@value;
.@new_size++;
}
}else{
set getelementofarray( getarg(1),.@new_size ),getelementofarray( getarg(0),.@i );
.@new_size++;
}
.@i++;
}

return .@new_size;


// display mission information + optional progress checking
OnDisplayMissionInfo:
.@mission_id = getarg(0);
.@title$ = getarg(1);
.@description$ = getarg(2);
.@repeatable = getarg(4);
.@timelimit = getarg(5);
.@monster_size = getarraysize( getarg(6) );
.@item_size = getarraysize( getarg(8) );
.@base_job_bitmask = getarg(10);
.@job_branch_bitmask = getarg(11);
.@baseexp = getarg(12);
.@jobexp = getarg(13);
.@Mission_Points = getarg(14);
.@zeny = getarg(15);
.@reward_size = getarraysize( getarg(16) );
.@selected_npc_size = getarraysize( getarg(18) );
.@time_update$ = getarg(19);
.@redo_delay = getarg(20);
.@check_progress = getarg(21);

if( .@check_progress & 8 )
.@eac = eaclass();

// display mission info
mes ""+(( .@mission_id )? "^FF0000Mission ID # "+.@mission_id:" " )+"^000000";
mes "Title : "+( ( .@title$ != "" )?"^777777"+.@title$:"^FF0000-incomplete-" )+"^000000";
mes "Description : "+( ( .@description$ != "" )?"^777777"+.@description$:"^FF0000-incomplete-" )+"^000000";
mes "Level Range : "+( ( getelementofarray( getarg(3),0 ) )? "^777777"+getelementofarray( getarg(3),0 )+" ~ "+getelementofarray( getarg(3),1 ):"^FF0000-incomplete-" )+"^000000";
if( .@check_progress & 1 )
if( BaseLevel >= getelementofarray( getarg(3),0 ) && BaseLevel <= getelementofarray( getarg(3),1 ) )
.@lv_progress = 1;

mes "Repeatable: ^777777"+( ( !.@repeatable )?"unlimit":.@repeatable+" time" )+"^000000";
mes "Redo Delay: ^777777"+( ( !.@redo_delay )?"none":callsub( OnTime2Str,( ( .@redo_delay * 3600 ) + gettimetick(2) ) ) )+"^000000";
mes "Expire in: ^777777"+( ( !.@timelimit )?"none":callsub( OnTime2Str,.@timelimit ) )+"^000000";
mes " ";

.@word$ = (( !.@monster_size && !.@item_size )?"^FF0000incomplete":"^777777none" );
mes "Monster List : "+( ( .@monster_size )?"":.@word$ )+"^000000";
if( .@monster_size )
for( .@i = 0; .@i < .@monster_size; .@i++ ){
.@mob_id = getelementofarray( getarg(6),.@i );
.@quantity = getelementofarray( getarg(7),.@i );
if( .@check_progress & 2 ){
.@killed_count = getd( "@ms_"+.@mission_id+"_hunt["+.@i+"]" );
if( .@killed_count >= .@quantity ){
.@monster_progress++;
.@temp_color$ = "44EE99";
}else{
.@temp_color$ = "FF0000";
}
}
mes " ^777777"+.@quantity+" x "+getmonsterinfo( .@mob_id,MOB_NAME )+"  "+( ( .@check_progress & 2 )?"^"+.@temp_color$+"(killed "+.@killed_count+")":"" )+"^000000";
}
mes "Item List : "+( ( .@item_size )?"":.@word$ )+"^000000";
if( .@item_size )
for( .@i = 0; .@i < .@item_size; .@i++ ){
.@item_id = getelementofarray( getarg(8),.@i );
.@quantity = getelementofarray( getarg(9),.@i );
.@item_type = getiteminfo( .@item_id,2 );
if( .@check_progress & 4 ){
.@item_count = countitem( .@item_id );
if( .@item_count >= .@quantity ){
.@item_progress++;
.@temp_color$ = "44EE99";
}else{
.@temp_color$ = "FF0000";
}
}
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";
}
mes " ";
mes "Available Job Classes :";
if( .@base_job_bitmask ){
deletearray .@available_job$;
deletearray .@available_branch$;
.@available_job_size = 0;
.@available_branch_size = 0;
for( .@i = 0; .@i < .base_job_size; .@i++ )
if( .@base_job_bitmask & ( 1 << .@i ) ){
.@class = roclass( .base_job[.@i] );
.@available_job$[.@available_job_size] = jobname( .@class );
if( .@check_progress & 8 && BaseClass == .@class )
.@class_progress = 1;
.@available_job_size++;
}
mes " ^777777"+implode( .@available_job$,"," )+" ^000000";
if( .@job_branch_bitmask && .@class_progress ){
for( .@i = 0; .@i < .job_branch_size; .@i++ )
if( .@job_branch_bitmask & ( 1 << .@i ) ){
if( .@check_progress & 8 && ( .@eac & .job_branch[.@i] ) )
.@branch_progress++;
.@available_branch$[.@available_branch_size] = .job_branch_name$[.@i];
.@available_branch_size++;
}
mes "Inherited: ^777777"+implode( .@available_branch$,", " )+" ^000000";
}
}else{
mes " ^FF0000-incomplete^000000";
}

mes " ";
mes "Reward List : ";
mes "^777777 ~ Base EXP: "+( ( .@baseexp )? .@baseexp:"none" )+"^000000";
mes "^777777 ~ Job EXP: "+( ( .@jobexp )? .@jobexp:"none" )+"^000000";
mes "^777777 ~ Mission Points: "+( ( .@Mission_Points )? .@Mission_Points:"none" )+"^000000";
mes "^777777 ~ Zeny: "+( ( .@zeny )? .@zeny:"none" )+"^000000";
mes "Reward Item List: "+( ( .@reward_size )?"":"^777777none" )+"^000000";
if( .@reward_size )
for( .@i = 0; .@i < .@reward_size; .@i++ ){
.@item_id = getelementofarray( getarg(16),.@i );
.@item_type = getiteminfo( .@item_id,2 );
mes " ^777777 ~ "+getelementofarray( getarg(17),.@i )+" x "+getitemname( .@item_id )+" "+( ( .@item_type == 4 || .@item_type == 5 )?"["+getitemslots( .@item_id )+"]":"" )+"^000000";
}
mes " ";

mes "Mission Offered by: "+( ( .@selected_npc_size )?"":"^FF0000-incomplete" )+"^000000";
if( .@selected_npc_size ){
if( .@selected_npc_size >= 2 )
.@selected_npc$ = "|"+implode( getarg(18),"|" )+"|";
else
.@selected_npc$ = "|"+getarg(18)+"|";
for( .@i = 0; .@i < .mission_npc_count; .@i++ )
if( ( compare( "|"+.@selected_npc$+"|","|"+.@i+"|" ) ) ){
getmapxy( .@map$,.@x,.@y,1,.npc_unique_list$[.@i] );
.@sub_npc_name$ = "^777777("+.@map$+") ";
.@sub_npc_name$ = .@sub_npc_name$ + .npc_name_list$[.@i] + "^000000";
mes " ~ "+.@sub_npc_name$;
}
mes " ";
}
if( .@time_update$ != "0000-00-00 00:00:00" && .@time_update$ != "" ){
mes "Last Mission Update:";
mes "^777777"+.@time_update$+"^000000";
}

if( .@check_progress ){
if( .@check_progress & 1 && !.@lv_progress ){
dispbottom "[Failed] Your level didnt meet the requirements.";
.@check_result |= 1;
}
if( .@check_progress & 2 && .@monster_size != .@monster_progress ){
dispbottom "[Failed] Your Monsters Hunt didnt meet the requirements.";
.@check_result |= 2;
}
if( .@check_progress & 4 && .@item_size != .@item_progress ){
dispbottom "[Failed] Your Items collecting didnt meet the requirements.";
.@check_result |= 4;
}
if( .@check_progress & 8 && ( !.@branch_progress && !.@class_progress ) ){
dispbottom "[Failed] Your Class didnt meet the requirements.";
.@check_result |= 8;
}
}
return .@check_result;
}


// the number behind the NPC name must be NUMBER with range of ( 1 ~ 500 )
// the number should stay the same for eternity, if you change it frequently, it might affect your missions for each NPC.
// ( to conclude, once you assigned the number, dont change it for the sake of your mission board ... )

morocc,175,88,4 duplicate(mission_board) เควสประจำวัน#1 837
//prontera,154,174,4 duplicate(mission_board) Mission B#2 837
//prontera,156,176,4 duplicate(mission_board) Mission C#3 837
//prontera,159,179,4 duplicate(mission_board) Mission D#4 837
//prontera,151,161,4 duplicate(mission_board) Mission E#5 837
//prontera,154,164,4 duplicate(mission_board) Mission F#6 837
//prontera,156,166,4 duplicate(mission_board) Mission G#7 837
//prontera,159,169,4 duplicate(mission_board) Mission H#8 837
Edited by zaruramen
fix image link. dont use upic.me
Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

  • Group:  Members
  • Topic Count:  7
  • Topics Per Day:  0.00
  • Content Count:  80
  • Reputation:   1
  • Joined:  10/08/13
  • Last Seen:  

The link is invaild please include the photo in your post.

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  49
  • Topics Per Day:  0.01
  • Content Count:  545
  • Reputation:   220
  • Joined:  03/01/13
  • Last Seen:  

Please format your post to use the proper '<Code>' built into the forum. Makes helping much easier.

 

As a first step you should always compare any unknown error to the information found in the Overview of Errors wiki page before posting. Another thing to consider is googling the error with rAthena in the search to find any relevant threads. Please do that and fix your image link so we can help!

Regards,
~Azura Skyy

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  14
  • Topics Per Day:  0.00
  • Content Count:  41
  • Reputation:   0
  • Joined:  08/27/15
  • Last Seen:  

yes I have already search I found some case look like mine but I really don't know how to fix.

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  7
  • Topics Per Day:  0.00
  • Content Count:  80
  • Reputation:   1
  • Joined:  10/08/13
  • Last Seen:  

yes I have already search I found some case look like mine but I really don't know how to fix.

 

Please fix the link or include the ss in your post so we can help you

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  14
  • Topics Per Day:  0.00
  • Content Count:  41
  • Reputation:   0
  • Joined:  08/27/15
  • Last Seen:  

I did it sorry I can see the picture but I don't know people don't see it. I will post the direct link instead.

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  1
  • Topics Per Day:  0.00
  • Content Count:  88
  • Reputation:   10
  • Joined:  01/15/16
  • Last Seen:  

Image still dont working :/

¿You can add the lines of the error directly?

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  14
  • Topics Per Day:  0.00
  • Content Count:  41
  • Reputation:   0
  • Joined:  08/27/15
  • Last Seen:  

ok I refix my post and sorry.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...