//===== rAthena Script ====================================== //= Quest Manager //===== By: ================================================== //= Cretino //= Aeromesi (Found a bug.) //===== Current Version: ===================================== //= 1.0b (Little improvement and others bugs fixed) //===== Description: ========================================= //= Create new quests with various requirements and prizes. (eg: Hunt monsters and collect items in same quest and so on...) //===== Additional Comments: ================================= //= 1.0 Initial version [Cretino] // TODO: Need revise all script with comments for spelling errors. // Bug fixed. Thanks to [Aeromesi]:[Hercules] // Little improvement and others bugs fixed [Cretino] //============================================================ prontera,146,202,5 script Quest Manager 4_F_HUWOMAN,{ function show_quest; function del_var; if (getgroupid() >= .dq_group_access) { mes .npc_name$[0]; NPC_QUEST_FIRST_MENU: mes "Hey ^FF0000" + strcharinfo(0) + "^000000."; mes "What do you want?"; .@selected = select("Check quests:Setting quests:Cancel"); next; if (.@selected == 1) goto PLAYER_NPC_START; else if (.@selected == 3) { mes .npc_name$[0]; mes "Come back whenever you need me!"; close; } mes .npc_name$[0]; NPC_QUEST_SECOND_MENU: mes "Choose an Option:"; .@selected = select("Show quests:Add new quest:Erase quests:Back"); next; mes .npc_name$[0]; if (.@selected == 4) goto NPC_QUEST_FIRST_MENU; switch(.@selected) { case 1: if (getarraysize($dq_id) <= 0) { mes "There is no quests."; next; mes .npc_name$[0]; } else { if (getarraysize($dq_id) > .freeloop_size_active) .@free = freeloop(1); for(.@i = 0; .@i < getarraysize($dq_id); .@i++) { show_quest($dq_id[.@i], $dq_name$[.@i], $dq_desc_name$[.@i], $dq_type[.@i], $dq_count[.@i], "$dq_hunting_id_" + $dq_id[.@i], "$dq_hunting_amount_" + $dq_id[.@i], "$dq_collect_id_" + $dq_id[.@i], "$dq_collect_amount_" + $dq_id[.@i], "$dq_prize_id_" + $dq_id[.@i], "$dq_prize_amount_" + $dq_id[.@i], getd("$dq_zeny_cost_" + $dq_id[.@i]), getd("$dq_cash_cost_" + $dq_id[.@i]), getd("$dq_kafra_point_cost_" + $dq_id[.@i]), getd("$dq_req_lv_" + $dq_id[.@i]), getd("$dq_max_lv_" + $dq_id[.@i]), getd("$dq_zeny_prize_" + $dq_id[.@i]), getd("$dq_cash_prize_" + $dq_id[.@i]), getd("$dq_kafra_point_prize_" + $dq_id[.@i]), getd("$dq_bexp_prize_" + $dq_id[.@i]), getd("$dq_jobexp_prize_" + $dq_id[.@i]), getd("$dq_delay_" + $dq_id[.@i])); next; mes .npc_name$[0]; } if (.@free == 1) .@free = freeloop(0); } goto NPC_QUEST_SECOND_MENU; break; case 2: .@q_id = $dq_generate_id; mes "Quest ID: ^FF0000" + .@q_id + "^000000"; NPC_QUEST_NAME: mes "Put the quest name:"; input .@q_name$; next; mes .npc_name$[0]; .@q_name$ = replacestr(.@q_name$, ":", ""); if (.@q_name$ == "" || compare(.@q_name$, ":")) { mes "Invalid quest name."; mes "Try again."; .@selected = select("Yes:No"); next; mes .npc_name$[0]; goto (.@selected == 1) ? NPC_QUEST_NAME : NPC_QUEST_SECOND_MENU; } mes "Quest name: ^FF0000" + .@q_name$ + "^000000."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) goto (.@selected == 2) ? NPC_QUEST_NAME : NPC_QUEST_SECOND_MENU; NPC_QUEST_DESC: mes "Put the quest description:"; input .@q_desc_name$; next; mes .npc_name$[0]; .@q_desc_name$ = replacestr(.@q_desc_name$, ":", ""); if (.@q_desc_name$ == "" || compare(.@q_desc_name$, ":")) { mes "Invalid quest description."; mes "Try again."; .@selected = select("Yes:No"); next; mes .npc_name$[0]; goto (.@selected == 1) ? NPC_QUEST_DESC : NPC_QUEST_SECOND_MENU; } mes "Quest description: ^FF0000" + .@q_desc_name$ + "^000000."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) goto (.@selected == 2) ? NPC_QUEST_DESC : NPC_QUEST_SECOND_MENU; mes "Choose the quest type:"; .@selected = select("Global:Account:Character:Back"); next; mes .npc_name$[0]; if (.@selected == 4) goto NPC_QUEST_SECOND_MENU; .@q_type = .@selected; NPC_QUEST_AMOUNT: mes "How many times this quest can be done?"; mes "If you put '0', will be can done unlimited times without delay time."; mes "Quest type: ^FF0000" + ((.@q_type == 1) ? "Global" : (.@q_type == 2) ? "Account" : "Character") + "^000000."; input .@q_count, 0; next; mes .npc_name$[0]; mes ((.@q_count == 0) ? "^FF0000Unlimited^000000" : "^FF0000" + .@q_count + "^000000 times") + "."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) goto (.@selected == 2) ? NPC_QUEST_AMOUNT : NPC_QUEST_SECOND_MENU; if (.@q_count == 0) { .@q_delay = 0; goto NPC_QUEST_MENU_REQ; } NPC_QUEST_DELAY: mes "Put the quest delay time in seconds:"; mes "eg: 1 day = 86400"; mes "If quest have limit and don't have delay, the quest can only be done up to the limit."; input .@q_delay, 0; next; mes .npc_name$[0]; mes "^FF0000" + ((.@q_delay == 0) ? "No delay" : callfunc("Time2Str", (gettimetick(2) + .@q_delay))) + "^000000."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) goto (.@selected == 2) ? NPC_QUEST_DELAY : NPC_QUEST_SECOND_MENU; NPC_QUEST_MENU_REQ: mes "Choose the quest requirements:"; set .@req_menu$, ""; set .@req_menu$, .@req_menu$ + ((.@q_hunting_count > 0 && getarraysize(.q_hunting_id) > 0) ? "" : "Hunting monsters") + ":"; set .@req_menu$, .@req_menu$ + ((.@q_collect_count > 0 && getarraysize(.q_collect_id) > 0) ? "" : "Collect items") + ":"; set .@req_menu$, .@req_menu$ + ((.@q_zeny_cost > 0) ? "" : "Zeny") + ":"; set .@req_menu$, .@req_menu$ + ((.@q_cash_cost > 0) ? "" : "Cash Points") + ":"; set .@req_menu$, .@req_menu$ + ((.@q_kafra_point_cost > 0) ? "" : "Kafra Points") + ":"; set .@req_menu$, .@req_menu$ + ((.@q_min_lv > 0) ? "" : "Min level") + ":"; set .@req_menu$, .@req_menu$ + ((.@q_max_lv > 0) ? "" : "Max level") + ":"; set .@req_menu$, .@req_menu$ + "Advance" + ":"; set .@req_menu$, .@req_menu$ + "Back"; .@selected = select(.@req_menu$); next; mes .npc_name$[0]; if (.@selected == 9) { .@q_prize_count = 0; .@q_zeny_prize = 0; .@q_cash_prize = 0; .@q_kafra_point_prize = 0; .@q_bexp_prize = 0; .@q_jobexp_prize = 0; .@q_hunting_count = 0; .@q_collect_count = 0; .@q_zeny_cost = 0; .@q_cash_cost = 0; .@q_kafra_point_cost = 0; .@q_min_lv = 0; .@q_max_lv = 0; deletearray .q_prize_id; deletearray .q_prize_amount; deletearray .q_hunting_id; deletearray .q_hunting_amount; deletearray .q_collect_id; deletearray .q_collect_amount; goto NPC_QUEST_SECOND_MENU; } switch(.@selected) { case 1: NPC_QUEST_HUNTING: mes "Put the amount of monsters you want hunt:"; input .@q_hunting_count, 1; next; mes .npc_name$[0]; mes "^FF0000" + .@q_hunting_count + "^000000 monsters."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_hunting_count = 0; goto (.@selected == 2) ? NPC_QUEST_HUNTING : NPC_QUEST_MENU_REQ; } for(.@i = 0; .@i < .@q_hunting_count; .@i++) { NPC_QUEST_HUNTING_ID: mes "Put the monster ID: [" + (.@i + 1) + "/" + .@q_hunting_count + "]"; input .q_hunting_id[.@i], 0; next; mes .npc_name$[0]; .@q_monster_name$ = strmobinfo(1, .q_hunting_id[.@i]); if (.@q_monster_name$ == "") { mes "Invalid monster ID: ^FF0000" + .q_hunting_id[.@i] + "^000000 [" + (.@i + 1) + "/" + .@q_hunting_count + "]"; mes "Try again."; mes "NOTE: If you select 'No', you will lose all monsters configured."; .@selected = select("Yes:No"); next; mes .npc_name$[0]; if (.@selected == 2) { .@q_hunting_count = 0; deletearray .q_hunting_id; deletearray .q_hunting_amount; } goto (.@selected == 2) ? NPC_QUEST_MENU_REQ : NPC_QUEST_HUNTING_ID; } mes "Monster: ^FF0000" + .@q_monster_name$ + "^000000 (ID: " + .q_hunting_id[.@i] + ") - [" + (.@i + 1) + "/" + .@q_hunting_count + "]."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) { .@q_hunting_count = 0; deletearray .q_hunting_id; deletearray .q_hunting_amount; } goto (.@selected == 2) ? NPC_QUEST_HUNTING_ID : NPC_QUEST_MENU_REQ; } NPC_QUEST_HUNTING_COUNT: mes "Put the amount of ^FF0000" + .@q_monster_name$ + "^000000 (ID: " + .q_hunting_id[.@i] + ") - [" + (.@i + 1) + "/" + .@q_hunting_count + "] you want hunt:"; input .q_hunting_amount[.@i], 1; next; mes .npc_name$[0]; mes "^FF0000" + .q_hunting_amount[.@i] + "^000000x ^FF0000" + .@q_monster_name$ + "^000000 (ID: " + .q_hunting_id[.@i] + ") - [" + (.@i + 1) + "/" + .@q_hunting_count + "]."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) { .@q_hunting_count = 0; deletearray .q_hunting_id; deletearray .q_hunting_amount; } goto (.@selected == 2) ? NPC_QUEST_HUNTING_COUNT : NPC_QUEST_MENU_REQ; } } goto NPC_QUEST_MENU_REQ; break; case 2: NPC_QUEST_COLLECT: mes "Put the amount of items you want collect:"; input .@q_collect_count, 1; next; mes .npc_name$[0]; mes "^FF0000" + .@q_collect_count + "^000000 items."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_collect_count = 0; goto (.@selected == 2) ? NPC_QUEST_COLLECT : NPC_QUEST_MENU_REQ; } for(.@i = 0; .@i < .@q_collect_count; .@i++) { NPC_QUEST_COLLECT_ID: mes "Put the item ID: [" + (.@i + 1) + "/" + .@q_collect_count + "]"; input .q_collect_id[.@i], 0; .@q_item_name$ = getitemname(.q_collect_id[.@i]); next; mes .npc_name$[0]; if (.@q_item_name$ == "null") { mes "Invalid item ID: ^FF0000" + .q_collect_id[.@i] + "^000000 [" + (.@i + 1) + "/" + .@q_collect_count + "]"; mes "Try again."; mes "NOTE: If you select 'No', you will lose all items configured."; .@selected = select("Yes:No"); next; mes .npc_name$[0]; if (.@selected == 2) { .@q_collect_count = 0; deletearray .q_collect_id; deletearray .q_collect_amount; } goto (.@selected == 2) ? NPC_QUEST_MENU_REQ : NPC_QUEST_COLLECT_ID; } mes "Item: ^FF0000" + .@q_item_name$ + "^000000 (ID: " + .q_collect_id[.@i] + ") - [" + (.@i + 1) + "/" + .@q_collect_count + "]."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) { .@q_collect_count = 0; deletearray .q_collect_id; deletearray .q_collect_amount; } goto (.@selected == 2) ? NPC_QUEST_COLLECT_ID : NPC_QUEST_MENU_REQ; } NPC_QUEST_COLLECT_COUNT: mes "Put the amount of ^FF0000" + .@q_item_name$ + "^000000 (ID: " + .q_collect_id[.@i] + ") - [" + (.@i + 1) + "/" + .@q_collect_count + "] you want collect:"; input .q_collect_amount[.@i], 1; next; mes .npc_name$[0]; mes "^FF0000" + .q_collect_amount[.@i] + "^000000x ^FF0000" + .@q_item_name$ + "^000000 (ID: " + .q_collect_id[.@i] + ") - [" + (.@i + 1) + "/" + .@q_collect_count + "]."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) { .@q_collect_count = 0; deletearray .q_collect_id; deletearray .q_collect_amount; } goto (.@selected == 2) ? NPC_QUEST_COLLECT_COUNT : NPC_QUEST_MENU_REQ; } } goto NPC_QUEST_MENU_REQ; break; case 3: NPC_QUEST_ZENY_COST: mes "Put the amount of Zeny you want to charge:"; input .@q_zeny_cost, 1, MAX_ZENY; next; mes .npc_name$[0]; mes "^FF0000" + callfunc("F_InsertComma", .@q_zeny_cost) + "^000000z."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_zeny_cost = 0; goto (.@selected == 2) ? NPC_QUEST_ZENY_COST : NPC_QUEST_MENU_REQ; } goto NPC_QUEST_MENU_REQ; break; case 4: NPC_QUEST_CASH_COST: mes "Put the amount of Cash Points you want to charge:"; input .@q_cash_cost, 1; next; mes .npc_name$[0]; mes "^FF0000" + callfunc("F_InsertComma", .@q_cash_cost) + "^000000 Cash Points."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_cash_cost = 0; goto (.@selected == 2) ? NPC_QUEST_CASH_COST : NPC_QUEST_MENU_REQ; } goto NPC_QUEST_MENU_REQ; break; case 5: NPC_QUEST_KAFRA_COST: mes "Put the amount of Kafra Points you want to charge:"; input .@q_kafra_point_cost, 1; next; mes .npc_name$[0]; mes "^FF0000" + callfunc("F_InsertComma", .@q_kafra_point_cost) + "^000000 Kafra Points."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_kafra_point_cost = 0; goto (.@selected == 2) ? NPC_QUEST_KAFRA_COST : NPC_QUEST_MENU_REQ; } goto NPC_QUEST_MENU_REQ; break; case 6: NPC_QUEST_REQ_LEVEL: mes "Put the min level:"; input .@q_min_lv, 1, MAX_LEVEL; next; mes .npc_name$[0]; if (.@q_min_lv == .@q_max_lv || (.@q_min_lv > .@q_max_lv && .@q_max_lv > 0)) { mes "Invalid min level, min level can't be upper or equal max level."; mes "Min level: ^FF0000" + .@q_min_lv + "^000000. Max level: ^FF0000" + .@q_max_lv + "^000000."; mes "Try again."; .@q_min_lv = 0; .@selected = select("Yes:No"); next; mes .npc_name$[0]; goto (.@selected == 2) ? NPC_QUEST_MENU_REQ : NPC_QUEST_REQ_LEVEL; } mes "Min Lv. ^FF0000" + .@q_min_lv + "^000000."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_min_lv = 0; goto (.@selected == 2) ? NPC_QUEST_REQ_LEVEL : NPC_QUEST_MENU_REQ; } goto NPC_QUEST_MENU_REQ; break; case 7: NPC_QUEST_MAX_LEVEL: mes "Put the max level:"; input .@q_max_lv, 1, MAX_LEVEL; next; mes .npc_name$[0]; if (.@q_max_lv == .@q_min_lv || .@q_max_lv < .@q_min_lv) { mes "Invalid max level, max level can't be lower or equal required level."; mes "Min level: ^FF0000" + .@q_min_lv + "^000000. Max level: ^FF0000" + .@q_max_lv + "^000000."; mes "Try again."; .@q_max_lv = 0; .@selected = select("Yes:No"); next; mes .npc_name$[0]; goto (.@selected == 2) ? NPC_QUEST_MENU_REQ : NPC_QUEST_MAX_LEVEL; } mes "Max Lv. ^FF0000" + .@q_max_lv + "^000000."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_max_lv = 0; goto (.@selected == 2) ? NPC_QUEST_MAX_LEVEL : NPC_QUEST_MENU_REQ; } goto NPC_QUEST_MENU_REQ; break; case 8: if (!(.@q_hunting_count > 0 && getarraysize(.q_hunting_id) > 0) && !(.@q_collect_count > 0 && getarraysize(.q_collect_id) > 0) && !(.@q_zeny_cost > 0) && !(.@q_cash_cost > 0) && !(.@q_kafra_point_cost > 0) && !(.@q_req_lv > 0)) { mes "You don't added any requirement."; next; mes .npc_name$[0]; goto NPC_QUEST_MENU_REQ; } break; } NPC_QUEST_MENU_PRIZE: mes "Choose the prizes you want to give:"; set .@prize_menu$, ""; set .@prize_menu$, .@prize_menu$ + ((.@q_prize_count > 0 && getarraysize(.q_prize_id) > 0) ? "" : "Item") + ":"; set .@prize_menu$, .@prize_menu$ + ((.@q_zeny_prize > 0) ? "" : "Zeny") + ":"; set .@prize_menu$, .@prize_menu$ + ((.@q_cash_prize > 0) ? "" : "Cash Points") + ":"; set .@prize_menu$, .@prize_menu$ + ((.@q_kafra_point_prize > 0) ? "" : "Kafra Points") + ":"; set .@prize_menu$, .@prize_menu$ + ((.@q_bexp_prize > 0) ? "" : "Base Exp") + ":"; set .@prize_menu$, .@prize_menu$ + ((.@q_jobexp_prize > 0) ? "" : "Job Exp") + ":"; set .@prize_menu$, .@prize_menu$ + "Advance" + ":"; set .@prize_menu$, .@prize_menu$ + "Back"; .@selected = select(.@prize_menu$); next; mes .npc_name$[0]; if (.@selected == 8) { .@q_prize_count = 0; .@q_zeny_prize = 0; .@q_cash_prize = 0; .@q_kafra_point_prize = 0; .@q_bexp_prize = 0; .@q_jobexp_prize = 0; .@q_hunting_count = 0; .@q_collect_count = 0; .@q_zeny_cost = 0; .@q_cash_cost = 0; .@q_kafra_point_cost = 0; .@q_min_lv = 0; .@q_max_lv = 0; deletearray .q_prize_id; deletearray .q_prize_amount; deletearray .q_hunting_id; deletearray .q_hunting_amount; deletearray .q_collect_id; deletearray .q_collect_amount; goto NPC_QUEST_SECOND_MENU; } switch(.@selected) { case 1: NPC_QUEST_PRIZE_ITEM: mes "Put the amount of items prize you want:"; input .@q_prize_count, 1; next; mes .npc_name$[0]; mes "^FF0000" + .@q_prize_count + "^000000 items."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_prize_count = 0; goto (.@selected == 2) ? NPC_QUEST_PRIZE_ITEM : NPC_QUEST_MENU_PRIZE; } for(.@i = 0; .@i < .@q_prize_count; .@i++) { NPC_QUEST_PRIZE_ITEM_ID: mes "Put the item ID: [" + (.@i + 1) + "/" + .@q_prize_count + "]"; input .q_prize_id[.@i], 0; .@q_item_name$ = getitemname(.q_prize_id[.@i]); next; mes .npc_name$[0]; if (.@q_item_name$ == "null") { mes "Invalid item ID: ^FF0000" + .q_prize_id[.@i] + "^000000 [" + (.@i + 1) + "/" + .@q_prize_count + "]"; mes "Try again."; mes "NOTE: If you select 'No', you will lose all items configured."; .@selected = select("Yes:No"); next; mes .npc_name$[0]; if (.@selected == 2) { .@q_prize_count = 0; deletearray .q_prize_id; deletearray .q_prize_amount; } goto (.@selected == 2) ? NPC_QUEST_MENU_PRIZE : NPC_QUEST_PRIZE_ITEM_ID; } mes "Item: ^FF0000" + .@q_item_name$ + "^000000 (ID: " + .q_prize_id[.@i] + ") - [" + (.@i + 1) + "/" + .@q_prize_count + "]."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) { .@q_prize_count = 0; deletearray .q_prize_id; deletearray .q_prize_amount; } goto (.@selected == 2) ? NPC_QUEST_PRIZE_ITEM_ID : NPC_QUEST_MENU_PRIZE; } NPC_Q_PRIZE_ITEM_COUNT: mes "Put the amount of ^FF0000" + .@q_item_name$ + "^000000 (ID: " + .q_prize_id[.@i] + ") - [" + (.@i + 1) + "/" + .@q_prize_count + "] you want give:"; input .q_prize_amount[.@i], 1; next; mes .npc_name$[0]; mes "^FF0000" + .q_prize_amount[.@i] + "^000000x ^FF0000" + .@q_item_name$ + "^000000 (ID: " + .q_prize_id[.@i] + ") - [" + (.@i + 1) + "/" + .@q_prize_count + "]."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) { .@q_prize_count = 0; deletearray .q_prize_id; deletearray .q_prize_amount; } goto (.@selected == 2) ? NPC_Q_PRIZE_ITEM_COUNT : NPC_QUEST_MENU_PRIZE; } } goto NPC_QUEST_MENU_PRIZE; break; case 2: NPC_QUEST_ZENY_PRIZE: mes "Put the amount of Zeny you want to give:"; input .@q_zeny_prize, 1, MAX_ZENY; next; mes .npc_name$[0]; mes "^FF0000" + callfunc("F_InsertComma", .@q_zeny_prize) + "^000000z."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_zeny_prize = 0; goto (.@selected == 2) ? NPC_QUEST_ZENY_PRIZE : NPC_QUEST_MENU_PRIZE; } goto NPC_QUEST_MENU_PRIZE; break; case 3: NPC_QUEST_CASH_PRIZE: mes "Put the amount of Cash Points you want to give:"; input .@q_cash_prize, 1; next; mes .npc_name$[0]; mes "^FF0000" + callfunc("F_InsertComma", .@q_cash_prize) + "^000000 Cash Points."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_cash_prize = 0; goto (.@selected == 2) ? NPC_QUEST_CASH_PRIZE : NPC_QUEST_MENU_PRIZE; } goto NPC_QUEST_MENU_PRIZE; break; case 4: NPC_QUEST_KAFRA_PRIZE: mes "Put the amount of Kafra Points you want to give:"; input .@q_kafra_point_prize, 1; next; mes .npc_name$[0]; mes "^FF0000" + callfunc("F_InsertComma", .@q_kafra_point_prize) + "^000000 Kafra Points."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_kafra_point_prize = 0; goto (.@selected == 2) ? NPC_QUEST_KAFRA_PRIZE : NPC_QUEST_MENU_PRIZE; } goto NPC_QUEST_MENU_PRIZE; break; case 5: NPC_QUEST_BEXP_PRIZE: mes "Put the amount of Base Exp you want to give:"; input .@q_bexp_prize, 1; next; mes .npc_name$[0]; mes "^FF0000" + callfunc("F_InsertComma", .@q_bexp_prize) + "^000000 Base Exp."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_bexp_prize = 0; goto (.@selected == 2) ? NPC_QUEST_BEXP_PRIZE : NPC_QUEST_MENU_PRIZE; } goto NPC_QUEST_MENU_PRIZE; break; case 6: NPC_QUEST_JOBEXP_PRIZE: mes "Put the amount of Job Exp you want to give:"; input .@q_jobexp_prize, 1; next; mes .npc_name$[0]; mes "^FF0000" + callfunc("F_InsertComma", .@q_jobexp_prize) + "^000000 Job Exp."; mes "That's right?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) { if (.@selected == 3) .@q_jobexp_prize = 0; goto (.@selected == 2) ? NPC_QUEST_JOBEXP_PRIZE : NPC_QUEST_MENU_PRIZE; } goto NPC_QUEST_MENU_PRIZE; break; case 7: if (!(.@q_prize_count > 0 && getarraysize(.q_prize_id) > 0) && !(.@q_bexp_prize > 0) && !(.@q_jobexp_prize > 0) && !(.@q_cash_prize > 0) && !(.@q_kafra_point_prize > 0) && !(.@q_zeny_prize > 0)) { mes "You don't added any prize."; next; mes .npc_name$[0]; goto NPC_QUEST_MENU_PRIZE; } break; } show_quest(.@q_id, .@q_name$, .@q_desc_name$, .@q_type, .@q_count, ".q_hunting_id", ".q_hunting_amount", ".q_collect_id", ".q_collect_amount", ".q_prize_id", ".q_prize_amount", .@q_zeny_cost, .@q_cash_cost, .@q_kafra_point_cost, .@q_min_lv, .@q_max_lv, .@q_zeny_prize, .@q_cash_prize, .@q_kafra_point_prize, .@q_bexp_prize, .@q_jobexp_prize, ((.@q_delay == 0) ? -1 : .@q_delay)); mes " "; mes "Confirm quest?"; .@selected = select("Yes:No"); next; mes .npc_name$[0]; if (.@selected == 2) { deletearray .q_hunting_id; deletearray .q_hunting_amount; deletearray .q_collect_id; deletearray .q_collect_amount; deletearray .q_prize_id; deletearray .q_prize_amount; .@q_zeny_cost = 0; .@q_cash_cost = 0; .@q_kafra_point_cost = 0; .@q_min_lv = 0; .@q_max_lv = 0; .@q_zeny_prize = 0; .@q_cash_prize = 0; .@q_kafra_point_prize = 0; .@q_bexp_prize = 0; .@q_jobexp_prize = 0; .@q_prize_count = 0; .@q_hunting_count = 0; .@q_collect_count = 0; .@q_count = 0; .@q_type = 0; .@q_delay = 0; .@q_name$ = ""; .@q_desc_name$ = ""; goto NPC_QUEST_SECOND_MENU; } mes "Quest successfully added !!"; setarray .@q_hunting_array$[0], "$dq_hunting_id_" + .@q_id + "[0]", "$dq_hunting_amount_" + .@q_id + "[0]"; setarray .@q_collect_array$[0], "$dq_collect_id_" + .@q_id + "[0]", "$dq_collect_amount_" + .@q_id + "[0]"; setarray .@q_prize_array$[0], "$dq_prize_id_" + .@q_id + "[0]", "$dq_prize_amount_" + .@q_id + "[0]"; copyarray getd(.@q_hunting_array$[0]), .q_hunting_id[0], getarraysize(.q_hunting_id); copyarray getd(.@q_hunting_array$[1]), .q_hunting_amount[0], getarraysize(.q_hunting_amount); copyarray getd(.@q_collect_array$[0]), .q_collect_id[0], getarraysize(.q_collect_id); copyarray getd(.@q_collect_array$[1]), .q_collect_amount[0], getarraysize(.q_collect_amount); copyarray getd(.@q_prize_array$[0]), .q_prize_id[0], getarraysize(.q_prize_id); copyarray getd(.@q_prize_array$[1]), .q_prize_amount[0], getarraysize(.q_prize_amount); setd "$dq_zeny_cost_" + .@q_id, (!.@q_zeny_cost) ? -1 : .@q_zeny_cost; setd "$dq_cash_cost_" + .@q_id, (!.@q_cash_cost) ? -1 : .@q_cash_cost; setd "$dq_kafra_point_cost_" + .@q_id, (!.@q_kafra_point_cost) ? -1 : .@q_kafra_point_cost; setd "$dq_req_lv_" + .@q_id, (!.@q_min_lv) ? -1 : .@q_min_lv; setd "$dq_max_lv_" + .@q_id, (!.@q_max_lv) ? -1 : .@q_max_lv; setd "$dq_zeny_prize_" + .@q_id, (!.@q_zeny_prize) ? -1 : .@q_zeny_prize; setd "$dq_cash_prize_" + .@q_id, (!.@q_cash_prize) ? -1 : .@q_cash_prize; setd "$dq_kafra_point_prize_" + .@q_id, (!.@q_kafra_point_prize) ? -1 : .@q_kafra_point_prize; setd "$dq_bexp_prize_" + .@q_id, (!.@q_bexp_prize) ? -1 : .@q_bexp_prize; setd "$dq_jobexp_prize_" + .@q_id, (!.@q_jobexp_prize) ? -1 : .@q_jobexp_prize; setd "$dq_delay_" + .@q_id, (!.@q_delay) ? -1 : .@q_delay; setarray $dq_id[getarraysize($dq_id)], .@q_id; setarray $dq_name$[getarraysize($dq_name$)], .@q_name$; setarray $dq_desc_name$[getarraysize($dq_desc_name$)], .@q_desc_name$; setarray $dq_count[getarraysize($dq_count)], (!.@q_count) ? -1 : .@q_count; setarray $dq_type[getarraysize($dq_type)], .@q_type; $dq_generate_id++; deletearray .q_hunting_id; deletearray .q_hunting_amount; deletearray .q_collect_id; deletearray .q_collect_amount; deletearray .q_prize_id; deletearray .q_prize_amount; .@q_zeny_cost = 0; .@q_cash_cost = 0; .@q_kafra_point_cost = 0; .@q_min_lv = 0; .@q_max_lv = 0; .@q_zeny_prize = 0; .@q_cash_prize = 0; .@q_kafra_point_prize = 0; .@q_bexp_prize = 0; .@q_jobexp_prize = 0; .@q_prize_count = 0; .@q_hunting_count = 0; .@q_collect_count = 0; .@q_count = 0; .@q_type = 0; .@q_delay = 0; .@q_name$ = ""; .@q_desc_name$ = ""; next; mes .npc_name$[0]; goto NPC_QUEST_SECOND_MENU; break; case 3: NPC_QUEST_ERASE: mes "Choose an Option:"; .@selected = select("Erase a quest:Erase all quests:Back"); next; mes .npc_name$[0]; if (.@selected == 3) goto NPC_QUEST_SECOND_MENU; if (getarraysize($dq_id) <= 0) { mes "There is no quest."; next; mes .npc_name$[0]; goto NPC_QUEST_SECOND_MENU; } else if (.@selected == 1) { NPC_QUEST_ERASE_CHOOSE: mes "Choose the quest you want erase:"; set .@menu$, ""; if (getarraysize($dq_id) > .freeloop_size_active) .@free = freeloop(1); for(.@i = 0; .@i < getarraysize($dq_id); .@i++) set .@menu$, ((.@menu$ == "") ? $dq_id[.@i] + " - " + $dq_name$[.@i] + " - " + $dq_desc_name$[.@i] + "." : .@menu$ + ":" + $dq_id[.@i] + " - " + $dq_name$[.@i] + " - " + $dq_desc_name$[.@i] + "."); set .@menu$, .@menu$ + ":Back"; if (.@free == 1) .@free = freeloop(0); .@i = select(.@menu$) - 1; next; mes .npc_name$[0]; if (.@i == getarraysize($dq_id)) goto NPC_QUEST_ERASE; show_quest($dq_id[.@i], $dq_name$[.@i], $dq_desc_name$[.@i], $dq_type[.@i], $dq_count[.@i], "$dq_hunting_id_" + $dq_id[.@i], "$dq_hunting_amount_" + $dq_id[.@i], "$dq_collect_id_" + $dq_id[.@i], "$dq_collect_amount_" + $dq_id[.@i], "$dq_prize_id_" + $dq_id[.@i], "$dq_prize_amount_" + $dq_id[.@i], getd("$dq_zeny_cost_" + $dq_id[.@i]), getd("$dq_cash_cost_" + $dq_id[.@i]), getd("$dq_kafra_point_cost_" + $dq_id[.@i]), getd("$dq_req_lv_" + $dq_id[.@i]), getd("$dq_max_lv_" + $dq_id[.@i]), getd("$dq_zeny_prize_" + $dq_id[.@i]), getd("$dq_cash_prize_" + $dq_id[.@i]), getd("$dq_kafra_point_prize_" + $dq_id[.@i]), getd("$dq_bexp_prize_" + $dq_id[.@i]), getd("$dq_jobexp_prize_" + $dq_id[.@i]), getd("$dq_delay_" + $dq_id[.@i])); mes "You really want remove this quest?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) goto (.@selected == 2) ? NPC_QUEST_ERASE_CHOOSE : NPC_QUEST_ERASE; mes "Quest successfully erased !!"; setd "$dq_" + $dq_id[.@i] + "_info$", ""; del_var($dq_id[.@i], $dq_type); setarray .@q_hunting_array$[0], "$dq_hunting_id_" + $dq_id[.@i], "$dq_hunting_amount_" + $dq_id[.@i]; setarray .@q_collect_array$[0], "$dq_collect_id_" + $dq_id[.@i], "$dq_collect_amount_" + $dq_id[.@i]; setarray .@q_prize_array$[0], "$dq_prize_id_" + $dq_id[.@i], "$dq_prize_amount_" + $dq_id[.@i]; deletearray getd(.@q_hunting_array$[0]); deletearray getd(.@q_hunting_array$[1]); deletearray getd(.@q_collect_array$[0]); deletearray getd(.@q_collect_array$[1]); deletearray getd(.@q_prize_array$[0]); deletearray getd(.@q_prize_array$[1]); setd "$dq_zeny_cost_" + $dq_id[.@i], 0; setd "$dq_cash_cost_" + $dq_id[.@i], 0; setd "$dq_kafra_point_cost_" + $dq_id[.@i], 0; setd "$dq_req_lv_" + $dq_id[.@i], 0; setd "$dq_max_lv_" + $dq_id[.@i], 0; setd "$dq_zeny_prize_" + $dq_id[.@i], 0; setd "$dq_cash_prize_" + $dq_id[.@i], 0; setd "$dq_kafra_point_prize_" + $dq_id[.@i], 0; setd "$dq_bexp_prize_" + $dq_id[.@i], 0; setd "$dq_jobexp_prize_" + $dq_id[.@i], 0; setd "$dq_delay_" + $dq_id[.@i], 0; deletearray $dq_id[.@i], 1; deletearray $dq_name$[.@i], 1; deletearray $dq_desc_name$[.@i], 1; deletearray $dq_count[.@i], 1; deletearray $dq_type[.@i], 1; next; mes .npc_name$[0]; goto NPC_QUEST_ERASE; } mes "You really want remove all quests?"; .@selected = select("Yes:No:Back"); next; mes .npc_name$[0]; if (.@selected == 2 || .@selected == 3) goto (.@selected == 2) ? NPC_QUEST_ERASE : NPC_QUEST_SECOND_MENU; mes "All quests have been successfully erased !!"; if (getarraysize($dq_id) > .freeloop_size_active) .@free = freeloop(1); for(.@i = 0; .@i < getarraysize($dq_id); .@i++) { setd "$dq_" + $dq_id[.@i] + "_info$", ""; del_var($dq_id[.@i], $dq_type); setarray .@q_hunting_array$[0], "$dq_hunting_id_" + $dq_id[.@i], "$dq_hunting_amount_" + $dq_id[.@i]; setarray .@q_collect_array$[0], "$dq_collect_id_" + $dq_id[.@i], "$dq_collect_amount_" + $dq_id[.@i]; setarray .@q_prize_array$[0], "$dq_prize_id_" + $dq_id[.@i], "$dq_prize_amount_" + $dq_id[.@i]; deletearray getd(.@q_hunting_array$[0]); deletearray getd(.@q_hunting_array$[1]); deletearray getd(.@q_collect_array$[0]); deletearray getd(.@q_collect_array$[1]); deletearray getd(.@q_prize_array$[0]); deletearray getd(.@q_prize_array$[1]); setd "$dq_zeny_cost_" + $dq_id[.@i], 0; setd "$dq_cash_cost_" + $dq_id[.@i], 0; setd "$dq_kafra_point_cost_" + $dq_id[.@i], 0; setd "$dq_req_lv_" + $dq_id[.@i], 0; setd "$dq_max_lv_" + $dq_id[.@i], 0; setd "$dq_zeny_prize_" + $dq_id[.@i], 0; setd "$dq_cash_prize_" + $dq_id[.@i], 0; setd "$dq_kafra_point_prize_" + $dq_id[.@i], 0; setd "$dq_bexp_prize_" + $dq_id[.@i], 0; setd "$dq_jobexp_prize_" + $dq_id[.@i], 0; setd "$dq_delay_" + $dq_id[.@i], 0; } if (.@free == 1) .@free = freeloop(0); deletearray $dq_id; deletearray $dq_name$; deletearray $dq_desc_name$; deletearray $dq_count; deletearray $dq_type; next; mes .npc_name$[0]; goto NPC_QUEST_SECOND_MENU; break; } } else { PLAYER_NPC_START: mes .npc_name$[0]; mes "Hey ^FF0000" + strcharinfo(0) + "^000000."; if (getarraysize($dq_id) <= 0) { mes "There is no quests at moment."; mes "Sorry..."; if (getgroupid() >= .dq_group_access) { next; mes .npc_name$[0]; goto NPC_QUEST_FIRST_MENU; } else close; } PLAYER_NPC_MENU_CHOOSE: mes "I have ^FF0000" + getarraysize($dq_id) + "^000000 quests today."; mes "Choose the quest you want:"; set .@menu$, ""; if (getarraysize($dq_id) > .freeloop_size_active) .@free = freeloop(1); for(.@i = 0; .@i < getarraysize($dq_id); .@i++) set .@menu$, ((.@menu$ == "") ? "^FF0000" + $dq_name$[.@i] + "^000000" : .@menu$ + ":" + "^FF0000" + $dq_name$[.@i] + "^000000"); set .@menu$, .@menu$ + ":Cancel"; if (.@free == 1) .@free = freeloop(0); .@i = select(.@menu$) - 1; next; mes .npc_name$[0]; if (.@i == getarraysize($dq_id)) { if (getgroupid() >= .dq_group_access) goto NPC_QUEST_FIRST_MENU; else { mes "Come back whenever you need me!"; close; } } deletearray .@tmp_values$; explode(.@tmp_values$, getd("$dq_" + $dq_id[.@i] + "_info$"), ":"); .@delay = getd("$dq_delay_" + $dq_id[.@i]); .@global_count = atoi(.@tmp_values$[0]); .@global_value = atoi(.@tmp_values$[1]); .@global_accept = atoi(.@tmp_values$[3]); switch($dq_type[.@i]) { // Global case 1: // Get delay of global variable .@tmp_delay = atoi(.@tmp_values$[2]); set .@qs_type$, "#dq_"; deletearray .@tmp_values$; explode(.@tmp_values$, getd(.@qs_type$ + $dq_id[.@i] + "_info$"), ":"); .@tmp_value[0] = atoi(.@tmp_values$[0]); .@tmp_value[1] = atoi(.@tmp_values$[1]); .@tmp_accept = atoi(.@tmp_values$[3]); break; // Account case 2: set .@qs_type$, "#dq_"; deletearray .@tmp_values$; explode(.@tmp_values$, getd(.@qs_type$ + $dq_id[.@i] + "_info$"), ":"); .@tmp_value[0] = atoi(.@tmp_values$[0]); .@tmp_value[1] = atoi(.@tmp_values$[1]); .@tmp_delay = atoi(.@tmp_values$[2]); .@tmp_accept = atoi(.@tmp_values$[3]); break; // Character case 3: set .@qs_type$, "dq_"; deletearray .@tmp_values$; explode(.@tmp_values$, getd(.@qs_type$ + $dq_id[.@i] + "_info$"), ":"); .@tmp_value[0] = atoi(.@tmp_values$[0]); .@tmp_value[1] = atoi(.@tmp_values$[1]); .@tmp_delay = atoi(.@tmp_values$[2]); .@tmp_accept = atoi(.@tmp_values$[3]); break; } if ((($dq_type[.@i] == 1) ? .@global_value : .@tmp_value[1]) >= $dq_count[.@i] && $dq_count[.@i] > 0) { if (.@tmp_delay > 0 && .@tmp_delay > gettimetick(2) && .@delay != -1) { mes "You can't do this quest."; mes "This quest was complete ^FF0000" + .@global_count + "^000000 times."; mes (.@tmp_value[0] > 0) ? "You have completed ^FF0000" + .@tmp_value[0] + "^000000 times." : "You failed to complete."; mes "Please wait ^FF0000" + callfunc("Time2Str", .@tmp_delay) + "^000000 to do again."; next; mes .npc_name$[0]; goto PLAYER_NPC_MENU_CHOOSE; } else if (.@delay == -1) { mes "You can't do this quest."; mes "Because it has already been completed ^FF0000" + $dq_count[.@i] + "^000000 times."; mes (.@tmp_value[0] > 0) ? "You have completed ^FF0000" + .@tmp_value[0] + "^000000 times." : "You failed to complete."; next; mes .npc_name$[0]; goto PLAYER_NPC_MENU_CHOOSE; } } setarray .@hunting_array$[0], "$dq_hunting_id_" + $dq_id[.@i], "$dq_hunting_amount_" + $dq_id[.@i]; setarray .@collect_array$[0], "$dq_collect_id_" + $dq_id[.@i], "$dq_collect_amount_" + $dq_id[.@i]; setarray .@prize_array$[0], "$dq_prize_id_" + $dq_id[.@i], "$dq_prize_amount_" + $dq_id[.@i]; .@zeny_cost = getd("$dq_zeny_cost_" + $dq_id[.@i]); .@cash_cost = getd("$dq_cash_cost_" + $dq_id[.@i]); .@kafra_point_cost = getd("$dq_kafra_point_cost_" + $dq_id[.@i]); .@min_lv = getd("$dq_req_lv_" + $dq_id[.@i]); .@max_lv = getd("$dq_max_lv_" + $dq_id[.@i]); .@zeny_prize = getd("$dq_zeny_prize_" + $dq_id[.@i]); .@cash_prize = getd("$dq_cash_prize_" + $dq_id[.@i]); .@kafra_point_prize = getd("$dq_kafra_point_prize_" + $dq_id[.@i]); .@bexp_prize = getd("$dq_bexp_prize_" + $dq_id[.@i]); .@jobexp_prize = getd("$dq_jobexp_prize_" + $dq_id[.@i]); if (.@global_count > 0) { mes "This quest was complete ^FF0000" + .@global_count + "^000000 times."; mes (.@tmp_value[0] > 0) ? "You have completed ^FF0000" + .@tmp_value[0] + "^000000 times." : "You failed to complete."; mes " "; } show_quest($dq_id[.@i], $dq_name$[.@i], $dq_desc_name$[.@i], $dq_type[.@i], $dq_count[.@i], .@hunting_array$[0], .@hunting_array$[1], .@collect_array$[0], .@collect_array$[1], .@prize_array$[0], .@prize_array$[1], .@zeny_cost, .@cash_cost, .@kafra_point_cost, .@min_lv, .@max_lv, .@zeny_prize, .@cash_prize, .@kafra_point_prize, .@bexp_prize, .@jobexp_prize, .@delay); if (.dq_player_accept == 1) { if (.@tmp_accept == 0) { mes " "; mes "You want to accept this quest?"; .@selected = select("Yes:No"); next; mes .npc_name$[0]; if (.@selected == 1) { .@result[0] = (.@tmp_delay > 0 && .@tmp_delay < gettimetick(2) && .@delay != -1); if ($dq_type[.@i] == 1 && .@global_accept == 0) { .@result[1] = (.@result[0] == 1 && .@global_value >= $dq_count[.@i] && $dq_count[.@i] > 0); setd "$dq_" + $dq_id[.@i] + "_info$", .@global_count + ":" + ((.@result[1] == 1) ? 0 : .@global_value) + ":" + ((.@result[0] == 1) ? 0 : .@tmp_delay) + ":" + 1; } .@result[1] = (.@result[0] == 1 && .@tmp_value[1] >= $dq_count[.@i] && $dq_count[.@i] > 0); setd .@qs_type$ + $dq_id[.@i] + "_info$", .@tmp_value[0] + ":" + ((.@result[1] == 1) ? 0 : .@tmp_value[1]) + ":" + ((.@result[0] == 1) ? 0 : .@tmp_delay) + ":" + 1; mes "Quest [^FF0000" + $dq_id[.@i] + "^000000] accepted !!"; mes "Quest name: ^FF0000" + $dq_name$[.@i] + "^000000."; next; mes .npc_name$[0]; } goto PLAYER_NPC_MENU_CHOOSE; } } else { if (.@tmp_accept == 0) { .@result[0] = (.@tmp_delay > 0 && .@tmp_delay < gettimetick(2) && .@delay != -1); if ($dq_type[.@i] == 1 && .@global_accept == 0) { .@result[1] = (.@result[0] == 1 && .@global_value >= $dq_count[.@i] && $dq_count[.@i] > 0); setd "$dq_" + $dq_id[.@i] + "_info$", .@global_count + ":" + ((.@result[1] == 1) ? 0 : .@global_value) + ":" + ((.@result[0] == 1) ? 0 : .@tmp_delay) + ":" + 1; } .@result[1] = (.@result[0] == 1 && .@tmp_value[1] >= $dq_count[.@i] && $dq_count[.@i] > 0); setd .@qs_type$ + $dq_id[.@i] + "_info$", .@tmp_value[0] + ":" + ((.@result[1] == 1) ? 0 : .@tmp_value[1]) + ":" + ((.@result[0] == 1) ? 0 : .@tmp_delay) + ":" + 1; } } mes " "; mes "You have all requirements?"; .@selected = select("Yes:No"); next; mes .npc_name$[0]; if (.@selected == 2) goto PLAYER_NPC_MENU_CHOOSE; if (.@min_lv > BaseLevel && .@min_lv > 0) { mes "You need more ^FF0000" + (.@min_lv - BaseLevel) + "^000000 levels."; next; mes .npc_name$[0]; goto PLAYER_NPC_MENU_CHOOSE; } if (.@max_lv < BaseLevel && .@max_lv > 0) { mes "You can't do this quest."; mes "Max Lv. ^FF0000" + .@max_lv + "^000000."; next; mes .npc_name$[0]; goto PLAYER_NPC_MENU_CHOOSE; } .@need = 0; set .@tmp_var$, ""; set .@tmp_var$, .@qs_type$ + $dq_id[.@i] + "_hunting_count$"; deletearray .@tmp_kill$; explode(.@tmp_kill$, getd(.@tmp_var$), ","); .@tmp_size = getarraysize(.@tmp_kill$); for(.@j = 0; .@j < getarraysize(getd(.@hunting_array$[0])); .@j++) { .@hunting_id = getd(.@hunting_array$[0] + "[" + .@j + "]"); .@hunting_kill = getd(.@hunting_array$[1] + "[" + .@j + "]"); .@found = 0; for(.@k = 0; .@k < .@tmp_size; .@k++) { deletearray .@tmp_values$; explode(.@tmp_values$, .@tmp_kill$[.@k], ":"); .@tmp_id = atoi(.@tmp_values$[0]); .@tmp_count = atoi(.@tmp_values$[1]); if (.@tmp_count < .@hunting_kill && .@hunting_id == .@tmp_id) { mes "You need hunt ^FF0000" + (.@hunting_kill - .@tmp_count) + "^000000x ^FF0000" + strmobinfo(1, .@hunting_id) + "^000000."; if (.@need == 0) .@need = 1; } if (.@hunting_id == .@tmp_id) .@found = 1; } if (.@found == 0) { mes "You need hunt ^FF0000" + .@hunting_kill + "^000000x ^FF0000" + strmobinfo(1, .@hunting_id) + "^000000."; if (.@need == 0) .@need = 1; } } for(.@j = 0; .@j < getarraysize(getd(.@collect_array$[0])); .@j++) { .@id = getd(.@collect_array$[0] + "[" + .@j + "]"); setarray .@tmp_count[0], countitem(.@id), getd(.@collect_array$[1] + "[" + .@j + "]"); if (.@tmp_count[0] < .@tmp_count[1]) { mes "You need collect ^FF0000" + (.@tmp_count[1] - .@tmp_count[0]) + "^000000x ^FF0000" + getitemname(.@id) + "^000000."; if (.@need == 0) .@need = 1; } } if (.@zeny_cost > Zeny && .@zeny_cost > 0) { mes "You need ^FF0000" + callfunc("F_InsertComma", (.@zeny_cost - Zeny)) + "^000000z."; if (.@need == 0) .@need = 1; } if (.@cash_cost > #CASHPOINTS && .@cash_cost > 0) { mes "You need ^FF0000" + callfunc("F_InsertComma", (.@cash_cost - #CASHPOINTS)) + "^000000 Cash Points."; if (.@need == 0) .@need = 1; } if (.@kafra_point_cost > #KAFRAPOINTS && .@kafra_point_cost > 0) { mes "You need ^FF0000" + callfunc("F_InsertComma", (.@kafra_point_cost - #KAFRAPOINTS)) + "^000000 Kafra Points."; if (.@need == 0) .@need = 1; } if (Zeny + .@zeny_prize > MAX_ZENY && .@zeny_prize > 0) { mes "You can't receive ^FF0000" + callfunc("F_InsertComma", .@zeny_prize) + "^000000z."; mes "Because will exceed the limit of ^FF0000" + callfunc("F_InsertComma", MAX_ZENY) + "^000000z."; if (.@need == 0) .@need = 1; } if (!checkweight2(getd(.@prize_array$[0]), getd(.@prize_array$[1]))) { mes "You are overweight."; if (.@need == 0) .@need = 1; } if (.@need == 1) { next; mes .npc_name$[0]; goto PLAYER_NPC_MENU_CHOOSE; } for(.@j = 0; .@j < getarraysize(getd(.@collect_array$[0])); .@j++) { .@id = getd(.@collect_array$[0] + "[" + .@j + "]"); .@count = getd(.@collect_array$[1] + "[" + .@j + "]"); delitem .@id, .@count; } setd .@qs_type$ + $dq_id[.@i] + "_hunting_count$", ""; setd (($dq_type[.@i] == 3) ? "#dq_" : "dq_") + $dq_id[.@i] + "_hunting_count$", ""; if (.@zeny_cost > 0) Zeny -= .@zeny_cost; if (.@cash_cost > 0) #CASHPOINTS -= .@cash_cost; if (.@kafra_point_cost > 0) #KAFRAPOINTS -= .@kafra_point_cost; if (.@zeny_prize > 0) { Zeny += .@zeny_prize; mes "You got ^FF0000" + callfunc("F_InsertComma", .@zeny_prize) + "^000000z."; } if (.@cash_prize > 0) { #CASHPOINTS += .@cash_prize; mes "You got ^FF0000" + callfunc("F_InsertComma", .@cash_prize) + "^000000 Cash Points."; } if (.@kafra_point_prize > 0) { #KAFRAPOINTS += .@kafra_point_prize; mes "You got ^FF0000" + callfunc("F_InsertComma", .@kafra_point_prize) + "^000000 Kafra Points."; } if (.@bexp_prize > 0) { BaseExp += .@bexp_prize; mes "You got ^FF0000" + callfunc("F_InsertComma", .@bexp_prize) + "^000000 Base Exp."; } if (.@jobexp_prize > 0) { JobExp += .@jobexp_prize; mes "You got ^FF0000" + callfunc("F_InsertComma", .@jobexp_prize) + "^000000 Job Exp."; } for(.@j = 0; .@j < getarraysize(getd(.@prize_array$[0])); .@j++) { .@id = getd(.@prize_array$[0] + "[" + .@j + "]"); .@count = getd(.@prize_array$[1] + "[" + .@j + "]"); getitem .@id, .@count; mes "You got ^FF0000" + .@count + "^000000x ^FF0000" + getitemname(.@id) + "^000000."; } setd "$dq_" + $dq_id[.@i] + "_info$", (.@global_count + 1) + ":" + (.@global_value + 1) + ":" + (gettimetick(2) + .@delay) + ":" + (((.@global_value + 1) >= $dq_count[.@i] && $dq_count[.@i] > 0) ? 0 : 1); setd .@qs_type$ + $dq_id[.@i] + "_info$", (.@tmp_value[0] + 1) + ":" + (.@tmp_value[1] + 1) + ":" + (gettimetick(2) + .@delay) + ":" + 0; mes "You received all prizes !!"; next; mes .npc_name$[0]; goto PLAYER_NPC_MENU_CHOOSE; } OnInit: // GameMaster Level to Access .dq_group_access = 99; // 1 = Show a message to player if kill a monster added in hunt (Message format: '[Quest Manager]: [My quest name] - Poring [1/100]') // 0 = Disabled. .dq_display_hunt = 1; // 1 = Players need accept quest in the npc to hunt monsters. // 0 = Disabled. .dq_player_accept = 1; // .npc_name$[0] = NPC name using 'mes'. // .npc_name$[1] = NPC name using 'dispbottom'. setarray .npc_name$[0], "[^FF0000" + strnpcinfo(3) + "^000000]", "[" + strnpcinfo(3) + "]"; // ONLY CHANGE IF YOU KNOW WHAT YOU'RE DOING !! if ($dq_generate_id == 0) $dq_generate_id = 1; .freeloop_size_active = 128; end; OnNPCKillEvent: if (getarraysize($dq_id) > .freeloop_size_active) .@free = freeloop(1); for(.@i = 0; .@i < getarraysize($dq_id); .@i++) { .@close = 0; .@min_lv = getd("$dq_req_lv_" + $dq_id[.@i]); .@max_lv = getd("$dq_max_lv_" + $dq_id[.@i]); if (.@max_lv < BaseLevel && .@max_lv > 0) continue; if (.@min_lv > BaseLevel && .@min_lv > 0) continue; switch($dq_type[.@i]) { // Global case 1: set .@qs_type$, "#dq_"; deletearray .@tmp_values$; explode(.@tmp_values$, getd("$dq_" + $dq_id[.@i] + "_info$"), ":"); .@tmp_value = atoi(.@tmp_values$[1]); .@tmp_delay = atoi(.@tmp_values$[2]); .@tmp_accept = atoi(.@tmp_values$[3]); deletearray .@tmp_values$; explode(.@tmp_values$, getd(.@qs_type$ + $dq_id[.@i] + "_info$"), ":"); .@player_accept = atoi(.@tmp_values$[3]); break; // Account case 2: set .@qs_type$, "#dq_"; deletearray .@tmp_values$; explode(.@tmp_values$, getd(.@qs_type$ + $dq_id[.@i] + "_info$"), ":"); .@tmp_value = atoi(.@tmp_values$[1]); .@tmp_delay = atoi(.@tmp_values$[2]); .@tmp_accept = atoi(.@tmp_values$[3]); break; // Character case 3: set .@qs_type$, "dq_"; deletearray .@tmp_values$; explode(.@tmp_values$, getd(.@qs_type$ + $dq_id[.@i] + "_info$"), ":"); .@tmp_value = atoi(.@tmp_values$[1]); .@tmp_delay = atoi(.@tmp_values$[2]); .@tmp_accept = atoi(.@tmp_values$[3]); break; } if ($dq_type[.@i] == 1) { if (.@player_accept == 0 && .dq_player_accept == 1) continue; if (.@tmp_delay > 0 && .@tmp_delay < gettimetick(2) && .@delay != -1 && .@tmp_accept == 0) .@tmp_accept = 1; } if (.dq_player_accept == 1) { if (.@tmp_accept == 0) continue; } else { if (.@tmp_accept == 0 && $dq_type[.@i] == 1) continue; } .@delay = getd("$dq_delay_" + $dq_id[.@i]); if (.@tmp_value >= $dq_count[.@i] && $dq_count[.@i] > 0) { if (.@tmp_delay > 0 && .@tmp_delay > gettimetick(2) && .@delay != -1) continue; else if (.@delay == -1) continue; } setarray .@hunting_array$[0], "$dq_hunting_id_" + $dq_id[.@i], "$dq_hunting_amount_" + $dq_id[.@i]; set .@tmp_var$, .@qs_type$ + $dq_id[.@i] + "_hunting_count$"; deletearray .@tmp_kill$; explode(.@tmp_kill$, getd(.@tmp_var$), ","); .@tmp_size = getarraysize(.@tmp_kill$); for(.@j = 0; .@j < getarraysize(getd(.@hunting_array$[0])); .@j++) { .@hunting_id = getd(.@hunting_array$[0] + "[" + .@j + "]"); .@hunting_kill = getd(.@hunting_array$[1] + "[" + .@j + "]"); if (.@hunting_id != killedrid) continue; .@found = 0; setd .@tmp_var$, ""; for(.@k = 0; .@k < .@tmp_size; .@k++) { deletearray .@tmp_values$; explode(.@tmp_values$, .@tmp_kill$[.@k], ":"); .@tmp_id = atoi(.@tmp_values$[0]); .@tmp_count = atoi(.@tmp_values$[1]); if (.@tmp_count < .@hunting_kill && .@hunting_id == .@tmp_id) { if (.@k > 0) setd .@tmp_var$, getd(.@tmp_var$) + "," + .@tmp_id + ":" + (.@tmp_count + 1); else setd .@tmp_var$, .@tmp_id + ":" + (.@tmp_count + 1); if (.dq_display_hunt == 1) dispbottom .npc_name$[1] + ": [" + $dq_name$[.@i] + "] - " + strmobinfo(1, .@tmp_id) + " [" + (.@tmp_count + 1) + "/" + .@hunting_kill + "]."; if (.@close == 0) .@close = 1; } else { if (.@k > 0) setd .@tmp_var$, getd(.@tmp_var$) + "," + .@tmp_id + ":" + .@tmp_count; else setd .@tmp_var$, .@tmp_id + ":" + .@tmp_count; } if (.@hunting_id == .@tmp_id) { if (.@found == 0) .@found = 1; } } if (.@found == 0) { if (.@tmp_size >= 1) setd .@tmp_var$, getd(.@tmp_var$) + "," + .@hunting_id + ":" + 1; else setd .@tmp_var$, .@hunting_id + ":" + 1; if (.dq_display_hunt == 1) dispbottom .npc_name$[1] + ": [" + $dq_name$[.@i] + "] - " + strmobinfo(1, .@hunting_id) + " [" + 1 + "/" + .@hunting_kill + "]."; if (.@close == 0) .@close = 1; } if (.@close == 1) break; } } if (.@free == 1) .@free = freeloop(0); end; //del_var(, ); function del_var { .@q_id = getarg(0); .@q_type = getarg(1); .@tmp = playerattached(); set .@key$, "dq_" + .@q_id; switch(.@q_type) { // Global case 1: // Account case 2: set .@table$, "`acc_reg_str`"; set .@type$, "`account_id`"; break; // Character case 3: set .@table$, "`char_reg_str`"; set .@type$, "`char_id`"; break; } query_sql "SELECT " + .@type$ + " FROM " + .@table$ + " WHERE `key` LIKE '%" + .@key$ + "%'", .@id; if (getarraysize(.@id) > .freeloop_size_active) .@free = freeloop(1); for(.@i = 0; .@i < getarraysize(.@id); .@i++) { query_sql "SELECT `account_id`, `online` FROM `char` WHERE " + .@type$ + " = '" + .@id[.@i] + "'", .@account_id, .@online; .@islogged = isloggedin(.@account_id); if (.@online == 1 && .@islogged == 1) { if (attachrid(.@account_id) == 1) { switch(.@q_type) { // Global case 1: // Account case 2: setd "#" + .@key$ + "_info$", ""; setd "#" + .@key$ + "_hunting_count$", ""; break; // Character case 3: setd .@key$ + "_info$", ""; setd .@key$ + "_hunting_count$", ""; break; } } else goto OFFLINE_PLAYER; // Can't attach to player. (Maybe offline?) } else { // Player is offline OFFLINE_PLAYER: query_sql "DELETE FROM " + .@table$ + " WHERE `key` LIKE '%" + .@key$ + "%' AND " + .@type$ + " = '" + .@id[.@i] + "'"; } } if (.@free == 1) .@free = freeloop(0); if (.@tmp != playerattached()) attachrid(.@tmp); } function show_quest { .@id = getarg(0); set .@name$, getarg(1); set .@desc_name$, getarg(2); .@type = getarg(3); .@count = getarg(4); .@zeny_cost = getarg(11); .@cash_cost = getarg(12); .@kafra_point_cost = getarg(13); .@min_lv = getarg(14); .@max_lv = getarg(15); .@zeny_prize = getarg(16); .@cash_prize = getarg(17); .@kafra_point_prize = getarg(18); .@bexp_prize = getarg(19); .@jobexp_prize = getarg(20); .@delay = getarg(21); setarray .@hunting_array$[0], getarg(5), getarg(6); setarray .@collect_array$[0], getarg(7), getarg(8); setarray .@prize_array$[0], getarg(9), getarg(10); mes "Quest ID: ^FF0000" + .@id + "^000000."; mes "Quest Name: ^FF0000" + .@name$ + "^000000."; mes "Quest Description: ^FF0000" + .@desc_name$ + "^000000."; mes "Quest Type: ^FF0000" + ((.@type == 1) ? "Global" : (.@type == 2) ? "Account" : "Character") + "^000000."; mes "Times: " + ((.@count == -1) ? "^FF0000Unlimited^000000" : ((.@delay == -1) ? "Only ^FF0000" + .@count + "^000000 times." : "^FF0000" + .@count + "^000000 times per ^FF0000" + callfunc("Time2Str", (gettimetick(2) + .@delay)) + "^000000.")); mes " "; mes "Requirements:"; for(.@j = 0; .@j < getarraysize(getd(.@hunting_array$[0])); .@j++) mes "Hunt ^FF0000" + getd(.@hunting_array$[1] + "[" + .@j + "]") + "^000000x ^FF0000" + strmobinfo(1, getd(.@hunting_array$[0] + "[" + .@j + "]")) + "^000000."; for(.@j = 0; .@j < getarraysize(getd(.@collect_array$[0])); .@j++) mes "Collect ^FF0000" + getd(.@collect_array$[1] + "[" + .@j + "]") + "^000000x ^FF0000" + getitemname(getd(.@collect_array$[0] + "[" + .@j + "]")) + "^000000."; mes (.@zeny_cost > 0) ? "^FF0000" + callfunc("F_InsertComma", .@zeny_cost) + "^000000z." : ""; mes (.@cash_cost > 0) ? "^FF0000" + callfunc("F_InsertComma", .@cash_cost) + "^000000 Cash Points." : ""; mes (.@kafra_point_cost > 0) ? "^FF0000" + callfunc("F_InsertComma", .@kafra_point_cost) + "^000000 Kafra Points." : ""; mes ((.@min_lv > 0 && .@max_lv > 0) ? "Lv. ^FF0000" + .@min_lv + "^000000~^FF0000" + .@max_lv + "^000000." : (.@min_lv > 0) ? "Min Lv. ^FF0000" + .@min_lv + "^000000." : (.@max_lv > 0) ? "Max Lv. ^FF0000" + .@max_lv + "^000000." : ""); mes " "; mes "Prizes:"; for(.@j = 0; .@j < getarraysize(getd(.@prize_array$[0])); .@j++) mes "^FF0000" + getd(.@prize_array$[1] + "[" + .@j + "]") + "^000000x ^FF0000" + getitemname(getd(.@prize_array$[0] + "[" + .@j + "]")) + "^000000."; mes (.@zeny_prize > 0) ? "^FF0000" + callfunc("F_InsertComma", .@zeny_prize) + "^000000z." : ""; mes (.@cash_prize > 0) ? "^FF0000" + callfunc("F_InsertComma", .@cash_prize) + "^000000 Cash Points." : ""; mes (.@kafra_point_prize > 0) ? "^FF0000" + callfunc("F_InsertComma", .@kafra_point_prize) + "^000000 Kafra Points." : ""; mes (.@bexp_prize > 0) ? "^FF0000" + callfunc("F_InsertComma", .@bexp_prize) + "^000000 Base Exp." : ""; mes (.@jobexp_prize > 0) ? "^FF0000" + callfunc("F_InsertComma", .@jobexp_prize) + "^000000 Job Exp." : ""; return; } }