Jump to content

zaruramen

Members
  • Posts

    41
  • Joined

  • Last visited

Posts posted by zaruramen

  1. 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
    
  2. hello

    I used to played with my friend on my server then I reinstall My Windows7 from 32 to 64bit then install my server again but now my friend can't join me he have some error

     

    10capture.jpg

     

    this error pop up when going to server select menu I'm not sure because windows Firewall or something?

  3. OH I just notice that maybe I can fix pvp damage by this file. but however have another way to fix like a global config? alike this part in misc.conf

     

    pk_short_attack_damage_rate: 80
    pk_long_attack_damage_rate: 70
    pk_weapon_attack_damage_rate: 60
    pk_magic_attack_damage_rate: 60
    pk_misc_attack_damage_rate: 60
     
    my server is pvp mode so this part is affect with monster attack and skill damage.
  4. hello

    I would like to fix a success rate of autoguard to 100%  I found some value but really don't know what it mean.

     

    status.c

     

    case SC_AUTOGUARD:

    if( !(flag&SCSTART_NOAVOID) ) {
    struct map_session_data *tsd;
    int i;
    for( i = val2 = 0; i < val1; i++) {
    int t = 5-(i>>1);
    val2 += (t < 0)? 1:t;
    }

     

    please advise me.

     

     

  5. hello long time ago I found some config about pvp and gvg damage setting the option have melee damage setting rang damage setting and magic damage setting but I can't remember where is it now. I think it should in conf but really don't know which one.


     

    Found it! misc.conf

    but I don't know why this setting is affect with monster on all map I set my server to pvp mode.

  6. hello

     

    I'm doing lvup reward script and my script is explane how to start on my server So when I warp player to other map a chatbox and script is end please advise me this is my script.

    - script Levelupbox -1,{
    -
    //male
    
    if(BaseLevel == 2) && (Sex == 1) goto lvftwo;
    cutin "3RD_WD_KIMDANCER01",0;
    mes "novice helper";
    mes "u got";
    next;
    getitem 13041,1;
    mes "I will warp you";
    next;
    menu "got it",-;
    warp "morocc",177,88;
    mes "good job";
    mes "let go";
    next;
    cutin "",255;
    getexp 1000,0;
    end;
    
    
    
    //female
    
    Lvftwo:
    cutin "GL_HEINRICH2",2;
    mes "novice helper";
    mes "u got";
    next;
    getitem 13041,1;
    mes "I will warp you";
    next;
    menu "got it",-;
    warp "morocc",177,88;
    mes "good job";
    mes "let go";
    next;
    cutin "",255;
    getexp 1000,0;
    end;
    
    
    }
    
    
  7. Hello

     

    I have a problem with the quest that have re-do delay. I cant pick a quest it told me "You cant pick this mission, you have mission redo delay isnt finish yet." I think the problem is at line 309-311

     

     

    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) +" order by completion desc limit 1", .@diff_delay, .@deny_time;

     

    if ( .@diff_delay < .@redo_delay ){

     

    anyone use this script and fixed it?


    Solved

     

    Change

     

     

     

    if ( .@diff_delay < .@redo_delay ){

     

    to

     

     

    if (.@deny_time != 0) && ( .@diff_delay < .@redo_delay ){

     

    for someone who got the same error with me.

  8.  

     

    hello

     

    I try to set this

     

    // Status points bonus for transcendent class
    transcendent_status_points: 52 to 1 (0 is invalid) 

     

     

     
    but when I changed class to transcendent I still got 52 bonus stat point

     

    did you reload the setting using @reloadbattleconf?

     

    yes I did :)

     

     

    @Haziel

     

    Worked Thank you very much

  9. hello

     

    I use huntingmission 1.4 script with no modify I got this error

    151010054844.jpg

     

    so I change 

     

    else if (.Party) {

    .@mob = killedrid;
    getmapxy(.@map1$,.@x1,.@y1,0);
    getpartymember getcharid(1),1;
    getpartymember getcharid(1),2;
    for (.@i = 0; .@i < $@partymembercount; .@i++) {
    if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) {
    set .@Mission_Count, getvar(#Mission_Count, $@partymembercid[.@i]);
    set .@Mission0, getvar(Mission0, $@partymembercid[.@i]);
    set .@HP, getvar(HP, $@partymembercid[.@i]);
     
    if (.@Mission_Count && .@Mission0 && .@HP > 0) {
    getmapxy(.@map2$,.@x2,.@y2,0);
    if ((.@map1$ == .@map2$ || .Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || .Party < 3)) {
    for (.@j = 0; .@j < .Quests; .@j++) {
    if (strmobinfo(1,.@mob) == strmobinfo(1,getvar(getd("Mission"+.@j), $@partymembercid[.@i]))) {
    if (getvar(getd("Mission"+.@j+"_"), $@partymembercid[.@i]) < .@Mission_Count) {
    dispbottom "[Hunting Mission] Killed " + (set(getvar(getd("Mission" + .@j + "_"), $@partymembercid[.@i]), getvar(getd("Mission" + .@j + "_") + 1, $@partymembercid[.@i]))) +
              " of " + .@Mission_Count + " " + strmobinfo(1,.@mob) + ".";
    break;
    }
    }
    }
    }
    }
    }
    }
    }
    end;

    with a part from huntingmission 1.3a

     

    else if (.Party) {

    set .@mob, killedrid;
    getmapxy(.@map1$,.@x1,.@y1,0);
    getpartymember getcharid(1),1;
    getpartymember getcharid(1),2;
    for(set .@i,0; .@i<$@partymembercount; set .@i,.@i+1) {
    if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) {
    attachrid $@partymemberaid[.@i];
    if (#Mission_Count && Mission0 && HP > 0) {
    getmapxy(.@map2$,.@x2,.@y2,0);
    if ((.@map1$ == .@map2$ || .Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || .Party < 3)) {
    for(set .@j,0; .@j<.Quests; set .@j,.@j+1) {
    if (strmobinfo(1,.@mob) == strmobinfo(1,getd("Mission"+.@j))) {
    if (getd("Mission"+.@j+"_") < #Mission_Count) {
    dispbottom "[Hunting Mission] Killed "+(set(getd("Mission"+.@j+"_"),getd("Mission"+.@j+"_")+1))+" of "+#Mission_Count+" "+strmobinfo(1,.@mob)+".";
    break;
    }
    }
    }
    }
    }
    }
    }
    }
    end;

    I can fix the first error but still got many error with many funtion when I talk to NPC it show

    [error]: script:callfunc: function not found! exp. F_InsertPlural,time2str,F_InsertComma

    I don't know how to delete a correct function part and when I change delay then abandon quest I got to wait 1444539905 befor taking another mission. please advise me to fix.

     

     

    FIXED IT My fault I delete Global_function in my npc folder that why I got function error.

     

    but still need help with first error.

     

    I have some suggestion is possible that someone in party take a quest and everybody in party got the same quest?

×
×
  • Create New...