From d6f948fea7c58ec926431ade02b088597a9f069a Mon Sep 17 00:00:00 2001 From: Aleos Date: Fri, 27 Mar 2020 09:43:11 -0400 Subject: [PATCH 001/212] Fixes some minor typos in Skill documentation (#4726) --- doc/skill_db.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/skill_db.txt b/doc/skill_db.txt index 099bd9c269..5e665d963a 100644 --- a/doc/skill_db.txt +++ b/doc/skill_db.txt @@ -3,7 +3,7 @@ //===== By: ================================================== //= rAthena Dev Team //===== Last Updated: ======================================== -//= 20191220 +//= 20200324 //===== Description: ========================================= //= Explanation of the skill_db.yml file and structure. //============================================================ @@ -71,7 +71,7 @@ IsSong - Song/Dance skill. IsEnsemble - Ensemble skill. IsTrap - Trap skill. TargetSelf - Damages/targets self. -NoTargetSelf - Cannot target self. If TargetType is Self_Skill, changes to Attack_Skill. +NoTargetSelf - Cannot target self. If TargetType is Self, changes to Attack. PartyOnly - Usable on party (and enemies if offensive). GuildOnly - Usable on guild (and enemies if offensive). NoTargetEnemy - Disable on enemies (for non-offensive). @@ -100,8 +100,8 @@ TargetHidden - Target enemy with OPTION_HIDE. IncreaseGloomyDayDamage - Increase SC_GLOOMYDAY_SK damage. IncreaseDanceWithWugDamage - Increase SC_DANCEWITHWUG damage. IgnoreWugBite - Ignore RA_WUGBITE. -IgnoreAutoGuard - Not blocked by SC_AUTOGUARD (Weapon_Skill only). -IgnoreCicada - Not blocked by SC_UTSUSEMI or SC_BUNSINJYUTSU (Weapon_Skill only). +IgnoreAutoGuard - Not blocked by SC_AUTOGUARD (When TargetType is Weapon only). +IgnoreCicada - Not blocked by SC_UTSUSEMI or SC_BUNSINJYUTSU (When TargetType is Weapon only). --------------------------------------- @@ -128,9 +128,9 @@ Sequence Map Form Hit: Skill hit type. -Normal - Passive/No damage skill. (Default) -Single - Single hit. -Repeat - Multiple hits. +Normal - Passive/No damage skill. (Default) +Single - Single hit. +Multi_Hit - Multiple hits. --------------------------------------- From 34cb15ec04543607173269bc16ba00b71a940dbc Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Fri, 27 Mar 2020 15:31:24 +0100 Subject: [PATCH 002/212] Fixed a couple of answers on Knight job quest test (#4724) --- npc/jobs/2-1/knight.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npc/jobs/2-1/knight.txt b/npc/jobs/2-1/knight.txt index d77590952a..4285e9b4c8 100644 --- a/npc/jobs/2-1/knight.txt +++ b/npc/jobs/2-1/knight.txt @@ -1634,7 +1634,7 @@ prt_in,69,107,6 script Lady Amy#knt 728,{ mes "[Lady Amy]"; mes "But some rude players came with a group of monsters and disappeared! What should you do?"; next; - if (select("Keep the monsters from reaching the party.:Defend while the party retreats.:Run away on your Peco Peco.") == 2) + if (select("Keep the monsters from reaching the party.:Defend while the party retreats.:Run away on your Peco Peco.") != 3) set .@knight_t,.@knight_t+10; mes "[Lady Amy]"; mes "Luckily, you all lived through the crisis. But as you walk, you find a person, who is not in your party, collapsed on the ground."; @@ -1662,7 +1662,7 @@ prt_in,69,107,6 script Lady Amy#knt 728,{ mes "What should you"; mes "do to sell your item?"; next; - if (select("Shout out loud to everyone.:Open a chat room and wait.:Inquire if there is anyone that is interested.") == 3) + if (select("Shout out loud to everyone.:Open a chat room and wait.:Inquire if there is anyone that is interested.") != 1) set .@knight_t,.@knight_t+10; mes "[Lady Amy]"; mes "While you are waiting,"; From 979e13dd66103e3b6387e9acfa48642a57b66a26 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Fri, 27 Mar 2020 15:32:56 +0100 Subject: [PATCH 003/212] Fixed a couple of bugs in Assassin job quest (#4723) * Fixed a bug where the player can't finish the quest if the NPC times out after obtaining the weapon. *Fixed savepoints for pre-renewal. *Thanks to @Tydus1 --- npc/jobs/2-1/assassin.txt | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/npc/jobs/2-1/assassin.txt b/npc/jobs/2-1/assassin.txt index 9b0c3aa94d..5ee1fd00f2 100644 --- a/npc/jobs/2-1/assassin.txt +++ b/npc/jobs/2-1/assassin.txt @@ -1642,7 +1642,10 @@ OnCast: in_moc_16,149,80,4 script Guildmaster#ASN2 106,1,1,{ end; OnTouch_: - savepoint "morocc",100,100,1,1; + if (checkre(0)) + savepoint "morocc",100,100,1,1; + else + savepoint "moc_ruins",79,99,1,1; if (ASSIN_Q == 7 && BaseJob == Job_Thief) { set ASSIN_Q,8; mes "[Guildmaster]"; @@ -2094,11 +2097,10 @@ OnTouch_: mes "It used to rule over the Assassin weapon market. Please take care of my gladius."; getitem 1220,1; //Gladius_ } - set ASSIN_Q,17; - set ASSIN_Q3,2; + ASSIN_Q3 = 2; next; } - else { + else if (ASSIN_Q3 != 2) { mes "[Guildmaster]"; mes "Well, I talked too much."; mes "Please take this first."; @@ -2119,7 +2121,7 @@ OnTouch_: case 5: getitem 1252,1; //Katar } - set ASSIN_Q,17; + ASSIN_Q3 = 2; } mes "[Guildmaster]"; mes "Well, I am giving you a token. Please return to the Assassin expert, the Ferocious-Looking Huey, at the entrance."; @@ -2129,8 +2131,12 @@ OnTouch_: next; mes "[Guildmaster]"; mes "You, " + strcharinfo(0) + ", have chosen to live as an Assassin. May you learn our ways and be an honorable example to others."; - savepoint "morocc",100,100,1,1; + if (checkre(0)) + savepoint "morocc",100,100,1,1; + else + savepoint "moc_ruins",79,99,1,1; getitem 1008,1; //Frozen_Heart + ASSIN_Q = 17; changequest 8006,8007; next; mes "[Guildmaster]"; From bdd63022a9c479df833304add9537eca7f39b331 Mon Sep 17 00:00:00 2001 From: Aleos Date: Fri, 27 Mar 2020 13:09:19 -0400 Subject: [PATCH 004/212] Fixes Assumptio status in renewal (#4736) * Adjusts Assumptio to increase hard defense, not soft. * Adjusts CASH_ASSUMPTIO status icon to follow as well. Thanks to @LordWhiplash! --- src/map/status.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/map/status.cpp b/src/map/status.cpp index 8e3961fa7c..84b832e126 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -581,7 +581,7 @@ void initChangeTables(void) #ifndef RENEWAL EFST_ASSUMPTIO , SCB_NONE ); #else - EFST_ASSUMPTIO_BUFF , SCB_DEF2 ); + EFST_ASSUMPTIO_BUFF , SCB_DEF ); #endif #ifdef RENEWAL set_sc( HP_BASILICA , SC_BASILICA , EFST_BASILICA_BUFF , SCB_ALL ); @@ -718,7 +718,12 @@ void initChangeTables(void) set_sc( CASH_BLESSING , SC_BLESSING , EFST_BLESSING , SCB_STR|SCB_INT|SCB_DEX ); set_sc( CASH_INCAGI , SC_INCREASEAGI , EFST_INC_AGI, SCB_AGI|SCB_SPEED ); - set_sc( CASH_ASSUMPTIO , SC_ASSUMPTIO , EFST_ASSUMPTIO , SCB_NONE ); + set_sc( CASH_ASSUMPTIO , SC_ASSUMPTIO , +#ifndef RENEWAL + EFST_ASSUMPTIO , SCB_NONE ); +#else + EFST_ASSUMPTIO_BUFF , SCB_DEF ); +#endif set_sc( ALL_PARTYFLEE , SC_PARTYFLEE , EFST_PARTYFLEE , SCB_NONE ); set_sc( ALL_ODINS_POWER , SC_ODINS_POWER , EFST_ODINS_POWER , SCB_WATK|SCB_MATK|SCB_MDEF|SCB_DEF ); @@ -6904,7 +6909,10 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc, if(sc->data[SC_DRUMBATTLE]) def += sc->data[SC_DRUMBATTLE]->val3; -#ifndef RENEWAL +#ifdef RENEWAL + if (sc->data[SC_ASSUMPTIO]) + def += sc->data[SC_ASSUMPTIO]->val1 * 50; +#else if(sc->data[SC_DEFENCE]) def += sc->data[SC_DEFENCE]->val2; #endif @@ -7000,8 +7008,6 @@ static signed short status_calc_def2(struct block_list *bl, struct status_change #ifdef RENEWAL if (sc->data[SC_SKA]) def2 += 80; - if (sc->data[SC_ASSUMPTIO]) - def2 += sc->data[SC_ASSUMPTIO]->val1 * 50; #endif if(sc->data[SC_ANGELUS]) #ifdef RENEWAL /// The VIT stat bonus is boosted by angelus [RENEWAL] From e07d2b9ec21ad94f4539afac69e1fe62167eaee1 Mon Sep 17 00:00:00 2001 From: Atemo Date: Mon, 30 Mar 2020 16:53:14 +0200 Subject: [PATCH 005/212] Fixed an issue in the custom job master npc (#4749) * The player shouldn't be able to rebirth after being 3rd class * Added additionnal checks here and there Closes #4735 Thanks to @reunite-ro --- npc/custom/jobmaster.txt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/npc/custom/jobmaster.txt b/npc/custom/jobmaster.txt index d29582eb05..59c4589a21 100644 --- a/npc/custom/jobmaster.txt +++ b/npc/custom/jobmaster.txt @@ -71,8 +71,8 @@ function Can_Rebirth { return false; // Rebirth disabled if( !(eaclass()&EAJL_2) ) return false; // Not second Class - if( eaclass()&EAJL_UPPER ) - return false; // Already Rebirthed + if( eaclass()&(EAJL_UPPER|EAJL_THIRD) ) + return false; // Already Rebirthed/ Third Class if( roclass(eaclass()|EAJL_UPPER) < 0 ) return false; // Job has no transcended class if( Is_Baby() && !.BabyClass ) @@ -126,7 +126,6 @@ function Job_Options { Check_SkillPoints(); // initialisation - deletearray .@job_opt[0],getarraysize(.@job_opt); .@eac = eaclass(); .@third_possible = Can_Change_Third(); .@rebirth_possible = Can_Rebirth(); @@ -300,6 +299,7 @@ function Job_Menu { // Executes the actual jobchange and closes. function Job_Change { + .@previous_class = Class; .@to_cls = getarg(0); next; mes .NPCName$; @@ -316,10 +316,12 @@ function Job_Change { } specialeffect2 EF_ANGEL2; specialeffect2 EF_ELECTRIC; - if (.Platinum) - callfunc "F_GetPlatinumSkills"; - if (.GetJobEquip) - Get_Job_Equip(); + if (.@previous_class != Class) { + if (.Platinum) + callfunc "F_GetPlatinumSkills"; + if (.GetJobEquip) + Get_Job_Equip(); + } close; // Always closes after the change } @@ -327,7 +329,7 @@ function Confirm_Change { // Player confirms he want to change into .@class .@class = getarg(0, -1); .@back = getarg(1, false); - if( .@class < 0 ) { + if( .@class < 0 || eaclass(.@class) == -1 ) { mes "Unknown Class Error."; close; } From 2f326bf04a0f81c1717289db55b38288c2d8c59c Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 30 Mar 2020 13:17:19 -0400 Subject: [PATCH 006/212] Converted Quest Database to YAML (#4064) * Changes TimeLimit format to be human readable. * Converts title to string. * Converts objectives and drop items to vectors. * General clean ups and optimizations. * Got rid of dummy_quest. * Added TXT to YAML converter. Thanks to @Atemo and @Normynator! Co-authored-by: atemo --- db/import-tmpl/quest_db.txt | 7 - db/import-tmpl/quest_db.yml | 44 + db/pre-re/quest_db.txt | 3135 ------------ db/pre-re/quest_db.yml | 7098 ++++++++++++++++++++++++++ db/quest_db.yml | 52 + db/re/quest_db.txt | 4053 --------------- db/re/quest_db.yml | 9573 +++++++++++++++++++++++++++++++++++ doc/yaml/db/quest_db.yml | 23 + src/char/int_quest.cpp | 2 +- src/common/mmo.hpp | 7 +- src/map/atcommand.cpp | 4 +- src/map/clif.cpp | 76 +- src/map/intif.cpp | 6 +- src/map/map-server.vcxproj | 2 +- src/map/quest.cpp | 720 +-- src/map/quest.hpp | 60 +- src/map/script.cpp | 7 +- src/tool/csv2yaml.cpp | 143 + 18 files changed, 17412 insertions(+), 7600 deletions(-) delete mode 100644 db/import-tmpl/quest_db.txt create mode 100644 db/import-tmpl/quest_db.yml delete mode 100644 db/pre-re/quest_db.txt create mode 100644 db/pre-re/quest_db.yml create mode 100644 db/quest_db.yml delete mode 100644 db/re/quest_db.txt create mode 100644 db/re/quest_db.yml create mode 100644 doc/yaml/db/quest_db.yml diff --git a/db/import-tmpl/quest_db.txt b/db/import-tmpl/quest_db.txt deleted file mode 100644 index 61416a27a4..0000000000 --- a/db/import-tmpl/quest_db.txt +++ /dev/null @@ -1,7 +0,0 @@ -// Quest Database -// -// Structure of Database: -// Quest ID,Time Limit,Target1,Val1,Target2,Val2,Target3,Val3,MobID1,NameID1,Rate1,MobID2,NameID2,Rate2,MobID3,NameID3,Rate3,Quest Title -// -// The MobID*, NameID*, and Rate* reflect special values for quests that can drop an item at given rate from given mob. -// If no MobID* is given, then any mob has a chance to drop the given ItemID*. diff --git a/db/import-tmpl/quest_db.yml b/db/import-tmpl/quest_db.yml new file mode 100644 index 0000000000..e426d78209 --- /dev/null +++ b/db/import-tmpl/quest_db.yml @@ -0,0 +1,44 @@ +# This file is a part of rAthena. +# Copyright(C) 2019 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Quest Database +########################################################################### +# +# Quest Settings +# +########################################################################### +# - Id Quest ID. +# Title Quest title. +# TimeLimit Amount of time before the quest expires. (Default: 0) +# Use a number following by "d" for day(s), "h" for hour(s), "mn" for minute(s), and "s" for second(s). +# Specify with "+" for how long until the quest expires. +# Specify without "+" for the exact time the quest expires using "d" (optionnal), [0-23]"h" (required), [0-59]"mn" (optionnal), [0-59]"s" (optionnal) format. +# Please note the number before "d" only shift the exact timer to the given day(s). +# Targets: Quest objective target. (Default: null) +# - Mob Monster to kill. +# Count Amount of monsters to kill. +# Drops: Quest item drop targets. (Default: null) +# - Mob Monster to kill. 0 will apply to all monsters. (Default: 0) +# Item Item to drop. +# Count Amount of items that will drop. Non-stackable items default to 1. (Default: 1) +# Rate Item drop rate. (10000 = 100%) +########################################################################### + +Header: + Type: QUEST_DB + Version: 1 diff --git a/db/pre-re/quest_db.txt b/db/pre-re/quest_db.txt deleted file mode 100644 index 013603284f..0000000000 --- a/db/pre-re/quest_db.txt +++ /dev/null @@ -1,3135 +0,0 @@ -// Quest Database -// -// Structure of Database: -// Quest ID,Time Limit,Target1,Val1,Target2,Val2,Target3,Val3,MobID1,NameID1,Rate1,MobID2,NameID2,Rate2,MobID3,NameID3,Rate3,Quest Title -// -// The MobID*, NameID*, and Rate* reflect special values for quests that can drop an item at given rate from given mob. -// If no MobID* is given, then any mob has a chance to drop the given ItemID*. - -1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Transcend" -1001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Acolyte" -1002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Acolyte" -1003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Acolyte" -1004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Archer" -1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Mage" -1006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Mage" -1007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Mage" -1008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Mage" -1009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Merchant" -1010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Merchant" -1011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Merchant" -1012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Merchant" -1013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Thief" -1014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Swordman" -1015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Your first quest" -1016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaining base levels" - -// 2010 Headgear Quests -1100,0,1178,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo in the Sphinx Dungeon!" -1101,0,1164,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soloing Sphinx Dungeon!" -1102,0,1194,40,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soloing Clock Tower!" -1103,0,1213,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soloing Clock Tower!" -1104,0,1519,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Luoyang!" -1105,0,1513,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Luoyang!" -1106,0,1375,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Amatsu Dungeon!" -1107,0,1403,40,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Amatsu Dungeon!" -1108,0,1631,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Luoyang!" - -// Ropewa & Yuridi Quest -1109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Survivors of the Labyrinth" -1110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Victims of the Labyrinth" -1111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Maze in the Labyrinth" -1112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Lost in the Labyrinth" -1113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Torn Apart" -1114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - The Cost of Restoration" -1115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Song of the Abyss" -1116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Dead Man's Song" -1117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Eternal Promise, Broken Ring" -1118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Neighborhood Knight - I Need Clues" -1119,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Neighborhood Knight - Cooldown" - -1145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1152,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" - -// 2011 X-Mas Event -1194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" - -// Find Professor Worm's Memory -1214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" - -2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 1" -2064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 2" -2065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 3" -2066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 4" -2067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 5" -2068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 6" -2069,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tierra Gorge Battle" -2070,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flavius Battle" -2071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2143,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guild Dungeon Event" -2144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guild Dungeon Event" - -2147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2150,0,1995,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2151,0,1992,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2157,0,1986,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding a Fairy" -2159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding a Tree Giant" -2179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dr. Lifeguard's request" -2180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dr. Lifeguard's request" -2181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dr. Lifeguard's request" -2182,64800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rough Minerals" -2183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flower of Alfheim" -2184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flower of Alfheim" -2185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spirit of Alfheim" -2186,64800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helping Grenouille" - -2187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" -2188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" -2189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" -2190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" -2191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" - -2192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" - -2209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" -2210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" -2211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" -2212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" -2213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" -2214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" -2215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" -2216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" -2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" -2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2221,600,1718,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2223,0,1428,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" - -// Secret in the Woods -2271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Buwaya" - -// Pyramid (Nightmare) -2289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Verit Hunting (Nightmare)" -2290,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Verit Hunting - Cooldown" -2291,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mummy Hunting - Cooldown" -2292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mummy Hunting (Nightmare)" - -// New Novice Ground -2299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training Center: Talk to Lisa" -2300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training Center: Talk to General Reindeer" -2301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training Center: Leave the boat" -2302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training Center: Formation" - -//2315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" - -3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk - Marathon" -3029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk - Final test" -//3030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk - Spiritual Training" -3032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk - Become a Monk" -3040,43200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Curse of Baphomet" -3041,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Curse of Baphomet" -3042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Cursed Baphomet Doll" -3043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Gigantic Magestic Goat" -3044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Gigantic Magestic Goat" -3045,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sealed Shrine" -3046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sealed Shrine After-effect" - -3050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 1" -3051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 2" -3052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 3" -3053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 4" -3054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 5" -3055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 6" -3056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 7" -3060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Where's the Little Sis?" -3061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Find a way to unlock the shackles!" -3062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Find the Locksmith!" -3063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Mr. Lockenlock?" -3064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Organic Chamelepu Soap" -3065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Soap Ingredients" -3066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - To make a Chamelepu Soap..." -3067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Camel Appetite Stimulants" -3068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Getting the Camel Dung" -3069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Where's the Silk Sand Camel?" -3070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Silk Sand Camel is gone!" -3071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Silk Sand Camel is found!" -3072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 1 lump of Camel dung obtained" -3073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 2 lumps of Camel dung obtained" -3074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 3 lumps of Camel dung obtained" -3075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 4 lumps of Camel dung obtained" -3076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 5 lumps of Camel dung obtained" -3077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Go to Ms. Ivory" -3078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Chamalepu Soap is completed!" -3079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Making the key mold" -3080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Bringing the key mold" -3081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - All you need is Steel!" -3082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - The Key is Made!" -3083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Mr. Lockenlock's key" -3085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Call from the commander" -3086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Commander's Duty" -3087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Rune Midgard" -3088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Accident!" -3089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - How to restore" -3090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Location of reports" -3091,1800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Location of reports" -3092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Success to restore!" -3093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Report to the continent" -3094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Return to the expedition" - -3100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Lost Bond of Debt" -3101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Strange Heap of Earth" -3102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Bond of Debt Found, but..." -3103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Inventor Dorian" -3104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Repair Materials of Magic Dryer" -3105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Repairing Magic Dryer" -3106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Repairing Magic Dryer Failed" -3107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Repairing Magic Dryer Successful" -3108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Let's Run the Magic Dryer" -3109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Restoring the Bond of Debt" -3110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Tracking the Diamond" -3111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Leblo's Favor" -3112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Wola the Doctor" -3113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Wola the Doctor" -3114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Wola the Doctor" -3115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Leblo's Information" -3116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Information from Rogue Investigator" -3117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Odd Switches" -3118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Diamond Found!" -3119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Wanted Notice" -3120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - About Z Gang" -3121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Valdes's Favor" -3122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Information from Valdes" -3123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Marybell's Test" -3124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Challenging Moonho Ahn" -3125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Challenging Moonho Ahn" -3126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Information from Marybell" -3127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Z Gang's Attack" -3128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Z Gang's Attack" -3129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Strange Letter" -3130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Decrypting the letter..." -3131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Code's Broken!" -3132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Find the Z Gang's Agit" -3133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Agit Found!" -3134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Clean Sweep of Z Gang" -3135,259200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nidhoggur's Nest" -3136,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nidhoggur's Nest Time Limit" - -3200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Recommendation for Rune knight" -3201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Secret rendezvous of Rune knight" -3202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The first test" -3203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The first test" -3204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Pass the first test" -3205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3209,0,1504,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Accumulation of magic energy1" -3210,0,1506,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Accumulation of magic energy2" -3211,0,1508,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Accumulation of magic energy3" -3212,0,1510,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Accumulation of magic energy4" -3213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Pass the second test" -3216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The final test" -3217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The final test" -3218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Pass the final test" -3219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The end of all test" -3220,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Waiting time of test" - -3250,0,1041,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - What is this bandage for?" -3251,0,1271,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - An alligator of Counterattack" -3252,0,1264,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - My mermaid don't do like this way!" -3253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Missing occult mania" -3254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A country wants you" -3255,0,1166,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A wild boar subjugate operation" -3256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Ready for waiting summer" -3257,0,1170,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A grudge of women" -3258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A material of delicacy" -3259,0,1143,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A agony of a doll master" -3260,0,1035,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Tiresome flies" -3261,0,1026,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Unclean girl" -3262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Queer hobby" -3263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A mallet of goblin" -3265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Missing occult mania" - -4000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sherin's Job Interview" -4001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter - Test" -4012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" - -// Following entries are depreciated - use 10000-10025 -//4015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Becoming an Adventurer Appraiser" -//4016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Proof of Qualification" -//4017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Qualification Test" -//4018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Preparations for Meeting Princes" -//4020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The prince, Peter's Favor" -//4029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Girl's Favor" -//4030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Story of Ahrum and Ernst" -//4031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Story of Ahrum and Ernst" -//4032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conspiracy of the two families" -//4033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Death of Ahrum" - -4133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Iara" -4134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Iara" -4135,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Iara" - -4154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus Researcher" -4155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 1" -4156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 2" -4157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 3" -4158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 4" -4159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 5" -4160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 6" - -4161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Siege Expert" -4162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Party Recruiting Expert" -4163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battleground Expert" -4164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memorial Dungeon Expert" -4165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Map Expert" -4166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Passing Grades" - -// Paradise 86 - 90 [Chilly] -4167,0,1321,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Dragon Tail Handling" -4168,0,1322,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Spring Rabbit Handling" -4169,0,1256,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Pest Handling" -4170,0,1102,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Bathory Handling" -4171,0,1193,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Alarm Handling" -4172,0,1882,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Babayaga Handling" -4173,0,1512,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Hyegun Handling" -4174,0,1403,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Antique Firelock Handling" -4175,0,1417,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Zipper Bear Handling" -4176,0,1155,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Earth Petite Handling" -4177,0,1162,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Rafflesia Handling" -4178,0,1621,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Venomous Handling" -4179,0,1616,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Pitman Handling" -4180,0,1718,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Yellow Novus Handling" - -// Paradise 91 - 99 [Chilly] -4181,0,1316,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Solider Handling" -4182,0,1319,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Freezer Handling" -4183,0,1318,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Heater Handling" -4184,0,1257,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Injustice Handling" -4185,0,1201,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Rybio Handling" -4186,0,1198,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Dark Priest Handling" -4187,0,1784,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Stapo Handling" -4188,0,1782,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Roween Handling" -4189,0,1776,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Siroma Handling" -4190,0,1401,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Shinobi Handling" -4191,0,1416,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Evil Nymph Handling" -4192,0,1109,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Deviruchi Handling" -4193,0,1614,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Mineral Handling" -4194,0,1072,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Kaho Handling" -4195,0,1255,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Neraid Handling" -4196,0,1506,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Disguise Handling" - -4197,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Octopus" - -// Paradise Cooldowns -4198,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4199,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4200,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4201,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4202,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4203,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4204,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4205,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4206,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4207,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4208,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4209,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4210,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4211,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4212,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4213,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4214,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4215,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4216,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4217,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4218,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4219,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4220,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4221,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4222,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4223,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4224,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4225,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4226,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4227,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" - -4229,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Devil in the Cave" - -4254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fairy with a stomache" -4255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revenge!" -4256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An accomplice?" -4257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conspiracy" -4258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eirinn" -4259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bourbon" -4260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bee" -4261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Counterattack (1)" -4262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Counterattack (2)" -4263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Counteroffensive (1)" -4264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Counteroffensive (2)" -4265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bookshelf use" -4266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"????? ??" -4267,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"????? ??" -//4303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//4304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//4305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -4999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Extermination Crisis" -5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 7" -5001,0,1037,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"King Froggie VII's revenge" -5002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The hero of the frogs" -5003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Frog Hiding Skill" -5004,0,1099,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Food Shortage" - -// Researcher's Quest -5016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bring me a Research Tool Bag" -5017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revenge of the Reseacher" -5018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revenge of the Reseacher" -5019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Sample Studying" -5020,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sample Researching" -5021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sample Collecting" -5022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sample Collecting" -5023,21600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of the Sample" -5024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eastern Pool Research" -5025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Western Pool Research" -5026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Southern Pool Research" -5027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Northern Pool Research" -5028,43200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of the Sample" -5029,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unidentified Creature" -5030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The creature's family" -5031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The creature's family" -5032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The creature's family" -5033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The creature's family" -5034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"News from the family" -5035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5043,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5044,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Weapon" -5053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Weapon" -5054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Weapon" -5055,0,2071,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Local Rising - Headless Horse" -5056,0,1584,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Local Rising - Tamruan" -5057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Local Rising - Ready the Festival" -5058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The mood of the players-(1)" -5059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The mood of the players-(2)" -5060,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Shock" -5061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Am I scared?" -5062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I met Eryu." -5063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I met Stew." -5064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I met Ketchup." -5065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I met Eff." -5066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scary image-(1)" -5067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scary image-(2)" -5068,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting complaint" -5069,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Token of honor" -5070,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rock Paper Scissors" -5071,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Chamchamcham" -5072,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kkongnyangkkong" -5073,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Challenging of flag wave" -5074,0,1158,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat's Meal" -5075,0,1144,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Health food" -5076,0,1282,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enemies" -5077,0,1209,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reaction Training" -5078,0,1019,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Light bird food" -5079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to stabilize the mind" -5080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lack of Snack" -5081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Banned foods" -5082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cool food" -5083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Eryu-(1)" -5084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Eryu-(2)" -5085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Stew-(1)" -5086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Stew-(2)" -5087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Ketchup-(1)" -5088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Ketchup-(2)" -5089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Eff-(1)" -5090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Eff-(2)" -5091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Go Malangdo" - -5092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5094,0,1002,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5095,0,1063,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5096,0,1007,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5097,0,1049,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" - -5109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Light but Unconfirmed Rumor" -5110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Rumored Character" -5111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Lab..." -5112,259200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Laboratory Restricted Access" -5113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Lord Knight" -5114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Paladin" -5115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] High Priest" -5116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Champion" -5117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] High Wizard" -5118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Professor" -5119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Whitesmith" -5120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Creator" -5121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Assassin Cross" -5122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Stalker" -5123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Sniper" -5124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Clown" -5125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Gypsy" - -// Kagerou/Oboro Job Quest -5131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Conversation" -5132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Family Business-(1)" -5133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Family Business-(2)" -5134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New path" -5135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"4 tests" -5136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Knowledge test" -5137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Survival test" -5138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Weapons test" -5139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The guy looks familiar!!" -5140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Uncertain chilliness" -5141,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Got a curse!!" -5142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prototype-(1)" -5143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prototype-(2)" -5144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prototype-(2)" -5145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prototype-(3)" -5146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battle test" - -// 2012 Headgear Quests -5161,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request[Stand by]" -5162,0,1164,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5163,0,1102,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5164,0,1322,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5165,0,1386,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5166,0,1117,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5167,0,1155,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5168,0,1269,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5169,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request[Stand by]" -5170,0,1776,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request" -5171,0,1198,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request" -5172,0,1784,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request" -5173,0,1316,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request" -5174,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collectiong request[Stand by]" -5175,0,1106,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collection request" -5176,0,1148,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collection request" -5177,0,1995,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collection request" -5178,0,1310,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collection request" -5179,0,1163,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Highest level collection request" -5180,0,1993,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Highest level collection request" -5181,0,1297,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Highest level collection request" -5182,0,1699,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Highest level collection request" -5222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving the energy crystals" -5223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving the energy crystals" -5224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving the energy crystals" -5225,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving energy crystal[Stand by]" -5226,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving energy crystal[Stand by]" -5227,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving energy crystal[Stand by]" - -6000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Taekwon" -6001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Taekwon" -6002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Taekwon" -6005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Soul-Linker" -6006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Soul-Linker" -6007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Soul-Linker" -6008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Soul-Linker" -6010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Super Novice" -6015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A favor from Cougar" -6016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A favor from a Suspicious Man" -6017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red Leopard Joe's Reply" -6018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cougar's Madness" -6020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Master Miller's Letter" -6021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wise Bull Horn's voucher" -6022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making a voucher" -6023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wise Bull Horn's Favor" -6024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Gunslinger!" -6025,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"KVM Guillaume" -6026,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"KVM Croix" -6027,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"KVM Indicator" -7000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars" -7008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars - Nature" -7009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars - the Altar" -7010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars - Stars?" -7011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars" -7012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Case closed?" -7038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Passion for Baked Sweet Potatoes" -7039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dodging the conversation" -7040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dodging the conversation" -7041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Politics is for the Politicians" -7042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Tatacho's feed" -7043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Cornus's feed" -7044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Hillthrion's feed1" -7045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Hillthrion's feed2" -7046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - warm rugs" -7047,18000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Let's call it a day!" -7048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Burled's Favor" -7049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Sealed Tower" -7050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Sealed Tower" -7051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Sealed Tower" -7052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Sealed Tower" -7053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - What they want is.." -7054,0,1282,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Myu's Favor - Teach them a lesson!" -7055,0,1261,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Myu's Favor - Not the cat!" -7056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Arc's Favor" -7057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Arc's Favor" -7058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Arc's Favor" -7059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Prove the Truth" -7067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Prove the Truth" -7068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Prove the Truth" -7069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Too late!" -7070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Return" -7071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Invitation" -//7072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7073,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -7074,0,2017,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rata Hunt" -7075,0,2018,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Duneyrr Hunt" -7076,0,2026,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanted: Dandelion" -7077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting Dragon Eggs" -7078,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting Dragon Eggs" -7079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding Refined Bradium" -7080,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding Refined Bradium" -7081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helping the Laphine Craftsman" -7082,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helping the Laphine Craftsman" - -7091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 01" -7092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 02" -7093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 03" -7094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 04" -7095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 05" -7096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A proof of new requirement" -7097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A proof of new requirement" -7098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A proof of new requirement" -7099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A proof of new requirement" -7100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A message of Bercascell" -7101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 1" -7102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 2" -7103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 3" -7104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 4" -7105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 4" -7106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 5" -7107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 6" -7108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 7" -7109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 8" -7110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 9" -7111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 10" -7112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of Madelle" -7113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of Crave" -7114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of Trovan" -7115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of a peddler" -7116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of a old man" - -// Novice Training Grounds -7117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Your first quest!" -7118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Novice Training" -7119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Novice Training" -7120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Novice Training" -7121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Novice Training" -7122,0,1002,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"First battle - Poring Hunt" -7123,0,1049,2,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battle Basics -Swordman" -7124,0,1063,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battle Basics -Mage" -//7125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"not used" -7126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Selling items" -7127,0,1010,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battle Basics -Thief" - -7128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training course 'conquest a desert!' -start" -7129,0,1009,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the desert!' - A real battle 1" -7130,0,1107,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the desert!' - A real battle 2" -7131,0,1001,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the desert!' - A real battle 3" -7132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the desert!' - Complete a quest" -7133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - Start" -7134,0,1051,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - A real battle 1" -7135,0,1175,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - A real battle 2" -7136,0,1005,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - A real battle 3" -7137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - Complete a quest" -7138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the haunted cave!' - Start" -7139,0,1076,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the haunted cave!' - A real battle 1" -7140,0,1031,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the haunted cave!' - A real battle 2" -7141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the haunted cave!' - Complete a quest" -7142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - Start" -7143,0,1160,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - A real battle 1" -7144,0,1095,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - A real battle 2" -7145,0,1176,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - A real battle 3" -7146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - Complete a quest" -7147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - start" -7148,0,1686,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - A real battle 1" -7149,0,1023,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - A real battle 2" -7150,0,1273,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - A real battle 3" -7151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - Complete a quest" -7152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc dungeon!' - start" -7153,0,1153,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc dungeon!' - A real battle 1" -7154,0,1152,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc dungeon!'- A real battle 2" -7155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc dungeon!' - complete a quest" -7156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer an undersea city!' - start" -7157,0,1264,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer an undersea city!' - A real battle 1" -7158,0,1065,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer an undersea city!' - A real battle 2" -7159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer an undersea city!' - Complete a quest" - -7160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram" -7161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 2nd" -7162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 2nd" -7163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 2nd" -7164,0,2076,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt for shadow of deception" -7165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Key of deception" -7166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rachel Branch of Shadow Workshop" -7167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 3rd" -7168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 3rd" -7169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 3rd" -7170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 3rd" -7171,0,2077,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt for shadow of delusion" -7172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Key of delusion" -7173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Message to Halled from Paul" -7174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 4th" -7175,0,2078,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunft for shadow of gaiety" -7176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Key of Gaiety" -7177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A young guy in Lighthalzen" -7178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Destination of Deception, Delusion and Gaiety" -7179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vicente, you dare!" -7180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Message from Doomk" - -7181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Karakas's ring" - -// El Dicastes -7182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sapha's Visit" -7183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Invitation from Sapha" -7184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To El Dicastes!" -7185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspector Doha" -7186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Order from Doha - Investigation" -7187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Order from Doha - Shay" -7188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information Gathering - in the Plaza" -7189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information Gathering - in the Factory" -7190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information Gathering - at the Guards" -7191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shay's designation - BK" -7192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"BK's Information" -7193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dimensional Crack Investigation" -7194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What's this bloodstain?" -7195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What's this skin piece?" -7196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What's this suspicious magic power?" -7197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sapha Certifications?" -7198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Audience with Ahat" -7199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Order from Ahat" -7200,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cheshire's call" -7201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Removing traces" -7202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret order from Doha - Collect proof" -7203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret order from Doha - Final Report" -7206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Day for Cheshire" -7207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cheshire's Box" -7208,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wait for Cheshire?" -7209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Forget the box." -7210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Daily delivery" - -// Misty Forest Labyrinth -7211,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Misty Forest Labyrinth Exploration" -7212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loki's Search" -7213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wandering Protector" - -// Paradise Gear Advanced Quests [Chilly] -7214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Training" -7215,0,1278,3,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Hunt 1" -7216,0,1278,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Hunt 2" -7217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Hunt 3" -7218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Complete" -7219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Johan Training" -7220,0,1192,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Johan Hunt 1" -7221,0,1117,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Johan Hunt 2" -7222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Johan Complete" -7223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Training" -7224,0,1619,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Hunt 1" -7225,0,1620,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Removed" -7226,0,1621,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Hunt 2 (Part A)" -7227,0,1622,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Hunt 2 (Part B)" -7228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Complete" -7229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Naomi Training" -7230,0,1776,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Naomi Hunt 1" -7231,0,1776,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Naomi Hunt 2" -7232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Naomi Complete" -7233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret Training" -7234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret's Favor" -7235,0,1988,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret Hunt 1" -7236,0,1995,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret Hunt 2" -7237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret Complete" -7238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toren's Errands (Easy)" -7239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toren's Errands (Normal)" -7240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strengthening Equipment" -7241,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toren's Errands - Tomorrow" -7242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Play with the baby cat" -7243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Duruduru Compass" -7244,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Duruduru Race" -7245,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Duruduru Race" -7246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-I'm coming now." -7247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Stop the Bang!" -//7248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -7249,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Bang! See you next time" -7250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Hidden Treasure?" -7251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The First piece of Painting" -7252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Second piece of Painting" -7253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Third piece of Painting" -7254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Fourth piece of Painting" -7255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Fifth piece of Painting" -7256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Sixth piece of Painting" -7257,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Race, Come back tomorrow!" -7258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Painting completed" -7259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gift from the Mew Bravery Team" -7260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The origin of Bugs" -7261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Table" -7262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Mattress" -7263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Grill" -7264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Chef Nyas" -7265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rage of Chef Nyas" -7266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Declaration of Chef Nyas" -7267,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Appointed time with Cleanyang" -7268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Cat's hard biscuits!" -7269,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Resting Place" -7270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Sand" -7271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Bottom of the Stairs" -7272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Corner" -7273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Locker" -7274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Foothold" -7275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Sand" -7276,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Promise to deliver more food" -7281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7283,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7310,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7317,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7319,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7324,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7326,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7331,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7332,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7335,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7338,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7341,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7342,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" - -// Hall of Abyss -7349,1800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vote" - -// Port Malaya -7350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cautious Village" -7351,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Better than My Old Button" -7352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sailor Wants a Button" -7353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Man Wants a Button" -7354,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Young Man Wants a Button" -7355,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Merchant Wants a Button" -7356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Little Kid Wants a Button" -7357,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Middle-aged Guy Wants a Button" -7358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why do they want my Buttons?" -7359,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Sailor" -7360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Old Man" -7361,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Young Man" -7362,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Merchant" -7363,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Little Kid" -7364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Middle-aged Man" -7365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Better than My Old Button-2" -7366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Spiritual Protection and Impudent Girl-1" -7367,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Spiritual Protection and Impudent Girl-2" -7368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Pedro" -7369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Nardo" -7370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Pandoi" -7371,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Woeon" -7372,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Talah" -7373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Romel" -7374,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Love and Spiritual Protection for All" -7375,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Love and Spiritual Protection Continues" -7376,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Man and Cast-Iron Caldron-1" -7377,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Man and Cast-Iron Caldron-2" -7378,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Man and Cast-Iron Caldron-Regular Trades" -7379,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Peace Preacher" -7380,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Smith a Traditional Spiritual Protection" -7381,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"High Demand on Spiritual Protection Material" -7382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Pedro" -7383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Nardo" -7384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Pandoi" -7385,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Woeon" -7386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Talah" -7387,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Romel" -7388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Maries's Child" -7389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Give the Shirt to Maries's Child" -7390,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Worried about Maries's Child" -7391,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jejeling and Jejellopy" -7392,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect Jejellopy Regularly" -7393,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shiny Silver Blade" -7394,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shiny Tomorrow" -7395,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ghost on the Ferry Ship" -7396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Angry Soul on Ferry Ship" -7397,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mumbaki Phong's Advice" -7398,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Offering Bouquet Recommended by Mumbaki" -7399,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soul Diwata's Story" -7400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mumbaki of Port Malaya" -7401,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"All Aboard for Perry Sailing" -7402,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bouquet for Diwata" -7403,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stabilized Perry" -7404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Jejeling" -7405,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Jejeling - Same Time Tomorrow" -7406,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Agree to Collecting Bones!" -7407,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Purified Bone" -7408,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Agree to Come Back Tomorrow?" -7409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cannot Meet Eyes with Him!" -7410,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Teach Another Lesson Tomorrow!" - -// Eclage -7411,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The traveler, Fome's story" -7412,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The traveler, Litrip's story" -7413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The traveler, Chiba's story" -7414,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eclage guard's message" -7415,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Laphine's Chief of Staff" -7416,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Waiting to meet" -7417,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kardui's request" -7418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Eclage 1" -7419,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Eclage 2" -7420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Eclage 3" -7421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"That's enough" -7422,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kardui's gift" -7423,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A rumor about the King 1" -7424,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A rumor about the King 2" -7425,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A rumor about the King 3" -7426,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A rumor about the King 4" -7427,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"At times like this, face it straight on!" -7428,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Yai of the wild" -7429,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wild recent trend!" -7430,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliveryman that runs through space" -7431,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A mailman never rests!" -7432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The troublemakers in the land of blooming flowers" -7433,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Need constant guidance" - -// Twins and Scholar of Magics -7434,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kardui's big brother" -7435,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time for reading the letter" -7436,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Avant the Scholar of Magics" -7437,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shenime's favor" -7438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret sponsorship" -7439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The scholar of magics sponsored by Shenime" -7440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Minuel's witness" -7441,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mail is here!" -7442,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The identity of the scholar of magics" -7443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interfere with the research!" -7444,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What Avant was researching" - -// Orb -7445,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Avant's back" -7446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unfruitful conversation" -7447,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dilemma surrounding the Orb" -7448,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Something's not right" -7449,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Temptation toward the Orb" -7450,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orb's lighting room" -7451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Betrayal" -7452,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the chief of staff!" -7453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The last of the chief of staff" - -//7619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7621,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7625,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7626,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7627,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" - -8000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quitting Job Change" -8001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Guild Master!" -8007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Acceptance from the Guild Master" -8008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Applying for Job Change to Priest" -8010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tarlock's Favor" -8033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ferlock's Favor" -8034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ferlock's Favor" -8035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How the Airship Works" -8036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hallen's Favor" -8037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Dice Roller" -8038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Dice Roller" -8039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Euslan's Fiancee" -8045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tips from Kaci" -8046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ferlock's Passengers list" -8047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Euslan's Favor" -8048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eukran's Testimony" -8049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thierry's Favor" -8050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Danger coming on to Thierry" -8051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Euslan's Medicine" -8052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thierry's Favor" -8053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Postell" -8054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Message from Postell" -8055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nursing Allen" -8056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Little something in return" -8057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Grumbling Manainne" -8058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with El Schatt" -8059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Perfitz" -8060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stubborn El Schatt" -8061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stories of the past" -8062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kanainne" -8063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kanainne's spirit" -8064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Gemstone" -8090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mr. Manson" -8091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jenny the gardener" -8092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching the Market" -8093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Message" -8094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Double Crossed?" -8095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Phobe" -8096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Gemstone Found" -8097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Informing Jenny" -8098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Keeping the Secret" -8099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vincent's Recommendation" -8100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mr. Shendar's daughter" -8107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lachellen's Testimony" -8108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Foreigner, Katinshuell" -8109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's scent" -8110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's scent" -8111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lachellen's Testimony" -8112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Freya's Spring" -8113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's Diary" -8114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's Diary" -8115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Suspicious Katinshuell" -8116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lachellen's Testimony" -8117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Freya's Spring" -8118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Mr. Shendar" -8119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's Diary" -8120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Katinshuell" -8121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Katinshuell" -8122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's resting place" -8123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ayothaya's world famous dish, Tom Yum Goong" -8124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ayothaya's world famous dish, Tom Yum Goong" -8125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ayothaya's world famous dish, Tom Yum Goong" -8126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ayothaya's world famous dish, Tom Yum Goong" -8127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Momotaro Field Trip" -8128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Momotaro Field Trip" -8129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Momotaro Field Trip" -8130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Momotaro Field Trip" -8131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The mother of lord in Amatsu" -8132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The mother of lord in Amatsu" -8133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Song of the fox" -8134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Boy at the Northern Shrine" -8135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fox Expelled" -8136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Gray Wolf's Warning" -8137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Keymaker" -8138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Blacksmith's Request" -8139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Golden Key" -8140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Red Ring" -8141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mashenka's Red Ring" -8142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching the Marsh" -8143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Flute's Voice" -8144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ryubaba's Confession" -8145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Worried Mother's Request" -8146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding Lusalka" -8147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lusalka's Beloved" -8148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lusalka's Beloved" -8149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Igor" -8150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Igor's message" -8151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Marozka's Cave" -8152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Golden Thread" -8153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of mind and wisdom" -8154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Keymaker" -8155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Golden Key" -8168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Koshei, the Immortal" -8169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Living and Dead Water" -8170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Living and Dead Water" -8171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Living and Dead Water" - -8181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sight Blaster" -8182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Push Back Theory" -8183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sight Blaster" -8184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Elemental Converter" -8185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Elemental Change" -8186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fire Elemental Change" -8187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Earth Elemental Change" -8188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wind Elemental Change" -8189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Water Elemental Change" -8190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Charming Wink" -8191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Charming Advisor" -8192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Selfish Advisor" -8193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Selfish Advisor" -8194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Drunken Advisor" -8195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kind Canell" -8196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Tripartite Union's Feud" -8197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Document Delivery" -8198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the United Research Official" -8199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"United Research Official's Favor" -8200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ryosen's Document Requests" -8201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Document" -8202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Document Restoration" -8203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Document Restoration" -8204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ryosen" -8205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the United Research Official" -8206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Researchers' Meeting" -8207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hansenne is not guilty." -8208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hansenne's Favor" -8209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hue's Report" -8210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the United Research Official" -8211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Order" -8217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dequ'ee's Message" -8218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's order" -8223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dequ'ee's order" -8224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The clue" -8225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dequ'ee's Reasoning" -8226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bankley's Death" -8227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Return to Shurank" -8228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prontera Market Research" -8235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collection of Red Jewel" -8242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collection of blue Jewel" -8243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Learning new languages" -8244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fairies and Tree Giants" -8245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Language sample investigation" -8246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Language sample investigation" -8247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Research progress" -8248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Research progress" -8249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Compressing Information" -8250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Storage Gem" -8251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Injection of Magic" -8252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Handworked jewels" -8253,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Language translation device" - -8254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"with a light heart and body" -8255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The test of power for existence" -8256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The test of power for existence" -8257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Providing food of Teardrop" -8258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Providing food of Teardrop" -8259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"to a place for taking a practical technique test" -8260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mission! Documents delivery" -8261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"When you play the flute,then the wolf show up!" -8262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ranger master never again" - -8265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"One time a one hour!" - -8266,0,1077,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting poison spore!" -8267,0,1056,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting smokie!" -8268,0,1033,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt elder wilow!" -8269,0,1104,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt coco!" -8270,0,1034,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt tharafrog!" -8271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toxic sprays delivery!" -8272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver a honey!" -8273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver a blanket!" -8274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect bones!" -8275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect feet!" -8276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect scell!" -8277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect tails!" -8278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect cookies!" -8279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect mustache!" - -9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Knight" -9001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loyalty of a Knight" -9002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loyalty of a Knight" -9003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Honor of a Knight" -9004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Honor of a Knight" -9005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tenacity of a Knight" -9006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tenacity of a Knight" -9007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Honor of a Knight" -9008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Etiquette as a Knight" -9009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Life as a Knight" -9010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quality of reverence" -9011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Life as a Knight" -9012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glory of a Knight!" -9013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Certified as a Wizard!" -9058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"O'Riley's Request" -9059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Happy St. Patrick's Day" -9117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse" -9118,0,1109,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse - Deviruchi Hunt" -9119,0,1291,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse - Wraith Dead Hunt" -9120,0,1504,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse - Dullahan Hunt" -9121,0,1379,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse - Nightmare Terror Hunt" -9122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse" -9123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse" -9024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An errand boy from Einbroch" -// kRO -//9028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"strange Mouse" -//9029,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Mouse : present conditions" -// iRO/cRO -9028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"strange Hydra" -9029,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Hydra : present conditions" -9030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find a puppy" -9031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find a puppy" -9032,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find a puppy" - -9155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting materials for the Jaty Crown" -9156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Make the Jaty Crown" -9157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reward from Sage, Kasyapa" -9158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery of Good News(1)" -9159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Paiko" -9160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery of Good News(2)" -9161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Paiko" -9162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery of Good News(3)" -9163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Paiko" -9164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery of Good News(4)" -9165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reward from Paiko for success of Jaty Crown" - -9167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tutorial - Mercenary for Hire" -9168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest Window Check" -9169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Window Shopper Catalogue" -9170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Window Shopper Catalogue" -9171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enchanting Items" -9172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enchanted Items" -9173,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tutorial Timer Cooldown" - -9222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bangungot from Hospital 2F" -9223,604800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Will there be Peace at the Hospital?" -9224,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Explore Hospital 2F" - -9225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 1" -9226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 2" -9227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 3" -9228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 4" -9229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 5" -9230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 6" -9231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 7" -9232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 8" -9233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 9" -9234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 10" -9235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 11" -9236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 12" -9237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 13" -9238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 14" -9239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 15" -9240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luen's statement notes" -9241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luen's statement notes" -9242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luen's statement notes" -9243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luen's statement notes" -9244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dames's statement notes" -9245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dames's statement notes" -9246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dames's statement notes" -9247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dames's statement notes" -9248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rosa's statement notes" -9249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rosa's statement notes" -9250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rosa's statement notes" -9251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rosa's statement notes" -9252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Observing Poppy" -9253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a messy bookshelf" -9254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a damaged book" -9255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a container for soda cans" -9256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a messed up table" -9257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a foreign object" -9258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Field examination results" -9259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Confirming Cruyan's statements" -9260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Survey investigation notes" -9262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 16" - -//9327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9331,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9332,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" - -10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Prontera Royal Court" -10001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Qualification Test" -10002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Qualification Review" -10003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Instructions on what to do" -10004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interim Report" -10005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Eigen Ahrum" -10006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Ernst" -10007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Poe" -10008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Peter" -10009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Urugen" -10010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Helmut" -10011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Erich" -10012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation of the two princes" -10013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for the unknown girl" -10014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Peter" -10015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test 15" -10016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Guest from the Walter Family" -10017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conspiracy" -10018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Poe" -10019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Peter" -10020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Erich" -10021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Urugen" -10022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Helmut" -10023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eigen Ahrum and Ernst -Former-" -10024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eigen Ahrum and Ernst -Latter-" -10025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Good-bye, dear!" -10026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Search the knife" -10035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver the knife" -10036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-Candy" -10037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-Crap Shells" -10038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-Conch" -10039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-Fish Tail" -10040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-White Platter" -10041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-?" -10042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keys-5 remained" -10043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keys-5 remained" -10044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keys-4 remained" -10045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-4 remained" -10046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-3 remained" -10047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-3 remained" -10048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-2 remained" -10049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-2 remained" -10050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-1 remained" -10051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-1 remained" -10052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-To the piano" -10053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-Fill the empty spot" -10054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"On the Verge of the Escape-Clint Kana" -10055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Understanding the culture of Utan" -10056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Learning Utan Language" -10057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10085,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10087,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" - -10090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" - -10102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of the sphinx dungeon" -10103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of Glast heim" -10104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of Juno" -10105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of a clock tower" -10106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of localizing " -10107,0,1164,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sphinx dungeon - Requiem" -10108,0,1140,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sphinx dungeon - Marduk" -10109,0,1154,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sphinx dungeon - Pasana" -10110,0,1260,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glast heim - Dark Frame" -10111,0,1117,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glast heim - Evil druid" -10112,0,1192,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glast heim - Wraith" -10113,0,1276,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glast Heim - Raydric Archer" -10114,0,1369,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno - Grand Peco" -10115,0,1386,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno - sleeper" -10116,0,1372,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno - Goat" -10117,0,1376,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno - Harpy" -10118,0,1269,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"clock tower - Clock" -10119,0,1199,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"clock tower - Punk" -10120,0,1195,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"clock tower - Rideword" -10121,0,1883,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Localizing - Uzhas" -10122,0,1404,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Localizing - Miyabi Doll" -10123,0,1516,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Localizing - Mi Gao" - -11000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morriphen's Request" -11010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching the medicine" -11011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Medicine for two" -11012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Makkie" -11013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red Plant Stem Powder" -11014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The researcher's medicine" -11015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Siria's cure" -11016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morriphen's story" -11017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -// iRO Event Quest -//11023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 1" -//11024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 2" -//11025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 3" -//11026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 4" -//11027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 5" -//11028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 6" -11029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Surroundings" -11085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Surroundings" -11086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Surroundings" -11087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing the Tent" -11088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing the Tent" -11089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing the Tent" -11090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing the Tent" -11091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To My Friend" -11100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To My Friend" -11101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret note of Bazet" -11102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret note of Bazet" -11103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret note of Bazet" -11104,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resting time" -11105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilrion skin" - -11106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11113,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Until radering is functioning" - -11114,0,1004,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Honet" -11115,0,1009,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Condor" -11116,0,1052,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Grasshopper's Leg" -11117,0,1024,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Worm tail" -11118,0,1014,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Spore" -11119,0,1048,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Pest Control" -11120,0,1055,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Muka" -11121,0,1005,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Farmiliar" -11122,0,1019,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Collect Feather" -11123,0,1077,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Collect Poison Spore" -11124,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Honet - Complete" -11125,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Condor - Complete" -11126,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Grasshopper's Leg - Complete" -11127,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Worm Tail - Complete" -11128,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Spore - Complete" -11129,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Pest Control - Complete" -11130,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Muka - Complete" -11131,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Farmiliar - Complete" -11132,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Collect Feather - Complete" -11133,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Collect Poison Spore - Complete" - -11135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The sky, plane and travel sickness." -11141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Human & gossip is towarding to the bar" -11142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fearful metalic sound" -11143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos tower" -11144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno manager : click" -11145,0,1622,33,0,0,0,0,0,0,0,0,0,0,0,0,0,"I want to get the " -11146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"to ice tunnel..." -11147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lared's dew" -11148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toward Comodo with the bow" -11149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Just pour the water. Pour! Pour!..." -11150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"to the quiet place!..." -11153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing watch top" -11154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I will remember the memories with you...." -11155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"undefinable battler" -11156,0,1106,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"annoying homework" -11157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helmes valley " -11158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"On the way for meditation" - -11159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Brian" -11160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of John" -11161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Tyler" -11162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Rose" -11163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Bain" -11164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Lash" -11165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Brian" -11166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to John" -11167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Tyler" -11168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Rose" -11169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Bain" -11170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Lash" -11171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Frede" -11172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Frede" -11173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Frede" -11174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Supply Shortage" -11175,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Supply Shortage" -11176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For my friends" - -// Mora -11182,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Theore's Report" -11183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Theore's Favor" -11184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Runaway Laphine" -11185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Roast Beef" -11190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Roast Beef" -11191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shortage of Roast Beef" -11192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Village..." -11193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sonya's Friend" -11194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Runaway Laphine" -11195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Village..." -11199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Theo's Friend" -11200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Roast Beef" -11202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Roast Beef" -11203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shortage of Roast Beef" -11206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quick Delivery Yoneseu" -11207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Very Heavy Burden" -11208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Daphne" - -// Malangdo -11209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hardships of Thomas" -11210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Fruits" -11239,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Fruits" -11240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11243,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soft Jelly" -11245,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soft Jelly" - -11284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-1" -11285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-2" -11286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-3" -11287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-4" -11288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-5" -11289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-6" -11290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-7" -11291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-8" -11292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-9" -11293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-10" -11294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-11" -11295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-12" -11296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-13" -11297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-14" -11298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-15" -11299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-16" -11300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-17" -11301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-18" -11302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-19" -11303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-20" -11304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-21" -11305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-22" -11306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-23" -11307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-24" -11308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-25" -11309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-26" - -11310,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eclage's Entrance" -11311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eclage's Entrance" -11312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Goliath" -11313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Goliath" -11314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Goliath" -11315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11317,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11319,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11324,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11326,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11331,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11332,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red seed and green seed" -11334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red seed and green seed" -11335,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dreaming boy" -11336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dreaming boy" -11337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dreaming boy" - -//11366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -11378,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Trick or treat" // Halloween Event 2013 - -12000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An old friend" -12001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Digotz, Maku's old friend" -12002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger of Friendship" -12003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Digotz's message" -12004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Maku's other friend" -12005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein" -12006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein's lost item" -12007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kazien" -12008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Researcher Garins" -12009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Failed mission" -12010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"No entrance" -12011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lyozien" -12012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet Mr. Ahman" -12013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery complete" -12014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"More missions" -12015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ghalstein" -12016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sneaking into the Laboratory" -12017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Membership approved" -12018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meeting the President" -12019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The President's Mission" -12020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rescuing a Secret Wing Member" -12021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Sealed File Folder" -12022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Sealed File Folder" -12023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shinokas the researcher" -12024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kafra Corporation Agent" -12025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rekenber's Secret Archive" -12026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rekenber's Secret Archive" -12027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rekenber's Secret Archive" -12028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kurelle the traitor" -12029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lost Engagement Ring" -12030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Engagement Ring Found" -12031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Annon" -12032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Annon" -12033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traces of blood" -12034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Annon's side of the story" -12035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Holy Threads" -12036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Stone Slate Message" -12037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Holier Threads" -12038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for the Sa-mhing Tiger" -12039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Boonthom's Comrade" -12040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein's Journal" -12041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein's Journal" -12042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein's Journal" -12043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pass to the Slums" -12044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 1" -12045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 2" -12046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 3" -12047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 4" -12048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 5" -12049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 1 - Rogue" -12050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 2 - Rogue" -12051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 3 - Rogue" -12052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 4 - Rogue" -12053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 5 - Rogue" -12054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 6 - Rogue" -12055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest - Assassin" -12056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest - Assassin" -12057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pass to the Lab" -12058,604800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Admission Restricted to the 102 Tower" -12059,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orc's Memory Time Limit" -12060,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Today's Fishing Closed" -12061,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Concentration" -12062,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Today's Mining Closed" -12070,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Limited time for enter" -12071,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stamp a seal on the attendance book" -12072,0,1034,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt tharafrog" -12073,0,1248,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Cruiser" -12074,0,1070,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Kukre" -12075,0,1686,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove orcbaby" -12076,0,1023,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove orcwarroir" -12077,0,1066,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt vadon" -12078,0,1064,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Megalodon" -12079,0,1144,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Marse" -12080,0,1067,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Cornutus" -12081,0,1151,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Myst" -12082,0,1074,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt shellfish" -12083,0,1142,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Marine sphere" -12084,0,1158,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Phen" -12085,0,1152,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove orcskeleton" -12086,0,1177,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Zenorc" -12087,0,1041,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove mummy" -12088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Accomplishing a request" - -12090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious guy" -12091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Just save the burning heart" -12092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Long lasting story" -12093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"the record the intelligence Lyoda left" -12094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The damaged shield letter" -12096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Towards Karakas" -12097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Basic preparation" -12098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tour of dungeon" -12099,0,2014,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Root Cause" -12100,0,1994,12,0,0,0,0,0,0,0,0,0,0,0,0,0,"Violent Winged Insect" -12101,0,2013,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Work Interference" -12102,0,1993,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Intelligent Snakes" -12103,0,1992,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Legendary Creature" -12104,0,1987,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Insects with an Appetite" -12105,0,2024,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Moving Rocks" -12106,0,1995,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"A child on a flower" -12107,0,2015,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Twisted Love" -12108,0,1988,12,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dangerous Plant Removal" -12109,0,1999,14,0,0,0,0,0,0,0,0,0,0,0,0,0,"Larva Extermination" -12110,0,2016,7,0,0,0,0,0,0,0,0,0,0,0,0,0,"Demon of Water" -12111,0,1986,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bird with ugly face" -12117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Withered Flower" -12118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Welcomed Mineral" -12119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Valuable Textile" -12120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Curious Meat" -12121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Materials to Clear Snow" -12122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Best Cooler Material" -12123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Best Paint" -12124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rare Valuable" -12125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Armory Material" -12126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Advanced Armory Material" -12127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Supervisor's Tool" -12128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Preparation for Heating" -12129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Suspicious Food" -12130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Useful Material" -12131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Essential Material for Construction" -12132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Essential Material for Construction 2" -12133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Decoration arrangement" -12134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Instant Receptacle" -12135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Not enough medicine" -12136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Honey robber" -12137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tools for Experiment" -12138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fine Gift Samples" -12139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Respect for Taste!" -12140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Courtesy for Regulars" -12141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special Package" -12142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dangerous Request" -12143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Trend" -12144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unknown Usage" -12145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Other World Cuisine" -12146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Filling in Cracks" -12147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adhesive Material" -12148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bait for Tatacho Hunting" -12149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Swordmanship Practice" -12150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pretty reddish vegetable" -12151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tenacity of the pub owner" -12152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tastes like home cooking" -12153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hazardous plant when burnt" -12154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unexpectedly Normal" -12155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gift with heart" -12156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Respect personal appetite!" -12157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resolution of the pub owner" -12158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rage of the pub owner" -12159,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Laponte" -12160,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Kalipo" -12161,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Pura" -12162,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Tragis" -12163,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Calyon" -12164,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Moltuka" -12165,21600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dizziness" -12166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tree Root Doc." -12167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reptile Tongue Doc." -12168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scorpion Tail Doc." -12169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stem Doc." -12170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pointed Scale Doc." -12171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resin Doc." -12172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spawn Doc." -12173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jellopy Doc." -12174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fish Tail Doc." -12175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Worm Peeling Doc." -12176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gill Doc." -12177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tooth of Bat Doc." -12178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fluff Doc." -12179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Chrysalis Doc." -12180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Feather of Birds Doc." -12181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Talon Document Doc." -12182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sticky Webfoot Doc." -12183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Animal Skin Doc." -12184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wolf Claw Doc." -12185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mushroom Spore Doc." -12186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orc's Fang Doc." -12187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Evil Horn Doc." -12188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Powder of Butterfly Doc." -12189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bill of Birds Doc." -12190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snake Scale Doc." -12191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Insect Feeler Doc." -12192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Immortal Heart Doc." -12193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rotten Bandage Doc." -12194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Decayed Nail Doc." -12195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Horrendous Mouth Doc." -12196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tentacle Doc." -12197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shell Doc." -12198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scale Shell Doc." -12199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Venom Canine Doc." -12200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sticky Mucus Doc." -12201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bee Sting Doc." -12202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Grasshopper's Leg Doc." -12203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Royal Jelly Doc." -12204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Yoyo Tail Doc." -12205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solid Shell Doc." -12206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Yam Doc." -12207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Raccoon Leaf Doc." -12208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snail's Shell Doc." -12209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Horn Doc." -12210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bear's Footskin Doc." -12211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Feather Doc." -12212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red Herb Doc." -12213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Carrot Doc." -12214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cactus Needle Doc." -12215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stone Heart Doc." -12216,21600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouty Jahbong" -12217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Traces of wild boar hunt" -12218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to make lava elixir" -12219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to creat flame elixir" -12220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to create glaicer elixir" -12221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to create fossil elixir" -12222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to create storm elixir" - -// Mora Coin Daily Quests -12225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pom Spider Hunting" -12226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Angra Mantis Hunting" -12227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Parus Hunting" -12228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Little Fatam Hunting" -12229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Miming Hunting" -12230,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Monster Hunt" -12231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Insect Feeler Collecting" -12232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Immortal Heart Collecting" -12233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rotten Bandage Collecting" -12234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orcish Voucher Collecting" -12235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Skeleton Bone Collecting" -12236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memento Collecting" -12237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shell Collecting" -12238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scale Shell Collecting" -12239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Venom Canine Collecting" -12240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sticky Mucus Collecting" -12241,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Item Request 1" -12242,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Item Request 2" - -// Missing Person Quests -12243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Tajareu" -12244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Tokenizer" -12245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Mesile" -12246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Noir" -12247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Pajama God" -12248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Mendel" -12249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Miles" -12250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Kunmune" -12251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Chayihokin" -12252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Tuale" -12253,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Person Search Time Limit" - -// Malangdo Culverts -12254,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Now it's cleaning" -12255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea crab" -12256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea squid" -12257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Ancient crustacean" -12258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea shell" -12259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt ancient kukre" -12260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea conch" -12261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea horse" -12262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt ancient sword fish" -12263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt ancient sea god" -12264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt mutation anolian" -12265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea mermaid" -12266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt transformable kapha" -12267,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt weird coelacanth" -12268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt dark coelacanth" -12269,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Cruel coelacanth" -12270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt mutation coelacanth" -12271,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In progress general culvert single day service" -12272,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In progress hard culvert single day service" -12273,579600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In progress general culvert weekly service" -12274,579600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In progress hard culvert weekly service" - -12278,604800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Towards Bakonawa Lake..." -12279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" - -12280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A suspicious prisoner" -12281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An unwanted favor" -12282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gossip king Clever" -12283,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The rift researcher" -12284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A cat merchant's source of information" -12285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A way to calm down a cat" -12286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information traded for some canned foods" -12287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A weird experience" -12288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A successful experience" -12289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Another visitation" -12290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clever's historical documents" -12291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hidden historical documents (?)" -12292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The unknown ones" -12293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Figures in history" -12294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tour of Eclage" -12295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Error" -12296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fun times with the reactor" -12297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Encountering Etran" -12298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Two wishes" -12299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revisiting Robert" -12300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revisiting Etran" -12301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Two remaining friends" - -// Old Glast Heim -12317,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fake Keyblade" -12318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Upper Cats: annoying guy" -12319,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Upper Cats: annoying guy" - -12363,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"?????? ?? ??" - -13000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"RWC2011Card Gathering" -13001,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"RWC2011Card Gathering - Hold" - -// eden 100-110 -13002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brigan collecting" -13003,0,1267,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Carat Request" -13004,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Carat Request timer" -13005,0,1194,22,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arclouse Request" -13006,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arclouse Request timer" -13007,0,1206,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anolian Request" -13008,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anolian Request timer" -13009,0,1207,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sting Request" -13010,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sting Request timer" -13011,0,1310,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Majoruros Request" -13012,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Majoruros Request timer" -13013,0,1995,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pinguicula Request" -13014,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pinguicula Request timer" -13015,0,1994,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luciola Vespa Request" -13016,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luciola Vespa Request timer" -13017,0,1106,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Desert Wolf Request" -13018,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Desert Wolf Request timer" -13019,0,1775,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snowier Request" -13020,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snowier Request timer" -13021,0,1777,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ice Titan Request" -13022,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ice Titan Request Timer" -13023,0,1379,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nightmare Terror Request" -13024,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nightmare Terror Request Timer" -13025,0,1384,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flying Deleter Request" -13026,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deleter Request Timer" -13040,0,1505,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loli Ruri Request" -13041,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loli Ruri Request Timer" -13042,0,1148,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Medusa Request" -13043,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Medusa Request Timer" -13044,0,1098,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anubis Request" -13045,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anubis Request Timer" -13046,0,1991,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilion Request" -13047,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilion Request Timer" -13048,0,1991,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilion Request" -13049,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilion Request Timer" - -13050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Laphine that loves the land" -13051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The singing Laphine" -13052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The watering Laphine" -13053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The dancing Laphine" -13054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The smiling Laphine" -13055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"See if all the adventurers are safe" -13056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reporter Rossi" -13057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adventurer Euncheong" -13058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Troublemaker New Oz" -13059,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"End of project" -13060,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Safety confirmation complete!" -13061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Food support" -13062,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Food support - complete" -13063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dusting off" -13064,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dusting off - complete" -13065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting a souvenir" -13066,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"This is enough for souvenirs" - -// eden 111-120 -13067,0,1163,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Raydric research" -13068,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Raydric research - timer" -13069,0,1132,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Khalitzburg research" -13070,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Khalitzburg research - timer" -13071,0,1208,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wander Man research" -13072,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wander Man research - timer" -13073,0,1699,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Mimic research" -13074,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Mimic research - timer" -13075,0,1698,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Death Word research" -13076,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Death Word research - timer" -13077,0,1295,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Owl Baron research" -13078,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Owl Baron research - timer" -13079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bloody Page Research" -13080,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bloody Page Research - Wait" -13081,0,2015,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dark Pinguicula research" -13082,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dark Pinguicula research - timer" -13083,0,1988,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nepenthes research" -13084,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nepenthes research - timer" -13085,0,1993,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Naga research" -13086,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Naga research - timer" -13087,0,1999,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Centipede Larva research" -13088,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Centipede Larva research - timer" -13089,0,1992,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cornus research" -13090,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cornus research - timer" -13091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystic Horn Research" -13092,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystic Horn Research - Wait" -13093,0,1297,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Mummy research" -13094,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Mummy research - timer" -13095,0,1374,10,1370,10,1390,10,0,0,0,0,0,0,0,0,0,"Geffenia expedition" -13096,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffenia expedition - Wait" -13097,0,1677,30,1678,30,1679,30,0,0,0,0,0,0,0,0,0,"Juperos expedition" -13098,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juperos expedition - Wait" -13099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fragments and Rusty Screw" -13100,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fragments and Rusty Screw - Wait" - -// eden 121-130 -13107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower Search" -13108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rachel holy ground Search" -13109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unknown island Search" -13110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake Search" -13111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower Search - Reporting results" -13112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rachel holy ground Search - Reporting results" -13113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nameless Island Search - Reporting results" -13114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake Search - Reporting results" -13115,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower Search - Wait" -13116,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rachel holy ground Search - Wait" -13117,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unknown island Search - Wait" -13118,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake Search - Wait" -13119,0,1702,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Baroness of Retribution" -13120,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Baroness of Retribution - Wait" -13121,0,1703,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Lady Solace" -13122,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Lady Solace - Wait" -13123,0,1701,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Mistress of Shelter" -13124,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Mistress of Shelter - Wait" -13125,0,1700,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Dame of Sentinel" -13126,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Dame of Sentinel - Wait" -13127,0,1771,20,1772,20,0,0,0,0,0,0,0,0,0,0,0,"Combat Vanberk and Isilla" -13128,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Vanberk and Isilla - Wait" -13129,0,1773,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Hodremlin" -13130,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Hodremlin - Wait" -13131,0,1769,20,1770,20,0,0,0,0,0,0,0,0,0,0,0,"Combat Agav and Echio" -13132,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Agav and Echio - Wait" -13133,0,1865,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Ragged Zombie" -13134,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Ragged Zombie - Wait" -13135,0,1864,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Zombie Slaughter" -13136,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Zombie Slaughter - Wait" -13137,0,1867,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Banshee" -13138,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Banshee - Wait" -13139,0,1714,30,1717,30,0,0,0,0,0,0,0,0,0,0,0,"Combat Ferus and Bewler" -13140,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Ferus and Bewler - Wait" -13141,0,1713,30,1716,30,0,0,0,0,0,0,0,0,0,0,0,"Combat Acidus" -13142,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Acidus - Wait" - -// eden 131-140 -13143,0,1652,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Egnigem Story" -13144,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Egnigem Story - Wait" -13145,0,1654,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Armeyer Story" -13146,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Armeyer Story - Wait" -13147,0,1653,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whikebain Story" -13148,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whikebain Story - Wait" -13149,0,1656,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kavach Story" -13150,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kavach Story - Wait" -13151,0,1655,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Errende Story" -13152,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Errende Story - Wait" -13153,0,1657,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Laurell Story" -13154,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Laurell Story - Wait" -13155,0,1918,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story1" -13156,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story1 - Wait" -13157,0,1919,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story2" -13158,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story2 - Wait" -13159,0,1921,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story3" -13160,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story3 - Wait" -13161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Uni-horn Scaraba Story" -13162,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Uni-horn Scaraba Story - Wait" -13163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Horn Scaraba Story" -13164,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Horn Scaraba Story - Wait" -13165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Antler Scaraba Story" -13166,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Antler Scaraba Story - Wait" -13167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rake horn Scaraba Story" -13168,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rake horn Scaraba Story - Wait" - -14118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wuhari's concern" -14119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of patience" -14120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of patience 2" -14121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of patience 3" -14122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time for two" -14123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wuharu's favor" -14125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Surveying the area" -14126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Ms. Goatie" -14127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Ms. Goatie's husband" -14128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Obtaining the research report" -14131,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Analysis time" -14133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Another favor" -14134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sharp Ms. Goatie" -14135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Mr. Pompe" -14136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A terrible scene in the field" -14137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An interesting proposition" -14138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The big corpse" -14139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Wuhuru" -14140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Wuhari" -14141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ingredients for research" - -//14254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14267,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14269,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14283,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" - -// 2013 Christmas Event -15055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : We are the great Single Union Army!" -15056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Declare war against couples!" -15057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Prepare the festival!" -15059,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Cooldown Timer" -15060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Kwami has joined" -15061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Willer has joined" -15062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Rinka has joined" -15063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Jee has joined" -15064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Marty has joined" - -16000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Metz Brayde's Notice" -16001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"First examination" -16002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -1" -16003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -2" -16004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -3" -16005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -4" -16006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -5" -16007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -6" -16008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quiz time!" -16009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quiz time!" -16010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Daewoon's Test" -16011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Jore's Test" -16012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Jore's Materials" -16013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Stone of Sage" -16014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Stone of Sage" -16015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lady Jesqurienne" -16016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jesquerinne's Quiz Challenge" -16017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Failed Quiz Challenge" -16018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quiz Challenge Triumph" -16019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Search for Dearles" -16020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dearles' Test" -16021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of Appreciation" -16022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dearles' Test Part Two" -16023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rhythm Test Passed" -16024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Bakerlan" -16025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bakerlan's delivery" -16026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mahatra's delivery" -16027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bakerlan's Receipt" -16028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Seylin" -16029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigorgra Medicine" -16030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigorgra Ingredients" -16031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigorgra Ingredients" -16032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Seylin's Request" -16033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Seylin" -16034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Mahatra" -16035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Bakerlan" -16036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The last Crumb" -16037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding Engel Howard" -16038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Liana's Letter" -16039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combining the Starlight" -16040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Letter to Engel's Family" -16041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Talk to Liana" -16042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sobbing Starlight Progress" -16043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restored Sobbing Starlight" -16044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combining the Starlight" -16045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Starlight message" -16046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The man in Umbala" -16047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Into the Tree" -16048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Papers" -16049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Record of Ancient Language" -16050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Fastidious Old Man" -16051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Blurry Vision" -16052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Translating the Document" -16053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Translated Ancient Language" -16054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Where the rejected live" -16055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Misfortunate of Niflheim" -16056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Removed Curse" -16057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meeting the witch" -16058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wing Of Crow" -16059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wing Of Crow" -16060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Misfortunate of Niflheim" -16061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bard in Niflheim" -16062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gen of Niflheim" -16063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Witch's Aid" -16064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Misfortunate of Niflheim" -16065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Queen's Symbol" -16066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Knowledge of the Symbol" -16067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Knowledge of Asgard" -16068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Agrboda's Soul" -16074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Symbol of the Nine Realms" -16075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Serin's Ambitions" -16076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Witch's Tonic" -16077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Serin's Release" -16078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Visit with Lady Hell" -16079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Sign" -16080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dark Lord's return" -16081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Serin's Ambitions" -16082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dark Lord's return" -16083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Serin's Realization" -16084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Sign" -16085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Sign" -16086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Sign" -16087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Sign" -16101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious World Map" -16118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hidden poem" -16119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snake swords" -16120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A dream?" -16121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Code?" -16122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Copper Key" -16123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Green Keycard" -16124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Steel Box" -16125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Limberg's Request" -16201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"TPS Report" -16202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"TPS Report" -16203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"TPS Report" -16204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Crack in the Wall" -16205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Empty Lava Tube" -17000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet with Father Bamph" -17001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet with Larjes" -17002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Father Bamph" -17003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Travel to Rachel" -17004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Travel to Veins" -17005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Frustrated Magistrate" -17006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interrogated Smugglers" -17007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Written Orders" -17008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigating" -17009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"More Investigating" -17010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Further Investigations" -17011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kurdi's Father" -17012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Karyn's Boat" -17013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Island" -17014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigating the Island" -17015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Research Note" -17016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Regicide" -17017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reporting the King's Death" - -18001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery for Rooney" -18002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery for Rooney" -18003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery for Rooney" -18004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lasda's Request" -18005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jesse's Request" -18006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Krieg's Approval" -18007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Krieg's Trust" -18008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Krieg's Trust" -18009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Into the prison" -18010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jail Break" -18011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jail Break" -18018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jail Break" -18019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre's Songs" -18020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre's Songs" -18021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre's Songs" -18022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre's Songs" -18023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre the Spy" -18030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing boy Mikhail" -18061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mikhail's Whereabouts" -18062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing boy Mikhail" -18063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The isolated swamp" -18064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to the Village" -18065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"High-strength Adhesive" -18066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to the swamp" -18067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Make the paste" -18068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fixing the Matrushka" -18069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Gallina" -18070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Banishing Winter" -18071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making the magic dust" -18072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making the magic dust" -18073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Dragon's Lair" -18074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Magic Gourd Bottle" -18075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Containing People's Speech" -18076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Containing People's Speech" -18077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Csar's Request" -18078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Secret Medicine" -18079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Winter is Banished" -18100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Legends from Moscovia" -18101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Moving Island" -18102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In Search of The Moving Island" -18103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In Search of The Moving Island" -18104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mr. Ibanoff's New Friend" -18105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing Charabel" -18106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"As the Tide Turns" -18107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Departing" -18108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Moving Island?" -18109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Moving Island???" -18110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Aged Stranger" -18111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whale Island!" -18112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Story for the Csar" -18113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Evidence for the Csar" -18114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Before Sunset" -18115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Departing" -18116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whale Island!" -18117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Materials for Evidence" -18118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Musical Instrument" -18119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gusli" -18120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gusli" -18121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shafka" -19101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" - -50000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pirate Dagger materials" -50001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Weather Beaten Old Man" -50002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lost Treasure?" -50003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lost Treasure?" -50004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A special lock pick" -50011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The special lock pick" -50012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Use the lock pick" -50013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Broken lock pick" -50015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"J Roger" -50022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"J Roger's key materials" -50023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with J Roger" -50024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bury the treasure" -50025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bury the treasure" -50026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bury the treasure" -50027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Buried treasure" -50028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen treasure!" -50029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Pirate's Spirit!" - -//60000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"60000" -60001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Endless Tower Effect" -60008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Endless Tower Time Limit" -60009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orc Hero" -60010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Derik Ver's Request" -60011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Byalan" -60012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Abyss" -60013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Investigation" -60014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffen Dungeon's Monster Investigation" -60015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffen Dungeon's Monster Investigation" -60016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffen Dungeon's Monster Investigation" -60017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffen Dungeon's Monster Investigation" -60018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Byalan Dungeon's Monster Investigation" -60019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Byalan Dungeon's Monster Investigation" -60020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Byalan Dungeon's Monster Investigation" -60021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Byalan Dungeon's Monster Investigation" -60022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake's Monster Investigation" -60023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake's Monster Investigation" -60024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake's Monster Investigation" -60025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake's Monster Investigation" -60026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Continuing the Investigation" -60027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigating Aldebaran" -60028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Investigation" -60029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Aldebaran Monster Investigation" -60030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lutie Field Monster Investigation" -60033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Aldebaran Monster Investigation" -60036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Aldebaran Monster Investigation" -60039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Investigation" -60042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Derik Ver's Brother" -60059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A history lesson" -60060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crown of Deceit" -60061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A magic solvent" -60062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rendering the crown Inert" -60101,0,1019,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Peco Pecos" -60102,0,1019,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Peco Pecos" -60103,0,1019,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Peco Pecos" -60104,0,1127,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Hodes" -60105,0,1127,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Hodes" -60106,0,1127,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Hodes" -60107,0,1007,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Fabres" -60108,0,1007,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Fabres" -60109,0,1007,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Fabres" -60110,0,1008,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Pupa" -60111,0,1008,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Pupa" -60112,0,1008,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Pupa" -60113,0,1104,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Cocos" -60114,0,1104,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Cocos" -60115,0,1104,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Cocos" -60116,0,1103,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Caramels" -60117,0,1103,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Caramels" -60118,0,1103,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Caramels" -60119,0,1271,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Alligators" -60120,0,1271,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Alligators" -60121,0,1271,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Alligators" -60122,0,1018,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Creamys" -60123,0,1018,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Creamys" -60124,0,1018,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Creamys" -60125,0,1378,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Demon Pungus" -60126,0,1378,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Demon Pungus" -60127,0,1378,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Demon Pungus" -60128,0,1110,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dokebi" -60129,0,1110,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dokebi" -60130,0,1110,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dokebi" -60131,0,1493,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dryads" -60132,0,1493,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dryads" -60133,0,1493,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dryads" -60134,0,1119,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Frilldora" -60135,0,1119,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Frilldora" -60136,0,1119,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Frilldora" -60137,0,1372,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Goats" -60138,0,1372,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Goats" -60139,0,1372,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Goats" -60140,0,1040,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Golems" -60141,0,1040,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Golems" -60142,0,1040,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Golems" -60143,0,1586,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Leaf Cats" -60144,0,1586,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Leaf Cats" -60145,0,1586,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Leaf Cats" -60146,0,1076,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Skeletons" -60147,0,1076,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Skeletons" -60148,0,1076,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Skeletons" -60149,0,1026,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Munaks" -60150,0,1026,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Munaks" -60151,0,1026,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Munaks" -60152,0,1170,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Sohees" -60153,0,1170,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Sohees" -60154,0,1170,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Sohees" -60155,0,1403,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Firelock Soldiers" -60156,0,1403,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Firelock Soldiers" -60157,0,1403,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Firelock Soldiers" -60158,0,1405,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Tengus" -60159,0,1405,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Tengus" -60160,0,1405,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Tengus" -60161,0,1675,25,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Venatu" -60162,0,1675,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Venatu" -60163,0,1675,75,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Venatu" -60164,0,1668,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Archdam" -60165,0,1668,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Archdam" -60166,0,1668,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Archdam" -60167,0,1776,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Siromas" -60168,0,1776,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Siromas" -60169,0,1776,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Siroma" -60170,0,1777,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Ice Titans" -60171,0,1777,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Ice Titans" -60172,0,1777,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Ice Titans" -60173,0,1506,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Disguises" -60174,0,1506,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Disguises" -60175,0,1506,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Disguises" -60176,0,1505,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Loli Ruri" -60177,0,1505,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Loli Ruri" -60178,0,1505,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Loli Ruri" -60179,0,1139,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Mantis" -60180,0,1139,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Mantis" -60181,0,1139,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Mantis" -60182,0,1514,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dancing Dragons" -60183,0,1514,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dancing Dragons" -60184,0,1514,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dancing Dragons" -60185,0,1870,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Necromancers" -60186,0,1870,40,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Necromancers" -60187,0,1870,60,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Necromancers" -60188,0,1365,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Apocalypse" -60189,0,1365,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Apocalypse" -60190,0,1365,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Apocalypse" - -60200,604800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Endless Tower Effect" -60201,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Endless Tower Time Limit" -60211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -60212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -60213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -60301,0,1155,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60302,0,1155,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60303,0,1714,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60304,0,1714,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60305,0,1717,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60306,0,1717,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60307,0,1713,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60308,0,1713,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60309,0,1716,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60310,0,1716,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" - -// iRO expanded upon the log entries of this quest. -60351,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" -60352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" -60353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" -60354,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" -60355,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" - -62238,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Midgardian Mercenary timer" diff --git a/db/pre-re/quest_db.yml b/db/pre-re/quest_db.yml new file mode 100644 index 0000000000..ddff8d5925 --- /dev/null +++ b/db/pre-re/quest_db.yml @@ -0,0 +1,7098 @@ +# This file is a part of rAthena. +# Copyright(C) 2019 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Quest Database +########################################################################### +# +# Quest Settings +# +########################################################################### +# - Id Quest ID. +# Title Quest title. +# TimeLimit Amount of time before the quest expires. (Default: 0) +# Use a number following by "d" for day(s), "h" for hour(s), "mn" for minute(s), and "s" for second(s). +# Specify with "+" for how long until the quest expires. +# Specify without "+" for the exact time the quest expires using "d" (optionnal), [0-23]"h" (required), [0-59]"mn" (optionnal), [0-59]"s" (optionnal) format. +# Please note the number before "d" only shift the exact timer to the given day(s). +# Targets: Quest objective target. (Default: null) +# - Mob Monster to kill. +# Count Amount of monsters to kill. +# Drops: Quest item drop targets. (Default: null) +# - Mob Monster to kill. 0 will apply to all monsters. (Default: 0) +# Item Item to drop. +# Count Amount of items that will drop. Non-stackable items default to 1. (Default: 1) +# Rate Item drop rate. (10000 = 100%) +########################################################################### + +Header: + Type: QUEST_DB + Version: 1 + +Body: + - Id: 1000 + Title: Transcend + - Id: 1001 + Title: Job Change to Acolyte + - Id: 1002 + Title: Job Change to Acolyte + - Id: 1003 + Title: Job Change to Acolyte + - Id: 1004 + Title: Job Change to Archer + - Id: 1005 + Title: Job Change to Mage + - Id: 1006 + Title: Job Change to Mage + - Id: 1007 + Title: Job Change to Mage + - Id: 1008 + Title: Job Change to Mage + - Id: 1009 + Title: Job Change to Merchant + - Id: 1010 + Title: Job Change to Merchant + - Id: 1011 + Title: Job Change to Merchant + - Id: 1012 + Title: Job Change to Merchant + - Id: 1013 + Title: Job Change to Thief + - Id: 1014 + Title: Job Change to Swordman + - Id: 1015 + Title: Your first quest + - Id: 1016 + Title: Gaining base levels + - Id: 1100 + Title: Solo in the Sphinx Dungeon! + Targets: + - Mob: ZEROM + Count: 20 + - Id: 1101 + Title: Soloing Sphinx Dungeon! + Targets: + - Mob: REQUIEM + Count: 20 + - Id: 1102 + Title: Soloing Clock Tower! + Targets: + - Mob: ARCLOUSE + Count: 40 + - Id: 1103 + Title: Soloing Clock Tower! + Targets: + - Mob: HIGH_ORC + Count: 30 + - Id: 1104 + Title: Solo at Luoyang! + Targets: + - Mob: CHUNG_E + Count: 20 + - Id: 1105 + Title: Solo at Luoyang! + Targets: + - Mob: CIVIL_SERVANT + Count: 50 + - Id: 1106 + Title: Solo at Amatsu Dungeon! + Targets: + - Mob: THE_PAPER + Count: 20 + - Id: 1107 + Title: Solo at Amatsu Dungeon! + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 40 + - Id: 1108 + Title: Solo at Luoyang! + Targets: + - Mob: CHUNG_E_ + Count: 20 + - Id: 1109 + Title: Ropewa & Yuridi - Survivors of the Labyrinth + - Id: 1110 + Title: Ropewa & Yuridi - Victims of the Labyrinth + - Id: 1111 + Title: Ropewa & Yuridi - Maze in the Labyrinth + - Id: 1112 + Title: Ropewa & Yuridi - Lost in the Labyrinth + - Id: 1113 + Title: Ropewa & Yuridi - Torn Apart + - Id: 1114 + Title: Ropewa & Yuridi - The Cost of Restoration + - Id: 1115 + Title: Ropewa & Yuridi - Song of the Abyss + - Id: 1116 + Title: Ropewa & Yuridi - Dead Man's Song + - Id: 1117 + Title: Ropewa & Yuridi - Eternal Promise, Broken Ring + - Id: 1118 + Title: Neighborhood Knight - I Need Clues + - Id: 1119 + Title: Neighborhood Knight - Cooldown + TimeLimit: +23h + - Id: 1145 + Title: Help the poor cat + - Id: 1146 + Title: Help the poor cat + - Id: 1147 + Title: Help the poor cat + - Id: 1148 + Title: Help the poor cat + - Id: 1149 + Title: Help the poor cat + - Id: 1150 + Title: Help the poor cat + - Id: 1151 + Title: Help the poor cat + - Id: 1152 + Title: Help the poor cat + TimeLimit: +23h + - Id: 1153 + Title: Help the poor cat + - Id: 1154 + Title: Help the poor cat + - Id: 1155 + Title: Help the poor cat + - Id: 1174 + Title: Rumor, Time and Legend + - Id: 1175 + Title: Rumor, Time and Legend + - Id: 1176 + Title: Rumor, Time and Legend + - Id: 1177 + Title: Rumor, Time and Legend + - Id: 1178 + Title: Rumor, Time and Legend + - Id: 1179 + Title: Rumor, Time and Legend + - Id: 1180 + Title: Get Rid of Bakonawa + - Id: 1181 + Title: Get Rid of Bakonawa + - Id: 1182 + Title: Get Rid of Bakonawa + - Id: 1183 + Title: Get Rid of Bakonawa + - Id: 1184 + Title: Get Rid of Bakonawa + - Id: 1185 + Title: Get Rid of Bakonawa + - Id: 1186 + Title: Get Rid of Bakonawa + - Id: 1187 + Title: Get Rid of Bakonawa + - Id: 1188 + Title: Get Rid of Bakonawa + - Id: 1189 + Title: Get Rid of Bakonawa + - Id: 1190 + Title: Get Rid of Bakonawa + - Id: 1191 + Title: Get Rid of Bakonawa + - Id: 1192 + Title: Get Rid of Bakonawa + - Id: 1193 + Title: Get Rid of Bakonawa + - Id: 1194 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1195 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1196 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1197 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1198 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1199 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1200 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1201 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1202 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1203 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1204 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1205 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1206 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1207 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1208 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1209 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1210 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1211 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1212 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1213 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1214 + Title: Getting back Professor Worm's memory + - Id: 1215 + Title: Getting back Professor Worm's memory + - Id: 1216 + Title: Getting back Professor Worm's memory + - Id: 1217 + Title: Getting back Professor Worm's memory + - Id: 1218 + Title: Getting back Professor Worm's memory + - Id: 1219 + Title: Getting back Professor Worm's memory + - Id: 1220 + Title: Getting back Professor Worm's memory + - Id: 1221 + Title: Getting back Professor Worm's memory + - Id: 1222 + Title: Getting back Professor Worm's memory + - Id: 1223 + Title: Getting back Professor Worm's memory + - Id: 1224 + Title: Getting back Professor Worm's memory + - Id: 1225 + Title: Getting back Professor Worm's memory + - Id: 1226 + Title: Getting back Professor Worm's memory + - Id: 1227 + Title: Getting back Professor Worm's memory + - Id: 1228 + Title: Getting back Professor Worm's memory + - Id: 2000 + Title: Job Change to Blacksmith + - Id: 2001 + Title: Job Change to Blacksmith + - Id: 2002 + Title: Job Change to Blacksmith + - Id: 2003 + Title: Job Change to Blacksmith + - Id: 2004 + Title: Job Change to Blacksmith + - Id: 2005 + Title: Job Change to Blacksmith + - Id: 2006 + Title: Job Change to Blacksmith + - Id: 2007 + Title: Job Change to Blacksmith + - Id: 2008 + Title: Job Change to Blacksmith + - Id: 2009 + Title: Job Change to Blacksmith + - Id: 2010 + Title: Job Change to Blacksmith + - Id: 2011 + Title: Job Change to Blacksmith + - Id: 2012 + Title: Job Change to Blacksmith + - Id: 2013 + Title: Job Change to Blacksmith + - Id: 2014 + Title: Job Change to Blacksmith + - Id: 2015 + Title: Job Change to Blacksmith + - Id: 2016 + Title: Job Change to Blacksmith + - Id: 2017 + Title: Job Change to Rogue + - Id: 2018 + Title: Job Change to Rogue + - Id: 2019 + Title: Job Change to Rogue + - Id: 2020 + Title: Job Change to Rogue + - Id: 2021 + Title: Job Change to Rogue + - Id: 2022 + Title: Job Change to Rogue + - Id: 2023 + Title: Job Change to Rogue + - Id: 2024 + Title: Job Change to Rogue + - Id: 2025 + Title: Job Change to Rogue + - Id: 2026 + Title: Job Change to Rogue + - Id: 2027 + Title: Job Change to Rogue + - Id: 2028 + Title: Job Change to Alchemist + - Id: 2029 + Title: Job Change to Alchemist + - Id: 2030 + Title: Job Change to Alchemist + - Id: 2031 + Title: Job Change to Alchemist + - Id: 2032 + Title: Job Change to Alchemist + - Id: 2033 + Title: Job Change to Alchemist + - Id: 2034 + Title: Job Change to Alchemist + - Id: 2035 + Title: Job Change to Alchemist + - Id: 2036 + Title: Job Change to Alchemist + - Id: 2037 + Title: Job Change to Alchemist + - Id: 2038 + Title: Job Change to Alchemist + - Id: 2039 + Title: Job Change to Alchemist + - Id: 2040 + Title: Job Change to Alchemist + - Id: 2041 + Title: Job Change to Sage + - Id: 2042 + Title: Job Change to Sage + - Id: 2043 + Title: Job Change to Sage + - Id: 2044 + Title: Job Change to Sage + - Id: 2045 + Title: Job Change to Sage + - Id: 2046 + Title: Job Change to Sage + - Id: 2047 + Title: Job Change to Sage + - Id: 2048 + Title: Job Change to Sage + - Id: 2049 + Title: Job Change to Sage + - Id: 2050 + Title: Job Change to Sage + - Id: 2051 + Title: Job Change to Sage + - Id: 2052 + Title: Job Change to Sage + - Id: 2053 + Title: Job Change to Sage + - Id: 2054 + Title: Job Change to Sage + - Id: 2055 + Title: Job Change to Sage + - Id: 2056 + Title: Job Change to Sage + - Id: 2057 + Title: Job Change to Sage + - Id: 2058 + Title: Job Change to Sage + - Id: 2059 + Title: Job Change to Sage + - Id: 2060 + Title: Job Change to Sage + - Id: 2061 + Title: Job Change to Sage + - Id: 2062 + Title: Job Change to Sage + - Id: 2063 + Title: The Crow of the Fate - 1 + - Id: 2064 + Title: The Crow of the Fate - 2 + - Id: 2065 + Title: The Crow of the Fate - 3 + - Id: 2066 + Title: The Crow of the Fate - 4 + - Id: 2067 + Title: The Crow of the Fate - 5 + - Id: 2068 + Title: The Crow of the Fate - 6 + - Id: 2069 + Title: Tierra Gorge Battle + TimeLimit: +5mn + - Id: 2070 + Title: Flavius Battle + TimeLimit: +5mn + - Id: 2071 + Title: Cursed Property + - Id: 2072 + Title: Cursed Property + - Id: 2073 + Title: Cursed Property + - Id: 2074 + Title: Cursed Property + - Id: 2075 + Title: Cursed Property + - Id: 2076 + Title: Cursed Property + - Id: 2077 + Title: Cursed Property + - Id: 2078 + Title: Cursed Property + - Id: 2079 + Title: The past went wrong + - Id: 2080 + Title: The past went wrong + - Id: 2081 + Title: The past went wrong + - Id: 2082 + Title: The past went wrong + - Id: 2083 + Title: The past went wrong + - Id: 2084 + Title: The past went wrong + - Id: 2085 + Title: The past went wrong + - Id: 2086 + Title: The Enterprise + - Id: 2087 + Title: The Enterprise + - Id: 2088 + Title: The Enterprise + - Id: 2089 + Title: The Enterprise + - Id: 2090 + Title: The Enterprise + - Id: 2091 + Title: The Enterprise + - Id: 2092 + Title: The Enterprise + - Id: 2093 + Title: The Enterprise + - Id: 2094 + Title: The Enterprise + - Id: 2095 + Title: The Enterprise + - Id: 2109 + Title: A Mage in the Ice Dungeon + - Id: 2110 + Title: A Mage in the Ice Dungeon + - Id: 2111 + Title: A Mage in the Ice Dungeon + - Id: 2112 + Title: A Mage in the Ice Dungeon + - Id: 2113 + Title: A Mage in the Ice Dungeon + - Id: 2114 + Title: Thor Volcano base camp + - Id: 2115 + Title: Thor Volcano base camp + - Id: 2116 + Title: Thor Volcano base camp + - Id: 2117 + Title: Thor Volcano base camp + - Id: 2118 + Title: Thor Volcano base camp + - Id: 2119 + Title: Thor Volcano base camp + - Id: 2120 + Title: Thor Volcano base camp + - Id: 2121 + Title: Thor Volcano base camp + - Id: 2122 + Title: Thor Volcano base camp + - Id: 2123 + Title: Thor Volcano base camp + - Id: 2124 + Title: Thor Volcano base camp + - Id: 2125 + Title: Thor Volcano base camp + - Id: 2126 + Title: Thor Volcano base camp + - Id: 2127 + Title: Thor Volcano base camp + - Id: 2128 + Title: Thor Volcano base camp + - Id: 2129 + Title: Thor Volcano base camp + - Id: 2130 + Title: Thor Volcano base camp + - Id: 2131 + Title: Thor Volcano base camp + - Id: 2132 + Title: For Arunafeltz + - Id: 2133 + Title: For Arunafeltz + - Id: 2134 + Title: For Arunafeltz + - Id: 2135 + Title: For Arunafeltz + - Id: 2136 + Title: For Arunafeltz + - Id: 2137 + Title: For Arunafeltz + - Id: 2138 + Title: For Arunafeltz + - Id: 2139 + Title: For Arunafeltz + - Id: 2140 + Title: For Arunafeltz + - Id: 2141 + Title: For Arunafeltz + - Id: 2142 + Title: For Arunafeltz + - Id: 2143 + Title: Guild Dungeon Event + TimeLimit: +50s + - Id: 2144 + Title: Guild Dungeon Event + - Id: 2147 + Title: Attitude to the New + - Id: 2148 + Title: Attitude to the New + - Id: 2149 + Title: Attitude to the New + - Id: 2150 + Title: Attitude to the New + Targets: + - Mob: PINGUICULA + Count: 30 + - Id: 2151 + Title: Attitude to the New + Targets: + - Mob: CORNUS + Count: 10 + - Id: 2152 + Title: Attitude to the New + - Id: 2153 + Title: Attitude to the New + - Id: 2154 + Title: Attitude to the New + - Id: 2155 + Title: Attitude to the New + - Id: 2156 + Title: Attitude to the New + - Id: 2157 + Title: Attitude to the New + Targets: + - Mob: TATACHO + Count: 10 + - Id: 2158 + Title: Finding a Fairy + - Id: 2159 + Title: Finding a Tree Giant + - Id: 2179 + Title: Dr. Lifeguard's request + - Id: 2180 + Title: Dr. Lifeguard's request + - Id: 2181 + Title: Dr. Lifeguard's request + - Id: 2182 + Title: Rough Minerals + TimeLimit: +18h + - Id: 2183 + Title: Flower of Alfheim + - Id: 2184 + Title: Flower of Alfheim + - Id: 2185 + Title: Spirit of Alfheim + - Id: 2186 + Title: Helping Grenouille + TimeLimit: +18h + - Id: 2187 + Title: Arch Bishop job changing quest + - Id: 2188 + Title: Arch Bishop job changing quest + - Id: 2189 + Title: Arch Bishop job changing quest + - Id: 2190 + Title: Arch Bishop job changing quest + - Id: 2191 + Title: Arch Bishop job changing quest + - Id: 2192 + Title: Guarana quest + - Id: 2193 + Title: Guarana quest + - Id: 2194 + Title: Guarana quest + - Id: 2195 + Title: Guarana quest + - Id: 2196 + Title: Guarana quest + - Id: 2197 + Title: Guarana quest + - Id: 2198 + Title: Guarana quest + - Id: 2199 + Title: Guarana quest + - Id: 2200 + Title: Guarana quest + - Id: 2201 + Title: Brasilis Water Lily + - Id: 2202 + Title: Brasilis Water Lily + - Id: 2203 + Title: Brasilis Water Lily + - Id: 2204 + Title: Brasilis Water Lily + - Id: 2205 + Title: Brasilis Water Lily + - Id: 2206 + Title: Brasilis Water Lily + - Id: 2207 + Title: Brasilis Water Lily + - Id: 2208 + Title: Bathroom Ghost + - Id: 2209 + Title: Generic Job Change Quest + - Id: 2210 + Title: Generic Job Change Quest + - Id: 2211 + Title: Generic Job Change Quest + - Id: 2212 + Title: Generic Job Change Quest + - Id: 2213 + Title: Generic Job Change Quest + - Id: 2214 + Title: Generic Job Change Quest + - Id: 2215 + Title: Generic Job Change Quest + - Id: 2216 + Title: Generic Job Change Quest + - Id: 2217 + Title: Generic Job Change Quest + - Id: 2218 + Title: Wanderer Job Change Quest + - Id: 2219 + Title: Wanderer Job Change Quest + - Id: 2220 + Title: Wanderer Job Change Quest + - Id: 2221 + Title: Wanderer Job Change Quest + TimeLimit: +10mn + Targets: + - Mob: NOVUS_ + Count: 50 + - Id: 2222 + Title: Wanderer Job Change Quest + - Id: 2223 + Title: Generic Job Change Quest + Targets: + - Mob: G_POISON_SPORE + Count: 100 + - Id: 2271 + Title: Secret in the Woods + - Id: 2272 + Title: Secret in the Woods + - Id: 2273 + Title: Secret in the Woods + - Id: 2274 + Title: Secret in the Woods + - Id: 2275 + Title: Secret in the Woods + - Id: 2276 + Title: Secret in the Woods + - Id: 2277 + Title: Secret in the Woods + - Id: 2278 + Title: Secret in the Woods + - Id: 2279 + Title: Secret in the Woods + - Id: 2280 + Title: Secret in the Woods + - Id: 2281 + Title: Get Rid of Buwaya + - Id: 2289 + Title: Verit Hunting (Nightmare) + - Id: 2290 + Title: Verit Hunting - Cooldown + TimeLimit: +23h + - Id: 2291 + Title: Mummy Hunting - Cooldown + TimeLimit: +23h + - Id: 2292 + Title: Mummy Hunting (Nightmare) + - Id: 2299 + Title: "Training Center: Talk to Lisa" + - Id: 2300 + Title: "Training Center: Talk to General Reindeer" + - Id: 2301 + Title: "Training Center: Leave the boat" + - Id: 2302 + Title: "Training Center: Formation" + - Id: 3000 + Title: Job Change to Bard + - Id: 3001 + Title: Job Change to Bard + - Id: 3002 + Title: Job Change to Bard + - Id: 3003 + Title: Job Change to Bard + - Id: 3004 + Title: Job Change to Bard + - Id: 3006 + Title: Job Change to Crusader + - Id: 3007 + Title: Job Change to Crusader + - Id: 3008 + Title: Job Change to Crusader + - Id: 3009 + Title: Job Change to Crusader + - Id: 3010 + Title: Job Change to Crusader + - Id: 3011 + Title: Job Change to Crusader + - Id: 3012 + Title: Job Change to Crusader + - Id: 3013 + Title: Job Change to Crusader + - Id: 3014 + Title: Job Change to Crusader + - Id: 3015 + Title: Job Change to Crusader + - Id: 3016 + Title: Job Change to Monk + - Id: 3017 + Title: Job Change to Monk + - Id: 3018 + Title: Job Change to Monk + - Id: 3019 + Title: Job Change to Monk + - Id: 3020 + Title: Job Change to Monk + - Id: 3021 + Title: Job Change to Monk + - Id: 3022 + Title: Job Change to Monk + - Id: 3023 + Title: Job Change to Monk + - Id: 3024 + Title: Job Change to Monk + - Id: 3025 + Title: Job Change to Monk + - Id: 3026 + Title: Job Change to Monk + - Id: 3027 + Title: Job Change to Monk + - Id: 3028 + Title: Job Change to Monk - Marathon + - Id: 3029 + Title: Job Change to Monk - Final test + - Id: 3031 + Title: Job Change to Monk - Spiritual Training + - Id: 3032 + Title: Job Change to Monk - Become a Monk + - Id: 3040 + Title: The Curse of Baphomet + TimeLimit: +12h + - Id: 3041 + Title: The Curse of Baphomet + TimeLimit: +3mn + - Id: 3042 + Title: The Cursed Baphomet Doll + - Id: 3043 + Title: The Gigantic Magestic Goat + - Id: 3044 + Title: The Gigantic Magestic Goat + - Id: 3045 + Title: Sealed Shrine + TimeLimit: +2h + - Id: 3046 + Title: Sealed Shrine After-effect + - Id: 3050 + Title: Resurrection of Satan Morocc - 1 + - Id: 3051 + Title: Resurrection of Satan Morocc - 2 + - Id: 3052 + Title: Resurrection of Satan Morocc - 3 + - Id: 3053 + Title: Resurrection of Satan Morocc - 4 + - Id: 3054 + Title: Resurrection of Satan Morocc - 5 + - Id: 3055 + Title: Resurrection of Satan Morocc - 6 + - Id: 3056 + Title: Resurrection of Satan Morocc - 7 + - Id: 3060 + Title: Kids in Veins - Where's the Little Sis? + - Id: 3061 + Title: Kids in Veins - Find a way to unlock the shackles! + - Id: 3062 + Title: Kids in Veins - Find the Locksmith! + - Id: 3063 + Title: Kids in Veins - Mr. Lockenlock? + - Id: 3064 + Title: Kids in Veins - Organic Chamelepu Soap + - Id: 3065 + Title: Kids in Veins - Soap Ingredients + - Id: 3066 + Title: Kids in Veins - To make a Chamelepu Soap... + - Id: 3067 + Title: Kids in Veins - Camel Appetite Stimulants + - Id: 3068 + Title: Kids in Veins - Getting the Camel Dung + - Id: 3069 + Title: Kids in Veins - Where's the Silk Sand Camel? + - Id: 3070 + Title: Kids in Veins - Silk Sand Camel is gone! + - Id: 3071 + Title: Kids in Veins - Silk Sand Camel is found! + - Id: 3072 + Title: Kids in Veins - 1 lump of Camel dung obtained + - Id: 3073 + Title: Kids in Veins - 2 lumps of Camel dung obtained + - Id: 3074 + Title: Kids in Veins - 3 lumps of Camel dung obtained + - Id: 3075 + Title: Kids in Veins - 4 lumps of Camel dung obtained + - Id: 3076 + Title: Kids in Veins - 5 lumps of Camel dung obtained + - Id: 3077 + Title: Kids in Veins - Go to Ms. Ivory + - Id: 3078 + Title: Kids in Veins - Chamalepu Soap is completed! + - Id: 3079 + Title: Kids in Veins - Making the key mold + - Id: 3080 + Title: Kids in Veins - Bringing the key mold + - Id: 3081 + Title: Kids in Veins - All you need is Steel! + - Id: 3082 + Title: Kids in Veins - The Key is Made! + - Id: 3083 + Title: Kids in Veins - Mr. Lockenlock's key + - Id: 3085 + Title: Call from the commander + - Id: 3086 + Title: Commander's Duty + - Id: 3087 + Title: Report to Rune Midgard + - Id: 3088 + Title: Report to the continent - Accident! + - Id: 3089 + Title: Report to the continent - How to restore + - Id: 3090 + Title: Report to the continent - Location of reports + - Id: 3091 + Title: Report to the continent - Location of reports + TimeLimit: +30mn + - Id: 3092 + Title: Report to the continent - Success to restore! + - Id: 3093 + Title: Report to the continent - Report to the continent + - Id: 3094 + Title: Report to the continent - Return to the expedition + - Id: 3100 + Title: Consolidating Heavy Debt - Lost Bond of Debt + - Id: 3101 + Title: Consolidating Heavy Debt - Strange Heap of Earth + - Id: 3102 + Title: Consolidating Heavy Debt - Bond of Debt Found, but... + - Id: 3103 + Title: Consolidating Heavy Debt - Inventor Dorian + - Id: 3104 + Title: Consolidating Heavy Debt - Repair Materials of Magic Dryer + - Id: 3105 + Title: Consolidating Heavy Debt - Repairing Magic Dryer + - Id: 3106 + Title: Consolidating Heavy Debt - Repairing Magic Dryer Failed + - Id: 3107 + Title: Consolidating Heavy Debt - Repairing Magic Dryer Successful + - Id: 3108 + Title: Consolidating Heavy Debt - Let's Run the Magic Dryer + - Id: 3109 + Title: Consolidating Heavy Debt - Restoring the Bond of Debt + - Id: 3110 + Title: Stolen Diamond - Tracking the Diamond + - Id: 3111 + Title: Stolen Diamond - Leblo's Favor + - Id: 3112 + Title: Stolen Diamond - Wola the Doctor + - Id: 3113 + Title: Stolen Diamond - Wola the Doctor + - Id: 3114 + Title: Stolen Diamond - Wola the Doctor + - Id: 3115 + Title: Stolen Diamond - Leblo's Information + - Id: 3116 + Title: Stolen Diamond - Information from Rogue Investigator + - Id: 3117 + Title: Stolen Diamond - Odd Switches + - Id: 3118 + Title: Stolen Diamond - Diamond Found! + - Id: 3119 + Title: Z Gang Wanted - Wanted Notice + - Id: 3120 + Title: Z Gang Wanted - About Z Gang + - Id: 3121 + Title: Z Gang Wanted - Valdes's Favor + - Id: 3122 + Title: Z Gang Wanted - Information from Valdes + - Id: 3123 + Title: Z Gang Wanted - Marybell's Test + - Id: 3124 + Title: Z Gang Wanted - Challenging Moonho Ahn + - Id: 3125 + Title: Z Gang Wanted - Challenging Moonho Ahn + - Id: 3126 + Title: Z Gang Wanted - Information from Marybell + - Id: 3127 + Title: Z Gang Wanted - Z Gang's Attack + - Id: 3128 + Title: Z Gang Wanted - Z Gang's Attack + - Id: 3129 + Title: Z Gang Wanted - Strange Letter + - Id: 3130 + Title: Z Gang Wanted - Decrypting the letter... + - Id: 3131 + Title: Z Gang Wanted - Code's Broken! + - Id: 3132 + Title: Z Gang Wanted - Find the Z Gang's Agit + - Id: 3133 + Title: Z Gang Wanted - Agit Found! + - Id: 3134 + Title: Z Gang Wanted - Clean Sweep of Z Gang + - Id: 3135 + Title: Nidhoggur's Nest + TimeLimit: +3d + - Id: 3136 + Title: Nidhoggur's Nest Time Limit + TimeLimit: +4h + - Id: 3200 + Title: Job changes to Rune knight - Recommendation for Rune knight + - Id: 3201 + Title: Job changes to Rune knight - Secret rendezvous of Rune knight + - Id: 3202 + Title: Job changes to Rune knight - The first test + - Id: 3203 + Title: Job changes to Rune knight - The first test + - Id: 3204 + Title: Job changes to Rune knight - Pass the first test + - Id: 3205 + Title: Job changes to Rune knight - The second test + - Id: 3206 + Title: Job changes to Rune knight - The second test + - Id: 3207 + Title: Job changes to Rune knight - The second test + - Id: 3208 + Title: Job changes to Rune knight - The second test + - Id: 3209 + Title: Job changes to Rune knight - Accumulation of magic energy1 + Targets: + - Mob: DULLAHAN + Count: 10 + - Id: 3210 + Title: Job changes to Rune knight - Accumulation of magic energy2 + Targets: + - Mob: DISGUISE + Count: 10 + - Id: 3211 + Title: Job changes to Rune knight - Accumulation of magic energy3 + Targets: + - Mob: QUVE + Count: 10 + - Id: 3212 + Title: Job changes to Rune knight - Accumulation of magic energy4 + Targets: + - Mob: HYLOZOIST + Count: 10 + - Id: 3213 + Title: Job changes to Rune knight - The second test + - Id: 3214 + Title: Job changes to Rune knight - The second test + - Id: 3215 + Title: Job changes to Rune knight - Pass the second test + - Id: 3216 + Title: Job changes to Rune knight - The final test + - Id: 3217 + Title: Job changes to Rune knight - The final test + - Id: 3218 + Title: Job changes to Rune knight - Pass the final test + - Id: 3219 + Title: Job changes to Rune knight - The end of all test + - Id: 3220 + Title: Job changes to Rune knight - Waiting time of test + TimeLimit: +10mn + - Id: 3250 + Title: Request - What is this bandage for? + Targets: + - Mob: MUMMY + Count: 30 + - Id: 3251 + Title: Request - An alligator of Counterattack + Targets: + - Mob: ALLIGATOR + Count: 30 + - Id: 3252 + Title: Request - My mermaid don't do like this way! + Targets: + - Mob: MERMAN + Count: 30 + - Id: 3253 + Title: Request - Missing occult mania + - Id: 3254 + Title: Request - A country wants you + - Id: 3255 + Title: Request - A wild boar subjugate operation + Targets: + - Mob: SAVAGE + Count: 30 + - Id: 3256 + Title: Request - Ready for waiting summer + - Id: 3257 + Title: Request - A grudge of women + Targets: + - Mob: SOHEE + Count: 30 + - Id: 3258 + Title: Request - A material of delicacy + - Id: 3259 + Title: Request - A agony of a doll master + Targets: + - Mob: MARIONETTE + Count: 30 + - Id: 3260 + Title: Request - Tiresome flies + Targets: + - Mob: HUNTER_FLY + Count: 30 + - Id: 3261 + Title: Request - Unclean girl + Targets: + - Mob: MUNAK + Count: 30 + - Id: 3262 + Title: Request - Queer hobby + - Id: 3263 + Title: Request - A mallet of goblin + - Id: 3265 + Title: Request - Missing occult mania + - Id: 4000 + Title: Sherin's Job Interview + - Id: 4001 + Title: Job Change to Hunter + - Id: 4002 + Title: Job Change to Hunter + - Id: 4003 + Title: Job Change to Hunter + - Id: 4004 + Title: Job Change to Hunter + - Id: 4005 + Title: Job Change to Hunter + - Id: 4006 + Title: Job Change to Hunter + - Id: 4007 + Title: Job Change to Hunter + - Id: 4008 + Title: Job Change to Hunter + - Id: 4009 + Title: Job Change to Hunter + - Id: 4010 + Title: Job Change to Hunter + - Id: 4011 + Title: Job Change to Hunter - Test + - Id: 4012 + Title: Job Change to Hunter + - Id: 4013 + Title: Job Change to Hunter + - Id: 4133 + Title: Iara + - Id: 4134 + Title: Iara + - Id: 4135 + Title: Iara + TimeLimit: +1d + - Id: 4154 + Title: Homunculus Researcher + - Id: 4155 + Title: Homunculus S Mutation Mission - 1 + - Id: 4156 + Title: Homunculus S Mutation Mission - 2 + - Id: 4157 + Title: Homunculus S Mutation Mission - 3 + - Id: 4158 + Title: Homunculus S Mutation Mission - 4 + - Id: 4159 + Title: Homunculus S Mutation Mission - 5 + - Id: 4160 + Title: Homunculus S Mutation Mission - 6 + - Id: 4161 + Title: Siege Expert + - Id: 4162 + Title: Party Recruiting Expert + - Id: 4163 + Title: Battleground Expert + - Id: 4164 + Title: Memorial Dungeon Expert + - Id: 4165 + Title: Map Expert + - Id: 4166 + Title: Passing Grades + - Id: 4167 + Title: "Paradise: Dragon Tail Handling" + Targets: + - Mob: DRAGON_TAIL + Count: 30 + - Id: 4168 + Title: "Paradise: Spring Rabbit Handling" + Targets: + - Mob: SPRING_RABBIT + Count: 30 + - Id: 4169 + Title: "Paradise: Pest Handling" + Targets: + - Mob: PEST + Count: 30 + - Id: 4170 + Title: "Paradise: Bathory Handling" + Targets: + - Mob: BATHORY + Count: 30 + - Id: 4171 + Title: "Paradise: Alarm Handling" + Targets: + - Mob: ALARM + Count: 30 + - Id: 4172 + Title: "Paradise: Babayaga Handling" + Targets: + - Mob: VAVAYAGA + Count: 30 + - Id: 4173 + Title: "Paradise: Hyegun Handling" + Targets: + - Mob: HYEGUN + Count: 30 + - Id: 4174 + Title: "Paradise: Antique Firelock Handling" + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 30 + - Id: 4175 + Title: "Paradise: Zipper Bear Handling" + Targets: + - Mob: ZIPPER_BEAR + Count: 30 + - Id: 4176 + Title: "Paradise: Earth Petite Handling" + Targets: + - Mob: PETIT + Count: 30 + - Id: 4177 + Title: "Paradise: Rafflesia Handling" + Targets: + - Mob: RAFFLESIA + Count: 30 + - Id: 4178 + Title: "Paradise: Venomous Handling" + Targets: + - Mob: VENOMOUS + Count: 30 + - Id: 4179 + Title: "Paradise: Pitman Handling" + Targets: + - Mob: PITMAN + Count: 30 + - Id: 4180 + Title: "Paradise: Yellow Novus Handling" + Targets: + - Mob: NOVUS_ + Count: 30 + - Id: 4181 + Title: "Paradise: Solider Handling" + Targets: + - Mob: SOLIDER + Count: 30 + - Id: 4182 + Title: "Paradise: Freezer Handling" + Targets: + - Mob: FREEZER + Count: 30 + - Id: 4183 + Title: "Paradise: Heater Handling" + Targets: + - Mob: HEATER + Count: 30 + - Id: 4184 + Title: "Paradise: Injustice Handling" + Targets: + - Mob: INJUSTICE + Count: 30 + - Id: 4185 + Title: "Paradise: Rybio Handling" + Targets: + - Mob: RYBIO + Count: 30 + - Id: 4186 + Title: "Paradise: Dark Priest Handling" + Targets: + - Mob: DARK_PRIEST + Count: 30 + - Id: 4187 + Title: "Paradise: Stapo Handling" + Targets: + - Mob: STAPO + Count: 30 + - Id: 4188 + Title: "Paradise: Roween Handling" + Targets: + - Mob: ROWEEN + Count: 30 + - Id: 4189 + Title: "Paradise: Siroma Handling" + Targets: + - Mob: SIROMA + Count: 30 + - Id: 4190 + Title: "Paradise: Shinobi Handling" + Targets: + - Mob: SHINOBI + Count: 30 + - Id: 4191 + Title: "Paradise: Evil Nymph Handling" + Targets: + - Mob: WICKED_NYMPH + Count: 30 + - Id: 4192 + Title: "Paradise: Deviruchi Handling" + Targets: + - Mob: DEVIRUCHI + Count: 30 + - Id: 4193 + Title: "Paradise: Mineral Handling" + Targets: + - Mob: MINERAL + Count: 30 + - Id: 4194 + Title: "Paradise: Kaho Handling" + Targets: + - Mob: KAHO + Count: 30 + - Id: 4195 + Title: "Paradise: Neraid Handling" + Targets: + - Mob: NERAID + Count: 30 + - Id: 4196 + Title: "Paradise: Disguise Handling" + Targets: + - Mob: DISGUISE + Count: 30 + - Id: 4197 + Title: Octopus + TimeLimit: +3h + - Id: 4198 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4199 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4200 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4201 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4202 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4203 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4204 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4205 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4206 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4207 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4208 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4209 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4210 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4211 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4212 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4213 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4214 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4215 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4216 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4217 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4218 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4219 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4220 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4221 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4222 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4223 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4224 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4225 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4226 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4227 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4229 + Title: Devil in the Cave + TimeLimit: +23h + - Id: 4254 + Title: Fairy with a stomache + - Id: 4255 + Title: Revenge! + - Id: 4256 + Title: An accomplice? + - Id: 4257 + Title: Conspiracy + - Id: 4258 + Title: Eirinn + - Id: 4259 + Title: Bourbon + - Id: 4260 + Title: Bee + - Id: 4261 + Title: Counterattack (1) + - Id: 4262 + Title: Counterattack (2) + - Id: 4263 + Title: Counteroffensive (1) + - Id: 4264 + Title: Counteroffensive (2) + - Id: 4265 + Title: Bookshelf use + - Id: 4266 + Title: ????? ?? + - Id: 4267 + Title: ????? ?? + - Id: 4999 + Title: Extermination Crisis + - Id: 5000 + Title: The Crow of the Fate - 7 + - Id: 5001 + Title: King Froggie VII's revenge + Targets: + - Mob: SIDE_WINDER + Count: 50 + - Id: 5002 + Title: The hero of the frogs + - Id: 5003 + Title: Frog Hiding Skill + - Id: 5004 + Title: Food Shortage + Targets: + - Mob: ARGIOPE + Count: 50 + - Id: 5016 + Title: Bring me a Research Tool Bag + - Id: 5017 + Title: Revenge of the Reseacher + - Id: 5018 + Title: Revenge of the Reseacher + - Id: 5019 + Title: Bathroom Sample Studying + - Id: 5020 + Title: Sample Researching + TimeLimit: +1d + - Id: 5021 + Title: Sample Collecting + - Id: 5022 + Title: Sample Collecting + - Id: 5023 + Title: Inspection of the Sample + TimeLimit: +6h + - Id: 5024 + Title: Eastern Pool Research + - Id: 5025 + Title: Western Pool Research + - Id: 5026 + Title: Southern Pool Research + - Id: 5027 + Title: Northern Pool Research + - Id: 5028 + Title: Inspection of the Sample + TimeLimit: +12h + - Id: 5029 + Title: Unidentified Creature + TimeLimit: +1h + - Id: 5030 + Title: The creature's family + - Id: 5031 + Title: The creature's family + - Id: 5032 + Title: The creature's family + - Id: 5033 + Title: The creature's family + - Id: 5034 + Title: News from the family + - Id: 5035 + Title: Help the old man! + - Id: 5036 + Title: Help the old man! + - Id: 5037 + Title: Help the old man! + - Id: 5038 + Title: Help the old man! + - Id: 5039 + Title: Help the old man! + - Id: 5040 + Title: Help the old man! + - Id: 5041 + Title: Help the old man! + - Id: 5042 + Title: Help the old man! + - Id: 5043 + Title: Help the old man! + TimeLimit: +5mn + - Id: 5044 + Title: Help the old man! + TimeLimit: +1d + - Id: 5045 + Title: Help the old man! + - Id: 5046 + Title: Help the old man! + - Id: 5047 + Title: Help the old man! + - Id: 5048 + Title: Help the old man! + - Id: 5049 + Title: Help the old man! + - Id: 5050 + Title: Help the old man! + - Id: 5051 + Title: Help the old man! + - Id: 5052 + Title: Traditional Weapon + - Id: 5053 + Title: Traditional Weapon + - Id: 5054 + Title: Traditional Weapon + - Id: 5055 + Title: Local Rising - Headless Horse + Targets: + - Mob: HEADLESS_MULE + Count: 15 + - Id: 5056 + Title: Local Rising - Tamruan + Targets: + - Mob: TAMRUAN + Count: 15 + - Id: 5057 + Title: Local Rising - Ready the Festival + - Id: 5058 + Title: The mood of the players-(1) + - Id: 5059 + Title: The mood of the players-(2) + - Id: 5060 + Title: Cat Shock + TimeLimit: +3mn + - Id: 5061 + Title: Am I scared? + - Id: 5062 + Title: I met Eryu. + - Id: 5063 + Title: I met Stew. + - Id: 5064 + Title: I met Ketchup. + - Id: 5065 + Title: I met Eff. + - Id: 5066 + Title: Scary image-(1) + - Id: 5067 + Title: Scary image-(2) + - Id: 5068 + Title: Collecting complaint + TimeLimit: +20h + - Id: 5069 + Title: Token of honor + TimeLimit: +1h + - Id: 5070 + Title: Rock Paper Scissors + TimeLimit: +1d + - Id: 5071 + Title: Chamchamcham + TimeLimit: +1d + - Id: 5072 + Title: Kkongnyangkkong + TimeLimit: +1d + - Id: 5073 + Title: Challenging of flag wave + TimeLimit: +1d + - Id: 5074 + Title: Cat's Meal + Targets: + - Mob: PHEN + Count: 30 + - Id: 5075 + Title: Health food + Targets: + - Mob: MARSE + Count: 50 + - Id: 5076 + Title: Enemies + Targets: + - Mob: KOBOLD_ARCHER + Count: 30 + - Id: 5077 + Title: Reaction Training + Targets: + - Mob: CRAMP + Count: 10 + - Id: 5078 + Title: Light bird food + Targets: + - Mob: PECOPECO + Count: 50 + - Id: 5079 + Title: How to stabilize the mind + - Id: 5080 + Title: Lack of Snack + - Id: 5081 + Title: Banned foods + - Id: 5082 + Title: Cool food + - Id: 5083 + Title: Please come back Eryu-(1) + - Id: 5084 + Title: Please come back Eryu-(2) + - Id: 5085 + Title: Please come back Stew-(1) + - Id: 5086 + Title: Please come back Stew-(2) + - Id: 5087 + Title: Please come back Ketchup-(1) + - Id: 5088 + Title: Please come back Ketchup-(2) + - Id: 5089 + Title: Please come back Eff-(1) + - Id: 5090 + Title: Please come back Eff-(2) + - Id: 5091 + Title: Go Malangdo + - Id: 5092 + Title: Unlocking the Ultimate Mediocrity + - Id: 5093 + Title: Unlocking the Ultimate Mediocrity + - Id: 5094 + Title: Unlocking the Ultimate Mediocrity + Targets: + - Mob: PORING + Count: 1000 + - Id: 5095 + Title: Unlocking the Ultimate Mediocrity + Targets: + - Mob: LUNATIC + Count: 1000 + - Id: 5096 + Title: Unlocking the Ultimate Mediocrity + Targets: + - Mob: FABRE + Count: 1000 + - Id: 5097 + Title: Unlocking the Ultimate Mediocrity + Targets: + - Mob: PICKY + Count: 1000 + - Id: 5098 + Title: Unlocking the Ultimate Mediocrity + - Id: 5099 + Title: Unlocking the Ultimate Mediocrity + - Id: 5100 + Title: Unlocking the Ultimate Mediocrity + - Id: 5109 + Title: Light but Unconfirmed Rumor + - Id: 5110 + Title: The Rumored Character + - Id: 5111 + Title: To the Lab... + - Id: 5112 + Title: Laboratory Restricted Access + TimeLimit: +3d + - Id: 5113 + Title: "[Rest] Lord Knight" + - Id: 5114 + Title: "[Rest] Paladin" + - Id: 5115 + Title: "[Rest] High Priest" + - Id: 5116 + Title: "[Rest] Champion" + - Id: 5117 + Title: "[Rest] High Wizard" + - Id: 5118 + Title: "[Rest] Professor" + - Id: 5119 + Title: "[Rest] Whitesmith" + - Id: 5120 + Title: "[Rest] Creator" + - Id: 5121 + Title: "[Rest] Assassin Cross" + - Id: 5122 + Title: "[Rest] Stalker" + - Id: 5123 + Title: "[Rest] Sniper" + - Id: 5124 + Title: "[Rest] Clown" + - Id: 5125 + Title: "[Rest] Gypsy" + - Id: 5131 + Title: Strange Conversation + - Id: 5132 + Title: Family Business-(1) + - Id: 5133 + Title: Family Business-(2) + - Id: 5134 + Title: New path + - Id: 5135 + Title: 4 tests + - Id: 5136 + Title: Knowledge test + - Id: 5137 + Title: Survival test + - Id: 5138 + Title: Weapons test + - Id: 5139 + Title: The guy looks familiar!! + - Id: 5140 + Title: Uncertain chilliness + - Id: 5141 + Title: Got a curse!! + TimeLimit: +2mn + - Id: 5142 + Title: Prototype-(1) + - Id: 5143 + Title: Prototype-(2) + - Id: 5144 + Title: Prototype-(2) + - Id: 5145 + Title: Prototype-(3) + - Id: 5146 + Title: Battle test + - Id: 5161 + Title: Low Level collection request[Stand by] + TimeLimit: +1d + - Id: 5162 + Title: Low Level collection request + Targets: + - Mob: REQUIEM + Count: 100 + - Id: 5163 + Title: Low Level collection request + Targets: + - Mob: BATHORY + Count: 100 + - Id: 5164 + Title: Low Level collection request + Targets: + - Mob: SPRING_RABBIT + Count: 100 + - Id: 5165 + Title: Low Level collection request + Targets: + - Mob: SLEEPER + Count: 100 + - Id: 5166 + Title: Low Level collection request + Targets: + - Mob: EVIL_DRUID + Count: 100 + - Id: 5167 + Title: Low Level collection request + Targets: + - Mob: PETIT + Count: 100 + - Id: 5168 + Title: Low Level collection request + Targets: + - Mob: CLOCK + Count: 100 + - Id: 5169 + Title: Mid-Level collection request[Stand by] + TimeLimit: +1d + - Id: 5170 + Title: Mid-Level collection request + Targets: + - Mob: SIROMA + Count: 100 + - Id: 5171 + Title: Mid-Level collection request + Targets: + - Mob: DARK_PRIEST + Count: 100 + - Id: 5172 + Title: Mid-Level collection request + Targets: + - Mob: STAPO + Count: 100 + - Id: 5173 + Title: Mid-Level collection request + Targets: + - Mob: SOLIDER + Count: 100 + - Id: 5174 + Title: High level collectiong request[Stand by] + TimeLimit: +1d + - Id: 5175 + Title: High level collection request + Targets: + - Mob: DESERT_WOLF + Count: 100 + - Id: 5176 + Title: High level collection request + Targets: + - Mob: MEDUSA + Count: 100 + - Id: 5177 + Title: High level collection request + Targets: + - Mob: PINGUICULA + Count: 100 + - Id: 5178 + Title: High level collection request + Targets: + - Mob: MAJORUROS + Count: 100 + - Id: 5179 + Title: Highest level collection request + Targets: + - Mob: RAYDRIC + Count: 100 + - Id: 5180 + Title: Highest level collection request + Targets: + - Mob: NAGA + Count: 100 + - Id: 5181 + Title: Highest level collection request + Targets: + - Mob: ANCIENT_MUMMY + Count: 100 + - Id: 5182 + Title: Highest level collection request + Targets: + - Mob: ANCIENT_MIMIC + Count: 100 + - Id: 5222 + Title: Saving the energy crystals + - Id: 5223 + Title: Saving the energy crystals + - Id: 5224 + Title: Saving the energy crystals + - Id: 5225 + Title: Saving energy crystal[Stand by] + TimeLimit: +2h + - Id: 5226 + Title: Saving energy crystal[Stand by] + TimeLimit: +2h + - Id: 5227 + Title: Saving energy crystal[Stand by] + TimeLimit: +2h + - Id: 6000 + Title: Job Change to Taekwon + - Id: 6001 + Title: Job Change to Taekwon + - Id: 6002 + Title: Job Change to Taekwon + - Id: 6005 + Title: Job Change to Soul-Linker + - Id: 6006 + Title: Job Change to Soul-Linker + - Id: 6007 + Title: Job Change to Soul-Linker + - Id: 6008 + Title: Job Change to Soul-Linker + - Id: 6010 + Title: Job Change to Super Novice + - Id: 6015 + Title: A favor from Cougar + - Id: 6016 + Title: A favor from a Suspicious Man + - Id: 6017 + Title: Red Leopard Joe's Reply + - Id: 6018 + Title: Cougar's Madness + - Id: 6020 + Title: Master Miller's Letter + - Id: 6021 + Title: Wise Bull Horn's voucher + - Id: 6022 + Title: Making a voucher + - Id: 6023 + Title: Wise Bull Horn's Favor + - Id: 6024 + Title: Job Change to Gunslinger! + - Id: 6025 + Title: KVM Guillaume + TimeLimit: +5mn + - Id: 6026 + Title: KVM Croix + TimeLimit: +5mn + - Id: 6027 + Title: KVM Indicator + TimeLimit: +5mn + - Id: 7000 + Title: Job Change to Dancer! + - Id: 7001 + Title: Job Change to Dancer! + - Id: 7002 + Title: Job Change to Dancer! + - Id: 7003 + Title: Job Change to Dancer! + - Id: 7004 + Title: Job Change to Dancer! + - Id: 7005 + Title: Job Change to Dancer! + - Id: 7006 + Title: Job Change to Dancer! + - Id: 7007 + Title: Warrior of the Sun, the Moon, and the Stars + - Id: 7008 + Title: Warrior of the Sun, the Moon, and the Stars - Nature + - Id: 7009 + Title: Warrior of the Sun, the Moon, and the Stars - the Altar + - Id: 7010 + Title: Warrior of the Sun, the Moon, and the Stars - Stars? + - Id: 7011 + Title: Warrior of the Sun, the Moon, and the Stars + - Id: 7012 + Title: Pursuing Rayan Moore + - Id: 7013 + Title: Pursuing Rayan Moore + - Id: 7014 + Title: Pursuing Rayan Moore + - Id: 7015 + Title: Pursuing Rayan Moore + - Id: 7016 + Title: Pursuing Rayan Moore + - Id: 7017 + Title: Pursuing Rayan Moore + - Id: 7018 + Title: Pursuing Rayan Moore + - Id: 7019 + Title: Pursuing Rayan Moore + - Id: 7020 + Title: Pursuing Rayan Moore + - Id: 7021 + Title: Pursuing Rayan Moore + - Id: 7022 + Title: Pursuing Rayan Moore + - Id: 7023 + Title: Pursuing Rayan Moore + - Id: 7024 + Title: Pursuing Rayan Moore + - Id: 7025 + Title: Pursuing Rayan Moore + - Id: 7026 + Title: Pursuing Rayan Moore + - Id: 7027 + Title: Pursuing Rayan Moore + - Id: 7028 + Title: Pursuing Rayan Moore + - Id: 7029 + Title: Pursuing Rayan Moore + - Id: 7030 + Title: Pursuing Rayan Moore + - Id: 7031 + Title: Pursuing Rayan Moore + - Id: 7032 + Title: Pursuing Rayan Moore + - Id: 7033 + Title: Pursuing Rayan Moore + - Id: 7034 + Title: Pursuing Rayan Moore + - Id: 7035 + Title: Pursuing Rayan Moore + - Id: 7036 + Title: Pursuing Rayan Moore + - Id: 7037 + Title: Case closed? + - Id: 7038 + Title: Passion for Baked Sweet Potatoes + - Id: 7039 + Title: Dodging the conversation + - Id: 7040 + Title: Dodging the conversation + - Id: 7041 + Title: Politics is for the Politicians + - Id: 7042 + Title: Part-time Job - Tatacho's feed + - Id: 7043 + Title: Part-time Job - Cornus's feed + - Id: 7044 + Title: Part-time Job - Hillthrion's feed1 + - Id: 7045 + Title: Part-time Job - Hillthrion's feed2 + - Id: 7046 + Title: Part-time Job - warm rugs + - Id: 7047 + Title: Part-time Job - Let's call it a day! + TimeLimit: +5h + - Id: 7048 + Title: Thanatos Tower - Burled's Favor + - Id: 7049 + Title: Thanatos Tower - Sealed Tower + - Id: 7050 + Title: Thanatos Tower - Sealed Tower + - Id: 7051 + Title: Thanatos Tower - Sealed Tower + - Id: 7052 + Title: Thanatos Tower - Sealed Tower + - Id: 7053 + Title: Thanatos Tower - What they want is.. + - Id: 7054 + Title: Myu's Favor - Teach them a lesson! + Targets: + - Mob: KOBOLD_ARCHER + Count: 1000 + - Id: 7055 + Title: Myu's Favor - Not the cat! + Targets: + - Mob: WILD_ROSE + Count: 1 + - Id: 7056 + Title: Messenger - Arc's Favor + - Id: 7057 + Title: Messenger - Arc's Favor + - Id: 7058 + Title: Messenger - Arc's Favor + - Id: 7059 + Title: Messenger - Terra's Whereabouts + - Id: 7060 + Title: Messenger - Terra's Whereabouts + - Id: 7061 + Title: Messenger - Terra's Whereabouts + - Id: 7062 + Title: Messenger - Terra's Whereabouts + - Id: 7063 + Title: Messenger - Terra's Whereabouts + - Id: 7064 + Title: Messenger - Terra's Whereabouts + - Id: 7065 + Title: Messenger - Terra's Whereabouts + - Id: 7066 + Title: Messenger - Prove the Truth + - Id: 7067 + Title: Messenger - Prove the Truth + - Id: 7068 + Title: Messenger - Prove the Truth + - Id: 7069 + Title: Messenger - Too late! + - Id: 7070 + Title: Messenger - Terra's Return + - Id: 7071 + Title: Messenger - Invitation + - Id: 7074 + Title: Rata Hunt + Targets: + - Mob: RATA + Count: 1 + - Id: 7075 + Title: Duneyrr Hunt + Targets: + - Mob: DUNEYRR + Count: 1 + - Id: 7076 + Title: "Wanted: Dandelion" + Targets: + - Mob: DANDELION_ + Count: 1 + - Id: 7077 + Title: Collecting Dragon Eggs + - Id: 7078 + Title: Collecting Dragon Eggs + TimeLimit: +1d + - Id: 7079 + Title: Finding Refined Bradium + - Id: 7080 + Title: Finding Refined Bradium + TimeLimit: +1d + - Id: 7081 + Title: Helping the Laphine Craftsman + - Id: 7082 + Title: Helping the Laphine Craftsman + TimeLimit: +1d + - Id: 7091 + Title: An advice of Diora 01 + - Id: 7092 + Title: An advice of Diora 02 + - Id: 7093 + Title: An advice of Diora 03 + - Id: 7094 + Title: An advice of Diora 04 + - Id: 7095 + Title: An advice of Diora 05 + - Id: 7096 + Title: A proof of new requirement + - Id: 7097 + Title: A proof of new requirement + - Id: 7098 + Title: A proof of new requirement + - Id: 7099 + Title: A proof of new requirement + - Id: 7100 + Title: A message of Bercascell + - Id: 7101 + Title: Special task of an assassin guild 1 + - Id: 7102 + Title: Special task of an assassin guild 2 + - Id: 7103 + Title: Special task of an assassin guild 3 + - Id: 7104 + Title: Special task of an assassin guild 4 + - Id: 7105 + Title: Special task of an assassin guild 4 + - Id: 7106 + Title: Special task of an assassin guild 5 + - Id: 7107 + Title: Special task of an assassin guild 6 + - Id: 7108 + Title: Special task of an assassin guild 7 + - Id: 7109 + Title: Special task of an assassin guild 8 + - Id: 7110 + Title: Special task of an assassin guild 9 + - Id: 7111 + Title: Special task of an assassin guild 10 + - Id: 7112 + Title: Information of Madelle + - Id: 7113 + Title: Information of Crave + - Id: 7114 + Title: Information of Trovan + - Id: 7115 + Title: Information of a peddler + - Id: 7116 + Title: Information of a old man + - Id: 7117 + Title: Your first quest! + - Id: 7118 + Title: Novice Training + - Id: 7119 + Title: Novice Training + - Id: 7120 + Title: Novice Training + - Id: 7121 + Title: Novice Training + - Id: 7122 + Title: First battle - Poring Hunt + Targets: + - Mob: PORING + Count: 1 + - Id: 7123 + Title: Battle Basics -Swordman + Targets: + - Mob: PICKY + Count: 2 + - Id: 7124 + Title: Battle Basics -Mage + Targets: + - Mob: LUNATIC + Count: 5 + - Id: 7126 + Title: Selling items + - Id: 7127 + Title: Battle Basics -Thief + Targets: + - Mob: WILOW + Count: 5 + - Id: 7128 + Title: Training course 'conquest a desert!' -start + - Id: 7129 + Title: The training course 'conquer the desert!' - A real battle 1 + Targets: + - Mob: CONDOR + Count: 10 + - Id: 7130 + Title: The training course 'conquer the desert!' - A real battle 2 + Targets: + - Mob: DESERT_WOLF_B + Count: 10 + - Id: 7131 + Title: The training course 'conquer the desert!' - A real battle 3 + Targets: + - Mob: SCORPION + Count: 5 + - Id: 7132 + Title: The training course 'conquer the desert!' - Complete a quest + - Id: 7133 + Title: The training course 'conquer the culvert!' - Start + - Id: 7134 + Title: The training course 'conquer the culvert!' - A real battle 1 + Targets: + - Mob: THIEF_BUG + Count: 10 + - Id: 7135 + Title: The training course 'conquer the culvert!' - A real battle 2 + Targets: + - Mob: TAROU + Count: 10 + - Id: 7136 + Title: The training course 'conquer the culvert!' - A real battle 3 + Targets: + - Mob: FARMILIAR + Count: 5 + - Id: 7137 + Title: The training course 'conquer the culvert!' - Complete a quest + - Id: 7138 + Title: The training course 'conquer the haunted cave!' - Start + - Id: 7139 + Title: The training course 'conquer the haunted cave!' - A real battle 1 + Targets: + - Mob: SKELETON + Count: 15 + - Id: 7140 + Title: The training course 'conquer the haunted cave!' - A real battle 2 + Targets: + - Mob: POPORING + Count: 10 + - Id: 7141 + Title: The training course 'conquer the haunted cave!' - Complete a quest + - Id: 7142 + Title: The training course 'conquer ant hell!' - Start + - Id: 7143 + Title: The training course 'conquer ant hell!' - A real battle 1 + Targets: + - Mob: PIERE + Count: 15 + - Id: 7144 + Title: The training course 'conquer ant hell!' - A real battle 2 + Targets: + - Mob: ANDRE + Count: 15 + - Id: 7145 + Title: The training course 'conquer ant hell!' - A real battle 3 + Targets: + - Mob: VITATA + Count: 10 + - Id: 7146 + Title: The training course 'conquer ant hell!' - Complete a quest + - Id: 7147 + Title: The training course 'conquer the orc village!' - start + - Id: 7148 + Title: The training course 'conquer the orc village!' - A real battle 1 + Targets: + - Mob: ORC_BABY + Count: 10 + - Id: 7149 + Title: The training course 'conquer the orc village!' - A real battle 2 + Targets: + - Mob: ORK_WARRIOR + Count: 10 + - Id: 7150 + Title: The training course 'conquer the orc village!' - A real battle 3 + Targets: + - Mob: ORC_LADY + Count: 10 + - Id: 7151 + Title: The training course 'conquer the orc village!' - Complete a quest + - Id: 7152 + Title: The training course 'conquer the orc dungeon!' - start + - Id: 7153 + Title: The training course 'conquer the orc dungeon!' - A real battle 1 + Targets: + - Mob: ORC_ZOMBIE + Count: 20 + - Id: 7154 + Title: The training course 'conquer the orc dungeon!'- A real battle 2 + Targets: + - Mob: ORC_SKELETON + Count: 20 + - Id: 7155 + Title: The training course 'conquer the orc dungeon!' - complete a quest + - Id: 7156 + Title: The training course 'conquer an undersea city!' - start + - Id: 7157 + Title: The training course 'conquer an undersea city!' - A real battle 1 + Targets: + - Mob: MERMAN + Count: 15 + - Id: 7158 + Title: The training course 'conquer an undersea city!' - A real battle 2 + Targets: + - Mob: STROUF + Count: 10 + - Id: 7159 + Title: The training course 'conquer an undersea city!' - Complete a quest + - Id: 7160 + Title: Mysterious Cryptogram + - Id: 7161 + Title: Mysterious Cryptogram - 2nd + - Id: 7162 + Title: Mysterious Cryptogram - 2nd + - Id: 7163 + Title: Mysterious Cryptogram - 2nd + - Id: 7164 + Title: Hunt for shadow of deception + Targets: + - Mob: S_WIND_GHOST + Count: 1 + - Id: 7165 + Title: Key of deception + - Id: 7166 + Title: Rachel Branch of Shadow Workshop + - Id: 7167 + Title: Mysterious Cryptogram - 3rd + - Id: 7168 + Title: Mysterious Cryptogram - 3rd + - Id: 7169 + Title: Mysterious Cryptogram - 3rd + - Id: 7170 + Title: Mysterious Cryptogram - 3rd + - Id: 7171 + Title: Hunt for shadow of delusion + Targets: + - Mob: S_SKOGUL + Count: 1 + - Id: 7172 + Title: Key of delusion + - Id: 7173 + Title: Message to Halled from Paul + - Id: 7174 + Title: Mysterious Cryptogram - 4th + - Id: 7175 + Title: Hunft for shadow of gaiety + Targets: + - Mob: S_SUCCUBUS + Count: 1 + - Id: 7176 + Title: Key of Gaiety + - Id: 7177 + Title: A young guy in Lighthalzen + - Id: 7178 + Title: Destination of Deception, Delusion and Gaiety + - Id: 7179 + Title: Vicente, you dare! + - Id: 7180 + Title: Message from Doomk + - Id: 7181 + Title: Karakas's ring + - Id: 7182 + Title: Sapha's Visit + - Id: 7183 + Title: Invitation from Sapha + - Id: 7184 + Title: To El Dicastes! + - Id: 7185 + Title: Inspector Doha + - Id: 7186 + Title: Secret Order from Doha - Investigation + - Id: 7187 + Title: Secret Order from Doha - Shay + - Id: 7188 + Title: Information Gathering - in the Plaza + - Id: 7189 + Title: Information Gathering - in the Factory + - Id: 7190 + Title: Information Gathering - at the Guards + - Id: 7191 + Title: Shay's designation - BK + - Id: 7192 + Title: BK's Information + - Id: 7193 + Title: Dimensional Crack Investigation + - Id: 7194 + Title: What's this bloodstain? + - Id: 7195 + Title: What's this skin piece? + - Id: 7196 + Title: What's this suspicious magic power? + - Id: 7197 + Title: Sapha Certifications? + - Id: 7198 + Title: Audience with Ahat + - Id: 7199 + Title: Secret Order from Ahat + - Id: 7200 + Title: Cheshire's call + TimeLimit: +23h + - Id: 7201 + Title: Removing traces + - Id: 7202 + Title: Secret order from Doha - Collect proof + - Id: 7203 + Title: Secret order from Doha - Final Report + - Id: 7206 + Title: New Day for Cheshire + - Id: 7207 + Title: Cheshire's Box + - Id: 7208 + Title: Wait for Cheshire? + TimeLimit: +1d + - Id: 7209 + Title: Forget the box. + - Id: 7210 + Title: Daily delivery + - Id: 7211 + Title: Misty Forest Labyrinth Exploration + TimeLimit: +2h30mn + - Id: 7212 + Title: Loki's Search + - Id: 7213 + Title: Wandering Protector + - Id: 7214 + Title: "Paradise Advanced: Romeo Training" + - Id: 7215 + Title: "Paradise Advanced: Romeo Hunt 1" + Targets: + - Mob: STALACTIC_GOLEM + Count: 3 + - Id: 7216 + Title: "Paradise Advanced: Romeo Hunt 2" + Targets: + - Mob: STALACTIC_GOLEM + Count: 10 + - Id: 7217 + Title: "Paradise Advanced: Romeo Hunt 3" + - Id: 7218 + Title: "Paradise Advanced: Romeo Complete" + - Id: 7219 + Title: "Paradise Advanced: Johan Training" + - Id: 7220 + Title: "Paradise Advanced: Johan Hunt 1" + Targets: + - Mob: WRAITH + Count: 20 + - Id: 7221 + Title: "Paradise Advanced: Johan Hunt 2" + Targets: + - Mob: EVIL_DRUID + Count: 10 + - Id: 7222 + Title: "Paradise Advanced: Johan Complete" + - Id: 7223 + Title: "Paradise Advanced: Kiren Training" + - Id: 7224 + Title: "Paradise Advanced: Kiren Hunt 1" + Targets: + - Mob: PORCELLIO + Count: 30 + - Id: 7225 + Title: "Paradise Advanced: Removed" + Targets: + - Mob: NOXIOUS + Count: 30 + - Id: 7226 + Title: "Paradise Advanced: Kiren Hunt 2 (Part A)" + Targets: + - Mob: VENOMOUS + Count: 30 + - Id: 7227 + Title: "Paradise Advanced: Kiren Hunt 2 (Part B)" + Targets: + - Mob: TEDDY_BEAR + Count: 5 + - Id: 7228 + Title: "Paradise Advanced: Kiren Complete" + - Id: 7229 + Title: "Paradise Advanced: Naomi Training" + - Id: 7230 + Title: "Paradise Advanced: Naomi Hunt 1" + Targets: + - Mob: SIROMA + Count: 30 + - Id: 7231 + Title: "Paradise Advanced: Naomi Hunt 2" + Targets: + - Mob: SIROMA + Count: 30 + - Id: 7232 + Title: "Paradise Advanced: Naomi Complete" + - Id: 7233 + Title: "Paradise Advanced: Margaret Training" + - Id: 7234 + Title: "Paradise Advanced: Margaret's Favor" + - Id: 7235 + Title: "Paradise Advanced: Margaret Hunt 1" + Targets: + - Mob: NEPENTHES + Count: 1 + - Id: 7236 + Title: "Paradise Advanced: Margaret Hunt 2" + Targets: + - Mob: PINGUICULA + Count: 5 + - Id: 7237 + Title: "Paradise Advanced: Margaret Complete" + - Id: 7238 + Title: Toren's Errands (Easy) + - Id: 7239 + Title: Toren's Errands (Normal) + - Id: 7240 + Title: Strengthening Equipment + - Id: 7241 + Title: Toren's Errands - Tomorrow + TimeLimit: +1d + - Id: 7242 + Title: Play with the baby cat + - Id: 7243 + Title: Nyadventure-Duruduru Compass + - Id: 7244 + Title: Nyadventure-Duruduru Race + TimeLimit: +3mn + - Id: 7245 + Title: Nyadventure-Duruduru Race + TimeLimit: +3mn + - Id: 7246 + Title: Nyadventure-I'm coming now. + - Id: 7247 + Title: Nyadventure-Stop the Bang! + - Id: 7249 + Title: Nyadventure-Bang! See you next time + TimeLimit: +1d + - Id: 7250 + Title: Nyadventure-Hidden Treasure? + - Id: 7251 + Title: Nyadventure-The First piece of Painting + - Id: 7252 + Title: Nyadventure-The Second piece of Painting + - Id: 7253 + Title: Nyadventure-The Third piece of Painting + - Id: 7254 + Title: Nyadventure-The Fourth piece of Painting + - Id: 7255 + Title: Nyadventure-The Fifth piece of Painting + - Id: 7256 + Title: Nyadventure-The Sixth piece of Painting + - Id: 7257 + Title: Nyadventure-Race, Come back tomorrow! + TimeLimit: +1d + - Id: 7258 + Title: Nyadventure-Painting completed + - Id: 7259 + Title: Gift from the Mew Bravery Team + - Id: 7260 + Title: The origin of Bugs + - Id: 7261 + Title: Cat Biscuits - Table + - Id: 7262 + Title: Cat Biscuits - Mattress + - Id: 7263 + Title: Cat Biscuits - Grill + - Id: 7264 + Title: To Chef Nyas + - Id: 7265 + Title: Rage of Chef Nyas + - Id: 7266 + Title: Declaration of Chef Nyas + - Id: 7267 + Title: Appointed time with Cleanyang + TimeLimit: +1d + - Id: 7268 + Title: Find the Cat's hard biscuits! + - Id: 7269 + Title: Cat Biscuits - Resting Place + - Id: 7270 + Title: Cat Biscuits - Sand + - Id: 7271 + Title: Cat Biscuits - Bottom of the Stairs + - Id: 7272 + Title: Cat Biscuits - Corner + - Id: 7273 + Title: Cat Biscuits - Locker + - Id: 7274 + Title: Cat Biscuits - Foothold + - Id: 7275 + Title: Cat Biscuits - Sand + - Id: 7276 + Title: Promise to deliver more food + TimeLimit: +1d + - Id: 7281 + Title: List of Errands + - Id: 7282 + Title: List of Errands + - Id: 7283 + Title: List of Errands + - Id: 7284 + Title: List of Errands + - Id: 7285 + Title: List of Errands + - Id: 7286 + Title: List of Errands + - Id: 7287 + Title: List of Errands + - Id: 7288 + Title: List of Errands + - Id: 7289 + Title: List of Errands + - Id: 7290 + Title: List of Errands + - Id: 7291 + Title: List of Errands + - Id: 7292 + Title: List of Errands + - Id: 7293 + Title: List of Errands + - Id: 7294 + Title: List of Errands + - Id: 7295 + Title: List of Errands + - Id: 7296 + Title: List of Errands + - Id: 7297 + Title: List of Errands + - Id: 7298 + Title: List of Errands + - Id: 7299 + Title: List of Errands + - Id: 7300 + Title: List of Errands + - Id: 7301 + Title: List of Errands + - Id: 7302 + Title: List of Errands + - Id: 7303 + Title: List of Errands + - Id: 7304 + Title: List of Errands + - Id: 7305 + Title: List of Errands + - Id: 7306 + Title: List of Errands + - Id: 7307 + Title: List of Errands + - Id: 7308 + Title: List of Errands + - Id: 7309 + Title: List of Errands + - Id: 7310 + Title: List of Errands + - Id: 7311 + Title: List of Errands + - Id: 7312 + Title: List of Errands + - Id: 7313 + Title: List of Errands + - Id: 7314 + Title: List of Errands + - Id: 7315 + Title: List of Errands + - Id: 7316 + Title: List of Errands + - Id: 7317 + Title: List of Errands + - Id: 7318 + Title: List of Errands + - Id: 7319 + Title: List of Errands + - Id: 7320 + Title: List of Errands + - Id: 7321 + Title: List of Errands + - Id: 7322 + Title: List of Errands + - Id: 7323 + Title: List of Errands + - Id: 7324 + Title: List of Errands + - Id: 7325 + Title: List of Errands + - Id: 7326 + Title: List of Errands + - Id: 7327 + Title: List of Errands + - Id: 7328 + Title: List of Errands + - Id: 7329 + Title: List of Errands + - Id: 7330 + Title: List of Errands + - Id: 7331 + Title: List of Errands + - Id: 7332 + Title: List of Errands + - Id: 7333 + Title: List of Errands + - Id: 7334 + Title: List of Errands + - Id: 7335 + Title: List of Errands + - Id: 7336 + Title: List of Errands + - Id: 7337 + Title: List of Errands + - Id: 7338 + Title: List of Errands + - Id: 7339 + Title: List of Errands + - Id: 7340 + Title: List of Errands + - Id: 7341 + Title: List of Errands + - Id: 7342 + Title: List of Errands + - Id: 7343 + Title: List of Errands + - Id: 7344 + Title: List of Errands + - Id: 7345 + Title: List of Errands + - Id: 7346 + Title: List of Errands + - Id: 7349 + Title: Vote + TimeLimit: +30mn + - Id: 7350 + Title: Cautious Village + - Id: 7351 + Title: Better than My Old Button + - Id: 7352 + Title: Sailor Wants a Button + - Id: 7353 + Title: Old Man Wants a Button + - Id: 7354 + Title: Young Man Wants a Button + - Id: 7355 + Title: Merchant Wants a Button + - Id: 7356 + Title: Little Kid Wants a Button + - Id: 7357 + Title: Middle-aged Guy Wants a Button + - Id: 7358 + Title: Why do they want my Buttons? + - Id: 7359 + Title: Deliver Holy Item to Sailor + - Id: 7360 + Title: Deliver Holy Item to Old Man + - Id: 7361 + Title: Deliver Holy Item to Young Man + - Id: 7362 + Title: Deliver Holy Item to Merchant + - Id: 7363 + Title: Deliver Holy Item to Little Kid + - Id: 7364 + Title: Deliver Holy Item to Middle-aged Man + - Id: 7365 + Title: Better than My Old Button-2 + - Id: 7366 + Title: Traditional Spiritual Protection and Impudent Girl-1 + - Id: 7367 + Title: Traditional Spiritual Protection and Impudent Girl-2 + TimeLimit: +10mn + - Id: 7368 + Title: Deliver Spiritual Protection-Pedro + - Id: 7369 + Title: Deliver Spiritual Protection-Nardo + - Id: 7370 + Title: Deliver Spiritual Protection-Pandoi + - Id: 7371 + Title: Deliver Spiritual Protection-Woeon + - Id: 7372 + Title: Deliver Spiritual Protection-Talah + - Id: 7373 + Title: Deliver Spiritual Protection-Romel + - Id: 7374 + Title: Love and Spiritual Protection for All + - Id: 7375 + Title: Love and Spiritual Protection Continues + TimeLimit: +23h + - Id: 7376 + Title: Old Man and Cast-Iron Caldron-1 + - Id: 7377 + Title: Old Man and Cast-Iron Caldron-2 + - Id: 7378 + Title: Old Man and Cast-Iron Caldron-Regular Trades + TimeLimit: +23h + - Id: 7379 + Title: Peace Preacher + - Id: 7380 + Title: To Smith a Traditional Spiritual Protection + - Id: 7381 + Title: High Demand on Spiritual Protection Material + TimeLimit: +23h + - Id: 7382 + Title: Deliver to Pedro + - Id: 7383 + Title: Deliver to Nardo + - Id: 7384 + Title: Deliver to Pandoi + - Id: 7385 + Title: Deliver to Woeon + - Id: 7386 + Title: Deliver to Talah + - Id: 7387 + Title: Deliver to Romel + - Id: 7388 + Title: Maries's Child + - Id: 7389 + Title: Give the Shirt to Maries's Child + - Id: 7390 + Title: Worried about Maries's Child + TimeLimit: +23h + - Id: 7391 + Title: Jejeling and Jejellopy + - Id: 7392 + Title: Collect Jejellopy Regularly + TimeLimit: +1d + - Id: 7393 + Title: Shiny Silver Blade + - Id: 7394 + Title: Shiny Tomorrow + TimeLimit: +23h + - Id: 7395 + Title: Ghost on the Ferry Ship + - Id: 7396 + Title: Angry Soul on Ferry Ship + - Id: 7397 + Title: Mumbaki Phong's Advice + - Id: 7398 + Title: Offering Bouquet Recommended by Mumbaki + - Id: 7399 + Title: Soul Diwata's Story + - Id: 7400 + Title: Mumbaki of Port Malaya + - Id: 7401 + Title: All Aboard for Perry Sailing + TimeLimit: +23h + - Id: 7402 + Title: Bouquet for Diwata + - Id: 7403 + Title: Stabilized Perry + - Id: 7404 + Title: Get Rid of Jejeling + - Id: 7405 + Title: Get Rid of Jejeling - Same Time Tomorrow + TimeLimit: +23h + - Id: 7406 + Title: Agree to Collecting Bones! + - Id: 7407 + Title: Purified Bone + - Id: 7408 + Title: Agree to Come Back Tomorrow? + TimeLimit: +23h + - Id: 7409 + Title: Cannot Meet Eyes with Him! + - Id: 7410 + Title: Teach Another Lesson Tomorrow! + TimeLimit: +23h + - Id: 7411 + Title: The traveler, Fome's story + - Id: 7412 + Title: The traveler, Litrip's story + - Id: 7413 + Title: The traveler, Chiba's story + - Id: 7414 + Title: Eclage guard's message + - Id: 7415 + Title: Laphine's Chief of Staff + - Id: 7416 + Title: Waiting to meet + TimeLimit: +10mn + - Id: 7417 + Title: Kardui's request + - Id: 7418 + Title: For Eclage 1 + - Id: 7419 + Title: For Eclage 2 + - Id: 7420 + Title: For Eclage 3 + - Id: 7421 + Title: That's enough + - Id: 7422 + Title: Kardui's gift + - Id: 7423 + Title: A rumor about the King 1 + - Id: 7424 + Title: A rumor about the King 2 + - Id: 7425 + Title: A rumor about the King 3 + - Id: 7426 + Title: A rumor about the King 4 + - Id: 7427 + Title: At times like this, face it straight on! + - Id: 7428 + Title: Yai of the wild + - Id: 7429 + Title: Wild recent trend! + TimeLimit: +23h + - Id: 7430 + Title: Deliveryman that runs through space + - Id: 7431 + Title: A mailman never rests! + TimeLimit: +23h + - Id: 7432 + Title: The troublemakers in the land of blooming flowers + - Id: 7433 + Title: Need constant guidance + TimeLimit: +23h + - Id: 7434 + Title: Kardui's big brother + - Id: 7435 + Title: Time for reading the letter + TimeLimit: +3mn + - Id: 7436 + Title: Avant the Scholar of Magics + - Id: 7437 + Title: Shenime's favor + - Id: 7438 + Title: Secret sponsorship + - Id: 7439 + Title: The scholar of magics sponsored by Shenime + - Id: 7440 + Title: Minuel's witness + - Id: 7441 + Title: Mail is here! + - Id: 7442 + Title: The identity of the scholar of magics + - Id: 7443 + Title: Interfere with the research! + - Id: 7444 + Title: What Avant was researching + - Id: 7445 + Title: Avant's back + - Id: 7446 + Title: Unfruitful conversation + - Id: 7447 + Title: Dilemma surrounding the Orb + - Id: 7448 + Title: Something's not right + - Id: 7449 + Title: Temptation toward the Orb + - Id: 7450 + Title: Orb's lighting room + - Id: 7451 + Title: Betrayal + - Id: 7452 + Title: Find the chief of staff! + - Id: 7453 + Title: The last of the chief of staff + - Id: 8000 + Title: Quitting Job Change + - Id: 8001 + Title: Job Change to Assassin + - Id: 8002 + Title: Job Change to Assassin + - Id: 8003 + Title: Job Change to Assassin + - Id: 8004 + Title: Job Change to Assassin + - Id: 8005 + Title: Job Change to Assassin + - Id: 8006 + Title: Find the Guild Master! + - Id: 8007 + Title: Acceptance from the Guild Master + - Id: 8008 + Title: Job Change to Assassin + - Id: 8009 + Title: Applying for Job Change to Priest + - Id: 8010 + Title: Job Change to Priest + - Id: 8011 + Title: Job Change to Priest + - Id: 8012 + Title: Job Change to Priest + - Id: 8013 + Title: Job Change to Priest + - Id: 8014 + Title: Job Change to Priest + - Id: 8015 + Title: Job Change to Priest + - Id: 8016 + Title: Job Change to Priest + - Id: 8017 + Title: Factory Inspection + - Id: 8018 + Title: Factory Inspection + - Id: 8019 + Title: Factory Inspection + - Id: 8020 + Title: Factory Inspection + - Id: 8021 + Title: Factory Inspection + - Id: 8022 + Title: Factory Inspection + - Id: 8023 + Title: Factory Inspection + - Id: 8024 + Title: Factory Inspection + - Id: 8025 + Title: Factory Inspection + - Id: 8026 + Title: Factory Inspection + - Id: 8027 + Title: Factory Inspection + - Id: 8028 + Title: Factory Inspection + - Id: 8029 + Title: Factory Inspection + - Id: 8030 + Title: Factory Inspection + - Id: 8031 + Title: Factory Inspection + - Id: 8032 + Title: Tarlock's Favor + - Id: 8033 + Title: Ferlock's Favor + - Id: 8034 + Title: Ferlock's Favor + - Id: 8035 + Title: How the Airship Works + - Id: 8036 + Title: Hallen's Favor + - Id: 8037 + Title: The Dice Roller + - Id: 8038 + Title: The Dice Roller + - Id: 8039 + Title: Secret of Airships + - Id: 8040 + Title: Secret of Airships + - Id: 8041 + Title: Secret of Airships + - Id: 8042 + Title: Secret of Airships + - Id: 8043 + Title: Secret of Airships + - Id: 8044 + Title: Euslan's Fiancee + - Id: 8045 + Title: Tips from Kaci + - Id: 8046 + Title: Ferlock's Passengers list + - Id: 8047 + Title: Euslan's Favor + - Id: 8048 + Title: Eukran's Testimony + - Id: 8049 + Title: Thierry's Favor + - Id: 8050 + Title: Danger coming on to Thierry + - Id: 8051 + Title: Euslan's Medicine + - Id: 8052 + Title: Thierry's Favor + - Id: 8053 + Title: Find Postell + - Id: 8054 + Title: Message from Postell + - Id: 8055 + Title: Nursing Allen + - Id: 8056 + Title: Little something in return + - Id: 8057 + Title: Grumbling Manainne + - Id: 8058 + Title: Conversation with El Schatt + - Id: 8059 + Title: Conversation with Perfitz + - Id: 8060 + Title: Stubborn El Schatt + - Id: 8061 + Title: Stories of the past + - Id: 8062 + Title: Kanainne + - Id: 8063 + Title: Kanainne's spirit + - Id: 8064 + Title: Cellette's Fish Cake Soup + - Id: 8065 + Title: Cellette's Fish Cake Soup + - Id: 8066 + Title: Cellette's Fish Cake Soup + - Id: 8067 + Title: Cellette's Fish Cake Soup + - Id: 8068 + Title: Cellette's Fish Cake Soup + - Id: 8069 + Title: Cellette's Fish Cake Soup + - Id: 8070 + Title: Cellette's Fish Cake Soup + - Id: 8071 + Title: Cellette's Fish Cake Soup + - Id: 8072 + Title: Cellette's Fish Cake Soup + - Id: 8073 + Title: Cellette's Fish Cake Soup + - Id: 8074 + Title: Cellette's Fish Cake Soup + - Id: 8075 + Title: Cellette's Fish Cake Soup + - Id: 8076 + Title: Klitzer and Calla + - Id: 8077 + Title: Klitzer and Calla + - Id: 8078 + Title: Klitzer and Calla + - Id: 8079 + Title: Klitzer and Calla + - Id: 8080 + Title: Klitzer and Calla + - Id: 8081 + Title: Klitzer and Calla + - Id: 8082 + Title: Klitzer and Calla + - Id: 8083 + Title: Klitzer and Calla + - Id: 8084 + Title: Klitzer and Calla + - Id: 8085 + Title: Klitzer and Calla + - Id: 8086 + Title: Klitzer and Calla + - Id: 8087 + Title: Klitzer and Calla + - Id: 8088 + Title: Klitzer and Calla + - Id: 8089 + Title: Stolen Gemstone + - Id: 8090 + Title: Mr. Manson + - Id: 8091 + Title: Jenny the gardener + - Id: 8092 + Title: Searching the Market + - Id: 8093 + Title: Mysterious Message + - Id: 8094 + Title: Double Crossed? + - Id: 8095 + Title: Find Phobe + - Id: 8096 + Title: Stolen Gemstone Found + - Id: 8097 + Title: Informing Jenny + - Id: 8098 + Title: Keeping the Secret + - Id: 8099 + Title: Vincent's Recommendation + - Id: 8100 + Title: Recommendation from High Priest Zhed + - Id: 8101 + Title: Recommendation from High Priest Zhed + - Id: 8102 + Title: Recommendation from High Priest Zhed + - Id: 8103 + Title: Recommendation from High Priest Zhed + - Id: 8104 + Title: Recommendation from High Priest Zhed + - Id: 8105 + Title: Recommendation from High Priest Zhed + - Id: 8106 + Title: Mr. Shendar's daughter + - Id: 8107 + Title: Lachellen's Testimony + - Id: 8108 + Title: A Foreigner, Katinshuell + - Id: 8109 + Title: Bruspetti's scent + - Id: 8110 + Title: Bruspetti's scent + - Id: 8111 + Title: Lachellen's Testimony + - Id: 8112 + Title: Freya's Spring + - Id: 8113 + Title: Bruspetti's Diary + - Id: 8114 + Title: Bruspetti's Diary + - Id: 8115 + Title: Suspicious Katinshuell + - Id: 8116 + Title: Lachellen's Testimony + - Id: 8117 + Title: Freya's Spring + - Id: 8118 + Title: Conversation with Mr. Shendar + - Id: 8119 + Title: Bruspetti's Diary + - Id: 8120 + Title: Conversation with Katinshuell + - Id: 8121 + Title: Conversation with Katinshuell + - Id: 8122 + Title: Bruspetti's resting place + - Id: 8123 + Title: Ayothaya's world famous dish, Tom Yum Goong + - Id: 8124 + Title: Ayothaya's world famous dish, Tom Yum Goong + - Id: 8125 + Title: Ayothaya's world famous dish, Tom Yum Goong + - Id: 8126 + Title: Ayothaya's world famous dish, Tom Yum Goong + - Id: 8127 + Title: Momotaro Field Trip + - Id: 8128 + Title: Momotaro Field Trip + - Id: 8129 + Title: Momotaro Field Trip + - Id: 8130 + Title: Momotaro Field Trip + - Id: 8131 + Title: The mother of lord in Amatsu + - Id: 8132 + Title: The mother of lord in Amatsu + - Id: 8133 + Title: Song of the fox + - Id: 8134 + Title: Boy at the Northern Shrine + - Id: 8135 + Title: Fox Expelled + - Id: 8136 + Title: The Gray Wolf's Warning + - Id: 8137 + Title: Finding the Keymaker + - Id: 8138 + Title: Blacksmith's Request + - Id: 8139 + Title: The Golden Key + - Id: 8140 + Title: The Red Ring + - Id: 8141 + Title: Mashenka's Red Ring + - Id: 8142 + Title: Searching the Marsh + - Id: 8143 + Title: The Flute's Voice + - Id: 8144 + Title: Ryubaba's Confession + - Id: 8145 + Title: Worried Mother's Request + - Id: 8146 + Title: Finding Lusalka + - Id: 8147 + Title: Lusalka's Beloved + - Id: 8148 + Title: Lusalka's Beloved + - Id: 8149 + Title: Searching for Igor + - Id: 8150 + Title: Igor's message + - Id: 8151 + Title: Marozka's Cave + - Id: 8152 + Title: The Golden Thread + - Id: 8153 + Title: Test of mind and wisdom + - Id: 8154 + Title: The Keymaker + - Id: 8155 + Title: Baba Yaga's Favor + - Id: 8156 + Title: Baba Yaga's Favor + - Id: 8157 + Title: Baba Yaga's Favor + - Id: 8158 + Title: Baba Yaga's Favor + - Id: 8159 + Title: Baba Yaga's Favor + - Id: 8160 + Title: Baba Yaga's Favor + - Id: 8161 + Title: Baba Yaga's Favor + - Id: 8162 + Title: Baba Yaga's Favor + - Id: 8163 + Title: Baba Yaga's Favor + - Id: 8164 + Title: Baba Yaga's Favor + - Id: 8165 + Title: Baba Yaga's Favor + - Id: 8166 + Title: Baba Yaga's Favor + - Id: 8167 + Title: The Golden Key + - Id: 8168 + Title: Koshei, the Immortal + - Id: 8169 + Title: Living and Dead Water + - Id: 8170 + Title: Living and Dead Water + - Id: 8171 + Title: Living and Dead Water + - Id: 8181 + Title: Sight Blaster + - Id: 8182 + Title: Push Back Theory + - Id: 8183 + Title: Sight Blaster + - Id: 8184 + Title: Elemental Converter + - Id: 8185 + Title: Elemental Change + - Id: 8186 + Title: Fire Elemental Change + - Id: 8187 + Title: Earth Elemental Change + - Id: 8188 + Title: Wind Elemental Change + - Id: 8189 + Title: Water Elemental Change + - Id: 8190 + Title: Charming Wink + - Id: 8191 + Title: Charming Advisor + - Id: 8192 + Title: Selfish Advisor + - Id: 8193 + Title: Selfish Advisor + - Id: 8194 + Title: Drunken Advisor + - Id: 8195 + Title: Kind Canell + - Id: 8196 + Title: The Tripartite Union's Feud + - Id: 8197 + Title: Document Delivery + - Id: 8198 + Title: Report to the United Research Official + - Id: 8199 + Title: United Research Official's Favor + - Id: 8200 + Title: Ryosen's Document Requests + - Id: 8201 + Title: Missing Document + - Id: 8202 + Title: Document Restoration + - Id: 8203 + Title: Document Restoration + - Id: 8204 + Title: Ryosen + - Id: 8205 + Title: Report to the United Research Official + - Id: 8206 + Title: Researchers' Meeting + - Id: 8207 + Title: Hansenne is not guilty. + - Id: 8208 + Title: Hansenne's Favor + - Id: 8209 + Title: Hue's Report + - Id: 8210 + Title: Report to the United Research Official + - Id: 8211 + Title: Shurank's Lecture + - Id: 8212 + Title: Shurank's Lecture + - Id: 8213 + Title: Shurank's Lecture + - Id: 8214 + Title: Shurank's Lecture + - Id: 8215 + Title: Shurank's Lecture + - Id: 8216 + Title: Shurank's Order + - Id: 8217 + Title: Dequ'ee's Message + - Id: 8218 + Title: Shurank's Lecture + - Id: 8219 + Title: Shurank's Lecture + - Id: 8220 + Title: Shurank's Lecture + - Id: 8221 + Title: Shurank's Lecture + - Id: 8222 + Title: Shurank's order + - Id: 8223 + Title: Dequ'ee's order + - Id: 8224 + Title: The clue + - Id: 8225 + Title: Dequ'ee's Reasoning + - Id: 8226 + Title: Bankley's Death + - Id: 8227 + Title: Return to Shurank + - Id: 8228 + Title: Shurank's Lecture + - Id: 8229 + Title: Guarnien's Lecture + - Id: 8230 + Title: Guarnien's Lecture + - Id: 8231 + Title: Guarnien's Lecture + - Id: 8232 + Title: Guarnien's Lecture + - Id: 8233 + Title: Guarnien's Lecture + - Id: 8234 + Title: Prontera Market Research + - Id: 8235 + Title: Guarnien's Lecture + - Id: 8236 + Title: Guarnien's Lecture + - Id: 8237 + Title: Guarnien's Lecture + - Id: 8238 + Title: Guarnien's Lecture + - Id: 8239 + Title: Guarnien's Lecture + - Id: 8240 + Title: Guarnien's Lecture + - Id: 8241 + Title: Collection of Red Jewel + - Id: 8242 + Title: Collection of blue Jewel + - Id: 8243 + Title: Learning new languages + - Id: 8244 + Title: Fairies and Tree Giants + - Id: 8245 + Title: Language sample investigation + - Id: 8246 + Title: Language sample investigation + - Id: 8247 + Title: Research progress + - Id: 8248 + Title: Research progress + - Id: 8249 + Title: Compressing Information + - Id: 8250 + Title: Storage Gem + - Id: 8251 + Title: Injection of Magic + - Id: 8252 + Title: Handworked jewels + - Id: 8253 + Title: Language translation device + TimeLimit: +1h + - Id: 8254 + Title: with a light heart and body + - Id: 8255 + Title: The test of power for existence + - Id: 8256 + Title: The test of power for existence + - Id: 8257 + Title: Providing food of Teardrop + - Id: 8258 + Title: Providing food of Teardrop + - Id: 8259 + Title: to a place for taking a practical technique test + - Id: 8260 + Title: Mission! Documents delivery + - Id: 8261 + Title: When you play the flute,then the wolf show up! + - Id: 8262 + Title: Ranger master never again + - Id: 8265 + Title: One time a one hour! + - Id: 8266 + Title: Hunting poison spore! + Targets: + - Mob: POISON_SPORE + Count: 10 + - Id: 8267 + Title: Hunting smokie! + Targets: + - Mob: SMOKIE + Count: 10 + - Id: 8268 + Title: Hunt elder wilow! + Targets: + - Mob: ELDER_WILOW + Count: 10 + - Id: 8269 + Title: Hunt coco! + Targets: + - Mob: COCO + Count: 10 + - Id: 8270 + Title: Hunt tharafrog! + Targets: + - Mob: THARA_FROG + Count: 10 + - Id: 8271 + Title: Toxic sprays delivery! + - Id: 8272 + Title: Deliver a honey! + - Id: 8273 + Title: Deliver a blanket! + - Id: 8274 + Title: Collect bones! + - Id: 8275 + Title: Collect feet! + - Id: 8276 + Title: Collect scell! + - Id: 8277 + Title: Collect tails! + - Id: 8278 + Title: Collect cookies! + - Id: 8279 + Title: Collect mustache! + - Id: 9000 + Title: Job Change to Knight + - Id: 9001 + Title: Loyalty of a Knight + - Id: 9002 + Title: Loyalty of a Knight + - Id: 9003 + Title: The Honor of a Knight + - Id: 9004 + Title: The Honor of a Knight + - Id: 9005 + Title: Tenacity of a Knight + - Id: 9006 + Title: Tenacity of a Knight + - Id: 9007 + Title: The Honor of a Knight + - Id: 9008 + Title: Etiquette as a Knight + - Id: 9009 + Title: Life as a Knight + - Id: 9010 + Title: Quality of reverence + - Id: 9011 + Title: Life as a Knight + - Id: 9012 + Title: Glory of a Knight! + - Id: 9013 + Title: Job Change to Wizard + - Id: 9014 + Title: Job Change to Wizard + - Id: 9015 + Title: Job Change to Wizard + - Id: 9016 + Title: Job Change to Wizard + - Id: 9017 + Title: Job Change to Wizard + - Id: 9018 + Title: Certified as a Wizard! + - Id: 9058 + Title: O'Riley's Request + - Id: 9059 + Title: Happy St. Patrick's Day + - Id: 9117 + Title: Lina's Curse + - Id: 9118 + Title: Lina's Curse - Deviruchi Hunt + Targets: + - Mob: DEVIRUCHI + Count: 50 + - Id: 9119 + Title: Lina's Curse - Wraith Dead Hunt + Targets: + - Mob: WRAITH_DEAD + Count: 50 + - Id: 9120 + Title: Lina's Curse - Dullahan Hunt + Targets: + - Mob: DULLAHAN + Count: 50 + - Id: 9121 + Title: Lina's Curse - Nightmare Terror Hunt + Targets: + - Mob: NIGHTMARE_TERROR + Count: 50 + - Id: 9122 + Title: Lina's Curse + - Id: 9123 + Title: Lina's Curse + - Id: 9024 + Title: An errand boy from Einbroch + - Id: 9028 + Title: strange Hydra + - Id: 9029 + Title: "Strange Hydra : present conditions" + TimeLimit: +1d + - Id: 9030 + Title: Find a puppy + - Id: 9031 + Title: Find a puppy + - Id: 9032 + Title: Find a puppy + TimeLimit: +1d + - Id: 9155 + Title: Getting materials for the Jaty Crown + - Id: 9156 + Title: Make the Jaty Crown + - Id: 9157 + Title: Reward from Sage, Kasyapa + - Id: 9158 + Title: Delivery of Good News(1) + - Id: 9159 + Title: Back to Paiko + - Id: 9160 + Title: Delivery of Good News(2) + - Id: 9161 + Title: Back to Paiko + - Id: 9162 + Title: Delivery of Good News(3) + - Id: 9163 + Title: Back to Paiko + - Id: 9164 + Title: Delivery of Good News(4) + - Id: 9165 + Title: Reward from Paiko for success of Jaty Crown + - Id: 9167 + Title: Tutorial - Mercenary for Hire + - Id: 9168 + Title: Quest Window Check + - Id: 9169 + Title: Window Shopper Catalogue + - Id: 9170 + Title: Window Shopper Catalogue + - Id: 9171 + Title: Enchanting Items + - Id: 9172 + Title: Enchanted Items + - Id: 9173 + Title: Tutorial Timer Cooldown + TimeLimit: +20h + - Id: 9222 + Title: Get Rid of Bangungot from Hospital 2F + - Id: 9223 + Title: Will there be Peace at the Hospital? + TimeLimit: +7d + - Id: 9224 + Title: Explore Hospital 2F + TimeLimit: +1h + - Id: 9225 + Title: Mystery Robbery Incident 1 + - Id: 9226 + Title: Mystery Robbery Incident 2 + - Id: 9227 + Title: Mystery Robbery Incident 3 + - Id: 9228 + Title: Mystery Robbery Incident 4 + - Id: 9229 + Title: Mystery Robbery Incident 5 + - Id: 9230 + Title: Mystery Robbery Incident 6 + - Id: 9231 + Title: Mystery Robbery Incident 7 + - Id: 9232 + Title: Mystery Robbery Incident 8 + - Id: 9233 + Title: Mystery Robbery Incident 9 + - Id: 9234 + Title: Mystery Robbery Incident 10 + - Id: 9235 + Title: Mystery Robbery Incident 11 + - Id: 9236 + Title: Mystery Robbery Incident 12 + - Id: 9237 + Title: Mystery Robbery Incident 13 + - Id: 9238 + Title: Mystery Robbery Incident 14 + - Id: 9239 + Title: Mystery Robbery Incident 15 + - Id: 9240 + Title: Luen's statement notes + - Id: 9241 + Title: Luen's statement notes + - Id: 9242 + Title: Luen's statement notes + - Id: 9243 + Title: Luen's statement notes + - Id: 9244 + Title: Dames's statement notes + - Id: 9245 + Title: Dames's statement notes + - Id: 9246 + Title: Dames's statement notes + - Id: 9247 + Title: Dames's statement notes + - Id: 9248 + Title: Rosa's statement notes + - Id: 9249 + Title: Rosa's statement notes + - Id: 9250 + Title: Rosa's statement notes + - Id: 9251 + Title: Rosa's statement notes + - Id: 9252 + Title: Observing Poppy + - Id: 9253 + Title: Examining a messy bookshelf + - Id: 9254 + Title: Examining a damaged book + - Id: 9255 + Title: Examining a container for soda cans + - Id: 9256 + Title: Examining a messed up table + - Id: 9257 + Title: Examining a foreign object + - Id: 9258 + Title: Field examination results + - Id: 9259 + Title: Confirming Cruyan's statements + - Id: 9260 + Title: Survey investigation notes + - Id: 9262 + Title: Mystery Robbery Incident 16 + - Id: 10000 + Title: To the Prontera Royal Court + - Id: 10001 + Title: Qualification Test + - Id: 10002 + Title: Qualification Review + - Id: 10003 + Title: Instructions on what to do + - Id: 10004 + Title: Interim Report + - Id: 10005 + Title: Prince Eigen Ahrum + - Id: 10006 + Title: Prince Ernst + - Id: 10007 + Title: Prince Poe + - Id: 10008 + Title: Prince Peter + - Id: 10009 + Title: Prince Urugen + - Id: 10010 + Title: Prince Helmut + - Id: 10011 + Title: Prince Erich + - Id: 10012 + Title: Conversation of the two princes + - Id: 10013 + Title: Searching for the unknown girl + - Id: 10014 + Title: Back to Peter + - Id: 10015 + Title: Test 15 + - Id: 10016 + Title: A Guest from the Walter Family + - Id: 10017 + Title: Conspiracy + - Id: 10018 + Title: Villainous Ahrum - Poe + - Id: 10019 + Title: Villainous Ahrum - Peter + - Id: 10020 + Title: Villainous Ahrum - Erich + - Id: 10021 + Title: Villainous Ahrum - Urugen + - Id: 10022 + Title: Villainous Ahrum - Helmut + - Id: 10023 + Title: Eigen Ahrum and Ernst -Former- + - Id: 10024 + Title: Eigen Ahrum and Ernst -Latter- + - Id: 10025 + Title: Good-bye, dear! + - Id: 10026 + Title: Reforming Meto + - Id: 10027 + Title: Reforming Meto + - Id: 10028 + Title: Reforming Meto + - Id: 10029 + Title: Reforming Meto + - Id: 10030 + Title: Reforming Meto + - Id: 10031 + Title: Reforming Meto + - Id: 10032 + Title: Reforming Meto + - Id: 10033 + Title: Reforming Meto + - Id: 10034 + Title: Search the knife + - Id: 10035 + Title: Deliver the knife + - Id: 10036 + Title: Material Supply-Candy + - Id: 10037 + Title: Material Supply-Crap Shells + - Id: 10038 + Title: Material Supply-Conch + - Id: 10039 + Title: Material Supply-Fish Tail + - Id: 10040 + Title: Material Supply-White Platter + - Id: 10041 + Title: Material Supply-? + - Id: 10042 + Title: Find the Piano Keys-5 remained + - Id: 10043 + Title: Find the Piano Keys-5 remained + - Id: 10044 + Title: Find the Piano Keys-4 remained + - Id: 10045 + Title: Find the Piano Keyboard-4 remained + - Id: 10046 + Title: Find the Piano Keyboard-3 remained + - Id: 10047 + Title: Find the Piano Keyboard-3 remained + - Id: 10048 + Title: Find the Piano Keyboard-2 remained + - Id: 10049 + Title: Find the Piano Keyboard-2 remained + - Id: 10050 + Title: Find the Piano Keyboard-1 remained + - Id: 10051 + Title: Find the Piano Keyboard-1 remained + - Id: 10052 + Title: Find the Piano Keyboard-To the piano + - Id: 10053 + Title: Find the Piano Keyboard-Fill the empty spot + - Id: 10054 + Title: On the Verge of the Escape-Clint Kana + - Id: 10055 + Title: Understanding the culture of Utan + - Id: 10056 + Title: Learning Utan Language + - Id: 10057 + Title: Onward to the Other World + - Id: 10058 + Title: Onward to the Other World + - Id: 10059 + Title: Onward to the Other World + - Id: 10060 + Title: Onward to the Other World + - Id: 10061 + Title: Onward to the Other World + - Id: 10062 + Title: Onward to the Other World + - Id: 10063 + Title: Onward to the Other World + - Id: 10064 + Title: Onward to the Other World + - Id: 10065 + Title: Onward to the Other World + - Id: 10066 + Title: Onward to the Other World + - Id: 10067 + Title: Onward to the Other World + - Id: 10068 + Title: Onward to the Other World + - Id: 10069 + Title: Onward to the Other World + - Id: 10070 + Title: Onward to the Other World + - Id: 10071 + Title: Onward to the Other World + - Id: 10072 + Title: Onward to the Other World + - Id: 10073 + Title: Onward to the Other World + - Id: 10074 + Title: Onward to the Other World + - Id: 10075 + Title: Onward to the Other World + - Id: 10076 + Title: Onward to the Other World + - Id: 10077 + Title: Onward to the Other World + - Id: 10078 + Title: Onward to the Other World + - Id: 10079 + Title: Escape from the reality, into the broad world + - Id: 10080 + Title: Escape from the reality, into the broad world + - Id: 10081 + Title: Escape from the reality, into the broad world + - Id: 10082 + Title: Escape from the reality, into the broad world + - Id: 10083 + Title: Escape from the reality, into the broad world + - Id: 10084 + Title: Escape from the reality, into the broad world + - Id: 10085 + Title: Escape from the reality, into the broad world + TimeLimit: +1d + - Id: 10086 + Title: Escape from the reality, into the broad world + - Id: 10087 + Title: Escape from the reality, into the broad world + TimeLimit: +1d + - Id: 10088 + Title: Escape from the reality, into the broad world + - Id: 10089 + Title: Escape from the reality, into the broad world + - Id: 10090 + Title: Job changes to Mechanic + - Id: 10091 + Title: Job changes to Mechanic + - Id: 10092 + Title: Job changes to Mechanic + - Id: 10093 + Title: Job changes to Mechanic + - Id: 10094 + Title: Job changes to Mechanic + - Id: 10095 + Title: Job changes to Mechanic + - Id: 10096 + Title: Job changes to Mechanic + - Id: 10097 + Title: Job changes to Mechanic + - Id: 10098 + Title: Job changes to Mechanic + - Id: 10099 + Title: Job changes to Mechanic + - Id: 10100 + Title: Job changes to Mechanic + - Id: 10101 + Title: Job changes to Mechanic + - Id: 10102 + Title: To client - the chapter of the sphinx dungeon + - Id: 10103 + Title: To client - the chapter of Glast heim + - Id: 10104 + Title: To client - the chapter of Juno + - Id: 10105 + Title: To client - the chapter of a clock tower + - Id: 10106 + Title: "To client - the chapter of localizing " + - Id: 10107 + Title: Sphinx dungeon - Requiem + Targets: + - Mob: REQUIEM + Count: 10 + - Id: 10108 + Title: Sphinx dungeon - Marduk + Targets: + - Mob: MARDUK + Count: 10 + - Id: 10109 + Title: Sphinx dungeon - Pasana + Targets: + - Mob: PASANA + Count: 10 + - Id: 10110 + Title: Glast heim - Dark Frame + Targets: + - Mob: DARK_FRAME + Count: 10 + - Id: 10111 + Title: Glast heim - Evil druid + Targets: + - Mob: EVIL_DRUID + Count: 10 + - Id: 10112 + Title: Glast heim - Wraith + Targets: + - Mob: WRAITH + Count: 10 + - Id: 10113 + Title: Glast Heim - Raydric Archer + Targets: + - Mob: RAYDRIC_ARCHER + Count: 10 + - Id: 10114 + Title: Juno - Grand Peco + Targets: + - Mob: GRAND_PECO + Count: 20 + - Id: 10115 + Title: Juno - sleeper + Targets: + - Mob: SLEEPER + Count: 20 + - Id: 10116 + Title: Juno - Goat + Targets: + - Mob: GOAT + Count: 20 + - Id: 10117 + Title: Juno - Harpy + Targets: + - Mob: HARPY + Count: 20 + - Id: 10118 + Title: clock tower - Clock + Targets: + - Mob: CLOCK + Count: 15 + - Id: 10119 + Title: clock tower - Punk + Targets: + - Mob: PUNK + Count: 15 + - Id: 10120 + Title: clock tower - Rideword + Targets: + - Mob: RIDEWORD + Count: 15 + - Id: 10121 + Title: Localizing - Uzhas + Targets: + - Mob: UZHAS + Count: 15 + - Id: 10122 + Title: Localizing - Miyabi Doll + Targets: + - Mob: MIYABI_NINGYO + Count: 15 + - Id: 10123 + Title: Localizing - Mi Gao + Targets: + - Mob: INCREASE_SOIL + Count: 15 + - Id: 11000 + Title: Inspection of Odin Shrine + - Id: 11001 + Title: Inspection of Odin Shrine + - Id: 11002 + Title: Inspection of Odin Shrine + - Id: 11003 + Title: Inspection of Odin Shrine + - Id: 11004 + Title: Inspection of Odin Shrine + - Id: 11005 + Title: Inspection of Odin Shrine + - Id: 11006 + Title: Inspection of Odin Shrine + - Id: 11007 + Title: Inspection of Odin Shrine + - Id: 11008 + Title: Inspection of Odin Shrine + - Id: 11009 + Title: Morriphen's Request + - Id: 11010 + Title: Fetching the medicine + - Id: 11011 + Title: Medicine for two + - Id: 11012 + Title: Find Makkie + - Id: 11013 + Title: Red Plant Stem Powder + - Id: 11014 + Title: The researcher's medicine + - Id: 11015 + Title: Siria's cure + - Id: 11016 + Title: Morriphen's story + - Id: 11017 + Title: Exploring Juperos + - Id: 11018 + Title: Exploring Juperos + - Id: 11019 + Title: Exploring Juperos + - Id: 11020 + Title: Exploring Juperos + - Id: 11021 + Title: Exploring Juperos + - Id: 11022 + Title: Exploring Juperos + - Id: 11029 + Title: Going to the Turtle Island.. + - Id: 11030 + Title: Going to the Turtle Island.. + - Id: 11031 + Title: Going to the Turtle Island.. + - Id: 11032 + Title: Going to the Turtle Island.. + - Id: 11033 + Title: Going to the Turtle Island.. + - Id: 11034 + Title: Going to the Turtle Island.. + - Id: 11035 + Title: Going to the Turtle Island.. + - Id: 11036 + Title: Going to the Turtle Island.. + - Id: 11037 + Title: Going to the Turtle Island.. + - Id: 11038 + Title: Meet the Dead + - Id: 11039 + Title: Meet the Dead + - Id: 11040 + Title: Meet the Dead + - Id: 11041 + Title: Meet the Dead + - Id: 11042 + Title: Meet the Dead + - Id: 11043 + Title: Meet the Dead + - Id: 11044 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11045 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11046 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11047 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11048 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11049 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11050 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11051 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11052 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11053 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11054 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11055 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11056 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11057 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11070 + Title: Poison King + - Id: 11071 + Title: Poison King + - Id: 11072 + Title: Poison King + - Id: 11073 + Title: Poison King + - Id: 11074 + Title: Poison King + - Id: 11075 + Title: Poison King + - Id: 11076 + Title: Poison King + - Id: 11077 + Title: Poison King + - Id: 11078 + Title: Poison King + - Id: 11079 + Title: Poison King + - Id: 11080 + Title: Poison King + - Id: 11081 + Title: Poison King + - Id: 11082 + Title: Poison King + - Id: 11083 + Title: Poison King + - Id: 11084 + Title: New Surroundings + - Id: 11085 + Title: New Surroundings + - Id: 11086 + Title: New Surroundings + - Id: 11087 + Title: Repairing the Tent + - Id: 11088 + Title: Repairing the Tent + - Id: 11089 + Title: Repairing the Tent + - Id: 11090 + Title: Repairing the Tent + - Id: 11091 + Title: Delivering Supplies + - Id: 11092 + Title: Delivering Supplies + - Id: 11093 + Title: Delivering Supplies + - Id: 11094 + Title: Delivering Supplies + - Id: 11095 + Title: Delivering Supplies + - Id: 11096 + Title: Delivering Supplies + - Id: 11097 + Title: Delivering Supplies + - Id: 11098 + Title: Delivering Supplies + - Id: 11099 + Title: To My Friend + - Id: 11100 + Title: To My Friend + - Id: 11101 + Title: Secret note of Bazet + - Id: 11102 + Title: Secret note of Bazet + - Id: 11103 + Title: Secret note of Bazet + - Id: 11104 + Title: Resting time + TimeLimit: +23h + - Id: 11105 + Title: Tendrilrion skin + - Id: 11106 + Title: Job changing to Warlock + - Id: 11107 + Title: Job changing to Warlock + - Id: 11108 + Title: Job changing to Warlock + - Id: 11109 + Title: Job changing to Warlock + - Id: 11110 + Title: Job changing to Warlock + - Id: 11111 + Title: Job changing to Warlock + - Id: 11112 + Title: Job changing to Warlock + - Id: 11113 + Title: Until radering is functioning + TimeLimit: +23h + - Id: 11114 + Title: "Request : Hunt Honet" + Targets: + - Mob: HORNET + Count: 10 + - Id: 11115 + Title: "Request : Hunt Condor" + Targets: + - Mob: CONDOR + Count: 20 + - Id: 11116 + Title: "Request : Hunt Grasshopper's Leg" + Targets: + - Mob: ROCKER + Count: 10 + - Id: 11117 + Title: "Request : Hunt Worm tail" + Targets: + - Mob: WORM_TAIL + Count: 20 + - Id: 11118 + Title: "Request : Hunt Spore" + Targets: + - Mob: SPORE + Count: 30 + - Id: 11119 + Title: "Request : Pest Control" + Targets: + - Mob: THIEF_BUG_EGG + Count: 20 + - Id: 11120 + Title: "Request : Hunt Muka" + Targets: + - Mob: MUKA + Count: 20 + - Id: 11121 + Title: "Request : Hunt Farmiliar" + Targets: + - Mob: FARMILIAR + Count: 20 + - Id: 11122 + Title: "Request : Collect Feather" + Targets: + - Mob: PECOPECO + Count: 30 + - Id: 11123 + Title: "Request : Collect Poison Spore" + Targets: + - Mob: POISON_SPORE + Count: 30 + - Id: 11124 + Title: "Request : Hunt Honet - Complete" + TimeLimit: +1d + - Id: 11125 + Title: "Request : Hunt Condor - Complete" + TimeLimit: +1d + - Id: 11126 + Title: "Request : Hunt Grasshopper's Leg - Complete" + TimeLimit: +1d + - Id: 11127 + Title: "Request : Hunt Worm Tail - Complete" + TimeLimit: +1d + - Id: 11128 + Title: "Request : Hunt Spore - Complete" + TimeLimit: +1d + - Id: 11129 + Title: "Request : Pest Control - Complete" + TimeLimit: +1d + - Id: 11130 + Title: "Request : Hunt Muka - Complete" + TimeLimit: +1d + - Id: 11131 + Title: "Request : Hunt Farmiliar - Complete" + TimeLimit: +1d + - Id: 11132 + Title: "Request : Collect Feather - Complete" + TimeLimit: +1d + - Id: 11133 + Title: "Request : Collect Poison Spore - Complete" + TimeLimit: +1d + - Id: 11135 + Title: Looking for Maestro Song + - Id: 11136 + Title: Looking for Maestro Song + - Id: 11137 + Title: Looking for Maestro Song + - Id: 11138 + Title: Looking for Maestro Song + - Id: 11139 + Title: Looking for Maestro Song + - Id: 11140 + Title: The sky, plane and travel sickness. + - Id: 11141 + Title: Human & gossip is towarding to the bar + - Id: 11142 + Title: Fearful metalic sound + - Id: 11143 + Title: Thanatos tower + - Id: 11144 + Title: "Juno manager : click" + - Id: 11145 + Title: "I want to get the " + Targets: + - Mob: TEDDY_BEAR + Count: 33 + - Id: 11146 + Title: to ice tunnel... + - Id: 11147 + Title: Lared's dew + - Id: 11148 + Title: Toward Comodo with the bow + - Id: 11149 + Title: Just pour the water. Pour! Pour!... + - Id: 11150 + Title: Looking for Maestro Song + - Id: 11151 + Title: Looking for Maestro Song + - Id: 11152 + Title: to the quiet place!... + - Id: 11153 + Title: Missing watch top + - Id: 11154 + Title: I will remember the memories with you.... + - Id: 11155 + Title: undefinable battler + - Id: 11156 + Title: annoying homework + Targets: + - Mob: DESERT_WOLF + Count: 100 + - Id: 11157 + Title: "Helmes valley " + - Id: 11158 + Title: On the way for meditation + - Id: 11159 + Title: Story of Brian + - Id: 11160 + Title: Story of John + - Id: 11161 + Title: Story of Tyler + - Id: 11162 + Title: Story of Rose + - Id: 11163 + Title: Story of Bain + - Id: 11164 + Title: Story of Lash + - Id: 11165 + Title: Delivery to Brian + - Id: 11166 + Title: Delivery to John + - Id: 11167 + Title: Delivery to Tyler + - Id: 11168 + Title: Delivery to Rose + - Id: 11169 + Title: Delivery to Bain + - Id: 11170 + Title: Delivery to Lash + - Id: 11171 + Title: Request from Frede + - Id: 11172 + Title: Request from Frede + - Id: 11173 + Title: Request from Frede + - Id: 11174 + Title: Supply Shortage + - Id: 11175 + Title: Supply Shortage + TimeLimit: +2h + - Id: 11176 + Title: For my friends + - Id: 11182 + Title: Theore's Report + TimeLimit: +1mn + - Id: 11183 + Title: Theore's Favor + - Id: 11184 + Title: Runaway Laphine + - Id: 11185 + Title: Pouch + - Id: 11186 + Title: Pouch + - Id: 11187 + Title: Pouch + - Id: 11188 + Title: Pouch + - Id: 11189 + Title: Roast Beef + - Id: 11190 + Title: Roast Beef + - Id: 11191 + Title: Shortage of Roast Beef + - Id: 11192 + Title: Mora Village... + - Id: 11193 + Title: Sonya's Friend + - Id: 11194 + Title: Runaway Laphine + - Id: 11195 + Title: Pouch + - Id: 11196 + Title: Pouch + - Id: 11197 + Title: Pouch + - Id: 11198 + Title: Mora Village... + - Id: 11199 + Title: Theo's Friend + - Id: 11200 + Title: Pouch + - Id: 11201 + Title: Roast Beef + - Id: 11202 + Title: Roast Beef + - Id: 11203 + Title: Shortage of Roast Beef + - Id: 11206 + Title: Quick Delivery Yoneseu + - Id: 11207 + Title: A Very Heavy Burden + - Id: 11208 + Title: Daphne + - Id: 11209 + Title: Hardships of Thomas + - Id: 11210 + Title: Malangdo Reunion + - Id: 11211 + Title: Malangdo Reunion + - Id: 11212 + Title: Malangdo Reunion + - Id: 11213 + Title: Malangdo Reunion + - Id: 11214 + Title: Malangdo Reunion + - Id: 11215 + Title: Malangdo Reunion + - Id: 11216 + Title: Malangdo Reunion + - Id: 11217 + Title: Malangdo Reunion + - Id: 11218 + Title: Malangdo Reunion + - Id: 11219 + Title: Malangdo Reunion + - Id: 11220 + Title: Malangdo Reunion + - Id: 11221 + Title: Repair of cracks + - Id: 11222 + Title: Repair of cracks + - Id: 11223 + Title: Repair of cracks + - Id: 11224 + Title: Repair of cracks + - Id: 11225 + Title: Repair of cracks + - Id: 11226 + Title: Repair of cracks + - Id: 11227 + Title: Repair of cracks + - Id: 11228 + Title: Repair of cracks + - Id: 11229 + Title: Repair of cracks + - Id: 11230 + Title: Repair of cracks + - Id: 11231 + Title: Repair of cracks + - Id: 11232 + Title: Repair of cracks + - Id: 11233 + Title: Repair of cracks + - Id: 11234 + Title: Repair of cracks + - Id: 11235 + Title: Repair of cracks + - Id: 11236 + Title: Repair of cracks + - Id: 11237 + Title: Repair of cracks + - Id: 11238 + Title: Malangdo Fruits + - Id: 11239 + Title: Malangdo Fruits + TimeLimit: +23h + - Id: 11240 + Title: Repair of cracks + - Id: 11241 + Title: Repair of cracks + - Id: 11242 + Title: Repair of cracks + - Id: 11243 + Title: Repair of cracks + TimeLimit: +23h + - Id: 11244 + Title: Soft Jelly + - Id: 11245 + Title: Soft Jelly + TimeLimit: +23h + - Id: 11284 + Title: Nurse at Port Malaya-1 + - Id: 11285 + Title: Nurse at Port Malaya-2 + - Id: 11286 + Title: Nurse at Port Malaya-3 + - Id: 11287 + Title: Nurse at Port Malaya-4 + - Id: 11288 + Title: Nurse at Port Malaya-5 + - Id: 11289 + Title: Nurse at Port Malaya-6 + - Id: 11290 + Title: Nurse at Port Malaya-7 + - Id: 11291 + Title: Nurse at Port Malaya-8 + - Id: 11292 + Title: Nurse at Port Malaya-9 + - Id: 11293 + Title: Nurse at Port Malaya-10 + - Id: 11294 + Title: Nurse at Port Malaya-11 + - Id: 11295 + Title: Nurse at Port Malaya-12 + - Id: 11296 + Title: Nurse at Port Malaya-13 + - Id: 11297 + Title: Nurse at Port Malaya-14 + - Id: 11298 + Title: Nurse at Port Malaya-15 + - Id: 11299 + Title: Nurse at Port Malaya-16 + - Id: 11300 + Title: Nurse at Port Malaya-17 + - Id: 11301 + Title: Nurse at Port Malaya-18 + - Id: 11302 + Title: Nurse at Port Malaya-19 + - Id: 11303 + Title: Nurse at Port Malaya-20 + - Id: 11304 + Title: Nurse at Port Malaya-21 + - Id: 11305 + Title: Nurse at Port Malaya-22 + - Id: 11306 + Title: Nurse at Port Malaya-23 + - Id: 11307 + Title: Nurse at Port Malaya-24 + - Id: 11308 + Title: Nurse at Port Malaya-25 + - Id: 11309 + Title: Nurse at Port Malaya-26 + - Id: 11310 + Title: Eclage's Entrance + TimeLimit: +30s + - Id: 11311 + Title: Eclage's Entrance + - Id: 11312 + Title: Goliath + - Id: 11313 + Title: Goliath + - Id: 11314 + Title: Goliath + - Id: 11315 + Title: And time keeps on flowing + - Id: 11316 + Title: And time keeps on flowing + - Id: 11317 + Title: And time keeps on flowing + - Id: 11318 + Title: And time keeps on flowing + - Id: 11319 + Title: And time keeps on flowing + - Id: 11320 + Title: And time keeps on flowing + - Id: 11321 + Title: And time keeps on flowing + - Id: 11322 + Title: And time keeps on flowing + - Id: 11323 + Title: And time keeps on flowing + - Id: 11324 + Title: And time keeps on flowing + - Id: 11325 + Title: The chicken or the egg + - Id: 11326 + Title: The chicken or the egg + - Id: 11327 + Title: The chicken or the egg + - Id: 11328 + Title: The chicken or the egg + - Id: 11329 + Title: The chicken or the egg + - Id: 11330 + Title: The chicken or the egg + - Id: 11331 + Title: The chicken or the egg + - Id: 11332 + Title: The chicken or the egg + - Id: 11333 + Title: Red seed and green seed + - Id: 11334 + Title: Red seed and green seed + - Id: 11335 + Title: Dreaming boy + - Id: 11336 + Title: Dreaming boy + - Id: 11337 + Title: Dreaming boy + - Id: 11378 + Title: "Trick or treat " + - Id: 12000 + Title: An old friend + - Id: 12001 + Title: Digotz, Maku's old friend + - Id: 12002 + Title: Messenger of Friendship + - Id: 12003 + Title: Digotz's message + - Id: 12004 + Title: Maku's other friend + - Id: 12005 + Title: Benkaistein + - Id: 12006 + Title: Benkaistein's lost item + - Id: 12007 + Title: Kazien + - Id: 12008 + Title: Researcher Garins + - Id: 12009 + Title: Failed mission + - Id: 12010 + Title: No entrance + - Id: 12011 + Title: Lyozien + - Id: 12012 + Title: Meet Mr. Ahman + - Id: 12013 + Title: Delivery complete + - Id: 12014 + Title: More missions + - Id: 12015 + Title: Ghalstein + - Id: 12016 + Title: Sneaking into the Laboratory + - Id: 12017 + Title: Membership approved + - Id: 12018 + Title: Meeting the President + - Id: 12019 + Title: The President's Mission + - Id: 12020 + Title: Rescuing a Secret Wing Member + - Id: 12021 + Title: The Sealed File Folder + - Id: 12022 + Title: The Sealed File Folder + - Id: 12023 + Title: Shinokas the researcher + - Id: 12024 + Title: Kafra Corporation Agent + - Id: 12025 + Title: Rekenber's Secret Archive + - Id: 12026 + Title: Rekenber's Secret Archive + - Id: 12027 + Title: Rekenber's Secret Archive + - Id: 12028 + Title: Kurelle the traitor + - Id: 12029 + Title: Lost Engagement Ring + - Id: 12030 + Title: Engagement Ring Found + - Id: 12031 + Title: Find Annon + - Id: 12032 + Title: Searching for Annon + - Id: 12033 + Title: Traces of blood + - Id: 12034 + Title: Annon's side of the story + - Id: 12035 + Title: Holy Threads + - Id: 12036 + Title: The Stone Slate Message + - Id: 12037 + Title: Holier Threads + - Id: 12038 + Title: Searching for the Sa-mhing Tiger + - Id: 12039 + Title: Boonthom's Comrade + - Id: 12040 + Title: Benkaistein's Journal + - Id: 12041 + Title: Benkaistein's Journal + - Id: 12042 + Title: Benkaistein's Journal + - Id: 12043 + Title: Pass to the Slums + - Id: 12044 + Title: Soothing a crying child 1 + - Id: 12045 + Title: Soothing a crying child 2 + - Id: 12046 + Title: Soothing a crying child 3 + - Id: 12047 + Title: Soothing a crying child 4 + - Id: 12048 + Title: Soothing a crying child 5 + - Id: 12049 + Title: Job Quest 1 - Rogue + - Id: 12050 + Title: Job Quest 2 - Rogue + - Id: 12051 + Title: Job Quest 3 - Rogue + - Id: 12052 + Title: Job Quest 4 - Rogue + - Id: 12053 + Title: Job Quest 5 - Rogue + - Id: 12054 + Title: Job Quest 6 - Rogue + - Id: 12055 + Title: Job Quest - Assassin + - Id: 12056 + Title: Job Quest - Assassin + - Id: 12057 + Title: Pass to the Lab + - Id: 12058 + Title: Admission Restricted to the 102 Tower + TimeLimit: +7d + - Id: 12059 + Title: Orc's Memory Time Limit + TimeLimit: +2h + - Id: 12060 + Title: Today's Fishing Closed + TimeLimit: +1d + - Id: 12061 + Title: Concentration + TimeLimit: +10s + - Id: 12062 + Title: Today's Mining Closed + TimeLimit: +1d + - Id: 12070 + Title: Limited time for enter + TimeLimit: +4h + - Id: 12071 + Title: Stamp a seal on the attendance book + TimeLimit: +1d + - Id: 12072 + Title: Hunt tharafrog + Targets: + - Mob: THARA_FROG + Count: 20 + - Id: 12073 + Title: Remove Cruiser + Targets: + - Mob: CRUISER + Count: 15 + - Id: 12074 + Title: Remove Kukre + Targets: + - Mob: KUKRE + Count: 30 + - Id: 12075 + Title: Remove orcbaby + Targets: + - Mob: ORC_BABY + Count: 15 + - Id: 12076 + Title: Remove orcwarroir + Targets: + - Mob: ORK_WARRIOR + Count: 20 + - Id: 12077 + Title: Hunt vadon + Targets: + - Mob: VADON + Count: 15 + - Id: 12078 + Title: Hunt Megalodon + Targets: + - Mob: MEGALODON + Count: 30 + - Id: 12079 + Title: Hunt Marse + Targets: + - Mob: MARSE + Count: 15 + - Id: 12080 + Title: Hunt Cornutus + Targets: + - Mob: CORNUTUS + Count: 20 + - Id: 12081 + Title: Remove Myst + Targets: + - Mob: MYST + Count: 15 + - Id: 12082 + Title: Hunt shellfish + Targets: + - Mob: SHELLFISH + Count: 30 + - Id: 12083 + Title: Hunt Marine sphere + Targets: + - Mob: MARINE_SPHERE + Count: 15 + - Id: 12084 + Title: Hunt Phen + Targets: + - Mob: PHEN + Count: 20 + - Id: 12085 + Title: Remove orcskeleton + Targets: + - Mob: ORC_SKELETON + Count: 15 + - Id: 12086 + Title: Remove Zenorc + Targets: + - Mob: ZENORC + Count: 30 + - Id: 12087 + Title: Remove mummy + Targets: + - Mob: MUMMY + Count: 15 + - Id: 12088 + Title: Accomplishing a request + - Id: 12090 + Title: Mysterious guy + - Id: 12091 + Title: Just save the burning heart + - Id: 12092 + Title: Long lasting story + - Id: 12093 + Title: the record the intelligence Lyoda left + - Id: 12094 + Title: The damaged shield letter + - Id: 12096 + Title: Towards Karakas + - Id: 12097 + Title: Basic preparation + - Id: 12098 + Title: Tour of dungeon + - Id: 12099 + Title: Remove Root Cause + Targets: + - Mob: DRACO_EGG + Count: 10 + - Id: 12100 + Title: Violent Winged Insect + Targets: + - Mob: LUCIOLA_VESPA + Count: 12 + - Id: 12101 + Title: Work Interference + Targets: + - Mob: DRACO + Count: 5 + - Id: 12102 + Title: Intelligent Snakes + Targets: + - Mob: NAGA + Count: 10 + - Id: 12103 + Title: Legendary Creature + Targets: + - Mob: CORNUS + Count: 1 + - Id: 12104 + Title: Insects with an Appetite + Targets: + - Mob: CENTIPEDE + Count: 15 + - Id: 12105 + Title: Moving Rocks + Targets: + - Mob: BRADIUM_GOLEM + Count: 10 + - Id: 12106 + Title: A child on a flower + Targets: + - Mob: PINGUICULA + Count: 15 + - Id: 12107 + Title: Twisted Love + Targets: + - Mob: PINGUICULA_D + Count: 10 + - Id: 12108 + Title: Dangerous Plant Removal + Targets: + - Mob: NEPENTHES + Count: 12 + - Id: 12109 + Title: Larva Extermination + Targets: + - Mob: CENTIPEDE_LARVA + Count: 14 + - Id: 12110 + Title: Demon of Water + Targets: + - Mob: AQUA_ELEMENTAL + Count: 7 + - Id: 12111 + Title: Bird with ugly face + Targets: + - Mob: TATACHO + Count: 10 + - Id: 12117 + Title: Withered Flower + - Id: 12118 + Title: Welcomed Mineral + - Id: 12119 + Title: Valuable Textile + - Id: 12120 + Title: Curious Meat + - Id: 12121 + Title: Materials to Clear Snow + - Id: 12122 + Title: Best Cooler Material + - Id: 12123 + Title: Best Paint + - Id: 12124 + Title: Rare Valuable + - Id: 12125 + Title: Armory Material + - Id: 12126 + Title: Advanced Armory Material + - Id: 12127 + Title: Supervisor's Tool + - Id: 12128 + Title: Preparation for Heating + - Id: 12129 + Title: Suspicious Food + - Id: 12130 + Title: Useful Material + - Id: 12131 + Title: Essential Material for Construction + - Id: 12132 + Title: Essential Material for Construction 2 + - Id: 12133 + Title: Decoration arrangement + - Id: 12134 + Title: Instant Receptacle + - Id: 12135 + Title: Not enough medicine + - Id: 12136 + Title: Honey robber + - Id: 12137 + Title: Tools for Experiment + - Id: 12138 + Title: Fine Gift Samples + - Id: 12139 + Title: Respect for Taste! + - Id: 12140 + Title: Courtesy for Regulars + - Id: 12141 + Title: Special Package + - Id: 12142 + Title: Dangerous Request + - Id: 12143 + Title: Strange Trend + - Id: 12144 + Title: Unknown Usage + - Id: 12145 + Title: Other World Cuisine + - Id: 12146 + Title: Filling in Cracks + - Id: 12147 + Title: Adhesive Material + - Id: 12148 + Title: Bait for Tatacho Hunting + - Id: 12149 + Title: Swordmanship Practice + - Id: 12150 + Title: Pretty reddish vegetable + - Id: 12151 + Title: Tenacity of the pub owner + - Id: 12152 + Title: Tastes like home cooking + - Id: 12153 + Title: Hazardous plant when burnt + - Id: 12154 + Title: Unexpectedly Normal + - Id: 12155 + Title: Gift with heart + - Id: 12156 + Title: Respect personal appetite! + - Id: 12157 + Title: Resolution of the pub owner + - Id: 12158 + Title: Rage of the pub owner + - Id: 12159 + Title: Quest record from Laponte + TimeLimit: +23h + - Id: 12160 + Title: Quest record from Kalipo + TimeLimit: +23h + - Id: 12161 + Title: Quest record from Pura + TimeLimit: +23h + - Id: 12162 + Title: Quest record from Tragis + TimeLimit: +23h + - Id: 12163 + Title: Quest record from Calyon + TimeLimit: +23h + - Id: 12164 + Title: Quest record from Moltuka + TimeLimit: +23h + - Id: 12165 + Title: Dizziness + TimeLimit: +6h + - Id: 12166 + Title: Tree Root Doc. + - Id: 12167 + Title: Reptile Tongue Doc. + - Id: 12168 + Title: Scorpion Tail Doc. + - Id: 12169 + Title: Stem Doc. + - Id: 12170 + Title: Pointed Scale Doc. + - Id: 12171 + Title: Resin Doc. + - Id: 12172 + Title: Spawn Doc. + - Id: 12173 + Title: Jellopy Doc. + - Id: 12174 + Title: Fish Tail Doc. + - Id: 12175 + Title: Worm Peeling Doc. + - Id: 12176 + Title: Gill Doc. + - Id: 12177 + Title: Tooth of Bat Doc. + - Id: 12178 + Title: Fluff Doc. + - Id: 12179 + Title: Chrysalis Doc. + - Id: 12180 + Title: Feather of Birds Doc. + - Id: 12181 + Title: Talon Document Doc. + - Id: 12182 + Title: Sticky Webfoot Doc. + - Id: 12183 + Title: Animal Skin Doc. + - Id: 12184 + Title: Wolf Claw Doc. + - Id: 12185 + Title: Mushroom Spore Doc. + - Id: 12186 + Title: Orc's Fang Doc. + - Id: 12187 + Title: Evil Horn Doc. + - Id: 12188 + Title: Powder of Butterfly Doc. + - Id: 12189 + Title: Bill of Birds Doc. + - Id: 12190 + Title: Snake Scale Doc. + - Id: 12191 + Title: Insect Feeler Doc. + - Id: 12192 + Title: Immortal Heart Doc. + - Id: 12193 + Title: Rotten Bandage Doc. + - Id: 12194 + Title: Decayed Nail Doc. + - Id: 12195 + Title: Horrendous Mouth Doc. + - Id: 12196 + Title: Tentacle Doc. + - Id: 12197 + Title: Shell Doc. + - Id: 12198 + Title: Scale Shell Doc. + - Id: 12199 + Title: Venom Canine Doc. + - Id: 12200 + Title: Sticky Mucus Doc. + - Id: 12201 + Title: Bee Sting Doc. + - Id: 12202 + Title: Grasshopper's Leg Doc. + - Id: 12203 + Title: Royal Jelly Doc. + - Id: 12204 + Title: Yoyo Tail Doc. + - Id: 12205 + Title: Solid Shell Doc. + - Id: 12206 + Title: Yam Doc. + - Id: 12207 + Title: Raccoon Leaf Doc. + - Id: 12208 + Title: Snail's Shell Doc. + - Id: 12209 + Title: Horn Doc. + - Id: 12210 + Title: Bear's Footskin Doc. + - Id: 12211 + Title: Feather Doc. + - Id: 12212 + Title: Red Herb Doc. + - Id: 12213 + Title: Carrot Doc. + - Id: 12214 + Title: Cactus Needle Doc. + - Id: 12215 + Title: Stone Heart Doc. + - Id: 12216 + Title: Pouty Jahbong + TimeLimit: +6h + - Id: 12217 + Title: Request - Traces of wild boar hunt + - Id: 12218 + Title: How to make lava elixir + - Id: 12219 + Title: How to creat flame elixir + - Id: 12220 + Title: How to create glaicer elixir + - Id: 12221 + Title: How to create fossil elixir + - Id: 12222 + Title: How to create storm elixir + - Id: 12225 + Title: Pom Spider Hunting + - Id: 12226 + Title: Angra Mantis Hunting + - Id: 12227 + Title: Parus Hunting + - Id: 12228 + Title: Little Fatam Hunting + - Id: 12229 + Title: Miming Hunting + - Id: 12230 + Title: Mora Monster Hunt + TimeLimit: +23h + - Id: 12231 + Title: Insect Feeler Collecting + - Id: 12232 + Title: Immortal Heart Collecting + - Id: 12233 + Title: Rotten Bandage Collecting + - Id: 12234 + Title: Orcish Voucher Collecting + - Id: 12235 + Title: Skeleton Bone Collecting + - Id: 12236 + Title: Memento Collecting + - Id: 12237 + Title: Shell Collecting + - Id: 12238 + Title: Scale Shell Collecting + - Id: 12239 + Title: Venom Canine Collecting + - Id: 12240 + Title: Sticky Mucus Collecting + - Id: 12241 + Title: Mora Item Request 1 + TimeLimit: +23h + - Id: 12242 + Title: Mora Item Request 2 + TimeLimit: +23h + - Id: 12243 + Title: Missing Information on Tajareu + - Id: 12244 + Title: Missing Information on Tokenizer + - Id: 12245 + Title: Missing Information on Mesile + - Id: 12246 + Title: Missing Information on Noir + - Id: 12247 + Title: Missing Information on Pajama God + - Id: 12248 + Title: Missing Information on Mendel + - Id: 12249 + Title: Missing Information on Miles + - Id: 12250 + Title: Missing Information on Kunmune + - Id: 12251 + Title: Missing Information on Chayihokin + - Id: 12252 + Title: Missing Information on Tuale + - Id: 12253 + Title: Missing Person Search Time Limit + TimeLimit: +23h + - Id: 12254 + Title: Now it's cleaning + TimeLimit: +1h + - Id: 12255 + Title: Hunt deep sea crab + - Id: 12256 + Title: Hunt deep sea squid + - Id: 12257 + Title: Hunt Ancient crustacean + - Id: 12258 + Title: Hunt deep sea shell + - Id: 12259 + Title: Hunt ancient kukre + - Id: 12260 + Title: Hunt deep sea conch + - Id: 12261 + Title: Hunt deep sea horse + - Id: 12262 + Title: Hunt ancient sword fish + - Id: 12263 + Title: Hunt ancient sea god + - Id: 12264 + Title: Hunt mutation anolian + - Id: 12265 + Title: Hunt deep sea mermaid + - Id: 12266 + Title: Hunt transformable kapha + - Id: 12267 + Title: Hunt weird coelacanth + - Id: 12268 + Title: Hunt dark coelacanth + - Id: 12269 + Title: Hunt Cruel coelacanth + - Id: 12270 + Title: Hunt mutation coelacanth + - Id: 12271 + Title: In progress general culvert single day service + TimeLimit: +23h + - Id: 12272 + Title: In progress hard culvert single day service + TimeLimit: +23h + - Id: 12273 + Title: In progress general culvert weekly service + TimeLimit: +6d17h + - Id: 12274 + Title: In progress hard culvert weekly service + TimeLimit: +6d17h + - Id: 12278 + Title: Towards Bakonawa Lake... + TimeLimit: +7d + - Id: 12279 + Title: Get Rid of Bakonawa + - Id: 12280 + Title: A suspicious prisoner + - Id: 12281 + Title: An unwanted favor + - Id: 12282 + Title: Gossip king Clever + - Id: 12283 + Title: The rift researcher + - Id: 12284 + Title: A cat merchant's source of information + - Id: 12285 + Title: A way to calm down a cat + - Id: 12286 + Title: Information traded for some canned foods + - Id: 12287 + Title: A weird experience + - Id: 12288 + Title: A successful experience + - Id: 12289 + Title: Another visitation + - Id: 12290 + Title: Clever's historical documents + - Id: 12291 + Title: Hidden historical documents (?) + - Id: 12292 + Title: The unknown ones + - Id: 12293 + Title: Figures in history + - Id: 12294 + Title: Tour of Eclage + - Id: 12295 + Title: Error + - Id: 12296 + Title: Fun times with the reactor + - Id: 12297 + Title: Encountering Etran + - Id: 12298 + Title: Two wishes + - Id: 12299 + Title: Revisiting Robert + - Id: 12300 + Title: Revisiting Etran + - Id: 12301 + Title: Two remaining friends + - Id: 12317 + Title: Fake Keyblade + TimeLimit: +23h + - Id: 12318 + Title: "Upper Cats: annoying guy" + - Id: 12319 + Title: "Upper Cats: annoying guy" + - Id: 12363 + Title: ?????? ?? ?? + - Id: 13000 + Title: RWC2011Card Gathering + - Id: 13001 + Title: RWC2011Card Gathering - Hold + TimeLimit: +23h + - Id: 13002 + Title: Brigan collecting + - Id: 13003 + Title: Carat Request + Targets: + - Mob: CARAT + Count: 30 + - Id: 13004 + Title: Carat Request timer + TimeLimit: +1h + - Id: 13005 + Title: Arclouse Request + Targets: + - Mob: ARCLOUSE + Count: 22 + - Id: 13006 + Title: Arclouse Request timer + TimeLimit: +1h + - Id: 13007 + Title: Anolian Request + Targets: + - Mob: ANOLIAN + Count: 30 + - Id: 13008 + Title: Anolian Request timer + TimeLimit: +1h + - Id: 13009 + Title: Sting Request + Targets: + - Mob: STING + Count: 30 + - Id: 13010 + Title: Sting Request timer + TimeLimit: +1h + - Id: 13011 + Title: Majoruros Request + Targets: + - Mob: MAJORUROS + Count: 30 + - Id: 13012 + Title: Majoruros Request timer + TimeLimit: +1h + - Id: 13013 + Title: Pinguicula Request + Targets: + - Mob: PINGUICULA + Count: 30 + - Id: 13014 + Title: Pinguicula Request timer + TimeLimit: +1h + - Id: 13015 + Title: Luciola Vespa Request + Targets: + - Mob: LUCIOLA_VESPA + Count: 30 + - Id: 13016 + Title: Luciola Vespa Request timer + TimeLimit: +1h + - Id: 13017 + Title: Desert Wolf Request + Targets: + - Mob: DESERT_WOLF + Count: 30 + - Id: 13018 + Title: Desert Wolf Request timer + TimeLimit: +1h + - Id: 13019 + Title: Snowier Request + Targets: + - Mob: SNOWIER + Count: 30 + - Id: 13020 + Title: Snowier Request timer + TimeLimit: +1h + - Id: 13021 + Title: Ice Titan Request + Targets: + - Mob: ICE_TITAN + Count: 30 + - Id: 13022 + Title: Ice Titan Request Timer + TimeLimit: +1h + - Id: 13023 + Title: Nightmare Terror Request + Targets: + - Mob: NIGHTMARE_TERROR + Count: 30 + - Id: 13024 + Title: Nightmare Terror Request Timer + TimeLimit: +1h + - Id: 13025 + Title: Flying Deleter Request + Targets: + - Mob: DELETER + Count: 30 + - Id: 13026 + Title: Deleter Request Timer + TimeLimit: +1h + - Id: 13040 + Title: Loli Ruri Request + Targets: + - Mob: LOLI_RURI + Count: 30 + - Id: 13041 + Title: Loli Ruri Request Timer + TimeLimit: +1h + - Id: 13042 + Title: Medusa Request + Targets: + - Mob: MEDUSA + Count: 30 + - Id: 13043 + Title: Medusa Request Timer + TimeLimit: +1h + - Id: 13044 + Title: Anubis Request + Targets: + - Mob: ANUBIS + Count: 20 + - Id: 13045 + Title: Anubis Request Timer + TimeLimit: +1h + - Id: 13046 + Title: Tendrilion Request + Targets: + - Mob: TENDRILRION + Count: 1 + - Id: 13047 + Title: Tendrilion Request Timer + TimeLimit: +1h + - Id: 13048 + Title: Tendrilion Request + Targets: + - Mob: TENDRILRION + Count: 1 + - Id: 13049 + Title: Tendrilion Request Timer + TimeLimit: +1h + - Id: 13050 + Title: The Laphine that loves the land + - Id: 13051 + Title: The singing Laphine + - Id: 13052 + Title: The watering Laphine + - Id: 13053 + Title: The dancing Laphine + - Id: 13054 + Title: The smiling Laphine + - Id: 13055 + Title: See if all the adventurers are safe + - Id: 13056 + Title: Reporter Rossi + - Id: 13057 + Title: Adventurer Euncheong + - Id: 13058 + Title: Troublemaker New Oz + - Id: 13059 + Title: End of project + TimeLimit: +22h + - Id: 13060 + Title: Safety confirmation complete! + TimeLimit: +22h + - Id: 13061 + Title: Food support + - Id: 13062 + Title: Food support - complete + TimeLimit: +22h + - Id: 13063 + Title: Dusting off + - Id: 13064 + Title: Dusting off - complete + TimeLimit: +22h + - Id: 13065 + Title: Collecting a souvenir + - Id: 13066 + Title: This is enough for souvenirs + TimeLimit: +22h + - Id: 13067 + Title: Raydric research + Targets: + - Mob: RAYDRIC + Count: 30 + - Id: 13068 + Title: Raydric research - timer + TimeLimit: +1h + - Id: 13069 + Title: Khalitzburg research + Targets: + - Mob: KHALITZBURG + Count: 30 + - Id: 13070 + Title: Khalitzburg research - timer + TimeLimit: +1h + - Id: 13071 + Title: Wander Man research + Targets: + - Mob: WANDER_MAN + Count: 30 + - Id: 13072 + Title: Wander Man research - timer + TimeLimit: +1h + - Id: 13073 + Title: Ancient Mimic research + Targets: + - Mob: ANCIENT_MIMIC + Count: 30 + - Id: 13074 + Title: Ancient Mimic research - timer + TimeLimit: +1h + - Id: 13075 + Title: Death Word research + Targets: + - Mob: DEATHWORD + Count: 30 + - Id: 13076 + Title: Death Word research - timer + TimeLimit: +1h + - Id: 13077 + Title: Owl Baron research + Targets: + - Mob: OWL_BARON + Count: 20 + - Id: 13078 + Title: Owl Baron research - timer + TimeLimit: +1h + - Id: 13079 + Title: Bloody Page Research + - Id: 13080 + Title: Bloody Page Research - Wait + TimeLimit: +1h + - Id: 13081 + Title: Dark Pinguicula research + Targets: + - Mob: PINGUICULA_D + Count: 30 + - Id: 13082 + Title: Dark Pinguicula research - timer + TimeLimit: +1h + - Id: 13083 + Title: Nepenthes research + Targets: + - Mob: NEPENTHES + Count: 30 + - Id: 13084 + Title: Nepenthes research - timer + TimeLimit: +1h + - Id: 13085 + Title: Naga research + Targets: + - Mob: NAGA + Count: 30 + - Id: 13086 + Title: Naga research - timer + TimeLimit: +1h + - Id: 13087 + Title: Centipede Larva research + Targets: + - Mob: CENTIPEDE_LARVA + Count: 20 + - Id: 13088 + Title: Centipede Larva research - timer + TimeLimit: +1h + - Id: 13089 + Title: Cornus research + Targets: + - Mob: CORNUS + Count: 30 + - Id: 13090 + Title: Cornus research - timer + TimeLimit: +1h + - Id: 13091 + Title: Mystic Horn Research + - Id: 13092 + Title: Mystic Horn Research - Wait + TimeLimit: +1h + - Id: 13093 + Title: Ancient Mummy research + Targets: + - Mob: ANCIENT_MUMMY + Count: 30 + - Id: 13094 + Title: Ancient Mummy research - timer + TimeLimit: +1h + - Id: 13095 + Title: Geffenia expedition + Targets: + - Mob: INCUBUS + Count: 10 + - Mob: SUCCUBUS + Count: 10 + - Mob: VIOLY + Count: 10 + - Id: 13096 + Title: Geffenia expedition - Wait + TimeLimit: +1h + - Id: 13097 + Title: Juperos expedition + Targets: + - Mob: VENATU_2 + Count: 30 + - Mob: VENATU_3 + Count: 30 + - Mob: VENATU_4 + Count: 30 + - Id: 13098 + Title: Juperos expedition - Wait + TimeLimit: +1h + - Id: 13099 + Title: Fragments and Rusty Screw + - Id: 13100 + Title: Fragments and Rusty Screw - Wait + TimeLimit: +1h + - Id: 13107 + Title: Thanatos Tower Search + - Id: 13108 + Title: Rachel holy ground Search + - Id: 13109 + Title: Unknown island Search + - Id: 13110 + Title: Abyss Lake Search + - Id: 13111 + Title: Thanatos Tower Search - Reporting results + - Id: 13112 + Title: Rachel holy ground Search - Reporting results + - Id: 13113 + Title: Nameless Island Search - Reporting results + - Id: 13114 + Title: Abyss Lake Search - Reporting results + - Id: 13115 + Title: Thanatos Tower Search - Wait + TimeLimit: +1h + - Id: 13116 + Title: Rachel holy ground Search - Wait + TimeLimit: +1h + - Id: 13117 + Title: Unknown island Search - Wait + TimeLimit: +1h + - Id: 13118 + Title: Abyss Lake Search - Wait + TimeLimit: +1h + - Id: 13119 + Title: Combat Baroness of Retribution + Targets: + - Mob: RETRIBUTION + Count: 30 + - Id: 13120 + Title: Combat Baroness of Retribution - Wait + TimeLimit: +1h + - Id: 13121 + Title: Combat Lady Solace + Targets: + - Mob: SOLACE + Count: 30 + - Id: 13122 + Title: Combat Lady Solace - Wait + TimeLimit: +1h + - Id: 13123 + Title: Combat Mistress of Shelter + Targets: + - Mob: SHELTER + Count: 30 + - Id: 13124 + Title: Combat Mistress of Shelter - Wait + TimeLimit: +1h + - Id: 13125 + Title: Combat Dame of Sentinel + Targets: + - Mob: OBSERVATION + Count: 30 + - Id: 13126 + Title: Combat Dame of Sentinel - Wait + TimeLimit: +1h + - Id: 13127 + Title: Combat Vanberk and Isilla + Targets: + - Mob: VANBERK + Count: 20 + - Mob: ISILLA + Count: 20 + - Id: 13128 + Title: Combat Vanberk and Isilla - Wait + TimeLimit: +1h + - Id: 13129 + Title: Combat Hodremlin + Targets: + - Mob: HODREMLIN + Count: 30 + - Id: 13130 + Title: Combat Hodremlin - Wait + TimeLimit: +1h + - Id: 13131 + Title: Combat Agav and Echio + Targets: + - Mob: AGAV + Count: 20 + - Mob: ECHIO + Count: 20 + - Id: 13132 + Title: Combat Agav and Echio - Wait + TimeLimit: +1h + - Id: 13133 + Title: Combat Ragged Zombie + Targets: + - Mob: RAGGED_ZOMBIE + Count: 30 + - Id: 13134 + Title: Combat Ragged Zombie - Wait + TimeLimit: +1h + - Id: 13135 + Title: Combat Zombie Slaughter + Targets: + - Mob: ZOMBIE_SLAUGHTER + Count: 30 + - Id: 13136 + Title: Combat Zombie Slaughter - Wait + TimeLimit: +1h + - Id: 13137 + Title: Combat Banshee + Targets: + - Mob: BANSHEE + Count: 30 + - Id: 13138 + Title: Combat Banshee - Wait + TimeLimit: +1h + - Id: 13139 + Title: Combat Ferus and Bewler + Targets: + - Mob: FERUS + Count: 30 + - Mob: FERUS_ + Count: 30 + - Id: 13140 + Title: Combat Ferus and Bewler - Wait + TimeLimit: +1h + - Id: 13141 + Title: Combat Acidus + Targets: + - Mob: ACIDUS + Count: 30 + - Mob: ACIDUS_ + Count: 30 + - Id: 13142 + Title: Combat Acidus - Wait + TimeLimit: +1h + - Id: 13143 + Title: Egnigem Story + Targets: + - Mob: YGNIZEM + Count: 30 + - Id: 13144 + Title: Egnigem Story - Wait + TimeLimit: +1h + - Id: 13145 + Title: Armeyer Story + Targets: + - Mob: ARMAIA + Count: 30 + - Id: 13146 + Title: Armeyer Story - Wait + TimeLimit: +1h + - Id: 13147 + Title: Whikebain Story + Targets: + - Mob: WHIKEBAIN + Count: 30 + - Id: 13148 + Title: Whikebain Story - Wait + TimeLimit: +1h + - Id: 13149 + Title: Kavach Story + Targets: + - Mob: KAVAC + Count: 30 + - Id: 13150 + Title: Kavach Story - Wait + TimeLimit: +1h + - Id: 13151 + Title: Errende Story + Targets: + - Mob: EREND + Count: 30 + - Id: 13152 + Title: Errende Story - Wait + TimeLimit: +1h + - Id: 13153 + Title: Laurell Story + Targets: + - Mob: RAWREL + Count: 30 + - Id: 13154 + Title: Laurell Story - Wait + TimeLimit: +1h + - Id: 13155 + Title: Morocc Story1 + Targets: + - Mob: MOROCC_1 + Count: 30 + - Id: 13156 + Title: Morocc Story1 - Wait + TimeLimit: +1h + - Id: 13157 + Title: Morocc Story2 + Targets: + - Mob: MOROCC_2 + Count: 30 + - Id: 13158 + Title: Morocc Story2 - Wait + TimeLimit: +1h + - Id: 13159 + Title: Morocc Story3 + Targets: + - Mob: MOROCC_4 + Count: 30 + - Id: 13160 + Title: Morocc Story3 - Wait + TimeLimit: +1h + - Id: 13161 + Title: Uni-horn Scaraba Story + - Id: 13162 + Title: Uni-horn Scaraba Story - Wait + TimeLimit: +1h + - Id: 13163 + Title: Horn Scaraba Story + - Id: 13164 + Title: Horn Scaraba Story - Wait + TimeLimit: +1h + - Id: 13165 + Title: Antler Scaraba Story + - Id: 13166 + Title: Antler Scaraba Story - Wait + TimeLimit: +1h + - Id: 13167 + Title: Rake horn Scaraba Story + - Id: 13168 + Title: Rake horn Scaraba Story - Wait + TimeLimit: +1h + - Id: 14118 + Title: Wuhari's concern + - Id: 14119 + Title: Test of patience + - Id: 14120 + Title: Test of patience 2 + - Id: 14121 + Title: Test of patience 3 + - Id: 14122 + Title: Time for two + - Id: 14123 + Title: Wuharu's favor + - Id: 14125 + Title: Surveying the area + - Id: 14126 + Title: Searching for Ms. Goatie + - Id: 14127 + Title: Searching for Ms. Goatie's husband + - Id: 14128 + Title: Obtaining the research report + - Id: 14131 + Title: Analysis time + TimeLimit: +5mn + - Id: 14133 + Title: Another favor + - Id: 14134 + Title: Sharp Ms. Goatie + - Id: 14135 + Title: Searching for Mr. Pompe + - Id: 14136 + Title: A terrible scene in the field + - Id: 14137 + Title: An interesting proposition + - Id: 14138 + Title: The big corpse + - Id: 14139 + Title: To Wuhuru + - Id: 14140 + Title: To Wuhari + - Id: 14141 + Title: Ingredients for research + - Id: 15055 + Title: "Christmas : We are the great Single Union Army!" + - Id: 15056 + Title: "Christmas : Declare war against couples!" + - Id: 15057 + Title: "Christmas : Prepare the festival!" + - Id: 15059 + Title: "Christmas : Cooldown Timer" + TimeLimit: +1d + - Id: 15060 + Title: "Christmas : Kwami has joined" + - Id: 15061 + Title: "Christmas : Willer has joined" + - Id: 15062 + Title: "Christmas : Rinka has joined" + - Id: 15063 + Title: "Christmas : Jee has joined" + - Id: 15064 + Title: "Christmas : Marty has joined" + - Id: 16000 + Title: Metz Brayde's Notice + - Id: 16001 + Title: First examination + - Id: 16002 + Title: Fetching Items for Arian -1 + - Id: 16003 + Title: Fetching Items for Arian -2 + - Id: 16004 + Title: Fetching Items for Arian -3 + - Id: 16005 + Title: Fetching Items for Arian -4 + - Id: 16006 + Title: Fetching Items for Arian -5 + - Id: 16007 + Title: Fetching Items for Arian -6 + - Id: 16008 + Title: Quiz time! + - Id: 16009 + Title: Quiz time! + - Id: 16010 + Title: Daewoon's Test + - Id: 16011 + Title: Sir Jore's Test + - Id: 16012 + Title: Sir Jore's Materials + - Id: 16013 + Title: The Stone of Sage + - Id: 16014 + Title: The Stone of Sage + - Id: 16015 + Title: Lady Jesqurienne + - Id: 16016 + Title: Jesquerinne's Quiz Challenge + - Id: 16017 + Title: Failed Quiz Challenge + - Id: 16018 + Title: Quiz Challenge Triumph + - Id: 16019 + Title: Search for Dearles + - Id: 16020 + Title: Dearles' Test + - Id: 16021 + Title: Test of Appreciation + - Id: 16022 + Title: Dearles' Test Part Two + - Id: 16023 + Title: Rhythm Test Passed + - Id: 16024 + Title: Find Bakerlan + - Id: 16025 + Title: Bakerlan's delivery + - Id: 16026 + Title: Mahatra's delivery + - Id: 16027 + Title: Bakerlan's Receipt + - Id: 16028 + Title: Find Seylin + - Id: 16029 + Title: Vigorgra Medicine + - Id: 16030 + Title: Vigorgra Ingredients + - Id: 16031 + Title: Vigorgra Ingredients + - Id: 16032 + Title: Seylin's Request + - Id: 16033 + Title: Back to Seylin + - Id: 16034 + Title: Back to Mahatra + - Id: 16035 + Title: Report to Bakerlan + - Id: 16036 + Title: The last Crumb + - Id: 16037 + Title: Finding Engel Howard + - Id: 16038 + Title: Liana's Letter + - Id: 16039 + Title: Combining the Starlight + - Id: 16040 + Title: Letter to Engel's Family + - Id: 16041 + Title: Talk to Liana + - Id: 16042 + Title: Sobbing Starlight Progress + - Id: 16043 + Title: Restored Sobbing Starlight + - Id: 16044 + Title: Combining the Starlight + - Id: 16045 + Title: Starlight message + - Id: 16046 + Title: The man in Umbala + - Id: 16047 + Title: Into the Tree + - Id: 16048 + Title: Ancient Papers + - Id: 16049 + Title: Record of Ancient Language + - Id: 16050 + Title: The Fastidious Old Man + - Id: 16051 + Title: Blurry Vision + - Id: 16052 + Title: Translating the Document + - Id: 16053 + Title: Translated Ancient Language + - Id: 16054 + Title: Where the rejected live + - Id: 16055 + Title: Misfortunate of Niflheim + - Id: 16056 + Title: Removed Curse + - Id: 16057 + Title: Meeting the witch + - Id: 16058 + Title: Wing Of Crow + - Id: 16059 + Title: Wing Of Crow + - Id: 16060 + Title: Misfortunate of Niflheim + - Id: 16061 + Title: Bard in Niflheim + - Id: 16062 + Title: Gen of Niflheim + - Id: 16063 + Title: The Witch's Aid + - Id: 16064 + Title: Misfortunate of Niflheim + - Id: 16065 + Title: The Queen's Symbol + - Id: 16066 + Title: Knowledge of the Symbol + - Id: 16067 + Title: Knowledge of Asgard + - Id: 16068 + Title: Finding the Soul Pieces + - Id: 16069 + Title: Finding the Soul Pieces + - Id: 16070 + Title: Finding the Soul Pieces + - Id: 16071 + Title: Finding the Soul Pieces + - Id: 16072 + Title: Finding the Soul Pieces + - Id: 16073 + Title: Agrboda's Soul + - Id: 16074 + Title: Symbol of the Nine Realms + - Id: 16075 + Title: Serin's Ambitions + - Id: 16076 + Title: Witch's Tonic + - Id: 16077 + Title: Serin's Release + - Id: 16078 + Title: Visit with Lady Hell + - Id: 16079 + Title: The Sign + - Id: 16080 + Title: Dark Lord's return + - Id: 16081 + Title: Serin's Ambitions + - Id: 16082 + Title: Dark Lord's return + - Id: 16083 + Title: Serin's Realization + - Id: 16084 + Title: The Sign + - Id: 16085 + Title: The Sign + - Id: 16086 + Title: The Sign + - Id: 16087 + Title: The Sign + - Id: 16101 + Title: Kiel Hyre Academy + - Id: 16102 + Title: Kiel Hyre Academy + - Id: 16103 + Title: Kiel Hyre Academy + - Id: 16104 + Title: Kiel Hyre Academy + - Id: 16105 + Title: Kiel Hyre Academy + - Id: 16106 + Title: Kiel Hyre Academy + - Id: 16107 + Title: Kiel Hyre Academy + - Id: 16108 + Title: Kiel Hyre Academy + - Id: 16109 + Title: Kiel Hyre Academy + - Id: 16110 + Title: Kiel Hyre Academy + - Id: 16111 + Title: Kiel Hyre Academy + - Id: 16112 + Title: Kiel Hyre Academy + - Id: 16113 + Title: Kiel Hyre Academy + - Id: 16114 + Title: Kiel Hyre Academy + - Id: 16115 + Title: Kiel Hyre Academy + - Id: 16116 + Title: Kiel Hyre Academy + - Id: 16117 + Title: Mysterious World Map + - Id: 16118 + Title: Hidden poem + - Id: 16119 + Title: Snake swords + - Id: 16120 + Title: A dream? + - Id: 16121 + Title: Secret Code? + - Id: 16122 + Title: Old Copper Key + - Id: 16123 + Title: Green Keycard + - Id: 16124 + Title: Steel Box + - Id: 16125 + Title: Kiel Hyre Academy + - Id: 16126 + Title: Kiel Hyre Academy + - Id: 16127 + Title: Kiel Hyre Academy + - Id: 16128 + Title: Kiel Hyre Academy + - Id: 16129 + Title: Kiel Hyre Academy + - Id: 16130 + Title: Kiel Hyre Academy + - Id: 16131 + Title: Kiel Hyre Academy + - Id: 16132 + Title: Kiel Hyre Academy + - Id: 16133 + Title: Kiel Hyre Academy + - Id: 16134 + Title: Kiel Hyre Academy + - Id: 16135 + Title: Kiel Hyre Academy + - Id: 16136 + Title: Kiel Hyre Academy + - Id: 16137 + Title: Kiel Hyre Academy + - Id: 16138 + Title: Kiel Hyre Academy + - Id: 16139 + Title: Kiel Hyre Academy + - Id: 16140 + Title: Kiel Hyre Academy + - Id: 16141 + Title: Kiel Hyre Academy + - Id: 16142 + Title: Kiel Hyre Academy + - Id: 16143 + Title: Kiel Hyre Academy + - Id: 16144 + Title: Kiel Hyre Academy + - Id: 16145 + Title: Kiel Hyre Academy + - Id: 16146 + Title: Kiel Hyre Academy + - Id: 16200 + Title: Limberg's Request + - Id: 16201 + Title: TPS Report + - Id: 16202 + Title: TPS Report + - Id: 16203 + Title: TPS Report + - Id: 16204 + Title: Crack in the Wall + - Id: 16205 + Title: The Empty Lava Tube + - Id: 17000 + Title: Meet with Father Bamph + - Id: 17001 + Title: Meet with Larjes + - Id: 17002 + Title: Report to Father Bamph + - Id: 17003 + Title: Travel to Rachel + - Id: 17004 + Title: Travel to Veins + - Id: 17005 + Title: Frustrated Magistrate + - Id: 17006 + Title: Interrogated Smugglers + - Id: 17007 + Title: Written Orders + - Id: 17008 + Title: Investigating + - Id: 17009 + Title: More Investigating + - Id: 17010 + Title: Further Investigations + - Id: 17011 + Title: Kurdi's Father + - Id: 17012 + Title: Karyn's Boat + - Id: 17013 + Title: To the Island + - Id: 17014 + Title: Investigating the Island + - Id: 17015 + Title: The Research Note + - Id: 17016 + Title: Regicide + - Id: 17017 + Title: Reporting the King's Death + - Id: 18001 + Title: Delivery for Rooney + - Id: 18002 + Title: Delivery for Rooney + - Id: 18003 + Title: Delivery for Rooney + - Id: 18004 + Title: Lasda's Request + - Id: 18005 + Title: Jesse's Request + - Id: 18006 + Title: Sir Krieg's Approval + - Id: 18007 + Title: Sir Krieg's Trust + - Id: 18008 + Title: Sir Krieg's Trust + - Id: 18009 + Title: Into the prison + - Id: 18010 + Title: Jail Break + - Id: 18011 + Title: Bodyguard work + - Id: 18012 + Title: Bodyguard work + - Id: 18013 + Title: Bodyguard work + - Id: 18014 + Title: Bodyguard work + - Id: 18015 + Title: Bodyguard work + - Id: 18016 + Title: Bodyguard work + - Id: 18017 + Title: Jail Break + - Id: 18018 + Title: Jail Break + - Id: 18019 + Title: Vitre's Songs + - Id: 18020 + Title: Vitre's Songs + - Id: 18021 + Title: Vitre's Songs + - Id: 18022 + Title: Vitre's Songs + - Id: 18023 + Title: Vitre the Spy + - Id: 18030 + Title: Gaebolg Family Curse + - Id: 18031 + Title: Gaebolg Family Curse + - Id: 18032 + Title: Gaebolg Family Curse + - Id: 18033 + Title: Gaebolg Family Curse + - Id: 18034 + Title: Gaebolg Family Curse + - Id: 18035 + Title: Gaebolg Family Curse + - Id: 18036 + Title: Gaebolg Family Curse + - Id: 18037 + Title: Gaebolg Family Curse + - Id: 18038 + Title: Gaebolg Family Curse + - Id: 18039 + Title: Gaebolg Family Curse + - Id: 18040 + Title: Gaebolg Family Curse + - Id: 18041 + Title: Gaebolg Family Curse + - Id: 18042 + Title: Gaebolg Family Curse + - Id: 18043 + Title: Gaebolg Family Curse + - Id: 18044 + Title: Gaebolg Family Curse + - Id: 18045 + Title: Gaebolg Family Curse + - Id: 18046 + Title: Gaebolg Family Curse + - Id: 18047 + Title: Gaebolg Family Curse + - Id: 18048 + Title: Gaebolg Family Curse + - Id: 18049 + Title: Gaebolg Family Curse + - Id: 18050 + Title: Gaebolg Family Curse + - Id: 18051 + Title: Gaebolg Family Curse + - Id: 18052 + Title: Gaebolg Family Curse + - Id: 18060 + Title: Missing boy Mikhail + - Id: 18061 + Title: Mikhail's Whereabouts + - Id: 18062 + Title: Missing boy Mikhail + - Id: 18063 + Title: The isolated swamp + - Id: 18064 + Title: Back to the Village + - Id: 18065 + Title: High-strength Adhesive + - Id: 18066 + Title: Back to the swamp + - Id: 18067 + Title: Make the paste + - Id: 18068 + Title: Fixing the Matrushka + - Id: 18069 + Title: Report to Gallina + - Id: 18070 + Title: Banishing Winter + - Id: 18071 + Title: Making the magic dust + - Id: 18072 + Title: Making the magic dust + - Id: 18073 + Title: The Dragon's Lair + - Id: 18074 + Title: The Magic Gourd Bottle + - Id: 18075 + Title: Containing People's Speech + - Id: 18076 + Title: Containing People's Speech + - Id: 18077 + Title: Csar's Request + - Id: 18078 + Title: Baba Yaga's Secret Medicine + - Id: 18079 + Title: Winter is Banished + - Id: 18100 + Title: Legends from Moscovia + - Id: 18101 + Title: The Moving Island + - Id: 18102 + Title: In Search of The Moving Island + - Id: 18103 + Title: In Search of The Moving Island + - Id: 18104 + Title: Mr. Ibanoff's New Friend + - Id: 18105 + Title: Repairing Charabel + - Id: 18106 + Title: As the Tide Turns + - Id: 18107 + Title: Departing + - Id: 18108 + Title: The Moving Island? + - Id: 18109 + Title: The Moving Island??? + - Id: 18110 + Title: The Aged Stranger + - Id: 18111 + Title: Whale Island! + - Id: 18112 + Title: A Story for the Csar + - Id: 18113 + Title: Evidence for the Csar + - Id: 18114 + Title: Before Sunset + - Id: 18115 + Title: Departing + - Id: 18116 + Title: Whale Island! + - Id: 18117 + Title: Materials for Evidence + - Id: 18118 + Title: Mysterious Musical Instrument + - Id: 18119 + Title: Gusli + - Id: 18120 + Title: Gusli + - Id: 18121 + Title: Shafka + - Id: 19101 + Title: The Eye of Hellion + - Id: 19102 + Title: The Eye of Hellion + - Id: 19103 + Title: The Eye of Hellion + - Id: 19104 + Title: The Eye of Hellion + - Id: 19105 + Title: The Eye of Hellion + - Id: 19106 + Title: The Eye of Hellion + - Id: 19107 + Title: The Eye of Hellion + - Id: 19108 + Title: The Eye of Hellion + - Id: 19109 + Title: The Eye of Hellion + - Id: 19110 + Title: The Eye of Hellion + - Id: 19111 + Title: The Eye of Hellion + - Id: 19112 + Title: The Eye of Hellion + - Id: 19113 + Title: The Eye of Hellion + - Id: 19114 + Title: The Eye of Hellion + - Id: 19115 + Title: The Eye of Hellion + - Id: 19116 + Title: The Eye of Hellion + - Id: 19117 + Title: The Eye of Hellion + - Id: 19118 + Title: The Eye of Hellion + - Id: 19119 + Title: The Eye of Hellion + - Id: 19120 + Title: The Eye of Hellion + - Id: 19121 + Title: The Eye of Hellion + - Id: 19122 + Title: The Eye of Hellion + - Id: 19123 + Title: The Eye of Hellion + - Id: 19124 + Title: The Eye of Hellion + - Id: 19125 + Title: The Eye of Hellion + - Id: 19126 + Title: The Eye of Hellion + - Id: 19127 + Title: The Eye of Hellion + - Id: 19128 + Title: The Eye of Hellion + - Id: 19129 + Title: The Eye of Hellion + - Id: 50000 + Title: Pirate Dagger materials + - Id: 50001 + Title: Weather Beaten Old Man + - Id: 50002 + Title: Lost Treasure? + - Id: 50003 + Title: Lost Treasure? + - Id: 50004 + Title: The Old Man's Treasure + - Id: 50005 + Title: The Old Man's Treasure + - Id: 50006 + Title: The Old Man's Treasure + - Id: 50007 + Title: The Old Man's Treasure + - Id: 50008 + Title: The Old Man's Treasure + - Id: 50009 + Title: The Old Man's Treasure + - Id: 50010 + Title: A special lock pick + - Id: 50011 + Title: The special lock pick + - Id: 50012 + Title: Use the lock pick + - Id: 50013 + Title: Broken lock pick + - Id: 50015 + Title: The empty treasure box + - Id: 50016 + Title: The empty treasure box + - Id: 50017 + Title: The empty treasure box + - Id: 50018 + Title: The empty treasure box + - Id: 50019 + Title: The empty treasure box + - Id: 50020 + Title: The empty treasure box + - Id: 50021 + Title: J Roger + - Id: 50022 + Title: J Roger's key materials + - Id: 50023 + Title: Conversation with J Roger + - Id: 50024 + Title: Bury the treasure + - Id: 50025 + Title: Bury the treasure + - Id: 50026 + Title: Bury the treasure + - Id: 50027 + Title: Buried treasure + - Id: 50028 + Title: Stolen treasure! + - Id: 50029 + Title: A Pirate's Spirit! + - Id: 60001 + Title: Monster Extermination + - Id: 60002 + Title: Monster Extermination + - Id: 60003 + Title: Monster Extermination + - Id: 60004 + Title: Monster Extermination + - Id: 60005 + Title: Monster Extermination + - Id: 60006 + Title: Monster Extermination + - Id: 60007 + Title: Endless Tower Effect + - Id: 60008 + Title: Endless Tower Time Limit + - Id: 60009 + Title: Orc Hero + - Id: 60010 + Title: Derik Ver's Request + - Id: 60011 + Title: Investigation of Byalan + - Id: 60012 + Title: Investigation of Abyss + - Id: 60013 + Title: Monster Investigation + - Id: 60014 + Title: Geffen Dungeon's Monster Investigation + - Id: 60015 + Title: Geffen Dungeon's Monster Investigation + - Id: 60016 + Title: Geffen Dungeon's Monster Investigation + - Id: 60017 + Title: Geffen Dungeon's Monster Investigation + - Id: 60018 + Title: Byalan Dungeon's Monster Investigation + - Id: 60019 + Title: Byalan Dungeon's Monster Investigation + - Id: 60020 + Title: Byalan Dungeon's Monster Investigation + - Id: 60021 + Title: Byalan Dungeon's Monster Investigation + - Id: 60022 + Title: Abyss Lake's Monster Investigation + - Id: 60023 + Title: Abyss Lake's Monster Investigation + - Id: 60024 + Title: Abyss Lake's Monster Investigation + - Id: 60025 + Title: Abyss Lake's Monster Investigation + - Id: 60026 + Title: Continuing the Investigation + - Id: 60027 + Title: Investigating Aldebaran + - Id: 60028 + Title: Monster Investigation + - Id: 60029 + Title: Aldebaran Monster Investigation + - Id: 60030 + Title: Clock Tower Monster Investigation + - Id: 60031 + Title: Clock Tower Monster Investigation + - Id: 60032 + Title: Lutie Field Monster Investigation + - Id: 60033 + Title: Clock Tower Monster Investigation + - Id: 60034 + Title: Clock Tower Monster Investigation + - Id: 60035 + Title: Aldebaran Monster Investigation + - Id: 60036 + Title: Clock Tower Monster Investigation + - Id: 60037 + Title: Clock Tower Monster Investigation + - Id: 60038 + Title: Aldebaran Monster Investigation + - Id: 60039 + Title: Investigation of Glastheim + - Id: 60040 + Title: Investigation of Glastheim + - Id: 60041 + Title: Monster Investigation + - Id: 60042 + Title: Investigation of Glastheim + - Id: 60043 + Title: Glastheim Monster Investigation + - Id: 60044 + Title: Glastheim Monster Investigation + - Id: 60045 + Title: Investigation of Glastheim + - Id: 60046 + Title: Glastheim Monster Investigation + - Id: 60047 + Title: Glastheim Monster Investigation + - Id: 60048 + Title: Investigation of Glastheim + - Id: 60049 + Title: Glastheim Monster Investigation + - Id: 60050 + Title: Glastheim Monster Investigation + - Id: 60051 + Title: Investigation of Glastheim + - Id: 60052 + Title: Glastheim Monster Investigation + - Id: 60053 + Title: Glastheim Monster Investigation + - Id: 60054 + Title: Investigation of Glastheim + - Id: 60055 + Title: Glastheim Monster Investigation + - Id: 60056 + Title: Glastheim Monster Investigation + - Id: 60057 + Title: Glastheim Monster Investigation + - Id: 60058 + Title: Derik Ver's Brother + - Id: 60059 + Title: A history lesson + - Id: 60060 + Title: The Crown of Deceit + - Id: 60061 + Title: A magic solvent + - Id: 60062 + Title: Rendering the crown Inert + - Id: 60101 + Title: Hunting Peco Pecos + Targets: + - Mob: PECOPECO + Count: 50 + - Id: 60102 + Title: Hunting Peco Pecos + Targets: + - Mob: PECOPECO + Count: 100 + - Id: 60103 + Title: Hunting Peco Pecos + Targets: + - Mob: PECOPECO + Count: 150 + - Id: 60104 + Title: Hunting Hodes + Targets: + - Mob: HODE + Count: 50 + - Id: 60105 + Title: Hunting Hodes + Targets: + - Mob: HODE + Count: 100 + - Id: 60106 + Title: Hunting Hodes + Targets: + - Mob: HODE + Count: 150 + - Id: 60107 + Title: Hunting Fabres + Targets: + - Mob: FABRE + Count: 50 + - Id: 60108 + Title: Hunting Fabres + Targets: + - Mob: FABRE + Count: 100 + - Id: 60109 + Title: Hunting Fabres + Targets: + - Mob: FABRE + Count: 150 + - Id: 60110 + Title: Hunting Pupa + Targets: + - Mob: PUPA + Count: 50 + - Id: 60111 + Title: Hunting Pupa + Targets: + - Mob: PUPA + Count: 100 + - Id: 60112 + Title: Hunting Pupa + Targets: + - Mob: PUPA + Count: 150 + - Id: 60113 + Title: Hunting Cocos + Targets: + - Mob: COCO + Count: 50 + - Id: 60114 + Title: Hunting Cocos + Targets: + - Mob: COCO + Count: 100 + - Id: 60115 + Title: Hunting Cocos + Targets: + - Mob: COCO + Count: 150 + - Id: 60116 + Title: Hunting Caramels + Targets: + - Mob: CARAMEL + Count: 50 + - Id: 60117 + Title: Hunting Caramels + Targets: + - Mob: CARAMEL + Count: 100 + - Id: 60118 + Title: Hunting Caramels + Targets: + - Mob: CARAMEL + Count: 150 + - Id: 60119 + Title: Hunting Alligators + Targets: + - Mob: ALLIGATOR + Count: 50 + - Id: 60120 + Title: Hunting Alligators + Targets: + - Mob: ALLIGATOR + Count: 100 + - Id: 60121 + Title: Hunting Alligators + Targets: + - Mob: ALLIGATOR + Count: 150 + - Id: 60122 + Title: Hunting Creamys + Targets: + - Mob: CREAMY + Count: 50 + - Id: 60123 + Title: Hunting Creamys + Targets: + - Mob: CREAMY + Count: 100 + - Id: 60124 + Title: Hunting Creamys + Targets: + - Mob: CREAMY + Count: 150 + - Id: 60125 + Title: Hunting Demon Pungus + Targets: + - Mob: DEMON_PUNGUS + Count: 50 + - Id: 60126 + Title: Hunting Demon Pungus + Targets: + - Mob: DEMON_PUNGUS + Count: 100 + - Id: 60127 + Title: Hunting Demon Pungus + Targets: + - Mob: DEMON_PUNGUS + Count: 150 + - Id: 60128 + Title: Hunting Dokebi + Targets: + - Mob: DOKEBI + Count: 50 + - Id: 60129 + Title: Hunting Dokebi + Targets: + - Mob: DOKEBI + Count: 100 + - Id: 60130 + Title: Hunting Dokebi + Targets: + - Mob: DOKEBI + Count: 150 + - Id: 60131 + Title: Hunting Dryads + Targets: + - Mob: DRYAD + Count: 50 + - Id: 60132 + Title: Hunting Dryads + Targets: + - Mob: DRYAD + Count: 100 + - Id: 60133 + Title: Hunting Dryads + Targets: + - Mob: DRYAD + Count: 150 + - Id: 60134 + Title: Hunting Frilldora + Targets: + - Mob: FRILLDORA + Count: 50 + - Id: 60135 + Title: Hunting Frilldora + Targets: + - Mob: FRILLDORA + Count: 100 + - Id: 60136 + Title: Hunting Frilldora + Targets: + - Mob: FRILLDORA + Count: 150 + - Id: 60137 + Title: Hunting Goats + Targets: + - Mob: GOAT + Count: 50 + - Id: 60138 + Title: Hunting Goats + Targets: + - Mob: GOAT + Count: 100 + - Id: 60139 + Title: Hunting Goats + Targets: + - Mob: GOAT + Count: 150 + - Id: 60140 + Title: Hunting Golems + Targets: + - Mob: GOLEM + Count: 50 + - Id: 60141 + Title: Hunting Golems + Targets: + - Mob: GOLEM + Count: 100 + - Id: 60142 + Title: Hunting Golems + Targets: + - Mob: GOLEM + Count: 150 + - Id: 60143 + Title: Hunting Leaf Cats + Targets: + - Mob: LEAF_CAT + Count: 50 + - Id: 60144 + Title: Hunting Leaf Cats + Targets: + - Mob: LEAF_CAT + Count: 100 + - Id: 60145 + Title: Hunting Leaf Cats + Targets: + - Mob: LEAF_CAT + Count: 150 + - Id: 60146 + Title: Hunting Skeletons + Targets: + - Mob: SKELETON + Count: 50 + - Id: 60147 + Title: Hunting Skeletons + Targets: + - Mob: SKELETON + Count: 100 + - Id: 60148 + Title: Hunting Skeletons + Targets: + - Mob: SKELETON + Count: 150 + - Id: 60149 + Title: Hunting Munaks + Targets: + - Mob: MUNAK + Count: 50 + - Id: 60150 + Title: Hunting Munaks + Targets: + - Mob: MUNAK + Count: 100 + - Id: 60151 + Title: Hunting Munaks + Targets: + - Mob: MUNAK + Count: 150 + - Id: 60152 + Title: Hunting Sohees + Targets: + - Mob: SOHEE + Count: 50 + - Id: 60153 + Title: Hunting Sohees + Targets: + - Mob: SOHEE + Count: 100 + - Id: 60154 + Title: Hunting Sohees + Targets: + - Mob: SOHEE + Count: 150 + - Id: 60155 + Title: Hunting Firelock Soldiers + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 50 + - Id: 60156 + Title: Hunting Firelock Soldiers + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 100 + - Id: 60157 + Title: Hunting Firelock Soldiers + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 150 + - Id: 60158 + Title: Hunting Tengus + Targets: + - Mob: TENGU + Count: 50 + - Id: 60159 + Title: Hunting Tengus + Targets: + - Mob: TENGU + Count: 100 + - Id: 60160 + Title: Hunting Tengus + Targets: + - Mob: TENGU + Count: 150 + - Id: 60161 + Title: Hunting Venatu + Targets: + - Mob: VENATU + Count: 25 + - Id: 60162 + Title: Hunting Venatu + Targets: + - Mob: VENATU + Count: 50 + - Id: 60163 + Title: Hunting Venatu + Targets: + - Mob: VENATU + Count: 75 + - Id: 60164 + Title: Hunting Archdam + Targets: + - Mob: ARCHDAM + Count: 50 + - Id: 60165 + Title: Hunting Archdam + Targets: + - Mob: ARCHDAM + Count: 100 + - Id: 60166 + Title: Hunting Archdam + Targets: + - Mob: ARCHDAM + Count: 150 + - Id: 60167 + Title: Hunting Siromas + Targets: + - Mob: SIROMA + Count: 50 + - Id: 60168 + Title: Hunting Siromas + Targets: + - Mob: SIROMA + Count: 100 + - Id: 60169 + Title: Hunting Siroma + Targets: + - Mob: SIROMA + Count: 150 + - Id: 60170 + Title: Hunting Ice Titans + Targets: + - Mob: ICE_TITAN + Count: 50 + - Id: 60171 + Title: Hunting Ice Titans + Targets: + - Mob: ICE_TITAN + Count: 100 + - Id: 60172 + Title: Hunting Ice Titans + Targets: + - Mob: ICE_TITAN + Count: 150 + - Id: 60173 + Title: Hunting Disguises + Targets: + - Mob: DISGUISE + Count: 50 + - Id: 60174 + Title: Hunting Disguises + Targets: + - Mob: DISGUISE + Count: 100 + - Id: 60175 + Title: Hunting Disguises + Targets: + - Mob: DISGUISE + Count: 150 + - Id: 60176 + Title: Hunting Loli Ruri + Targets: + - Mob: LOLI_RURI + Count: 50 + - Id: 60177 + Title: Hunting Loli Ruri + Targets: + - Mob: LOLI_RURI + Count: 100 + - Id: 60178 + Title: Hunting Loli Ruri + Targets: + - Mob: LOLI_RURI + Count: 150 + - Id: 60179 + Title: Hunting Mantis + Targets: + - Mob: MANTIS + Count: 50 + - Id: 60180 + Title: Hunting Mantis + Targets: + - Mob: MANTIS + Count: 100 + - Id: 60181 + Title: Hunting Mantis + Targets: + - Mob: MANTIS + Count: 150 + - Id: 60182 + Title: Hunting Dancing Dragons + Targets: + - Mob: DANCING_DRAGON + Count: 50 + - Id: 60183 + Title: Hunting Dancing Dragons + Targets: + - Mob: DANCING_DRAGON + Count: 100 + - Id: 60184 + Title: Hunting Dancing Dragons + Targets: + - Mob: DANCING_DRAGON + Count: 150 + - Id: 60185 + Title: Hunting Necromancers + Targets: + - Mob: NECROMANCER + Count: 20 + - Id: 60186 + Title: Hunting Necromancers + Targets: + - Mob: NECROMANCER + Count: 40 + - Id: 60187 + Title: Hunting Necromancers + Targets: + - Mob: NECROMANCER + Count: 60 + - Id: 60188 + Title: Hunting Apocalypse + Targets: + - Mob: APOCALIPS + Count: 50 + - Id: 60189 + Title: Hunting Apocalypse + Targets: + - Mob: APOCALIPS + Count: 100 + - Id: 60190 + Title: Hunting Apocalypse + Targets: + - Mob: APOCALIPS + Count: 150 + - Id: 60200 + Title: Endless Tower Effect + TimeLimit: +7d + - Id: 60201 + Title: Endless Tower Time Limit + TimeLimit: +4h + - Id: 60211 + Title: Thor Volcano base camp + - Id: 60212 + Title: Thor Volcano base camp + - Id: 60213 + Title: Thor Volcano base camp + - Id: 60301 + Title: Dragon Hunting + Targets: + - Mob: PETIT + Count: 100 + - Id: 60302 + Title: Dragon Hunting + Targets: + - Mob: PETIT + Count: 200 + - Id: 60303 + Title: Dragon Hunting + Targets: + - Mob: FERUS + Count: 100 + - Id: 60304 + Title: Dragon Hunting + Targets: + - Mob: FERUS + Count: 200 + - Id: 60305 + Title: Dragon Hunting + Targets: + - Mob: FERUS_ + Count: 100 + - Id: 60306 + Title: Dragon Hunting + Targets: + - Mob: FERUS_ + Count: 200 + - Id: 60307 + Title: Dragon Hunting + Targets: + - Mob: ACIDUS + Count: 100 + - Id: 60308 + Title: Dragon Hunting + Targets: + - Mob: ACIDUS + Count: 200 + - Id: 60309 + Title: Dragon Hunting + Targets: + - Mob: ACIDUS_ + Count: 100 + - Id: 60310 + Title: Dragon Hunting + Targets: + - Mob: ACIDUS_ + Count: 200 + - Id: 60351 + Title: Bathroom Ghost + - Id: 60352 + Title: Bathroom Ghost + - Id: 60353 + Title: Bathroom Ghost + - Id: 60354 + Title: Bathroom Ghost + - Id: 60355 + Title: Bathroom Ghost + - Id: 62238 + Title: Midgardian Mercenary timer + TimeLimit: +1h diff --git a/db/quest_db.yml b/db/quest_db.yml new file mode 100644 index 0000000000..9aff01e03d --- /dev/null +++ b/db/quest_db.yml @@ -0,0 +1,52 @@ +# This file is a part of rAthena. +# Copyright(C) 2019 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Quest Database +########################################################################### +# +# Quest Settings +# +########################################################################### +# - Id Quest ID. +# Title Quest title. +# TimeLimit Amount of time before the quest expires. (Default: 0) +# Use a number following by "d" for day(s), "h" for hour(s), "mn" for minute(s), and "s" for second(s). +# Specify with "+" for how long until the quest expires. +# Specify without "+" for the exact time the quest expires using "d" (optionnal), [0-23]"h" (required), [0-59]"mn" (optionnal), [0-59]"s" (optionnal) format. +# Please note the number before "d" only shift the exact timer to the given day(s). +# Targets: Quest objective target. (Default: null) +# - Mob Monster to kill. +# Count Amount of monsters to kill. +# Drops: Quest item drop targets. (Default: null) +# - Mob Monster to kill. 0 will apply to all monsters. (Default: 0) +# Item Item to drop. +# Count Amount of items that will drop. Non-stackable items default to 1. (Default: 1) +# Rate Item drop rate. (10000 = 100%) +########################################################################### + +Header: + Type: QUEST_DB + Version: 1 + +Footer: + Imports: + - Path: db/pre-re/quest_db.yml + Mode: Prerenewal + - Path: db/re/quest_db.yml + Mode: Renewal + - Path: db/import/quest_db.yml diff --git a/db/re/quest_db.txt b/db/re/quest_db.txt deleted file mode 100644 index 34b5123fbb..0000000000 --- a/db/re/quest_db.txt +++ /dev/null @@ -1,4053 +0,0 @@ -// Quest Database -// -// Structure of Database: -// Quest ID,Time Limit,Target1,Val1,Target2,Val2,Target3,Val3,MobID1,NameID1,Rate1,MobID2,NameID2,Rate2,MobID3,NameID3,Rate3,Quest Title -// -// Time Limit* can be: -// - in seconds ; date limit will be at [Current time + Time Limit] -// - in HH-MM format ; date limit will be at [Time Limit] of the current day or at [Time Limit] -// of the next day if [Time Limit] is lower than the current date. -// -// The MobID*, NameID*, and Rate* reflect special values for quests that can drop an item at given rate from given mob. -// If no MobID* is given, then any mob has a chance to drop the given ItemID*. - -1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Transcend" -1001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Acolyte" -1002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Acolyte" -1003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Acolyte" -1004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Archer" -1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Mage" -1006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Mage" -1007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Mage" -1008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Mage" -1009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Merchant" -1010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Merchant" -1011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Merchant" -1012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Merchant" -1013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Thief" -1014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Swordman" -1015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Your first quest" -1016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaining base levels" - -// 2010 Headgear Quests -1100,0,1178,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo in the Sphinx Dungeon!" -1101,0,1164,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soloing Sphinx Dungeon!" -1102,0,1194,40,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soloing Clock Tower!" -1103,0,1213,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soloing Clock Tower!" -1104,0,1519,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Luoyang!" -1105,0,1513,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Luoyang!" -1106,0,1375,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Amatsu Dungeon!" -1107,0,1403,40,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Amatsu Dungeon!" -1108,0,1631,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solo at Luoyang!" - -// Ropewa & Yuridi Quest -1109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Survivors of the Labyrinth" -1110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Victims of the Labyrinth" -1111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Maze in the Labyrinth" -1112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Lost in the Labyrinth" -1113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Torn Apart" -1114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - The Cost of Restoration" -1115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Song of the Abyss" -1116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Dead Man's Song" -1117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ropewa & Yuridi - Eternal Promise, Broken Ring" -1118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Neighborhood Knight - I Need Clues" -1119,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Neighborhood Knight - Cooldown" - -1145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1152,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1154,0,2197,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the poor cat" -1174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rumor, Time and Legend" -1180,0,0,0,0,0,0,0,2314,6520,3000,0,0,0,0,0,0,"Get Rid of Bakonawa" -1181,0,0,0,0,0,0,0,2314,6520,3000,0,0,0,0,0,0,"Get Rid of Bakonawa" -1182,0,0,0,0,0,0,0,2314,6520,3000,0,0,0,0,0,0,"Get Rid of Bakonawa" -1183,0,0,0,0,0,0,0,2314,6520,3000,0,0,0,0,0,0,"Get Rid of Bakonawa" -1184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1186,0,2313,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" -1193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" - -// 2011 X-Mas Event -1194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" -1213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look out the window, Cheers for Raccoon Hurray team!" - -// Find Professor Worm's Memory -1214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1216,0,0,0,0,0,0,0,2364,6542,3000,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1225,0,2367,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1227,0,0,0,0,0,0,0,2364,6542,3000,0,0,0,0,0,0,"Getting back Professor Worm's memory" -1228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting back Professor Worm's memory" - -// Academy 14.2 -1229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Swordsman training" -1230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Swordsman training" -1233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Swordsman training" -1234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Swordsman training" -1235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Swordsman training" -1236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Swordsman training" -1237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shop guide" -1238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shop guide" -1239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shop guide" -1240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shop guide" - -// Ghost Palace memorial -1261,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Swordman" -1263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Swordman" - -1264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1266,0,0,0,0,0,0,0,3021,6692,2000,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1267,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1268,0,3021,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1269,0,3022,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" -1297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flaming Basin and Doom Prayers" - -// Rockridge -1298,0,3740,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gas! Gas!" -1299,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Patrol Once a Day" - -1321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spotty and Her Ring" -1322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Found Something" -1323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spotty, No!" -1324,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spotty, No!" -1325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spotty, No!" -1326,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spotty, No!" -1327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spotty, No!" -1328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Found Missing Items" -1329,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spotty in the Dreamland" -1330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spotty's Holes" -1331,0,3736,3,3737,3,3738,3,0,0,0,0,0,0,0,0,0,"Avenging Spotty" -1332,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Blood for Blood" - -2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Blacksmith" -2017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Rogue" -2028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Alchemist" -2041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Sage" -2063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 1" -2064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 2" -2065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 3" -2066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 4" -2067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 5" -2068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 6" -2069,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tierra Gorge Battle" -2070,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flavius Battle" -2071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cursed Property" -2079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The past went wrong" -2086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Enterprise" -2109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Mage in the Ice Dungeon" -2114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -2132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Arunafeltz" -2143,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guild Dungeon Event" -2144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guild Dungeon Event" - -2147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2150,0,1995,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2151,0,1992,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2157,0,1986,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attitude to the New" -2158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding a Fairy" -2159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding a Tree Giant" -2179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dr. Lifeguard's request" -2180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dr. Lifeguard's request" -2181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dr. Lifeguard's request" -2182,64800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rough Minerals" -2183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flower of Alfheim" -2184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flower of Alfheim" -2185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spirit of Alfheim" -2186,64800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helping Grenouille" - -2187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" -2188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" -2189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" -2190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" -2191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arch Bishop job changing quest" - -2192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarana quest" -2201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brasilis Water Lily" -2208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" - -2209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Genetic Job Change Quest" -2210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Genetic Job Change Quest" -2211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Genetic Job Change Quest" -2212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Genetic Job Change Quest" -2213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Genetic Job Change Quest" -2214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Genetic Job Change Quest" -2215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Genetic Job Change Quest" -2216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Genetic Job Change Quest" -2217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Genetic Job Change Quest" -2218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2221,600,1718,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanderer Job Change Quest" -2223,0,1428,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Generic Job Change Quest" - -// Secret in the Woods -2271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret in the Woods" -2281,0,2319,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Buwaya" - -// Pyramid (Nightmare) -2289,0,2355,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Verit Hunting (Nightmare)" -2290,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Verit Hunting - Cooldown" -2291,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mummy Hunting - Cooldown" -2292,0,2360,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mummy Hunting (Nightmare)" - -// Academy 14.2 -2293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adventurer's Companion" -2294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adventurer's Companion" -2295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adventurer's Companion" -2296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adventurer's Companion" -2297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adventurer's Companion" -2298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adventurer's Companion" -2299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rapid Completion Experience" - -// New Novice Ground -// 2299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training Center: Talk to Lisa" -2300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training Center: Talk to General Reindeer" -2301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training Center: Leave the boat" -2302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training Center: Formation" - -//2315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" - -3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Bard" -3006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Crusader" -3016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk - Marathon" -3029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk - Final test" -//3030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk" -3031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk - Spiritual Training" -3032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Monk - Become a Monk" -3040,43200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Curse of Baphomet" -3041,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Curse of Baphomet" -3042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Cursed Baphomet Doll" -3043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Gigantic Magestic Goat" -3044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Gigantic Magestic Goat" -3045,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sealed Shrine" -3046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sealed Shrine After-effect" - -3050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 1" -3051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 2" -3052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 3" -3053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 4" -3054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 5" -3055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 6" -3056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resurrection of Satan Morocc - 7" -3060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Where's the Little Sis?" -3061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Find a way to unlock the shackles!" -3062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Find the Locksmith!" -3063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Mr. Lockenlock?" -3064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Organic Chamelepu Soap" -3065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Soap Ingredients" -3066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - To make a Chamelepu Soap..." -3067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Camel Appetite Stimulants" -3068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Getting the Camel Dung" -3069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Where's the Silk Sand Camel?" -3070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Silk Sand Camel is gone!" -3071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Silk Sand Camel is found!" -3072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 1 lump of Camel dung obtained" -3073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 2 lumps of Camel dung obtained" -3074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 3 lumps of Camel dung obtained" -3075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 4 lumps of Camel dung obtained" -3076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - 5 lumps of Camel dung obtained" -3077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Go to Ms. Ivory" -3078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Chamalepu Soap is completed!" -3079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Making the key mold" -3080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Bringing the key mold" -3081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - All you need is Steel!" -3082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - The Key is Made!" -3083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kids in Veins - Mr. Lockenlock's key" -3085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Call from the commander" -3086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Commander's Duty" -3087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Midgard" -3088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Accident!" -3089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - How to restore" -3090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Location of reports" -3091,1800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Location of reports" -3092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Success to restore!" -3093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Report to the continent" -3094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the continent - Return to the expedition" - -3100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Lost Bond of Debt" -3101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Strange Heap of Earth" -3102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Bond of Debt Found, but..." -3103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Inventor Dorian" -3104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Repair Materials of Magic Dryer" -3105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Repairing Magic Dryer" -3106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Repairing Magic Dryer Failed" -3107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Repairing Magic Dryer Successful" -3108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Let's Run the Magic Dryer" -3109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Consolidating Heavy Debt - Restoring the Bond of Debt" -3110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Tracking the Diamond" -3111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Leblo's Favor" -3112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Wola the Doctor" -3113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Wola the Doctor" -3114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Wola the Doctor" -3115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Leblo's Information" -3116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Information from Rogue Investigator" -3117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Odd Switches" -3118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Diamond - Diamond Found!" -3119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Wanted Notice" -3120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - About Z Gang" -3121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Valdes's Favor" -3122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Information from Valdes" -3123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Marybell's Test" -3124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Challenging Moonho Ahn" -3125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Challenging Moonho Ahn" -3126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Information from Marybell" -3127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Z Gang's Attack" -3128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Z Gang's Attack" -3129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Strange Letter" -3130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Decrypting the letter..." -3131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Code's Broken!" -3132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Find the Z Gang's Agit" -3133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Agit Found!" -3134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Z Gang Wanted - Clean Sweep of Z Gang" -3135,259200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nidhoggur's Nest" -3136,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nidhoggur's Nest Time Limit" - -3200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Recommendation for Rune knight" -3201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Secret rendezvous of Rune knight" -3202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The first test" -3203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The first test" -3204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Pass the first test" -3205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3209,0,1504,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Accumulation of magic energy1" -3210,0,1506,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Accumulation of magic energy2" -3211,0,1508,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Accumulation of magic energy3" -3212,0,1510,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Accumulation of magic energy4" -3213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The second test" -3215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Pass the second test" -3216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The final test" -3217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The final test" -3218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Pass the final test" -3219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - The end of all test" -3220,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Rune knight - Waiting time of test" - -3250,0,1041,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - What is this bandage for?" -3251,0,1271,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - An alligator of Counterattack" -3252,0,1264,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - My mermaid don't do like this way!" -3253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Missing occult mania" -3254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A country wants you" -3255,0,1166,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A wild boar subjugate operation" -3256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Ready for waiting summer" -3257,0,1170,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A grudge of women" -3258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A material of delicacy" -3259,0,1143,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A agony of a doll master" -3260,0,1035,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Tiresome flies" -3261,0,1026,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Unclean girl" -3262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Queer hobby" -3263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - A mallet of goblin" -3265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Missing occult mania" - -4000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sherin's Job Interview" -4001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter - Test" -4012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" -4013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Hunter" - -// Following entries are depreciated - use 10000-10025 -//4015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Becoming an Adventurer Appraiser" -//4016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Proof of Qualification" -//4017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Qualification Test" -//4018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Preparations for Meeting Princes" -//4020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Prince" -//4028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The prince, Peter's Favor" -//4029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Girl's Favor" -//4030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Story of Ahrum and Ernst" -//4031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Story of Ahrum and Ernst" -//4032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conspiracy of the two families" -//4033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Death of Ahrum" - -4133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Iara" -4134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Iara" -4135,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Iara" - -4154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus Researcher" -4155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 1" -4156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 2" -4157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 3" -4158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 4" -4159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 5" -4160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Homunculus S Mutation Mission - 6" - -4161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Siege Expert" -4162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Party Recruiting Expert" -4163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battleground Expert" -4164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memorial Dungeon Expert" -4165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Map Expert" -4166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Passing Grades" - -// Paradise 86 - 90 [Chilly] -4167,0,1321,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Dragon Tail Hunting" -4168,0,1322,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Spring Rabbit Hunting" -4169,0,1256,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Pest Hunting" -4170,0,1102,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Bathory Hunting" -4171,0,1193,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Alarm Hunting" -4172,0,1882,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Babayaga Hunting" -4173,0,1512,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Hyegun Hunting" -4174,0,1403,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Antique Firelock Hunting" -4175,0,1417,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Zipper Bear Hunting" -4176,0,1155,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Earth Petite Hunting" -4177,0,1162,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Rafflesia Hunting" -4178,0,1621,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Venomous Hunting" -4179,0,1616,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Pitman Hunting" -4180,0,1718,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Yellow Novus Hunting" - -// Paradise 91 - 99 [Chilly] -4181,0,1316,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Solider Hunting" -4182,0,1319,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Freezer Hunting" -4183,0,1318,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Heater Hunting" -4184,0,1257,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Injustice Hunting" -4185,0,1201,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Rybio Hunting" -4186,0,1198,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Dark Priest Hunting" -4187,0,1784,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Stapo Hunting" -4188,0,1782,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Roween Hunting" -4189,0,1776,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Siroma Hunting" -4190,0,1401,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Shinobi Hunting" -4191,0,1416,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Evil Nymph Hunting" -4192,0,1109,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Deviruchi Hunting" -4193,0,1614,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Mineral Hunting" -4194,0,1072,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Kaho Hunting" -4195,0,1255,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Neraid Hunting" -4196,0,1506,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise: Disguise Hunting" - -4197,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Octopus" - -// Paradise Cooldowns -4198,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4199,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4200,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4201,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4202,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4203,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4204,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4205,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4206,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4207,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4208,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4209,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4210,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4211,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"86-90 Mission Board Timer" -4212,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4213,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4214,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4215,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4216,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4217,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4218,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4219,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4220,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4221,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4222,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4223,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4224,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4225,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4226,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" -4227,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"91-99 Mission Board Timer" - -4229,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Devil in the Cave" - -4254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fairy with a stomache" -4255,0,2363,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revenge!" -4256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An accomplice?" -4257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conspiracy" -4258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eirinn" -4259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bourbon" -4260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bee" -4261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Counterattack (1)" -4262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Counterattack (2)" -4263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Counteroffensive (1)" -4264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Counteroffensive (2)" -4265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bookshelf use" -4266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"????? ??" -4267,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"????? ??" - -// Academy 14.2 -4268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja trainer" -4269,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Registration at the Academy" -4270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training - stat explanation" -4271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-explanation about the skills" -4272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training- conversation about the skills" -4273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training- explanation about the weapons" -4274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninjas training- explanation about job change" -4275,0,1113,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-Exercise1" -4276,0,1002,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-Exercise2" -4277,0,1052,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-Actual battle2" -4278,0,1024,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-Actual battle1" -4279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-test" -4280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-test" -4281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Beginner's training-Ninja" -4282,0,1113,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-exercise1" -4283,0,1002,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-exercise2" -4284,0,1052,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-actual battle2" -4285,0,1024,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-actual battle1" -4286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-test" -4287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ninja training-test" - -// Episode 15.1 Bard's Story -4295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wandering Bard" -4296,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Take a Break" -4297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bard's Story: Some Corporation" -4298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bard's Story: The President" -4299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bard's Story: a Scholar in Juno" -4300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bard's Story: a Mad Scientist" -4301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bard's Story: Hugel" -4302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bard's Story: Odin Temple" - -//4303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//4304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//4305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -4999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Extermination Crisis" -5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crow of the Fate - 7" -5001,0,1037,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"King Froggie VII's revenge" -5002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The hero of the frogs" -5003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Frog Hiding Skill" -5004,0,1099,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Food Shortage" - -// Researcher's Quest -5016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bring me a Research Tool Bag" -5017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revenge of the Reseacher" -5018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revenge of the Reseacher" -5019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Sample Studying" -5020,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sample Researching" -5021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sample Collecting" -5022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sample Collecting" -5023,21600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of the Sample" -5024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eastern Pool Research" -5025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Western Pool Research" -5026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Southern Pool Research" -5027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Northern Pool Research" -5028,43200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of the Sample" -5029,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unidentified Creature" -5030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The creature's family" -5031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The creature's family" -5032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The creature's family" -5033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The creature's family" -5034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"News from the family" -5035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5043,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5044,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help the old man!" -5052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Weapon" -5053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Weapon" -5054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Weapon" -5055,0,2071,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Local Rising - Headless Horse" -5056,0,1584,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Local Rising - Tamruan" -5057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Local Rising - Ready the Festival" -5058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The mood of the players-(1)" -5059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The mood of the players-(2)" -5060,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Shock" -5061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Am I scared?" -5062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I met Eryu." -5063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I met Stew." -5064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I met Ketchup." -5065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I met Eff." -5066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scary image-(1)" -5067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scary image-(2)" -5068,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting complaint" -5069,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Token of honor" -5070,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rock Paper Scissors" -5071,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Chamchamcham" -5072,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kkongnyangkkong" -5073,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Challenging of flag wave" -5074,0,1158,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat's Meal" -5075,0,1144,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Health food" -5076,0,1282,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enemies" -5077,0,1209,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reaction Training" -5078,0,1019,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Light bird food" -5079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to stabilize the mind" -5080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lack of Snack" -5081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Banned foods" -5082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cool food" -5083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Eryu-(1)" -5084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Eryu-(2)" -5085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Stew-(1)" -5086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Stew-(2)" -5087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Ketchup-(1)" -5088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Ketchup-(2)" -5089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Eff-(1)" -5090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please come back Eff-(2)" -5091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Go Malangdo" - -5092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5094,0,1002,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5095,0,1063,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5096,0,1007,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5097,0,1049,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" -5100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unlocking the Ultimate Mediocrity" - -5109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Light but Unconfirmed Rumor" -5110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Rumored Character" -5111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Lab..." -5112,259200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Laboratory Restricted Access" -5113,0,1646,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Lord Knight" -5114,0,2235,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Paladin" -5115,0,1649,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] High Priest" -5116,0,2238,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Champion" -5117,0,1651,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] High Wizard" -5118,0,2237,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Professor" -5119,0,1648,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Whitesmith" -5120,0,2236,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Creator" -5121,0,1647,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Assassin Cross" -5122,0,2239,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Stalker" -5123,0,1650,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Sniper" -5124,0,2240,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Clown" -5125,0,2241,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Rest] Gypsy" - -// Kagerou/Oboro Job Quest -5131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Conversation" -5132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Family Business-(1)" -5133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Family Business-(2)" -5134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New path" -5135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"4 tests" -5136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Knowledge test" -5137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Survival test" -5138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Weapons test" -5139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The guy looks familiar!!" -5140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Uncertain chilliness" -5141,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Got a curse!!" -5142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prototype-(1)" -5143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prototype-(2)" -5144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prototype-(2)" -5145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prototype-(3)" -5146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battle test" - -// Academy 14.2 -5147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gunslinger basic training(1)" -5148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gunslinger basic training(2)" -5149,0,1004,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -5150,0,1012,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -5151,0,1167,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -5152,0,1052,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -5153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Refining tutorial (1)" -5154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Refining tutorial (2)" -5155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Refining tutorial (3)" -5156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Refining tutorial (4)" -5157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enchant tutorial (1)" -5158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enchant tutorial (2)" -5159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enchant tutorial (3)" - -// 2012 Headgear Quests -5161,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request[Stand by]" -5162,0,1164,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5163,0,1102,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5164,0,1322,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5165,0,1386,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5166,0,1117,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5167,0,1155,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5168,0,1269,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Low Level collection request" -5169,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request[Stand by]" -5170,0,1776,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request" -5171,0,1198,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request" -5172,0,1784,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request" -5173,0,1316,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mid-Level collection request" -5174,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collectiong request[Stand by]" -5175,0,1106,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collection request" -5176,0,1148,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collection request" -5177,0,1995,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collection request" -5178,0,1310,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"High level collection request" -5179,0,1163,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Highest level collection request" -5180,0,1993,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Highest level collection request" -5181,0,1297,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Highest level collection request" -5182,0,1699,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Highest level collection request" -5222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving the energy crystals" -5223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving the energy crystals" -5224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving the energy crystals" -5225,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving energy crystal[Stand by]" -5226,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving energy crystal[Stand by]" -5227,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Saving energy crystal[Stand by]" - -// Episode 15.1 Phantasmagorika -5304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Police Chief Kesler" -5305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Police Officer Salgran" -5306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Police Officer Gerev" -5307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Police Officer Seiden" -5308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Police Officer Piffs" -5309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Police Chief's Request" -5310,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Salgran's Problem" -5311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gerev's Problem" -5312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Seiden's Problem" -5313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Piffs's Problem" -5314,0,3159,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Salgran's Request" -5315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gerev's Request" -5316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Seiden's Request" -5317,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Piffs's Request" -5318,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Come Back Tomorrow" - -// Episode 15.2 Memory Record -5341,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restriction on the Journey" -5342,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Her" -5343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making a Head Count" -5344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making a Head Count" -5345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making a Head Count" -5346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making a Head Count" -5347,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finishing a Head Count" -5348,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finishing a Head Count" -5349,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finishing a Head Count" -5350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finishing a Head Count" -5351,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restriction on the Journey" -5352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Air Purifier" -5353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivered to C-0" -5354,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivered to F-1" -5355,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivered to F-2" -5356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivered to I-0" -5357,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivered to Z-0" -5358,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restriction on the Journey" -5359,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Grape Harvest" -5360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Grape Delivery" -5361,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Grape Delivery" -5362,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Grape Delivery" -5363,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restriction on the Journey" -5364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Subdue Hysterical Patients" -5365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Urgent News" -5366,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restriction on the Journey" -5367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Daily Necessities Transport" -5368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivered Supplies" -5369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivered the Message" -5370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memory Record" - -// Banquet Quests -5402,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Royal Richard" -5403,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Royal Richard" -// Todo : Quests by race / level -5404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Human" -5405,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Animal" -5406,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Insect" -5407,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Fish" -5408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Plant" -5409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Devil" -5410,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Angel" -5411,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Immortal" -5412,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Intangible" -5413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Warrior Discipline-Dragon" -5414,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Stand by]Warrior Discipline" -5415,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restricted Sector" -5416,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restricted Sector A" -5417,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restricted Sector B" -5418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restricted Sector C" -5419,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restricted Sector D" -5420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restricted Sector E" -5421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restricted Sector F" -5422,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restricted Sector G" -5423,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restricted Sector H" -5424,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Complete]Restricted Sector" -5425,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To My Beloved Fellow" -5426,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Stand by]To My Beloved Fellow" -5427,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]To My Beloved Fellow" -5428,0,0,0,0,0,0,0,3444,6924,2000,0,0,0,0,0,0,"Lowly Standards" -5429,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Stand by]Lowly Standards" -5430,0,0,0,0,0,0,0,3444,6924,2000,0,0,0,0,0,0,"[Repeat]Lowly Standards" -5431,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clean Life" -5432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Cleaning is complete." -5433,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Stand by]Clean Life" -5434,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Clean Life" -5435,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Cleaning is complete." -5436,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding Lights" -5437,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Stand by]Finding Lights" -5438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Finding Lights" -5439,0,0,0,0,0,0,0,3442,6921,2000,0,0,0,0,0,0,"Refreshing Prison Life" -5440,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Stand by]Refreshing Prison Life" -5441,0,0,0,0,0,0,0,3442,6921,2000,0,0,0,0,0,0,"[Repeat]Refreshing Prison Life" -5442,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Suppressing Darkness" -5443,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Stand by]Suppressing Darkness" -5444,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Repeat]Suppressing Darkness" -5445,0,0,0,0,0,0,0,3443,6922,2000,0,0,0,0,0,0,"Bothersome Little Thing" -5446,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Stand by]Bothersome Little Thing" -5447,0,0,0,0,0,0,0,3443,6922,2000,0,0,0,0,0,0,"[Repeat]Bothersome Little Thing" -5448,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Chief Guard" -5449,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Chief Guard" -5450,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Chief Guard" -5451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Chief Guard" -5452,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"[Stand by]Request from Chief Guard" -5453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ungrateful(1)" -5454,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ungrateful(2)" -5455,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ungrateful(3)" -5456,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ungrateful(4)" -5457,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find My Sister(1)" -5458,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find My Sister(2)" -5459,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find My Sister(3)" -5460,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Blatant Bluff(1)" -5461,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Blatant Bluff(2)" -5462,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Blatant Bluff(3)" -5463,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mad Love for Wife(1)" -5464,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mad Love for Wife(2)" -5465,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mad Love for Wife(3)" -5466,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mad Love for Wife(4)" -5467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mad Love for Wife(5)" -5468,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mad Love for Wife(6)" - -6000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Taekwon" -6001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Taekwon" -6002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Taekwon" -6005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Soul-Linker" -6006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Soul-Linker" -6007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Soul-Linker" -6008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Soul-Linker" -6010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Super Novice" -6015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A favor from Cougar" -6016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A favor from a Suspicious Man" -6017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red Leopard Joe's Reply" -6018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cougar's Madness" -6020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Master Miller's Letter" -6021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wise Bull Horn's voucher" -6022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making a voucher" -6023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wise Bull Horn's Favor" -6024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Gunslinger!" -6025,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"KVM Guillaume" -6026,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"KVM Croix" -6027,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"KVM Indicator" -7000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Dancer!" -7007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars" -7008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars - Nature" -7009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars - the Altar" -7010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars - Stars?" -7011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Warrior of the Sun, the Moon, and the Stars" -7012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Rayan Moore" -7037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Case closed?" -7038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Passion for Baked Sweet Potatoes" -7039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dodging the conversation" -7040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dodging the conversation" -7041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Politics is for the Politicians" -7042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Tatacho's feed" -7043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Cornus's feed" -7044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Hillthrion's feed1" -7045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Hillthrion's feed2" -7046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - warm rugs" -7047,18000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Part-time Job - Let's call it a day!" -7048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Burled's Favor" -7049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Sealed Tower" -7050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Sealed Tower" -7051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Sealed Tower" -7052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - Sealed Tower" -7053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower - What they want is.." -7054,0,1282,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,"Myu's Favor - Teach them a lesson!" -7055,0,1261,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Myu's Favor - Not the cat!" -7056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Arc's Favor" -7057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Arc's Favor" -7058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Arc's Favor" -7059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Whereabouts" -7066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Prove the Truth" -7067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Prove the Truth" -7068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Prove the Truth" -7069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Too late!" -7070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Terra's Return" -7071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger - Invitation" -//7072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//7073,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -7074,0,2017,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rata Hunt" -7075,0,2018,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Duneyrr Hunt" -7076,0,2026,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wanted: Dandelion" -7077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting Dragon Eggs" -7078,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting Dragon Eggs" -7079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding Refined Bradium" -7080,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding Refined Bradium" -7081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helping the Laphine Craftsman" -7082,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helping the Laphine Craftsman" - -7091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 01" -7092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 02" -7093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 03" -7094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 04" -7095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An advice of Diora 05" -7096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A proof of new requirement" -7097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A proof of new requirement" -7098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A proof of new requirement" -7099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A proof of new requirement" -7100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A message of Bercascell" -7101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 1" -7102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 2" -7103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 3" -7104,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 4" -7105,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 4" -7106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 5" -7107,10800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 6" -7108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 7" -7109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 8" -7110,600,2030,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 9" -7111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special task of an assassin guild 10" -7112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of Madelle" -7113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of Crave" -7114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of Trovan" -7115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of a peddler" -7116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information of a old man" - -// Novice Training Grounds -7117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Your first quest!" -7118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Novice Training" -7119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Novice Training" -7120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Novice Training" -7121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Novice Training" -7122,0,1002,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"First battle - Poring Hunt" -7123,0,1049,2,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battle Basics -Swordman" -7124,0,1063,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battle Basics -Mage" -//7125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"not used" -7126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Selling items" -7127,0,1010,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battle Basics -Thief" - -7128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Training course 'conquest a desert!' -start" -7129,0,1009,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the desert!' - A real battle 1" -7130,0,1107,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the desert!' - A real battle 2" -7131,0,1001,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the desert!' - A real battle 3" -7132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the desert!' - Complete a quest" -7133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - Start" -7134,0,1051,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - A real battle 1" -7135,0,1175,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - A real battle 2" -7136,0,1005,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - A real battle 3" -7137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the culvert!' - Complete a quest" -7138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the haunted cave!' - Start" -7139,0,1076,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the haunted cave!' - A real battle 1" -7140,0,1031,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the haunted cave!' - A real battle 2" -7141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the haunted cave!' - Complete a quest" -7142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - Start" -7143,0,1160,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - A real battle 1" -7144,0,1095,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - A real battle 2" -7145,0,1176,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - A real battle 3" -7146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer ant hell!' - Complete a quest" -7147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - start" -7148,0,1686,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - A real battle 1" -7149,0,1023,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - A real battle 2" -7150,0,1273,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - A real battle 3" -7151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc village!' - Complete a quest" -7152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc dungeon!' - start" -7153,0,1153,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc dungeon!' - A real battle 1" -7154,0,1152,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc dungeon!'- A real battle 2" -7155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer the orc dungeon!' - complete a quest" -7156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer an undersea city!' - start" -7157,0,1264,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer an undersea city!' - A real battle 1" -7158,0,1065,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer an undersea city!' - A real battle 2" -7159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The training course 'conquer an undersea city!' - Complete a quest" - -7160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram" -7161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 2nd" -7162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 2nd" -7163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 2nd" -7164,0,2076,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt for shadow of deception" -7165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Key of deception" -7166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rachel Branch of Shadow Workshop" -7167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 3rd" -7168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 3rd" -7169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 3rd" -7170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 3rd" -7171,0,2077,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt for shadow of delusion" -7172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Key of delusion" -7173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Message to Halled from Paul" -7174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Cryptogram - 4th" -7175,0,2078,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunft for shadow of gaiety" -7176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Key of Gaiety" -7177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A young guy in Lighthalzen" -7178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Destination of Deception, Delusion and Gaiety" -7179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vicente, you dare!" -7180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Message from Doomk" - -7181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Karakas's ring" - -// El Dicastes -7182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sapha's Visit" -7183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Invitation from Sapha" -7184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To El Dicastes!" -7185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspector Doha" -7186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Order from Doha - Investigation" -7187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Order from Doha - Shay" -7188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information Gathering - in the Plaza" -7189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information Gathering - in the Factory" -7190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information Gathering - at the Guards" -7191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shay's designation - BK" -7192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"BK's Information" -7193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dimensional Crack Investigation" -7194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What's this bloodstain?" -7195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What's this skin piece?" -7196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What's this suspicious magic power?" -7197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sapha Certifications?" -7198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Audience with Ahat" -7199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Order from Ahat" -7200,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cheshire's call" -7201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Removing traces" -7202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret order from Doha - Collect proof" -7203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret order from Doha - Final Report" -7206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Day for Cheshire" -7207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cheshire's Box" -7208,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wait for Cheshire?" -7209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Forget the box." -7210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Daily delivery" - -// Misty Forest Labyrinth -7211,9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Misty Forest Labyrinth Exploration" -7212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loki's Search" -7213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wandering Protector" - -// Paradise Gear Advanced Quests [Chilly] -7214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Training" -7215,0,1278,3,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Hunt 1" -7216,0,1278,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Hunt 2" -7217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Hunt 3" -7218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Romeo Complete" -7219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Johan Training" -7220,0,1192,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Johan Hunt 1" -7221,0,1117,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Johan Hunt 2" -7222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Johan Complete" -7223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Training" -7224,0,1619,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Hunt 1" -7225,0,1620,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Removed" -7226,0,1621,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Hunt 2 (Part A)" -7227,0,1622,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Hunt 2 (Part B)" -7228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Kiren Complete" -7229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Naomi Training" -7230,0,1776,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Naomi Hunt 1" -7231,0,1776,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Naomi Hunt 2" -7232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Naomi Complete" -7233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret Training" -7234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret's Favor" -7235,0,1988,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret Hunt 1" -7236,0,1995,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret Hunt 2" -7237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Paradise Advanced: Margaret Complete" -7238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toren's Errands (Easy)" -7239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toren's Errands (Normal)" -7240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strengthening Equipment" -7241,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toren's Errands - Tomorrow" -7242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Play with the baby cat" -7243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Duruduru Compass" -7244,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Duruduru Race" -7245,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Duruduru Race" -7246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-I'm coming now." -7247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Stop the Bang!" -//7248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -7249,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Bang! See you next time" -7250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Hidden Treasure?" -7251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The First piece of Painting" -7252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Second piece of Painting" -7253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Third piece of Painting" -7254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Fourth piece of Painting" -7255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Fifth piece of Painting" -7256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-The Sixth piece of Painting" -7257,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Race, Come back tomorrow!" -7258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyadventure-Painting completed" -7259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gift from the Mew Bravery Team" -7260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The origin of Bugs" -7261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Table" -7262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Mattress" -7263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Grill" -7264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Chef Nyas" -7265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rage of Chef Nyas" -7266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Declaration of Chef Nyas" -7267,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Appointed time with Cleanyang" -7268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Cat's hard biscuits!" -7269,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Resting Place" -7270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Sand" -7271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Bottom of the Stairs" -7272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Corner" -7273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Locker" -7274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Foothold" -7275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cat Biscuits - Sand" -7276,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Promise to deliver more food" -7281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7283,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7310,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7317,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7319,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7324,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7326,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7331,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7332,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7335,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7338,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7341,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7342,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" -7346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"List of Errands" - -// Hall of Abyss -7349,1800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vote" - -// Port Malaya -7350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cautious Village" -7351,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Better than My Old Button" -7352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sailor Wants a Button" -7353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Man Wants a Button" -7354,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Young Man Wants a Button" -7355,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Merchant Wants a Button" -7356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Little Kid Wants a Button" -7357,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Middle-aged Guy Wants a Button" -7358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why do they want my Buttons?" -7359,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Sailor" -7360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Old Man" -7361,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Young Man" -7362,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Merchant" -7363,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Little Kid" -7364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Holy Item to Middle-aged Man" -7365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Better than My Old Button-2" -7366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Spiritual Protection and Impudent Girl-1" -7367,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traditional Spiritual Protection and Impudent Girl-2" -7368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Pedro" -7369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Nardo" -7370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Pandoi" -7371,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Woeon" -7372,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Talah" -7373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver Spiritual Protection-Romel" -7374,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Love and Spiritual Protection for All" -7375,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Love and Spiritual Protection Continues" -7376,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Man and Cast-Iron Caldron-1" -7377,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Man and Cast-Iron Caldron-2" -7378,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Man and Cast-Iron Caldron-Regular Trades" -7379,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Peace Preacher" -7380,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Smith a Traditional Spiritual Protection" -7381,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"High Demand on Spiritual Protection Material" -7382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Pedro" -7383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Nardo" -7384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Pandoi" -7385,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Woeon" -7386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Talah" -7387,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver to Romel" -7388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Maries's Child" -7389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Give the Shirt to Maries's Child" -7390,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Worried about Maries's Child" -7391,0,0,0,0,0,0,0,2316,6498,5000,0,0,0,0,0,0,"Jejeling and Jejellopy" -7392,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect Jejellopy Regularly" -7393,0,2314,10,2311,10,0,0,0,0,0,0,0,0,0,0,0,"Shiny Silver Blade" -7394,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shiny Tomorrow" -7395,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ghost on the Ferry Ship" -7396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Angry Soul on Ferry Ship" -7397,0,0,0,0,0,0,0,2310,6510,3000,0,0,0,0,0,0,"Mumbaki Phong's Advice" -7398,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Offering Bouquet Recommended by Mumbaki" -7399,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soul Diwata's Story" -7400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mumbaki of Port Malaya" -7401,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"All Aboard for Perry Sailing" -7402,0,0,0,0,0,0,0,2310,6510,3000,0,0,0,0,0,0,"Bouquet for Diwata" -7403,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stabilized Perry" -7404,0,2316,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Jejeling" -7405,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Jejeling - Same Time Tomorrow" -7406,0,0,0,0,0,0,0,2309,6507,5000,2313,6507,5000,2314,6507,5000,"Agree to Collecting Bones!" -7407,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Purified Bone" -7408,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Agree to Come Back Tomorrow?" -7409,0,2309,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cannot Meet Eyes with Him!" -7410,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Teach Another Lesson Tomorrow!" - -// Eclage -7411,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The traveler, Fome's story" -7412,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The traveler, Litrip's story" -7413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The traveler, Chiba's story" -7414,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eclage guard's message" -7415,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Laphine's Chief of Staff" -7416,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Waiting to meet" -7417,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kardui's request" -7418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Eclage 1" -7419,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Eclage 2" -7420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For Eclage 3" -7421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"That's enough" -7422,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kardui's gift" -7423,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A rumor about the King 1" -7424,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A rumor about the King 2" -7425,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A rumor about the King 3" -7426,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A rumor about the King 4" -7427,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"At times like this, face it straight on!" -7428,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Yai of the wild" -7429,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wild recent trend!" -7430,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliveryman that runs through space" -7431,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A mailman never rests!" -7432,0,2363,5,2364,5,0,0,0,0,0,0,0,0,0,0,0,"The troublemakers in the land of blooming flowers" -7433,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Need constant guidance" - -// Twins and Scholar of Magics -7434,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kardui's big brother" -7435,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time for reading the letter" -7436,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Avant the Scholar of Magics" -7437,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shenime's favor" -7438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret sponsorship" -7439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The scholar of magics sponsored by Shenime" -7440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Minuel's witness" -7441,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mail is here!" -7442,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The identity of the scholar of magics" -7443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interfere with the research!" -7444,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What Avant was researching" - -// Orb -7445,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Avant's back" -7446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unfruitful conversation" -7447,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dilemma surrounding the Orb" -7448,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Something's not right" -7449,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Temptation toward the Orb" -7450,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orb's lighting room" -7451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Betrayal" -7452,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the chief of staff!" -7453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The last of the chief of staff" - -// Academy 14.2 -7471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"First time talking after being born" -7472,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"First step towards a new world" -7473,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cool drink" -7474,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for treasure" -7475,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered the Airship" -7476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered the Arena" -7477,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bridge to Prontera" -7478,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Basic Medical Botany" -7479,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Friend or Foe?" -7480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Regarding Thief job" -7481,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vicente's class" -7482,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vercassel's class" -7483,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Use the Thief Manual" -7484,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shop owner! Order to steal!" -7485,0,1725,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Assassin! Use Envenom" -7486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"With Lumin" -7487,30,1725,4,0,0,0,0,0,0,0,0,0,0,0,0,0,"30 seconds duel" -7488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Trio set of Fire Elements" -7489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Silent liquidation plan" -7490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mushroom soup calling memories" -7491,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get away to Paradise!" -7492,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Invincible pumpkin knight" -7493,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Battle of 17 vs. 1" -7494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cleanup of the mushroom farm" - -// WOE TE Mission -7501,14400,2451,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"1 Suspicious Babe" -7502,14400,2451,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"10 Suspicious Babes" -7503,14400,2451,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"30 Suspicious Babes" -7504,14400,1288,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Destroy 1 Emperium" -7505,14400,1288,3,0,0,0,0,0,0,0,0,0,0,0,0,0,"Destroy 3 Emperiums" -7506,14400,1288,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Destroy 5 Emperiums" -7507,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"10 Small Wooden Boxes" -7508,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"20 Small Wooden Boxes" -7509,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"30 Small Wooden Boxes" -7510,14400,2450,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fight Off a Thief" -7511,14400,2450,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fight Off 10 Thieves" -7512,14400,2450,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fight Off 30 Thieves" -7513,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"10 Paychecks" -7514,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"20 Paychecks" -7515,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"30 Paychecks" -7516,1200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A break for Commercial Development" - -// Guild Occupy Quest -7517,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Occupy Valkyrie Realm" -7518,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Occupy Luina" -7519,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Occupy Britoniah" -7520,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Occupy Greenwood Lake" -7521,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Occupy Nidabehl" -7522,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Occupy Valfreyja" -7523,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Occupy Gloria" -7524,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Occupy Kafragaten" - -// Guild Dungeon Daily Quest -7525,0,1300,50,1293,50,0,0,0,0,0,0,0,0,0,0,0,"Valkyrie Realm Challenge 1" -7526,0,2284,30,2285,30,2286,30,0,0,0,0,0,0,0,0,0,"Valkyrie Realm Challenge 2" -7527,0,2249,1,2250,1,0,0,0,0,0,0,0,0,0,0,0,"Valkyrie Realm Challenge 3" -7528,0,1305,50,1303,50,0,0,0,0,0,0,0,0,0,0,0,"Luina Challenge 1" -7529,0,1294,40,2133,50,0,0,0,0,0,0,0,0,0,0,0,"Luina Challenge 2" -7530,0,2251,1,2252,1,0,0,0,0,0,0,0,0,0,0,0,"Luina Challenge 3" -7531,0,1298,50,1291,50,0,0,0,0,0,0,0,0,0,0,0,"Britoniah Challenge 1" -7532,0,2282,20,2283,20,2281,50,0,0,0,0,0,0,0,0,0,"Britoniah Challenge 2" -7533,0,2255,1,2256,1,0,0,0,0,0,0,0,0,0,0,0,"Britoniah Challenge 3" -7534,0,1311,50,1306,50,0,0,0,0,0,0,0,0,0,0,0,"Greenwood Lake Challenge 1" -7535,0,1290,45,1301,20,1309,25,0,0,0,0,0,0,0,0,0,"Greenwood Lake Challenge 2" -7536,0,2253,1,2254,1,0,0,0,0,0,0,0,0,0,0,0,"Greenwood Lake Challenge 3" -7537,0,1978,50,1979,50,0,0,0,0,0,0,0,0,0,0,0,"Nidabehl Challenge 1" -7538,0,1290,35,1301,35,0,0,0,0,0,0,0,0,0,0,0,"Nidabehl Challenge 2" -7539,0,1974,50,1975,30,0,0,0,0,0,0,0,0,0,0,0,"Valfreyja Challenge 1" -7540,0,1796,50,1797,20,0,0,0,0,0,0,0,0,0,0,0,"Valfreyja Challenge 2" -7541,0,2415,30,2416,30,2417,30,0,0,0,0,0,0,0,0,0,"Gloria Challenge 1" -7542,0,2419,30,2420,30,2418,30,0,0,0,0,0,0,0,0,0,"Gloria Challenge 2" -7543,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Valkyrie Realm Challenge 1" -7544,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Valkyrie Realm Challenge 2" -7545,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Valkyrie Realm Challenge 3" -7546,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Luina Challenge 1" -7547,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Luina Challenge 2" -7548,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Luina Challenge 3" -7549,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Britoniah Challenge 1" -7550,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Britoniah Challenge 2" -7551,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Britoniah Challenge 3" -7552,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Greenwood Lake Challenge 1" -7553,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Greenwood Lake Challenge 2" -7554,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Greenwood Lake Challenge 3" -7555,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Nidabehl Challenge 1" -7556,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Nidabehl Challenge 2" -7557,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Valfreyja Challenge 1" -7558,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Valfreyja Challenge 2" -7559,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Gloria Challenge 1" -7560,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Gloria Challenge 2" -7561,0,2421,30,2422,30,2423,30,0,0,0,0,0,0,0,0,0,"Kafragaten Challenge 1" -7562,0,2426,30,2427,30,2424,30,0,0,0,0,0,0,0,0,0,"Kafragaten Challenge 2" -7563,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Kafragaten Challenge 1" -7564,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Standby for Kafragaten Challenge 2" - -// Devil Tower Memorial -7568,5400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Explore the tower" -7569,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Treat the injured" -7570,0,2939,7,2940,7,2941,7,0,0,0,0,0,0,0,0,0,"Destroy the demons" -7571,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tower Expedition" -7572,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lucile...?" -7573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Magic Swordman Thanatos" -7574,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower" -7576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc castle seal" -7577,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Space distortion" - -// Episode 14.3 -7578,0,3061,1,0,0,0,0,3061,6392,10000,0,0,0,0,0,0,"Rampaging Box" -7579,0,3061,10,0,0,0,0,3061,6392,10000,0,0,0,0,0,0,"Collecting Bradiums" -7580,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting Every Day" -7581,0,3039,1,3040,1,3041,1,0,0,0,0,0,0,0,0,0,"Eliminating Risks" -7582,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Daily Cleaning" -7583,0,0,0,0,0,0,0,3039,6708,10000,3040,6708,10000,3041,6708,10000,"Collecting Mana" -7584,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unending Battle" - -// Episode 14.3 part 2 - End of morocc -7593,0,3097,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Demon God Subjugation" -7594,0,3091,1,3092,1,0,0,0,0,0,0,0,0,0,0,0,"Frost Spider and Fire Wolf" -7595,0,3101,3,3102,3,3103,3,0,0,0,0,0,0,0,0,0,"Wandering Orb Magic" -// 7596,0,0,0,0,0,0,0,3105,6713,10000,3106,6714,10000,0,0,0,"Qualifications of the Guests" -7597,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fall of the False God" -7598,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Caged God" -7599,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unending Hunt" -7600,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Promising Tomorrow" - -// Episode 15.1 Verus City -7606,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Phantasmagorika Excavator Recruitment" -7607,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eden Group Leader" -7608,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Artnard Excavation Team 1" -7609,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Artnard Excavation Team 2" -7610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Registered Excavator" -7611,0,3154,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Passage Cleaning" -7612,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Passage Cleaning - Down" -7613,0,3155,15,3156,15,0,0,0,0,0,0,0,0,0,0,0,"Eliminating Risks" -7614,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eliminating Risks - Down" -7615,0,0,0,0,0,0,0,3154,6749,5000,3155,6749,5000,3156,6749,5000,"Core Collection" -7616,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Core Collection - Down" -7617,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Turning In Excavation Report" -7618,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reporting the Results - Down" -7619,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Assisting the Excavation Team" -7620,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Young Blood?" -7621,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bottling the Energy" -7622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Good News!" -7623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Artnard's Summon" -7624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In Search of a Delicacy" -7625,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Count On Me" -7626,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delicacy for Him" -7627,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Last Exploration" -7628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Power Source" -7629,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tomorrow for Tomorrow's Energy" - -// Episode 15.2 Atnad Excavator 2 -7641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Access Permitted" -7642,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Explore Research facilities" -7643,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Piece" -7644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Record Player" -7645,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Piece of Memory Record" -7646,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Play Memory Record" -7647,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report Memory Record" -7648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memory Records of the Laboratories" -7649,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report Memory Record Content" -7650,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect Memory Records of Research facilities" -7651,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"One Memory a Day" -7652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect Memory Records of Laboratories" -7653,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"One Memory a Day 2" -7654,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Play Research facilities Memory Records" -7655,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Play Laboratories Memory Records" -7656,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Invitation of Rekenber" - -// Banquet Quests -7681,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Invitation to Royal Banquet" -7682,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Socializing Starts from an Eye Contact" -7683,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Visit the Heines" -7684,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Visit the Nerius" -7685,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What Is the Next Thing on the Schedule ?" -7686,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nyhill and Skia" -7687,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Participating in the Banquet" -7688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Suspicious Movement" -7689,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Nyhill" -7690,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Where Is Nyhill?" -7691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Waiting for the Ritual" -7692,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Attend the Ritual" -7693,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Surprise Attack" -7694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I'd Like to See that Too" -7695,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the Past Memories of the Royal Family" -7696,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What's Next?" -7697,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Invitation from the Nerius" -7698,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Heine Now" -7699,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Past" -7700,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Once More!" -7701,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lost Imir Heart" -7702,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prontera at the Time" -7703,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Who Knows the Truth" -7705,0,3450,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hope You Cannot Let Go" -7706,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nillem Is Not Almighty" - -// Lasagna Quests -7711,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Beginning" -7712,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Where am I? Who am I??" -7713,0,3495,3,0,0,0,0,0,0,0,0,0,0,0,0,0,"First Battle!" -7714,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Refreshing Apple Juice" -7715,0,0,0,0,0,0,0,3495,1081,5000,0,0,0,0,0,0,"Midding Box" -7716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Village!" -7717,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Merchant's Kindness" -7718,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I'm used to this" -7719,0,1078,3,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time to Digest" -7720,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Service Manual" -7721,600,3496,3,3497,2,0,0,0,0,0,0,0,0,0,0,0,"Cat showoff contest" -7722,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"EMT" -7723,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The potential within" - -// Rockridge -7790,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rock Ridge, Land of Opportunities" -7791,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Problems in Rock Ridge" -7792,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Problems in Rock Ridge 2" -7793,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Good News" -7794,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Expected Response" -7795,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Negotiation on the Railroad" -7796,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unexpected Arrest" -7797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hear Me Out 1" -7798,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Perfectly Prime" -7799,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shawn McCurdy's Weapon 1" -7800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shawn McCurdy's Weapon 2" -7801,0,0,0,0,0,0,0,3742,25247,10000,0,0,0,0,0,0,"Shawn McCurdy's Weapon 3" -7802,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hear Me Out 2" -7803,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Happy for Broken Trust" -7804,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Location of the Ores" -7805,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Location of the Ores 2" -7806,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Location of the Ores 3" -7807,0,3736,3,3737,3,3738,3,0,0,0,0,0,0,0,0,0,"Ace up Our Sleeve" -7808,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Case Solved" -7809,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting Ores" - -8000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quitting Job Change" -8001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Guild Master!" -8007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Acceptance from the Guild Master" -8008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Assassin" -8009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Applying for Job Change to Priest" -8010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Priest" -8017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Factory Inspection" -8032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tarlock's Favor" -8033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ferlock's Favor" -8034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ferlock's Favor" -8035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How the Airship Works" -8036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hallen's Favor" -8037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Dice Roller" -8038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Dice Roller" -8039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret of Airships" -8044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Euslan's Fiancee" -8045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tips from Kaci" -8046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ferlock's Passengers list" -8047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Euslan's Favor" -8048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eukran's Testimony" -8049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thierry's Favor" -8050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Danger coming on to Thierry" -8051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Euslan's Medicine" -8052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thierry's Favor" -8053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Postell" -8054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Message from Postell" -8055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nursing Allen" -8056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Little something in return" -8057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Grumbling Manainne" -8058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with El Schatt" -8059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Perfitz" -8060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stubborn El Schatt" -8061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stories of the past" -8062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kanainne" -8063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kanainne's spirit" -8064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cellette's Fish Cake Soup" -8076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Klitzer and Calla" -8089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Gemstone" -8090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mr. Manson" -8091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jenny the gardener" -8092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching the Market" -8093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Message" -8094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Double Crossed?" -8095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Phobe" -8096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen Gemstone Found" -8097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Informing Jenny" -8098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Keeping the Secret" -8099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vincent's Recommendation" -8100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Recommendation from High Priest Zhed" -8106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mr. Shendar's daughter" -8107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lachellen's Testimony" -8108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Foreigner, Katinshuell" -8109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's scent" -8110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's scent" -8111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lachellen's Testimony" -8112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Freya's Spring" -8113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's Diary" -8114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's Diary" -8115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Suspicious Katinshuell" -8116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lachellen's Testimony" -8117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Freya's Spring" -8118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Mr. Shendar" -8119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's Diary" -8120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Katinshuell" -8121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Katinshuell" -8122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bruspetti's resting place" -8123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ayothaya's world famous dish, Tom Yum Goong" -8124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ayothaya's world famous dish, Tom Yum Goong" -8125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ayothaya's world famous dish, Tom Yum Goong" -8126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ayothaya's world famous dish, Tom Yum Goong" -8127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Momotaro Field Trip" -8128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Momotaro Field Trip" -8129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Momotaro Field Trip" -8130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Momotaro Field Trip" -8131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The mother of lord in Amatsu" -8132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The mother of lord in Amatsu" -8133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Song of the fox" -8134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Boy at the Northern Shrine" -8135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fox Expelled" -8136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Gray Wolf's Warning" -8137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Keymaker" -8138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Blacksmith's Request" -8139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Golden Key" -8140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Red Ring" -8141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mashenka's Red Ring" -8142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching the Marsh" -8143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Flute's Voice" -8144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ryubaba's Confession" -8145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Worried Mother's Request" -8146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding Lusalka" -8147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lusalka's Beloved" -8148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lusalka's Beloved" -8149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Igor" -8150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Igor's message" -8151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Marozka's Cave" -8152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Golden Thread" -8153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of mind and wisdom" -8154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Keymaker" -8155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Favor" -8167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Golden Key" -8168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Koshei, the Immortal" -8169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Living and Dead Water" -8170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Living and Dead Water" -8171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Living and Dead Water" - -8181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sight Blaster" -8182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Push Back Theory" -8183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sight Blaster" -8184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Elemental Converter" -8185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Elemental Change" -8186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fire Elemental Change" -8187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Earth Elemental Change" -8188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wind Elemental Change" -8189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Water Elemental Change" -8190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Charming Wink" -8191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Charming Advisor" -8192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Selfish Advisor" -8193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Selfish Advisor" -8194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Drunken Advisor" -8195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kind Canell" -8196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Tripartite Union's Feud" -8197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Document Delivery" -8198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the United Research Official" -8199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"United Research Official's Favor" -8200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ryosen's Document Requests" -8201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Document" -8202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Document Restoration" -8203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Document Restoration" -8204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ryosen" -8205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the United Research Official" -8206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Researchers' Meeting" -8207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hansenne is not guilty." -8208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hansenne's Favor" -8209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hue's Report" -8210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to the United Research Official" -8211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Order" -8217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dequ'ee's Message" -8218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's order" -8223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dequ'ee's order" -8224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The clue" -8225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dequ'ee's Reasoning" -8226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bankley's Death" -8227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Return to Shurank" -8228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shurank's Lecture" -8229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prontera Market Research" -8235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guarnien's Lecture" -8241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collection of Red Jewel" -8242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collection of blue Jewel" -8243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Learning new languages" -8244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fairies and Tree Giants" -8245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Language sample investigation" -8246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Language sample investigation" -8247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Research progress" -8248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Research progress" -8249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Compressing Information" -8250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Storage Gem" -8251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Injection of Magic" -8252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Handworked jewels" -8253,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Language translation device" - -8254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"with a light heart and body" -8255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The test of power for existence" -8256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The test of power for existence" -8257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Providing food of Teardrop" -8258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Providing food of Teardrop" -8259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"to a place for taking a practical technique test" -8260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mission! Documents delivery" -8261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"When you play the flute,then the wolf show up!" -8262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ranger master never again" - -8265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"One time a one hour!" - -8266,0,1077,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting poison spore!" -8267,0,1056,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting smokie!" -8268,0,1033,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt elder wilow!" -8269,0,1104,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt coco!" -8270,0,1034,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt tharafrog!" -8271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toxic sprays delivery!" -8272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver a honey!" -8273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver a blanket!" -8274,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect bones!" -8275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect feet!" -8276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect scell!" -8277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect tails!" -8278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect cookies!" -8279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collect mustache!" - -9000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Knight" -9001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loyalty of a Knight" -9002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loyalty of a Knight" -9003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Honor of a Knight" -9004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Honor of a Knight" -9005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tenacity of a Knight" -9006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tenacity of a Knight" -9007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Honor of a Knight" -9008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Etiquette as a Knight" -9009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Life as a Knight" -9010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quality of reverence" -9011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Life as a Knight" -9012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glory of a Knight!" -9013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Change to Wizard" -9018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Certified as a Wizard!" -9058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"O'Riley's Request" -9059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Happy St. Patrick's Day" -9117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse" -9118,0,1109,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse - Deviruchi Hunt" -9119,0,1291,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse - Wraith Dead Hunt" -9120,0,1504,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse - Dullahan Hunt" -9121,0,1379,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse - Nightmare Terror Hunt" -9122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse" -9123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lina's Curse" -9024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An errand boy from Einbroch" -// kRO -//9028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Mouse" -//9029,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Mouse : present conditions" -// iRO/cRO -9028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Hydra" -9029,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Hydra : present conditions" -9030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find a puppy" -9031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find a puppy" -9032,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find a puppy" - -9155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Getting materials for the Jaty Crown" -9156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Make the Jaty Crown" -9157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reward from Sage, Kasyapa" -9158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery of Good News(1)" -9159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Paiko" -9160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery of Good News(2)" -9161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Paiko" -9162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery of Good News(3)" -9163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Paiko" -9164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery of Good News(4)" -9165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reward from Paiko for success of Jaty Crown" - -9167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tutorial - Mercenary for Hire" -9168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest Window Check" -9169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Window Shopper Catalogue" -9170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Window Shopper Catalogue" -9171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enchanting Items" -9172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enchanted Items" -9173,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tutorial Timer Cooldown" - -9222,0,2327,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bangungot from Hospital 2F" -9223,604800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Will there be Peace at the Hospital?" -9224,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Explore Hospital 2F" - -9225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 1" -9226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 2" -9227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 3" -9228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 4" -9229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 5" -9230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 6" -9231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 7" -9232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 8" -9233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 9" -9234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 10" -9235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 11" -9236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 12" -9237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 13" -9238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 14" -9239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 15" -9240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luen's statement notes" -9241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luen's statement notes" -9242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luen's statement notes" -9243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luen's statement notes" -9244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dames's statement notes" -9245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dames's statement notes" -9246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dames's statement notes" -9247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dames's statement notes" -9248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rosa's statement notes" -9249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rosa's statement notes" -9250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rosa's statement notes" -9251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rosa's statement notes" -9252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Observing Poppy" -9253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a messy bookshelf" -9254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a damaged book" -9255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a container for soda cans" -9256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a messed up table" -9257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Examining a foreign object" -9258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Field examination results" -9259,0,2363,5,2364,30,0,0,0,0,0,0,0,0,0,0,0,"Confirming Cruyan's statements" -9260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Survey investigation notes" -9262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystery Robbery Incident 16" - -// Academy 14.2 -9264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job change to Mage" -9265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job change to Mage" -9266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job change to Mage" -9267,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The way to be a strong Mage - 1" -9268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The way to be a strong Mage - 2" -9269,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The way to be a strong Mage - 3" -9270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The way to be a strong Mage - 4" - -//Geffen Magic Tournament -9284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stopping Geffen Gangsters" -9285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Beating Geffen Gangsters" -9286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stop Geffen Gangsters" -9287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Defeating Geffen Gangsters" -9288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Catch a Geffen thief" -9289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get things back from the thief" -9290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Participate in Magic competitions" -9291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Participate in Magic competitions" -9292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Participate in Magic competitions" -9293,0,1106,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Register in Magic Competition" -9294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Registration Complete" -9295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"1st match of the Tournament has started" -9296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"2nd match of the Competition has started" -9297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"3rd match of the Competition has started" -9298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"4th match of the Competition has started" -9299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"5th match of the Competition has started" -9300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"6th match of the Competition has started" -9301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"7th match of the Competition has started" -9302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"8th match of the Competition has started" -9303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"9th match of the Competition has started" -9304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"10th match of the Competition has started" -9305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"11th match of the Competition has started" -9306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"12th match of the Competition has started" -9307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Final match of the Competition has started" -9308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Magic Competition Win~!" -9309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Magic Tournament defeat" -9310,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Encounter Iris" -9311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Encounter Chaos" -9312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Encounter Lydia" -9313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Encounter Fenrir" -9314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Encounter Loki" -9315,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring the dimensional gap" -9316,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Re-exploring the crack of spaces" - -// EP14.3 Morse's Cave -9318,0,3000,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Hiding Morocc" -9319,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pursuing Hiding Morocc Continues" - -//9327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9331,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9332,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//9334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" - -// Sarah Fenrir memorial -9335,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Search for shards of Gigantes" -9336,604800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Go back to Professor Bernhard" -9337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wrapping up the Adventure" - -// Rockridge -9457,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solved Anyway" -9458,0,3743,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pipe Cleaning" -9459,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Too Early for Pipe Cleaning" -9460,0,0,0,0,0,0,0,3736,25260,5000,3737,25260,5000,3739,25260,5000,"Collecting Ore Fragments" -9461,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Enough Ores" - -10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Prontera Royal Court" -10001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Qualification Test" -10002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Qualification Review" -10003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Instructions on what to do" -10004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interim Report" -10005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Eigen Ahrum" -10006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Ernst" -10007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Poe" -10008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Peter" -10009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Urugen" -10010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Helmut" -10011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prince Erich" -10012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation of the two princes" -10013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for the unknown girl" -10014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Peter" -10015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test 15" -10016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Guest from the Walter Family" -10017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conspiracy" -10018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Poe" -10019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Peter" -10020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Erich" -10021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Urugen" -10022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Villainous Ahrum - Helmut" -10023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eigen Ahrum and Ernst -Former-" -10024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eigen Ahrum and Ernst -Latter-" -10025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Good-bye, dear!" -10026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reforming Meto" -10034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Search the knife" -10035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deliver the knife" -10036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-Candy" -10037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-Crap Shells" -10038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-Conch" -10039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-Fish Tail" -10040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-White Platter" -10041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Material Supply-?" -10042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keys-5 remained" -10043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keys-5 remained" -10044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keys-4 remained" -10045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-4 remained" -10046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-3 remained" -10047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-3 remained" -10048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-2 remained" -10049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-2 remained" -10050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-1 remained" -10051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-1 remained" -10052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-To the piano" -10053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find the Piano Keyboard-Fill the empty spot" -10054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"On the Verge of the Escape-Clint Kana" -10055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Understanding the culture of Utan" -10056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Learning Utan Language" -10057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Onward to the Other World" -10079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10085,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10087,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" -10089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape from the reality, into the broad world" - -10090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" -10101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changes to Mechanic" - -10102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of the sphinx dungeon" -10103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of Glast heim" -10104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of Juno" -10105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of a clock tower" -10106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To client - the chapter of localizing " -10107,0,1164,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sphinx dungeon - Requiem" -10108,0,1140,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sphinx dungeon - Marduk" -10109,0,1154,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sphinx dungeon - Pasana" -10110,0,1260,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glast heim - Dark Frame" -10111,0,1117,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glast heim - Evil druid" -10112,0,1192,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glast heim - Wraith" -10113,0,1276,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glast Heim - Raydric Archer" -10114,0,1369,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno - Grand Peco" -10115,0,1386,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno - sleeper" -10116,0,1372,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno - Goat" -10117,0,1376,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno - Harpy" -10118,0,1269,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock tower - Clock" -10119,0,1199,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock tower - Punk" -10120,0,1195,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock tower - Rideword" -10121,0,1883,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Localizing - Uzhas" -10122,0,1404,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Localizing - Miyabi Doll" -10123,0,1516,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Localizing - Mi Gao" - -11000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Inspection of Odin Shrine" -11009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morriphen's Request" -11010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching the medicine" -11011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Medicine for two" -11012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Makkie" -11013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red Plant Stem Powder" -11014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The researcher's medicine" -11015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Siria's cure" -11016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morriphen's story" -11017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -11022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exploring Juperos" -// iRO Event Quest -//11023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 1" -//11024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 2" -//11025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 3" -//11026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 4" -//11027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 5" -//11028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Help Mr. Zabaroo - 6" -11029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Going to the Turtle Island.." -11038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet the Dead" -11044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Herb Medicine - Being a Doctor's Assistance" -11070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Poison King" -11084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Surroundings" -11085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Surroundings" -11086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Surroundings" -11087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing the Tent" -11088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing the Tent" -11089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing the Tent" -11090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing the Tent" -11091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivering Supplies" -11099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To My Friend" -11100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To My Friend" -11101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret note of Bazet" -11102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret note of Bazet" -11103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret note of Bazet" -11104,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resting time" -11105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilrion skin" - -11106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job changing to Warlock" -11113,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Until radering is functioning" - -11114,0,1004,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Honet" -11115,0,1009,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Condor" -11116,0,1052,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Grasshopper's Leg" -11117,0,1024,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Worm tail" -11118,0,1014,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Spore" -11119,0,1048,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Pest Control" -11120,0,1055,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Muka" -11121,0,1005,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Farmiliar" -11122,0,1019,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Collect Feather" -11123,0,1077,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Collect Poison Spore" -11124,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Honet - Complete" -11125,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Condor - Complete" -11126,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Grasshopper's Leg - Complete" -11127,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Worm Tail - Complete" -11128,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Spore - Complete" -11129,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Pest Control - Complete" -11130,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Muka - Complete" -11131,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Hunt Farmiliar - Complete" -11132,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Collect Feather - Complete" -11133,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request : Collect Poison Spore - Complete" - -11135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The sky, plane and travel sickness." -11141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Human & gossip is towarding to the bar" -11142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fearful metalic sound" -11143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos tower" -11144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juno manager : click" -11145,0,1622,33,0,0,0,0,0,0,0,0,0,0,0,0,0,"I want to get the " -11146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"to ice tunnel..." -11147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lared's dew" -11148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Toward Comodo with the bow" -11149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Just pour the water. Pour! Pour!..." -11150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for Maestro Song" -11152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"to the quiet place!..." -11153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing watch top" -11154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I will remember the memories with you...." -11155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"undefinable battler" -11156,0,1106,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"annoying homework" -11157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helmes valley " -11158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"On the way for meditation" - -11159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Brian" -11160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of John" -11161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Tyler" -11162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Rose" -11163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Bain" -11164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Story of Lash" -11165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Brian" -11166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to John" -11167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Tyler" -11168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Rose" -11169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Bain" -11170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Lash" -11171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Frede" -11172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Frede" -11173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request from Frede" -11174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Supply Shortage" -11175,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Supply Shortage" -11176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"For my friends" - -// Mora -11182,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Theore's Report" -11183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Theore's Favor" -11184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Runaway Laphine" -11185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Roast Beef" -11190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Roast Beef" -11191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shortage of Roast Beef" -11192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Village..." -11193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sonya's Friend" -11194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Runaway Laphine" -11195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Village..." -11199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Theo's Friend" -11200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouch" -11201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Roast Beef" -11202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Roast Beef" -11203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shortage of Roast Beef" -11204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Village..." -11205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pauchon's Friend" -11206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quick Delivery Yoneseu" -11207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Very Heavy Burden" -11208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Daphne" - -// Malangdo -11209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hardships of Thomas" -11210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Reunion" -11221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Fruits" -11239,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Malangdo Fruits" -11240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11243,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repair of cracks" -11244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soft Jelly" -11245,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soft Jelly" - -// Academy 14.2 -11255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Otter Ssamsun" - -11284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-1" -11285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-2" -11286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-3" -11287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-4" -11288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-5" -11289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-6" -11290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-7" -11291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-8" -11292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-9" -11293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-10" -11294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-11" -11295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-12" -11296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-13" -11297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-14" -11298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-15" -11299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-16" -11300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-17" -11301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-18" -11302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-19" -11303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-20" -11304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-21" -11305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-22" -11306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-23" -11307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-24" -11308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-25" -11309,0,2327,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nurse at Port Malaya-26" - -11310,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eclage's Entrance" -11311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eclage's Entrance" -11312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Goliath" -11313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Goliath" -11314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Goliath" -11315,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11317,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11319,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11324,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"And time keeps on flowing" -11325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11326,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11327,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11331,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11332,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The chicken or the egg" -11333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red seed and green seed" -11334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red seed and green seed" -11335,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dreaming boy" -11336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dreaming boy" -11337,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dreaming boy" - -// Academy 14.2 -11338,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Subino" -11339,0,1002,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The most delicious on earth" -11340,0,1063,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Carrots are delicious!" -11341,0,1007,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rolling Fabre's clothing" -11342,0,1004,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Antidote Material~" -11343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Alice" -11344,0,1008,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Barrier!!" -11345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with Alice" -11346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Acolyte_damped creatures(LV.13)" -11347,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Acolyte_soft bone(LV.18)" -11348,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Acolyte_Solid bone(LV.23)" - -// Dimensional Travel Quest -11349,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dimensional Travel" -11350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dimensional Travel" -11351,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dimensional Travel" -11352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dimensional Travel" -11353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dimensional Travel" -11354,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Specimen Collection" -11355,0,3026,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Specimen Collection" -11356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Specimen Collection" -11357,0,3028,25,0,0,0,0,0,0,0,0,0,0,0,0,0,"Specimen Collection" -11358,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Specimen Collection" -11359,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Antidote" -11360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Antidote" -11361,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Antidote" -11362,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Antidote" - -// Episode 15.1 To Phantasmagorika! -11363,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Phantasmagorika!" -11364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Phantasmagorika!" -11365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Phantasmagorika!" -11366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Phantasmagorika!" -11367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for the Traces" -11368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for the Traces" -11369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for the Traces" -11370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for the Traces" -11371,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for the Traces" -11372,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for the Traces" -11373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for the Traces" -11374,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for the Traces" -11375,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Looking for the Traces" -11376,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Let the Specialists Handle It" -11377,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Act of Kindness" - -11378,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Trick or treat" // Halloween Event 2013 - -// Episode 15.2 The Last Room Instance -11379,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Final Room" -11380,0,3254,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Final Room" -11381,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vestige" -11382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vestige" -11383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vestige" -11384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vestige" -11385,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vestige" -11386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vestige" -11387,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vestige" -11388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vestige" -11389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vestige" - -// Banquet Quests -11394,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Call of the Royal Head Chef" -11395,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11396,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11397,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11398,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11399,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11401,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11402,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11403,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11404,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11405,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11406,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11407,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11410,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11411,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11412,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Geoborgs" -11413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11414,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11415,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11416,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11417,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11418,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11419,0,0,0,0,0,0,0,3455,6935,3000,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Why Should I Prepare for the Banquets?" -11421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Banquet: Unexpected Sauce" -11422,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Complete Today's Sauce" -11423,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Banquet: Griffin Barbecue" -11424,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Banquet: Griffin Barbecue" -11425,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Complete Today's Grilled Griffin" -11426,0,0,0,0,0,0,0,3455,6935,3000,0,0,0,0,0,0,"Banquet: Washing 15 Dishes" -11427,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Complete Today's Dish Collecting" -11428,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ingredient for the Sauce" -11429,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ingredient for the Sauce" -11430,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ingredient for the Sauce" -11431,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ingredient for the Sauce" - -// Lasagna Quests -11435,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" -11436,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" -11437,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" -11438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" -11439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" -11440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" -11441,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" -11442,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" -11443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" -11444,0,0,0,0,0,0,0,3499,25045,5000,0,0,0,0,0,0,"Vigilante Corp" -11445,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigilante Corp" - -12000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An old friend" -12001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Digotz, Maku's old friend" -12002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Messenger of Friendship" -12003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Digotz's message" -12004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Maku's other friend" -12005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein" -12006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein's lost item" -12007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kazien" -12008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Researcher Garins" -12009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Failed mission" -12010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"No entrance" -12011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lyozien" -12012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet Mr. Ahman" -12013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery complete" -12014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"More missions" -12015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ghalstein" -12016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sneaking into the Laboratory" -12017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Membership approved" -12018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meeting the President" -12019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The President's Mission" -12020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rescuing a Secret Wing Member" -12021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Sealed File Folder" -12022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Sealed File Folder" -12023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shinokas the researcher" -12024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kafra Corporation Agent" -12025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rekenber's Secret Archive" -12026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rekenber's Secret Archive" -12027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rekenber's Secret Archive" -12028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kurelle the traitor" -12029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lost Engagement Ring" -12030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Engagement Ring Found" -12031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Annon" -12032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Annon" -12033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Traces of blood" -12034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Annon's side of the story" -12035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Holy Threads" -12036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Stone Slate Message" -12037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Holier Threads" -12038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for the Sa-mhing Tiger" -12039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Boonthom's Comrade" -12040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein's Journal" -12041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein's Journal" -12042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Benkaistein's Journal" -12043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pass to the Slums" -12044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 1" -12045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 2" -12046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 3" -12047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 4" -12048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Soothing a crying child 5" -12049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 1 - Rogue" -12050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 2 - Rogue" -12051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 3 - Rogue" -12052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 4 - Rogue" -12053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 5 - Rogue" -12054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest 6 - Rogue" -12055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest - Assassin" -12056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Job Quest - Assassin" -12057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pass to the Lab" -12058,604800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Admission Restricted to the 102 Tower" -12059,7200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orc's Memory Time Limit" -12060,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Today's Fishing Closed" -12061,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Concentration" -12062,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Today's Mining Closed" -12070,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Limited time for enter" -12071,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stamp a seal on the attendance book" -12072,0,1034,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt tharafrog" -12073,0,1248,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Cruiser" -12074,0,1070,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Kukre" -12075,0,1686,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove orcbaby" -12076,0,1023,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove orcwarroir" -12077,0,1066,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt vadon" -12078,0,1064,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Megalodon" -12079,0,1144,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Marse" -12080,0,1067,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Cornutus" -12081,0,1151,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Myst" -12082,0,1074,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt shellfish" -12083,0,1142,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Marine sphere" -12084,0,1158,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Phen" -12085,0,1152,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove orcskeleton" -12086,0,1177,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Zenorc" -12087,0,1041,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove mummy" -12088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Accomplishing a request" - -12090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious guy" -12091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Just save the burning heart" -12092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Long lasting story" -12093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"the record the intelligence Lyoda left" -12094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The damaged shield letter" -12096,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Towards Karakas" -12097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Basic preparation" -12098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tour of dungeon" -12099,0,2014,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Remove Root Cause" -12100,0,1994,12,0,0,0,0,0,0,0,0,0,0,0,0,0,"Violent Winged Insect" -12101,0,2013,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Work Interference" -12102,0,1993,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Intelligent Snakes" -12103,0,1992,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Legendary Creature" -12104,0,1987,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Insects with an Appetite" -12105,0,2024,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Moving Rocks" -12106,0,1995,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"A child on a flower" -12107,0,2015,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Twisted Love" -12108,0,1988,12,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dangerous Plant Removal" -12109,0,1999,14,0,0,0,0,0,0,0,0,0,0,0,0,0,"Larva Extermination" -12110,0,2016,7,0,0,0,0,0,0,0,0,0,0,0,0,0,"Demon of Water" -12111,0,1986,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bird with ugly face" -12117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Withered Flower" -12118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Welcomed Mineral" -12119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Valuable Textile" -12120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Curious Meat" -12121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Materials to Clear Snow" -12122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Best Cooler Material" -12123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Best Paint" -12124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rare Valuable" -12125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Armory Material" -12126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Advanced Armory Material" -12127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Supervisor's Tool" -12128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Preparation for Heating" -12129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Suspicious Food" -12130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Useful Material" -12131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Essential Material for Construction" -12132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Essential Material for Construction 2" -12133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Decoration arrangement" -12134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Instant Receptacle" -12135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Not enough medicine" -12136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Honey robber" -12137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tools for Experiment" -12138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fine Gift Samples" -12139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Respect for Taste!" -12140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Courtesy for Regulars" -12141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Special Package" -12142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dangerous Request" -12143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Trend" -12144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unknown Usage" -12145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Other World Cuisine" -12146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Filling in Cracks" -12147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adhesive Material" -12148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bait for Tatacho Hunting" -12149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Swordmanship Practice" -12150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pretty reddish vegetable" -12151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tenacity of the pub owner" -12152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tastes like home cooking" -12153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hazardous plant when burnt" -12154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unexpectedly Normal" -12155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gift with heart" -12156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Respect personal appetite!" -12157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resolution of the pub owner" -12158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rage of the pub owner" -12159,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Laponte" -12160,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Kalipo" -12161,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Pura" -12162,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Tragis" -12163,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Calyon" -12164,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quest record from Moltuka" -12165,21600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dizziness" -12166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tree Root Doc." -12167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reptile Tongue Doc." -12168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scorpion Tail Doc." -12169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stem Doc." -12170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pointed Scale Doc." -12171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resin Doc." -12172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spawn Doc." -12173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jellopy Doc." -12174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fish Tail Doc." -12175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Worm Peeling Doc." -12176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gill Doc." -12177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tooth of Bat Doc." -12178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fluff Doc." -12179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Chrysalis Doc." -12180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Feather of Birds Doc." -12181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Talon Document Doc." -12182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sticky Webfoot Doc." -12183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Animal Skin Doc." -12184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wolf Claw Doc." -12185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mushroom Spore Doc." -12186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orc's Fang Doc." -12187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Evil Horn Doc." -12188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Powder of Butterfly Doc." -12189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bill of Birds Doc." -12190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snake Scale Doc." -12191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Insect Feeler Doc." -12192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Immortal Heart Doc." -12193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rotten Bandage Doc." -12194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Decayed Nail Doc." -12195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Horrendous Mouth Doc." -12196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tentacle Doc." -12197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shell Doc." -12198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scale Shell Doc." -12199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Venom Canine Doc." -12200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sticky Mucus Doc." -12201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bee Sting Doc." -12202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Grasshopper's Leg Doc." -12203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Royal Jelly Doc." -12204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Yoyo Tail Doc." -12205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Solid Shell Doc." -12206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Yam Doc." -12207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Raccoon Leaf Doc." -12208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snail's Shell Doc." -12209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Horn Doc." -12210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bear's Footskin Doc." -12211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Feather Doc." -12212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Red Herb Doc." -12213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Carrot Doc." -12214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cactus Needle Doc." -12215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stone Heart Doc." -12216,21600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pouty Jahbong" -12217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Request - Traces of wild boar hunt" -12218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to make lava elixir" -12219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to creat flame elixir" -12220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to create glaicer elixir" -12221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to create fossil elixir" -12222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How to create storm elixir" - -// Mora Coin Daily Quests -12225,0,2132,3,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pom Spider Hunting" -12226,0,2133,4,0,0,0,0,0,0,0,0,0,0,0,0,0,"Angra Mantis Hunting" -12227,0,2134,5,0,0,0,0,0,0,0,0,0,0,0,0,0,"Parus Hunting" -12228,0,2136,6,0,0,0,0,0,0,0,0,0,0,0,0,0,"Little Fatam Hunting" -12229,0,2137,7,0,0,0,0,0,0,0,0,0,0,0,0,0,"Miming Hunting" -12230,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Monster Hunt" -12231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Insect Feeler Collecting" -12232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Immortal Heart Collecting" -12233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rotten Bandage Collecting" -12234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orcish Voucher Collecting" -12235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Skeleton Bone Collecting" -12236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memento Collecting" -12237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shell Collecting" -12238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Scale Shell Collecting" -12239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Venom Canine Collecting" -12240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sticky Mucus Collecting" -12241,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Item Request 1" -12242,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mora Item Request 2" - -// Missing Person Quests -12243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Tajareu" -12244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Tokenizer" -12245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Mesile" -12246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Noir" -12247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Pajama God" -12248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Mendel" -12249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Miles" -12250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Kunmune" -12251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Chayihokin" -12252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Information on Tuale" -12253,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing Person Search Time Limit" - -// Malangdo Culverts -12254,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Now it's cleaning" -12255,0,2176,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea crab" -12256,0,2175,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea squid" -12257,0,2174,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Ancient crustacean" -12258,0,2178,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea shell" -12259,0,2179,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt ancient kukre" -12260,0,2177,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea conch" -12261,0,2182,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea horse" -12262,0,2181,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt ancient sword fish" -12263,0,2180,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt ancient sea god" -12264,0,2183,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt mutation anolian" -12265,0,2184,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt deep sea mermaid" -12266,0,2185,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt transformable kapha" -12267,0,2188,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt weird coelacanth" -12268,0,2187,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt dark coelacanth" -12269,0,2190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Cruel coelacanth" -12270,0,2189,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt mutation coelacanth" -12271,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In progress general culvert single day service" -12272,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In progress hard culvert single day service" -12273,579600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In progress general culvert weekly service" -12274,579600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In progress hard culvert weekly service" - -12278,604800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Towards Bakonawa Lake..." -12279,0,2322,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Get Rid of Bakonawa" - -12280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A suspicious prisoner" -12281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An unwanted favor" -12282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gossip king Clever" -12283,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The rift researcher" -12284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A cat merchant's source of information" -12285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A way to calm down a cat" -12286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Information traded for some canned foods" -12287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A weird experience" -12288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A successful experience" -12289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Another visitation" -12290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clever's historical documents" -12291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hidden historical documents (?)" -12292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The unknown ones" -12293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Figures in history" -12294,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tour of Eclage" -12295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Error" -12296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fun times with the reactor" -12297,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Encountering Etran" -12298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Two wishes" -12299,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revisiting Robert" -12300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Revisiting Etran" -12301,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Two remaining friends" - -// Academy 14.2 -12302,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Salim Hamid" -12303,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Applicant for trader" -12304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Introduction to merchantology" -12305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"About the capability figure" -12306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Experience of disounts" -12307,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Way to the Merchant" -12308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Removal of Worm Tails" -12309,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Removal of Boa" -12310,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Removal of Spore" -12311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Removal of Pirate Skeletons" -12312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Supplementary to the theory lesson" -12313,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"About stats" -12314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"About skills" - -// Old Glast Heim -12316,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meeting Hugin" -12317,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Trace of Time Travel" -12318,0,2475,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Corrupted Soul Hunt" -12319,0,2476,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Amdarais Hunt" -12320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time Traveler" -12321,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time Conqueror" -12322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Space Distortion" - -// Faceworm's Nest -12325,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Faceworm's Nest after-effects" -12326,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The owner of old ring" -12327,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The memory of old photo album" -12328,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dol-Seoi's Sorrow" -12329,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Keaton's Bracelet" - -// Horror Toy Factory - Ep 14.2 -12330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Skull-faced Girl" -12331,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Trail of Toy Factory" - -12334,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Trace of Time Travel" -12335,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Space Distortion" -//12336,0,3151,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Corrupted Soul Hunt" -//12337,0,3150,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Amdarais Soul Hunt" -12338,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time Traveler" -12339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time Conqueror" -12340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rebellion Job Change Quest" -12341,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rebellion Job Change Quest" -12342,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rebellion Job Change Quest" -12343,0,3169,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rebellion Job Change Quest" -12344,0,3170,3,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rebellion Job Change Quest" -12345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rebellion Job Change Quest" - -// Episode 15.2: Central Laboratory -12346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Strange Ancient Science" -12347,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Trace of Laboratory Access" - -12363,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"?????? ?? ??" - -// Banquet Quests -12369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Business Relation" - -// Rockridge -12381,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"New Continent's Food Supplier" -12382,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Distributing Food" -12383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sweet Potato Delivery" -12384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meat Delivery" -12385,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Carrot Delivery" -12386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Banana Delivery" -12387,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pumpkin Delivery" -12388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mushroom Delivery" -12389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Guardian of Rock Ridge" -12390,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Relieved for Now" -12391,0,3736,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Buffaloes with Rifles" -12392,0,3737,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Punishing the Red Masks" -12393,0,3738,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eye Patch Desperadoes" -12394,0,3739,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exterminate Gray Four-legged Beasts" -12395,0,3787,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exterminate Swamp Arclouzes" -12396,0,3788,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Exterminate Brown Rats" -12398,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"You're Good" -12399,0,3747,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Heinous Criminals" -12400,0,3748,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Heinous Criminals" -12401,0,3749,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunt Heinous Criminals" -12402,0,3740,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Eliminate Dangerous Gas" -12403,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Laborers of Rock Ridge" -12404,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Are You Not Tired?" -12405,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Maintain the Red Pipe" -12406,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Maintain the Blue Pipe" -12407,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Maintain the Yellow Pipe" -12408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Maintain the White Pipe" -12409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pipes Maintained" -12410,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Contract with the Wealthy Merchant" -12411,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Come Back Tomorrow" - -13000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"RWC2011Card Gathering" -13001,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"RWC2011Card Gathering - Hold" - -// Eden 100-110 -13002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brigan collecting" -13003,0,1267,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Carat Request" -13004,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Carat Request timer" -13005,0,1194,22,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arclouse Request" -13006,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Arclouse Request timer" -13007,0,1206,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anolian Request" -13008,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anolian Request timer" -13009,0,1207,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sting Request" -13010,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sting Request timer" -13011,0,1310,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Majoruros Request" -13012,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Majoruros Request timer" -13013,0,1995,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pinguicula Request" -13014,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pinguicula Request timer" -13015,0,1994,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luciola Vespa Request" -13016,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Luciola Vespa Request timer" -13017,0,1106,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Desert Wolf Request" -13018,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Desert Wolf Request timer" -13019,0,1775,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snowier Request" -13020,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snowier Request timer" -13021,0,1777,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ice Titan Request" -13022,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ice Titan Request Timer" -13023,0,1379,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nightmare Terror Request" -13024,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nightmare Terror Request Timer" -13025,0,1384,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Flying Deleter Request" -13026,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deleter Request Timer" -13040,0,1505,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loli Ruri Request" -13041,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Loli Ruri Request Timer" -13042,0,1148,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Medusa Request" -13043,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Medusa Request Timer" -13044,0,1098,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anubis Request" -13045,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anubis Request Timer" -13046,0,1991,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilion Request" -13047,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilion Request Timer" -13048,0,1991,1,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilion Request" -13049,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Tendrilion Request Timer" - -13050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Laphine that loves the land" -13051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The singing Laphine" -13052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The watering Laphine" -13053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The dancing Laphine" -13054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The smiling Laphine" -13055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"See if all the adventurers are safe" -13056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reporter Rossi" -13057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adventurer Euncheong" -13058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Troublemaker New Oz" -13059,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"End of project" -13060,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Safety confirmation complete!" -13061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Food support" -13062,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Food support - complete" -13063,0,2365,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dusting off" -13064,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dusting off - complete" -13065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Collecting a souvenir" -13066,79200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"This is enough for souvenirs" - -// Eden 111-120 -13067,0,1163,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Raydric research" -13068,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Raydric research - timer" -13069,0,1132,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Khalitzburg research" -13070,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Khalitzburg research - timer" -13071,0,1208,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wander Man research" -13072,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wander Man research - timer" -13073,0,1699,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Mimic research" -13074,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Mimic research - timer" -13075,0,1698,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Death Word research" -13076,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Death Word research - timer" -13077,0,1295,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Owl Baron research" -13078,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Owl Baron research - timer" -13079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bloody Page Research" -13080,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bloody Page Research - Wait" -13081,0,2015,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dark Pinguicula research" -13082,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dark Pinguicula research - timer" -13083,0,1988,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nepenthes research" -13084,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nepenthes research - timer" -13085,0,1993,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Naga research" -13086,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Naga research - timer" -13087,0,1999,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Centipede Larva research" -13088,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Centipede Larva research - timer" -13089,0,1992,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cornus research" -13090,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Cornus research - timer" -13091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystic Horn Research" -13092,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mystic Horn Research - Wait" -13093,0,1297,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Mummy research" -13094,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Mummy research - timer" -13095,0,1374,10,1370,10,1390,10,0,0,0,0,0,0,0,0,0,"Geffenia expedition" -13096,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffenia expedition - Wait" -13097,0,1677,30,1678,30,1679,30,0,0,0,0,0,0,0,0,0,"Juperos expedition" -13098,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Juperos expedition - Wait" -13099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fragments and Rusty Screw" -13100,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fragments and Rusty Screw - Wait" - -// Academy 14.2 -13101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The way of Taekwon" -13102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Spinning kick" -13103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Breaking Willows" -13104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Breaking Spores" -13105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Breaking Zombies" -13106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Breaking Skeletons" - -// Eden 121-130 -13107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower Search" -13108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rachel holy ground Search" -13109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unknown island Search" -13110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake Search" -13111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower Search - Reporting results" -13112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rachel holy ground Search - Reporting results" -13113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nameless Island Search - Reporting results" -13114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake Search - Reporting results" -13115,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thanatos Tower Search - Wait" -13116,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rachel holy ground Search - Wait" -13117,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Unknown island Search - Wait" -13118,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake Search - Wait" -13119,0,1702,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Baroness of Retribution" -13120,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Baroness of Retribution - Wait" -13121,0,1703,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Lady Solace" -13122,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Lady Solace - Wait" -13123,0,1701,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Mistress of Shelter" -13124,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Mistress of Shelter - Wait" -13125,0,1700,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Dame of Sentinel" -13126,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Dame of Sentinel - Wait" -13127,0,1771,20,1772,20,0,0,0,0,0,0,0,0,0,0,0,"Combat Vanberk and Isilla" -13128,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Vanberk and Isilla - Wait" -13129,0,1773,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Hodremlin" -13130,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Hodremlin - Wait" -13131,0,1769,20,1770,20,0,0,0,0,0,0,0,0,0,0,0,"Combat Agav and Echio" -13132,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Agav and Echio - Wait" -13133,0,1865,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Ragged Zombie" -13134,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Ragged Zombie - Wait" -13135,0,1864,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Zombie Slaughter" -13136,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Zombie Slaughter - Wait" -13137,0,1867,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Banshee" -13138,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Banshee - Wait" -13139,0,1714,30,1717,30,0,0,0,0,0,0,0,0,0,0,0,"Combat Ferus and Bewler" -13140,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Ferus and Bewler - Wait" -13141,0,1713,30,1716,30,0,0,0,0,0,0,0,0,0,0,0,"Combat Acidus" -13142,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combat Acidus - Wait" - -// Eden 131-140 -13143,0,1652,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Egnigem Story" -13144,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Egnigem Story - Wait" -13145,0,1654,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Armeyer Story" -13146,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Armeyer Story - Wait" -13147,0,1653,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whikebain Story" -13148,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whikebain Story - Wait" -13149,0,1656,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kavach Story" -13150,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kavach Story - Wait" -13151,0,1655,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Errende Story" -13152,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Errende Story - Wait" -13153,0,1657,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Laurell Story" -13154,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Laurell Story - Wait" -13155,0,1918,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story1" -13156,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story1 - Wait" -13157,0,1919,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story2" -13158,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story2 - Wait" -13159,0,1921,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story3" -13160,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Morocc Story3 - Wait" -13161,0,2083,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Uni-horn Scaraba Story" -13162,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Uni-horn Scaraba Story - Wait" -13163,0,2084,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Horn Scaraba Story" -13164,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Horn Scaraba Story - Wait" -13165,0,2085,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Antler Scaraba Story" -13166,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Antler Scaraba Story - Wait" -13167,0,2086,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rake horn Scaraba Story" -13168,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rake horn Scaraba Story - Wait" - -13181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nightmarish Jitterbug" -13182,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nightmarish Jitterbug: Waiting" -13183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Nightmarish Jitterbug: Completed" -13184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Charleston Factory" -13185,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Charleston Factory - Hold" -13186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Charleston Factory - Complete" -13187,0,3125,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deal with the Staff" -13188,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Deal with the Staff - Hold" - -// Episode 15.2 Krotzel's Request -13195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monthly Brigan" -13196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monthly Brigan" -13197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monthly Brigan" -13198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monthly Brigan : Krotzel's Request" -13199,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Krotzel's Request - Complete" -13200,0,3247,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monthly Brigan : Rookie's Request" -13201,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rookie's Request - Complete" -13202,0,3248,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monthly Brigan : Photo Journalist's Request" -13203,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Photo Journalist's Request - Complete" -13204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monthly Brigan : Grylls' Request" -13205,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Grylls' Request - Complete" - -14118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wuhari's concern" -14119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of patience" -14120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of patience 2" -14121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of patience 3" -14122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time for two" -14123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wuharu's favor" -14125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Surveying the area" -14126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Ms. Goatie" -14127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Ms. Goatie's husband" -14128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Obtaining the research report" -14131,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Analysis time" -14133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Another favor" -14134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sharp Ms. Goatie" -14135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for Mr. Pompe" -14136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A terrible scene in the field" -14137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"An interesting proposition" -14138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The big corpse" -14139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Wuhuru" -14140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Wuhari" -14141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ingredients for research" - -// Academy 14.2 -14142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Archer's town!" -14143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Application for the Archer's job change" -14144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Retest - Stats" -14145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Archer Skills" -14146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting training" -14147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Retest - Skills" -14148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the next step" -14149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Listening to the 2nd job change" -14150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the next step" -14151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting training - Spoa" -14152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting training - Creamy" -14153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting training - Skeleton" -14154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fragrant herb mix" -14155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Crunchy salad" -14156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anything shabushabu" -14157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baked golden apple" -14158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Presentation of the Archer manual" -14159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Met with the PR staff" -14160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Met with the PR staff" -14161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of stats" -14162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of skills" -14163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Caught Spores" -14164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Caught Creamy" -14165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Caught Skeletons" - -//14254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14258,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14259,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14267,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14268,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14269,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14275,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14283,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14284,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14286,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14289,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//14291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" - -// Banquet Quests -14469,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Look around the Walther Family" -14470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In Search of the Guardian Knight" -14471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Royal Prison" -14472,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gourmet Bigfoot" -14473,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Veins" -14474,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Isenhonor" -14475,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Jurgen" -14476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Levuiere and His Wife" -14477,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"What Is Going on?" -14478,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Searching for the Clue" -14479,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clean-up out of Apology" -14480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conquer the Grease" -14481,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conquer the Mold" -14482,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conquer the Dirt of Devil" -14483,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report the Completion of the Clean-up" -14484,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"There Was a Furniture Delivery Man" -14485,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I Am Upset" -14486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I Heard the Story" -14487,0,0,0,0,0,0,0,1148,6927,3000,0,0,0,0,0,0,"Please Find the Token of Memory" -14488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Please Deliver My Love" -14489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I Have to Turn It Down" -14490,0,0,0,0,0,0,0,1148,6927,3000,0,0,0,0,0,0,"My Love Once More" -14491,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I Have to Turn It Down Again" -14492,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"There Is a Silver Lining" -14493,0,0,0,0,0,0,0,1148,6927,3000,0,0,0,0,0,0,"Today I Feel" -14494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I Have to Turn It Down Again" -14495,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Wolf" -14496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Isaac" -14497,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery for Wolf" -14498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Which Rumor" -14499,0,1310,33,0,0,0,0,0,0,0,0,0,0,0,0,0,"Prove Yourself" -14500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Complete checking out the book" -14501,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Wolf" -14502,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Isaac" -14503,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Wolf" -14504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In Search of Helmut" -14505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I Won't go Back" -14506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Things Turned out This Way" -14507,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Maximilian" -14508,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jewel and Cloth" -14509,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Still Making It" -14510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pink Petal-like Dress" -14511,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Beautiful Flower Decoration" -14512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dress of the Night Sky" -14513,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shawl of the Blazing Sun" -14514,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Step of the Fairy" -14515,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sparkling Star" -14516,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Suspicious Shadow" - -// Lasagna Quests -14531,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Everything about Con-Chliina" -14532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Greetings to Captain Gamberi" -14533,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Say hi to recorder" -14534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the kitchen" -14535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Purser" -14536,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery to Chef" -14537,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"When do we take off?" -14538,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Can we take off?" -14539,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Crazy Dragon" -14540,0,0,0,0,0,0,0,3502,25049,5000,0,0,0,0,0,0,"An errand out of nowhere" -14541,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"No news is not a good news" -14542,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How is the Dragon" -14543,0,3502,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Basilisk Hunt" -14544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Now I can leave" -14545,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Purser" -14546,0,3496,5,3497,5,0,0,0,0,0,0,0,0,0,0,0,"Take care of grass thief" -14547,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Can we set out the sailing?" -14548,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Crazy Dragon" -14549,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"No news is not a good news" -14550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"How is the Dragon" -14551,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Chief Basilisk" -14552,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lord Imuk's message" -14553,0,3504,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Basilisk Hunt" -14554,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"We can start sail now" -14555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whole new world of taste" -14556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"There also is a scary thing for me" -14557,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Truth is alway harsh" -14558,0,0,0,0,0,0,0,3503,25049,5000,0,0,0,0,0,0,"Dirty Creatures" -14559,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Charm Effect Duration" -14560,0,0,0,0,0,0,0,3503,25049,5000,0,0,0,0,0,0,"New Ingredient" -14561,0,0,0,0,0,0,0,3503,25049,5000,0,0,0,0,0,0,"Dirty and Filty" -14562,0,0,0,0,0,0,0,3503,25049,5000,0,0,0,0,0,0,"The basic are the best" -14563,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Free time" -14565,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Emergency food supplies" -14566,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Brilliant idea" -14567,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kaluna milk is in Danger!" -14568,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time to persuade" -14569,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Babysitter" -14570,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Processing Anchovy" -14571,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Anchovy fishing ship" -14572,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Helpless..." -14573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"I need the time on my own" -14574,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meal Box Delivery" -14575,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery Complete Report" -14576,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meal Box Delivery Time" -14579,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with Captain" -14580,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Recorder" -14581,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interview with the Chief" -14582,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Recorder" -14583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To Granma" -14584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Recorder" -14588,0,3498,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Competition" -14589,0,3499,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sticky ingredient" -14590,0,3500,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunter's destination" -14591,0,3501,10,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Ingredient" -14592,04:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Resting Time" - -// Rock Ridge -14672,0,3740,15,0,0,0,0,0,0,0,0,0,0,0,0,0,"Preparing for the Firework Festival" -14673,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Time to Make Bombs" - -// A Bed Of Honor -14683,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Device" -14684,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Device" -14685,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Device" -14686,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Device" -14687,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Device" - -// Academy 14.2 -15000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Experiencing abnormal statuses" -15001,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hold your breath" - -// Heroes' Trail Part 1 - Sara's Memory -15002,72000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memorial dungeon: Sara's Memory" -15003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Adventurer leon" - -// Episode 14.3: Isle of Bios -15005,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memorial Dungeon: Isle of Bios" -15006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Isle of Bios Exploration" -15007,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memorial Dungeon: Isle of Bios" -15008,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memorial Dungeon: Isle of Bios" -//15025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" -//15045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"" - -// Episode 15.1 : Airship Assault instance -15050,82800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memorial Dungeon: Airship Assault" -15051,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memorial Dungeon: Airship Assault" -// 15052,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Memorial Dungeon: Airship Assault" - -// 2013 Christmas Event -15055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : We are the great Single Union Army!" -15056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Declare war against couples!" -15057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Prepare the festival!" -15059,86400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Cooldown Timer" -15060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Kwami has joined" -15061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Willer has joined" -15062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Rinka has joined" -15063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Jee has joined" -15064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Christmas : Marty has joined" - -16000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Metz Brayde's Notice" -16001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"First examination" -16002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -1" -16003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -2" -16004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -3" -16005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -4" -16006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -5" -16007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fetching Items for Arian -6" -16008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quiz time!" -16009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quiz time!" -16010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Daewoon's Test" -16011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Jore's Test" -16012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Jore's Materials" -16013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Stone of Sage" -16014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Stone of Sage" -16015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lady Jesqurienne" -16016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jesquerinne's Quiz Challenge" -16017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Failed Quiz Challenge" -16018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Quiz Challenge Triumph" -16019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Search for Dearles" -16020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dearles' Test" -16021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Test of Appreciation" -16022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dearles' Test Part Two" -16023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rhythm Test Passed" -16024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Bakerlan" -16025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bakerlan's delivery" -16026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mahatra's delivery" -16027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bakerlan's Receipt" -16028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Find Seylin" -16029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigorgra Medicine" -16030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigorgra Ingredients" -16031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vigorgra Ingredients" -16032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Seylin's Request" -16033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Seylin" -16034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to Mahatra" -16035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Bakerlan" -16036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The last Crumb" -16037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding Engel Howard" -16038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Liana's Letter" -16039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combining the Starlight" -16040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Letter to Engel's Family" -16041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Talk to Liana" -16042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sobbing Starlight Progress" -16043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Restored Sobbing Starlight" -16044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Combining the Starlight" -16045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Starlight message" -16046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The man in Umbala" -16047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Into the Tree" -16048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Ancient Papers" -16049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Record of Ancient Language" -16050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Fastidious Old Man" -16051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Blurry Vision" -16052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Translating the Document" -16053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Translated Ancient Language" -16054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Where the rejected live" -16055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Misfortunate of Niflheim" -16056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Removed Curse" -16057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meeting the witch" -16058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wing Of Crow" -16059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Wing Of Crow" -16060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Misfortunate of Niflheim" -16061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bard in Niflheim" -16062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gen of Niflheim" -16063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Witch's Aid" -16064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Misfortunate of Niflheim" -16065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Queen's Symbol" -16066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Knowledge of the Symbol" -16067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Knowledge of Asgard" -16068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Finding the Soul Pieces" -16073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Agrboda's Soul" -16074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Symbol of the Nine Realms" -16075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Serin's Ambitions" -16076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Witch's Tonic" -16077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Serin's Release" - -// Rock Ridge -16078,0,3739,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Peace of the Family" -16079,4:00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back for More Coyotes Tomorrow" -16080,0,3739,30,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Coyotes Again" -16081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Failed to Get Juice Mix Package" -16082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" -16083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Wasteland Cactuten" -16084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" -16085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Coyote" -16086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" -16087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Cactus Girl" -16088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Coyote" -16089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" -16090,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" -16091,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" -16092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" -16093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" -16094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" -16095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Discovered Suspicious Sand Pile" - -16101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious World Map" -16118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hidden poem" -16119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Snake swords" -16120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A dream?" -16121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Secret Code?" -16122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Old Copper Key" -16123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Green Keycard" -16124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Steel Box" -16125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kiel Hyre Academy" -16200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Limberg's Request" -16201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"TPS Report" -16202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"TPS Report" -16203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"TPS Report" -16204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Crack in the Wall" -16205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Empty Lava Tube" -17000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet with Father Bamph" -17001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Meet with Larjes" -17002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Father Bamph" -17003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Travel to Rachel" -17004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Travel to Veins" -17005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Frustrated Magistrate" -17006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Interrogated Smugglers" -17007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Written Orders" -17008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigating" -17009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"More Investigating" -17010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Further Investigations" -17011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Kurdi's Father" -17012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Karyn's Boat" -17013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"To the Island" -17014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigating the Island" -17015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Research Note" -17016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Regicide" -17017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reporting the King's Death" - -18001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery for Rooney" -18002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery for Rooney" -18003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Delivery for Rooney" -18004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lasda's Request" -18005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jesse's Request" -18006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Krieg's Approval" -18007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Krieg's Trust" -18008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Sir Krieg's Trust" -18009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Into the prison" -18010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jail Break" -18011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bodyguard work" -18017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jail Break" -18018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Jail Break" -18019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre's Songs" -18020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre's Songs" -18021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre's Songs" -18022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre's Songs" -18023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Vitre the Spy" -18030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gaebolg Family Curse" -18060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing boy Mikhail" -18061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mikhail's Whereabouts" -18062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Missing boy Mikhail" -18063,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The isolated swamp" -18064,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to the Village" -18065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"High-strength Adhesive" -18066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Back to the swamp" -18067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Make the paste" -18068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Fixing the Matrushka" -18069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Report to Gallina" -18070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Banishing Winter" -18071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making the magic dust" -18072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Making the magic dust" -18073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Dragon's Lair" -18074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Magic Gourd Bottle" -18075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Containing People's Speech" -18076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Containing People's Speech" -18077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Csar's Request" -18078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Baba Yaga's Secret Medicine" -18079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Winter is Banished" -18100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Legends from Moscovia" -18101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Moving Island" -18102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In Search of The Moving Island" -18103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"In Search of The Moving Island" -18104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mr. Ibanoff's New Friend" -18105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Repairing Charabel" -18106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"As the Tide Turns" -18107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Departing" -18108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Moving Island?" -18109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Moving Island???" -18110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Aged Stranger" -18111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whale Island!" -18112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Story for the Csar" -18113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Evidence for the Csar" -18114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Before Sunset" -18115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Departing" -18116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Whale Island!" -18117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Materials for Evidence" -18118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Mysterious Musical Instrument" -18119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gusli" -18120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Gusli" -18121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Shafka" -19101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" -19129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Eye of Hellion" - -21001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Escape the Wreck" -21002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The first battle" -21008,0,0,0,0,0,0,0,2401,6008,10000,0,0,0,0,0,0,"The first battle" - -50000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Pirate Dagger materials" -50001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Weather Beaten Old Man" -50002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lost Treasure?" -50003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lost Treasure?" -50004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Old Man's Treasure" -50010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A special lock pick" -50011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The special lock pick" -50012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Use the lock pick" -50013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Broken lock pick" -50015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The empty treasure box" -50021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"J Roger" -50022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"J Roger's key materials" -50023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Conversation with J Roger" -50024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bury the treasure" -50025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bury the treasure" -50026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bury the treasure" -50027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Buried treasure" -50028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Stolen treasure!" -50029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A Pirate's Spirit!" - -//60000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"60000" -60001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Extermination" -60007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Endless Tower Effect" -60008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Endless Tower Time Limit" -60009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Orc Hero" -60010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Derik Ver's Request" -60011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Byalan" -60012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Abyss" -60013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Investigation" -60014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffen Dungeon's Monster Investigation" -60015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffen Dungeon's Monster Investigation" -60016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffen Dungeon's Monster Investigation" -60017,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Geffen Dungeon's Monster Investigation" -60018,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Byalan Dungeon's Monster Investigation" -60019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Byalan Dungeon's Monster Investigation" -60020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Byalan Dungeon's Monster Investigation" -60021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Byalan Dungeon's Monster Investigation" -60022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake's Monster Investigation" -60023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake's Monster Investigation" -60024,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake's Monster Investigation" -60025,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Abyss Lake's Monster Investigation" -60026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Continuing the Investigation" -60027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigating Aldebaran" -60028,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Investigation" -60029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Aldebaran Monster Investigation" -60030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Lutie Field Monster Investigation" -60033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60034,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Aldebaran Monster Investigation" -60036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Clock Tower Monster Investigation" -60038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Aldebaran Monster Investigation" -60039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60040,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60041,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Monster Investigation" -60042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60043,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60044,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60049,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60051,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60052,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Investigation of Glastheim" -60055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Glastheim Monster Investigation" -60058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Derik Ver's Brother" -60059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A history lesson" -60060,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"The Crown of Deceit" -60061,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A magic solvent" -60062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Rendering the crown Inert" -60101,0,1019,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Peco Pecos" -60102,0,1019,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Peco Pecos" -60103,0,1019,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Peco Pecos" -60104,0,1127,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Hodes" -60105,0,1127,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Hodes" -60106,0,1127,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Hodes" -60107,0,1007,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Fabres" -60108,0,1007,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Fabres" -60109,0,1007,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Fabres" -60110,0,1008,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Pupa" -60111,0,1008,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Pupa" -60112,0,1008,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Pupa" -60113,0,1104,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Cocos" -60114,0,1104,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Cocos" -60115,0,1104,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Cocos" -60116,0,1103,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Caramels" -60117,0,1103,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Caramels" -60118,0,1103,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Caramels" -60119,0,1271,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Alligators" -60120,0,1271,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Alligators" -60121,0,1271,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Alligators" -60122,0,1018,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Creamys" -60123,0,1018,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Creamys" -60124,0,1018,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Creamys" -60125,0,1378,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Demon Pungus" -60126,0,1378,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Demon Pungus" -60127,0,1378,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Demon Pungus" -60128,0,1110,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dokebi" -60129,0,1110,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dokebi" -60130,0,1110,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dokebi" -60131,0,1493,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dryads" -60132,0,1493,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dryads" -60133,0,1493,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dryads" -60134,0,1119,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Frilldora" -60135,0,1119,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Frilldora" -60136,0,1119,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Frilldora" -60137,0,1372,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Goats" -60138,0,1372,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Goats" -60139,0,1372,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Goats" -60140,0,1040,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Golems" -60141,0,1040,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Golems" -60142,0,1040,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Golems" -60143,0,1586,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Leaf Cats" -60144,0,1586,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Leaf Cats" -60145,0,1586,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Leaf Cats" -60146,0,1076,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Skeletons" -60147,0,1076,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Skeletons" -60148,0,1076,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Skeletons" -60149,0,1026,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Munaks" -60150,0,1026,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Munaks" -60151,0,1026,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Munaks" -60152,0,1170,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Sohees" -60153,0,1170,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Sohees" -60154,0,1170,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Sohees" -60155,0,1403,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Firelock Soldiers" -60156,0,1403,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Firelock Soldiers" -60157,0,1403,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Firelock Soldiers" -60158,0,1405,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Tengus" -60159,0,1405,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Tengus" -60160,0,1405,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Tengus" -60161,0,1675,25,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Venatu" -60162,0,1675,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Venatu" -60163,0,1675,75,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Venatu" -60164,0,1668,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Archdam" -60165,0,1668,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Archdam" -60166,0,1668,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Archdam" -60167,0,1776,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Siromas" -60168,0,1776,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Siromas" -60169,0,1776,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Siroma" -60170,0,1777,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Ice Titans" -60171,0,1777,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Ice Titans" -60172,0,1777,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Ice Titans" -60173,0,1506,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Disguises" -60174,0,1506,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Disguises" -60175,0,1506,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Disguises" -60176,0,1505,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Loli Ruri" -60177,0,1505,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Loli Ruri" -60178,0,1505,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Loli Ruri" -60179,0,1139,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Mantis" -60180,0,1139,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Mantis" -60181,0,1139,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Mantis" -60182,0,1514,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dancing Dragons" -60183,0,1514,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dancing Dragons" -60184,0,1514,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Dancing Dragons" -60185,0,1870,20,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Necromancers" -60186,0,1870,40,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Necromancers" -60187,0,1870,60,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Necromancers" -60188,0,1365,50,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Apocalypse" -60189,0,1365,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Apocalypse" -60190,0,1365,150,0,0,0,0,0,0,0,0,0,0,0,0,0,"Hunting Apocalypse" - -60200,604800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Endless Tower Effect" -60201,14400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Endless Tower Time Limit" -60211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -60212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -60213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Thor Volcano base camp" -60301,0,1155,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60302,0,1155,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60303,0,1714,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60304,0,1714,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60305,0,1717,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60306,0,1717,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60307,0,1713,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60308,0,1713,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60309,0,1716,100,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" -60310,0,1716,200,0,0,0,0,0,0,0,0,0,0,0,0,0,"Dragon Hunting" - -// iRO expanded upon the log entries of this quest. -60351,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" -60352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" -60353,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" -60354,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" -60355,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Bathroom Ghost" - -62238,3600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Midgardian Mercenary timer" diff --git a/db/re/quest_db.yml b/db/re/quest_db.yml new file mode 100644 index 0000000000..d5c8bb5b66 --- /dev/null +++ b/db/re/quest_db.yml @@ -0,0 +1,9573 @@ +# This file is a part of rAthena. +# Copyright(C) 2019 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Quest Database +########################################################################### +# +# Quest Settings +# +########################################################################### +# - Id Quest ID. +# Title Quest title. +# TimeLimit Amount of time before the quest expires. (Default: 0) +# Use a number following by "d" for day(s), "h" for hour(s), "mn" for minute(s), and "s" for second(s). +# Specify with "+" for how long until the quest expires. +# Specify without "+" for the exact time the quest expires using "d" (optionnal), [0-23]"h" (required), [0-59]"mn" (optionnal), [0-59]"s" (optionnal) format. +# Please note the number before "d" only shift the exact timer to the given day(s). +# Targets: Quest objective target. (Default: null) +# - Mob Monster to kill. +# Count Amount of monsters to kill. +# Drops: Quest item drop targets. (Default: null) +# - Mob Monster to kill. 0 will apply to all monsters. (Default: 0) +# Item Item to drop. +# Count Amount of items that will drop. Non-stackable items default to 1. (Default: 1) +# Rate Item drop rate. (10000 = 100%) +########################################################################### + +Header: + Type: QUEST_DB + Version: 1 + +Body: + - Id: 1000 + Title: Transcend + - Id: 1001 + Title: Job Change to Acolyte + - Id: 1002 + Title: Job Change to Acolyte + - Id: 1003 + Title: Job Change to Acolyte + - Id: 1004 + Title: Job Change to Archer + - Id: 1005 + Title: Job Change to Mage + - Id: 1006 + Title: Job Change to Mage + - Id: 1007 + Title: Job Change to Mage + - Id: 1008 + Title: Job Change to Mage + - Id: 1009 + Title: Job Change to Merchant + - Id: 1010 + Title: Job Change to Merchant + - Id: 1011 + Title: Job Change to Merchant + - Id: 1012 + Title: Job Change to Merchant + - Id: 1013 + Title: Job Change to Thief + - Id: 1014 + Title: Job Change to Swordman + - Id: 1015 + Title: Your first quest + - Id: 1016 + Title: Gaining base levels + - Id: 1100 + Title: Solo in the Sphinx Dungeon! + Targets: + - Mob: ZEROM + Count: 20 + - Id: 1101 + Title: Soloing Sphinx Dungeon! + Targets: + - Mob: REQUIEM + Count: 20 + - Id: 1102 + Title: Soloing Clock Tower! + Targets: + - Mob: ARCLOUSE + Count: 40 + - Id: 1103 + Title: Soloing Clock Tower! + Targets: + - Mob: HIGH_ORC + Count: 30 + - Id: 1104 + Title: Solo at Luoyang! + Targets: + - Mob: CHUNG_E + Count: 20 + - Id: 1105 + Title: Solo at Luoyang! + Targets: + - Mob: CIVIL_SERVANT + Count: 50 + - Id: 1106 + Title: Solo at Amatsu Dungeon! + Targets: + - Mob: THE_PAPER + Count: 20 + - Id: 1107 + Title: Solo at Amatsu Dungeon! + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 40 + - Id: 1108 + Title: Solo at Luoyang! + Targets: + - Mob: CHUNG_E_ + Count: 20 + - Id: 1109 + Title: Ropewa & Yuridi - Survivors of the Labyrinth + - Id: 1110 + Title: Ropewa & Yuridi - Victims of the Labyrinth + - Id: 1111 + Title: Ropewa & Yuridi - Maze in the Labyrinth + - Id: 1112 + Title: Ropewa & Yuridi - Lost in the Labyrinth + - Id: 1113 + Title: Ropewa & Yuridi - Torn Apart + - Id: 1114 + Title: Ropewa & Yuridi - The Cost of Restoration + - Id: 1115 + Title: Ropewa & Yuridi - Song of the Abyss + - Id: 1116 + Title: Ropewa & Yuridi - Dead Man's Song + - Id: 1117 + Title: Ropewa & Yuridi - Eternal Promise, Broken Ring + - Id: 1118 + Title: Neighborhood Knight - I Need Clues + - Id: 1119 + Title: Neighborhood Knight - Cooldown + TimeLimit: +23h + - Id: 1145 + Title: Help the poor cat + - Id: 1146 + Title: Help the poor cat + - Id: 1147 + Title: Help the poor cat + - Id: 1148 + Title: Help the poor cat + - Id: 1149 + Title: Help the poor cat + - Id: 1150 + Title: Help the poor cat + - Id: 1151 + Title: Help the poor cat + - Id: 1152 + Title: Help the poor cat + TimeLimit: +23h + - Id: 1153 + Title: Help the poor cat + - Id: 1154 + Title: Help the poor cat + Targets: + - Mob: RED_ERUMA + Count: 20 + - Id: 1155 + Title: Help the poor cat + - Id: 1174 + Title: Rumor, Time and Legend + - Id: 1175 + Title: Rumor, Time and Legend + - Id: 1176 + Title: Rumor, Time and Legend + - Id: 1177 + Title: Rumor, Time and Legend + - Id: 1178 + Title: Rumor, Time and Legend + - Id: 1179 + Title: Rumor, Time and Legend + - Id: 1180 + Title: Get Rid of Bakonawa + Drops: + - Mob: TIYANAK + Item: Lost_Belongings + Rate: 3000 + - Id: 1181 + Title: Get Rid of Bakonawa + Drops: + - Mob: TIYANAK + Item: Lost_Belongings + Rate: 3000 + - Id: 1182 + Title: Get Rid of Bakonawa + Drops: + - Mob: TIYANAK + Item: Lost_Belongings + Rate: 3000 + - Id: 1183 + Title: Get Rid of Bakonawa + Drops: + - Mob: TIYANAK + Item: Lost_Belongings + Rate: 3000 + - Id: 1184 + Title: Get Rid of Bakonawa + - Id: 1185 + Title: Get Rid of Bakonawa + - Id: 1186 + Title: Get Rid of Bakonawa + Targets: + - Mob: TIKBALANG + Count: 15 + - Id: 1187 + Title: Get Rid of Bakonawa + - Id: 1188 + Title: Get Rid of Bakonawa + - Id: 1189 + Title: Get Rid of Bakonawa + - Id: 1190 + Title: Get Rid of Bakonawa + - Id: 1191 + Title: Get Rid of Bakonawa + - Id: 1192 + Title: Get Rid of Bakonawa + - Id: 1193 + Title: Get Rid of Bakonawa + - Id: 1194 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1195 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1196 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1197 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1198 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1199 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1200 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1201 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1202 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1203 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1204 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1205 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1206 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1207 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1208 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1209 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1210 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1211 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1212 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1213 + Title: Look out the window, Cheers for Raccoon Hurray team! + - Id: 1214 + Title: Getting back Professor Worm's memory + - Id: 1215 + Title: Getting back Professor Worm's memory + - Id: 1216 + Title: Getting back Professor Worm's memory + Drops: + - Mob: PETAL + Item: Star_Shape_Mushroom + Rate: 3000 + - Id: 1217 + Title: Getting back Professor Worm's memory + - Id: 1218 + Title: Getting back Professor Worm's memory + - Id: 1219 + Title: Getting back Professor Worm's memory + - Id: 1220 + Title: Getting back Professor Worm's memory + - Id: 1221 + Title: Getting back Professor Worm's memory + - Id: 1222 + Title: Getting back Professor Worm's memory + - Id: 1223 + Title: Getting back Professor Worm's memory + - Id: 1224 + Title: Getting back Professor Worm's memory + - Id: 1225 + Title: Getting back Professor Worm's memory + Targets: + - Mob: LICHTERN_B + Count: 15 + - Id: 1226 + Title: Getting back Professor Worm's memory + - Id: 1227 + Title: Getting back Professor Worm's memory + Drops: + - Mob: PETAL + Item: Star_Shape_Mushroom + Rate: 3000 + - Id: 1228 + Title: Getting back Professor Worm's memory + - Id: 1229 + Title: Swordsman training + - Id: 1230 + Title: Swordsman training + - Id: 1233 + Title: Swordsman training + - Id: 1234 + Title: Swordsman training + - Id: 1235 + Title: Swordsman training + - Id: 1236 + Title: Swordsman training + - Id: 1237 + Title: Shop guide + - Id: 1238 + Title: Shop guide + - Id: 1239 + Title: Shop guide + - Id: 1240 + Title: Shop guide + - Id: 1261 + Title: Cursed Swordman + TimeLimit: +23h + - Id: 1263 + Title: Cursed Swordman + - Id: 1264 + Title: Flaming Basin and Doom Prayers + - Id: 1265 + Title: Flaming Basin and Doom Prayers + - Id: 1266 + Title: Flaming Basin and Doom Prayers + Drops: + - Mob: FIRE_SAND_MAN + Item: PatrolLog + Rate: 2000 + - Id: 1267 + Title: Flaming Basin and Doom Prayers + - Id: 1268 + Title: Flaming Basin and Doom Prayers + Targets: + - Mob: FIRE_SAND_MAN + Count: 20 + - Id: 1269 + Title: Flaming Basin and Doom Prayers + Targets: + - Mob: FIRE_FRILLDORA + Count: 20 + - Id: 1270 + Title: Flaming Basin and Doom Prayers + - Id: 1271 + Title: Flaming Basin and Doom Prayers + - Id: 1272 + Title: Flaming Basin and Doom Prayers + - Id: 1273 + Title: Flaming Basin and Doom Prayers + - Id: 1274 + Title: Flaming Basin and Doom Prayers + - Id: 1275 + Title: Flaming Basin and Doom Prayers + - Id: 1297 + Title: Flaming Basin and Doom Prayers + - Id: 1298 + Title: Gas! Gas! + Targets: + - Mob: GASTER + Count: 20 + - Id: 1299 + Title: Patrol Once a Day + TimeLimit: 4h + - Id: 1321 + Title: Spotty and Her Ring + - Id: 1322 + Title: Found Something + - Id: 1323 + Title: Spotty, No! + - Id: 1324 + Title: Spotty, No! + - Id: 1325 + Title: Spotty, No! + - Id: 1326 + Title: Spotty, No! + - Id: 1327 + Title: Spotty, No! + - Id: 1328 + Title: Found Missing Items + - Id: 1329 + Title: Spotty in the Dreamland + TimeLimit: 4h + - Id: 1330 + Title: Spotty's Holes + - Id: 1331 + Title: Avenging Spotty + Targets: + - Mob: COWRAIDERS1 + Count: 3 + - Mob: COWRAIDERS2 + Count: 3 + - Mob: COWRAIDERS3 + Count: 3 + - Id: 1332 + Title: Blood for Blood + TimeLimit: 4h + - Id: 2000 + Title: Job Change to Blacksmith + - Id: 2001 + Title: Job Change to Blacksmith + - Id: 2002 + Title: Job Change to Blacksmith + - Id: 2003 + Title: Job Change to Blacksmith + - Id: 2004 + Title: Job Change to Blacksmith + - Id: 2005 + Title: Job Change to Blacksmith + - Id: 2006 + Title: Job Change to Blacksmith + - Id: 2007 + Title: Job Change to Blacksmith + - Id: 2008 + Title: Job Change to Blacksmith + - Id: 2009 + Title: Job Change to Blacksmith + - Id: 2010 + Title: Job Change to Blacksmith + - Id: 2011 + Title: Job Change to Blacksmith + - Id: 2012 + Title: Job Change to Blacksmith + - Id: 2013 + Title: Job Change to Blacksmith + - Id: 2014 + Title: Job Change to Blacksmith + - Id: 2015 + Title: Job Change to Blacksmith + - Id: 2016 + Title: Job Change to Blacksmith + - Id: 2017 + Title: Job Change to Rogue + - Id: 2018 + Title: Job Change to Rogue + - Id: 2019 + Title: Job Change to Rogue + - Id: 2020 + Title: Job Change to Rogue + - Id: 2021 + Title: Job Change to Rogue + - Id: 2022 + Title: Job Change to Rogue + - Id: 2023 + Title: Job Change to Rogue + - Id: 2024 + Title: Job Change to Rogue + - Id: 2025 + Title: Job Change to Rogue + - Id: 2026 + Title: Job Change to Rogue + - Id: 2027 + Title: Job Change to Rogue + - Id: 2028 + Title: Job Change to Alchemist + - Id: 2029 + Title: Job Change to Alchemist + - Id: 2030 + Title: Job Change to Alchemist + - Id: 2031 + Title: Job Change to Alchemist + - Id: 2032 + Title: Job Change to Alchemist + - Id: 2033 + Title: Job Change to Alchemist + - Id: 2034 + Title: Job Change to Alchemist + - Id: 2035 + Title: Job Change to Alchemist + - Id: 2036 + Title: Job Change to Alchemist + - Id: 2037 + Title: Job Change to Alchemist + - Id: 2038 + Title: Job Change to Alchemist + - Id: 2039 + Title: Job Change to Alchemist + - Id: 2040 + Title: Job Change to Alchemist + - Id: 2041 + Title: Job Change to Sage + - Id: 2042 + Title: Job Change to Sage + - Id: 2043 + Title: Job Change to Sage + - Id: 2044 + Title: Job Change to Sage + - Id: 2045 + Title: Job Change to Sage + - Id: 2046 + Title: Job Change to Sage + - Id: 2047 + Title: Job Change to Sage + - Id: 2048 + Title: Job Change to Sage + - Id: 2049 + Title: Job Change to Sage + - Id: 2050 + Title: Job Change to Sage + - Id: 2051 + Title: Job Change to Sage + - Id: 2052 + Title: Job Change to Sage + - Id: 2053 + Title: Job Change to Sage + - Id: 2054 + Title: Job Change to Sage + - Id: 2055 + Title: Job Change to Sage + - Id: 2056 + Title: Job Change to Sage + - Id: 2057 + Title: Job Change to Sage + - Id: 2058 + Title: Job Change to Sage + - Id: 2059 + Title: Job Change to Sage + - Id: 2060 + Title: Job Change to Sage + - Id: 2061 + Title: Job Change to Sage + - Id: 2062 + Title: Job Change to Sage + - Id: 2063 + Title: The Crow of the Fate - 1 + - Id: 2064 + Title: The Crow of the Fate - 2 + - Id: 2065 + Title: The Crow of the Fate - 3 + - Id: 2066 + Title: The Crow of the Fate - 4 + - Id: 2067 + Title: The Crow of the Fate - 5 + - Id: 2068 + Title: The Crow of the Fate - 6 + - Id: 2069 + Title: Tierra Gorge Battle + TimeLimit: +5mn + - Id: 2070 + Title: Flavius Battle + TimeLimit: +5mn + - Id: 2071 + Title: Cursed Property + - Id: 2072 + Title: Cursed Property + - Id: 2073 + Title: Cursed Property + - Id: 2074 + Title: Cursed Property + - Id: 2075 + Title: Cursed Property + - Id: 2076 + Title: Cursed Property + - Id: 2077 + Title: Cursed Property + - Id: 2078 + Title: Cursed Property + - Id: 2079 + Title: The past went wrong + - Id: 2080 + Title: The past went wrong + - Id: 2081 + Title: The past went wrong + - Id: 2082 + Title: The past went wrong + - Id: 2083 + Title: The past went wrong + - Id: 2084 + Title: The past went wrong + - Id: 2085 + Title: The past went wrong + - Id: 2086 + Title: The Enterprise + - Id: 2087 + Title: The Enterprise + - Id: 2088 + Title: The Enterprise + - Id: 2089 + Title: The Enterprise + - Id: 2090 + Title: The Enterprise + - Id: 2091 + Title: The Enterprise + - Id: 2092 + Title: The Enterprise + - Id: 2093 + Title: The Enterprise + - Id: 2094 + Title: The Enterprise + - Id: 2095 + Title: The Enterprise + - Id: 2109 + Title: A Mage in the Ice Dungeon + - Id: 2110 + Title: A Mage in the Ice Dungeon + - Id: 2111 + Title: A Mage in the Ice Dungeon + - Id: 2112 + Title: A Mage in the Ice Dungeon + - Id: 2113 + Title: A Mage in the Ice Dungeon + - Id: 2114 + Title: Thor Volcano base camp + - Id: 2115 + Title: Thor Volcano base camp + - Id: 2116 + Title: Thor Volcano base camp + - Id: 2117 + Title: Thor Volcano base camp + - Id: 2118 + Title: Thor Volcano base camp + - Id: 2119 + Title: Thor Volcano base camp + - Id: 2120 + Title: Thor Volcano base camp + - Id: 2121 + Title: Thor Volcano base camp + - Id: 2122 + Title: Thor Volcano base camp + - Id: 2123 + Title: Thor Volcano base camp + - Id: 2124 + Title: Thor Volcano base camp + - Id: 2125 + Title: Thor Volcano base camp + - Id: 2126 + Title: Thor Volcano base camp + - Id: 2127 + Title: Thor Volcano base camp + - Id: 2128 + Title: Thor Volcano base camp + - Id: 2129 + Title: Thor Volcano base camp + - Id: 2130 + Title: Thor Volcano base camp + - Id: 2131 + Title: Thor Volcano base camp + - Id: 2132 + Title: For Arunafeltz + - Id: 2133 + Title: For Arunafeltz + - Id: 2134 + Title: For Arunafeltz + - Id: 2135 + Title: For Arunafeltz + - Id: 2136 + Title: For Arunafeltz + - Id: 2137 + Title: For Arunafeltz + - Id: 2138 + Title: For Arunafeltz + - Id: 2139 + Title: For Arunafeltz + - Id: 2140 + Title: For Arunafeltz + - Id: 2141 + Title: For Arunafeltz + - Id: 2142 + Title: For Arunafeltz + - Id: 2143 + Title: Guild Dungeon Event + TimeLimit: +50s + - Id: 2144 + Title: Guild Dungeon Event + - Id: 2147 + Title: Attitude to the New + - Id: 2148 + Title: Attitude to the New + - Id: 2149 + Title: Attitude to the New + - Id: 2150 + Title: Attitude to the New + Targets: + - Mob: PINGUICULA + Count: 30 + - Id: 2151 + Title: Attitude to the New + Targets: + - Mob: CORNUS + Count: 10 + - Id: 2152 + Title: Attitude to the New + - Id: 2153 + Title: Attitude to the New + - Id: 2154 + Title: Attitude to the New + - Id: 2155 + Title: Attitude to the New + - Id: 2156 + Title: Attitude to the New + - Id: 2157 + Title: Attitude to the New + Targets: + - Mob: TATACHO + Count: 10 + - Id: 2158 + Title: Finding a Fairy + - Id: 2159 + Title: Finding a Tree Giant + - Id: 2179 + Title: Dr. Lifeguard's request + - Id: 2180 + Title: Dr. Lifeguard's request + - Id: 2181 + Title: Dr. Lifeguard's request + - Id: 2182 + Title: Rough Minerals + TimeLimit: +18h + - Id: 2183 + Title: Flower of Alfheim + - Id: 2184 + Title: Flower of Alfheim + - Id: 2185 + Title: Spirit of Alfheim + - Id: 2186 + Title: Helping Grenouille + TimeLimit: +18h + - Id: 2187 + Title: Arch Bishop job changing quest + - Id: 2188 + Title: Arch Bishop job changing quest + - Id: 2189 + Title: Arch Bishop job changing quest + - Id: 2190 + Title: Arch Bishop job changing quest + - Id: 2191 + Title: Arch Bishop job changing quest + - Id: 2192 + Title: Guarana quest + - Id: 2193 + Title: Guarana quest + - Id: 2194 + Title: Guarana quest + - Id: 2195 + Title: Guarana quest + - Id: 2196 + Title: Guarana quest + - Id: 2197 + Title: Guarana quest + - Id: 2198 + Title: Guarana quest + - Id: 2199 + Title: Guarana quest + - Id: 2200 + Title: Guarana quest + - Id: 2201 + Title: Brasilis Water Lily + - Id: 2202 + Title: Brasilis Water Lily + - Id: 2203 + Title: Brasilis Water Lily + - Id: 2204 + Title: Brasilis Water Lily + - Id: 2205 + Title: Brasilis Water Lily + - Id: 2206 + Title: Brasilis Water Lily + - Id: 2207 + Title: Brasilis Water Lily + - Id: 2208 + Title: Bathroom Ghost + - Id: 2209 + Title: Genetic Job Change Quest + - Id: 2210 + Title: Genetic Job Change Quest + - Id: 2211 + Title: Genetic Job Change Quest + - Id: 2212 + Title: Genetic Job Change Quest + - Id: 2213 + Title: Genetic Job Change Quest + - Id: 2214 + Title: Genetic Job Change Quest + - Id: 2215 + Title: Genetic Job Change Quest + - Id: 2216 + Title: Genetic Job Change Quest + - Id: 2217 + Title: Genetic Job Change Quest + - Id: 2218 + Title: Wanderer Job Change Quest + - Id: 2219 + Title: Wanderer Job Change Quest + - Id: 2220 + Title: Wanderer Job Change Quest + - Id: 2221 + Title: Wanderer Job Change Quest + TimeLimit: +10mn + Targets: + - Mob: NOVUS_ + Count: 50 + - Id: 2222 + Title: Wanderer Job Change Quest + - Id: 2223 + Title: Generic Job Change Quest + Targets: + - Mob: G_POISON_SPORE + Count: 100 + - Id: 2271 + Title: Secret in the Woods + - Id: 2272 + Title: Secret in the Woods + - Id: 2273 + Title: Secret in the Woods + - Id: 2274 + Title: Secret in the Woods + - Id: 2275 + Title: Secret in the Woods + - Id: 2276 + Title: Secret in the Woods + - Id: 2277 + Title: Secret in the Woods + - Id: 2278 + Title: Secret in the Woods + - Id: 2279 + Title: Secret in the Woods + - Id: 2280 + Title: Secret in the Woods + - Id: 2281 + Title: Get Rid of Buwaya + Targets: + - Mob: BUWAYA + Count: 1 + - Id: 2289 + Title: Verit Hunting (Nightmare) + Targets: + - Mob: N_VERIT + Count: 20 + - Id: 2290 + Title: Verit Hunting - Cooldown + TimeLimit: +23h + - Id: 2291 + Title: Mummy Hunting - Cooldown + TimeLimit: +23h + - Id: 2292 + Title: Mummy Hunting (Nightmare) + Targets: + - Mob: N_ANCIENT_MUMMY + Count: 20 + - Id: 2293 + Title: Adventurer's Companion + - Id: 2294 + Title: Adventurer's Companion + - Id: 2295 + Title: Adventurer's Companion + - Id: 2296 + Title: Adventurer's Companion + - Id: 2297 + Title: Adventurer's Companion + - Id: 2298 + Title: Adventurer's Companion + - Id: 2299 + Title: Rapid Completion Experience + - Id: 2300 + Title: "Training Center: Talk to General Reindeer" + - Id: 2301 + Title: "Training Center: Leave the boat" + - Id: 2302 + Title: "Training Center: Formation" + - Id: 3000 + Title: Job Change to Bard + - Id: 3001 + Title: Job Change to Bard + - Id: 3002 + Title: Job Change to Bard + - Id: 3003 + Title: Job Change to Bard + - Id: 3004 + Title: Job Change to Bard + - Id: 3006 + Title: Job Change to Crusader + - Id: 3007 + Title: Job Change to Crusader + - Id: 3008 + Title: Job Change to Crusader + - Id: 3009 + Title: Job Change to Crusader + - Id: 3010 + Title: Job Change to Crusader + - Id: 3011 + Title: Job Change to Crusader + - Id: 3012 + Title: Job Change to Crusader + - Id: 3013 + Title: Job Change to Crusader + - Id: 3014 + Title: Job Change to Crusader + - Id: 3015 + Title: Job Change to Crusader + - Id: 3016 + Title: Job Change to Monk + - Id: 3017 + Title: Job Change to Monk + - Id: 3018 + Title: Job Change to Monk + - Id: 3019 + Title: Job Change to Monk + - Id: 3020 + Title: Job Change to Monk + - Id: 3021 + Title: Job Change to Monk + - Id: 3022 + Title: Job Change to Monk + - Id: 3023 + Title: Job Change to Monk + - Id: 3024 + Title: Job Change to Monk + - Id: 3025 + Title: Job Change to Monk + - Id: 3026 + Title: Job Change to Monk + - Id: 3027 + Title: Job Change to Monk + - Id: 3028 + Title: Job Change to Monk - Marathon + - Id: 3029 + Title: Job Change to Monk - Final test + - Id: 3031 + Title: Job Change to Monk - Spiritual Training + - Id: 3032 + Title: Job Change to Monk - Become a Monk + - Id: 3040 + Title: The Curse of Baphomet + TimeLimit: +12h + - Id: 3041 + Title: The Curse of Baphomet + TimeLimit: +3mn + - Id: 3042 + Title: The Cursed Baphomet Doll + - Id: 3043 + Title: The Gigantic Magestic Goat + - Id: 3044 + Title: The Gigantic Magestic Goat + - Id: 3045 + Title: Sealed Shrine + TimeLimit: +2h + - Id: 3046 + Title: Sealed Shrine After-effect + - Id: 3050 + Title: Resurrection of Satan Morocc - 1 + - Id: 3051 + Title: Resurrection of Satan Morocc - 2 + - Id: 3052 + Title: Resurrection of Satan Morocc - 3 + - Id: 3053 + Title: Resurrection of Satan Morocc - 4 + - Id: 3054 + Title: Resurrection of Satan Morocc - 5 + - Id: 3055 + Title: Resurrection of Satan Morocc - 6 + - Id: 3056 + Title: Resurrection of Satan Morocc - 7 + - Id: 3060 + Title: Kids in Veins - Where's the Little Sis? + - Id: 3061 + Title: Kids in Veins - Find a way to unlock the shackles! + - Id: 3062 + Title: Kids in Veins - Find the Locksmith! + - Id: 3063 + Title: Kids in Veins - Mr. Lockenlock? + - Id: 3064 + Title: Kids in Veins - Organic Chamelepu Soap + - Id: 3065 + Title: Kids in Veins - Soap Ingredients + - Id: 3066 + Title: Kids in Veins - To make a Chamelepu Soap... + - Id: 3067 + Title: Kids in Veins - Camel Appetite Stimulants + - Id: 3068 + Title: Kids in Veins - Getting the Camel Dung + - Id: 3069 + Title: Kids in Veins - Where's the Silk Sand Camel? + - Id: 3070 + Title: Kids in Veins - Silk Sand Camel is gone! + - Id: 3071 + Title: Kids in Veins - Silk Sand Camel is found! + - Id: 3072 + Title: Kids in Veins - 1 lump of Camel dung obtained + - Id: 3073 + Title: Kids in Veins - 2 lumps of Camel dung obtained + - Id: 3074 + Title: Kids in Veins - 3 lumps of Camel dung obtained + - Id: 3075 + Title: Kids in Veins - 4 lumps of Camel dung obtained + - Id: 3076 + Title: Kids in Veins - 5 lumps of Camel dung obtained + - Id: 3077 + Title: Kids in Veins - Go to Ms. Ivory + - Id: 3078 + Title: Kids in Veins - Chamalepu Soap is completed! + - Id: 3079 + Title: Kids in Veins - Making the key mold + - Id: 3080 + Title: Kids in Veins - Bringing the key mold + - Id: 3081 + Title: Kids in Veins - All you need is Steel! + - Id: 3082 + Title: Kids in Veins - The Key is Made! + - Id: 3083 + Title: Kids in Veins - Mr. Lockenlock's key + - Id: 3085 + Title: Call from the commander + - Id: 3086 + Title: Commander's Duty + - Id: 3087 + Title: Report to Midgard + - Id: 3088 + Title: Report to the continent - Accident! + - Id: 3089 + Title: Report to the continent - How to restore + - Id: 3090 + Title: Report to the continent - Location of reports + - Id: 3091 + Title: Report to the continent - Location of reports + TimeLimit: +30mn + - Id: 3092 + Title: Report to the continent - Success to restore! + - Id: 3093 + Title: Report to the continent - Report to the continent + - Id: 3094 + Title: Report to the continent - Return to the expedition + - Id: 3100 + Title: Consolidating Heavy Debt - Lost Bond of Debt + - Id: 3101 + Title: Consolidating Heavy Debt - Strange Heap of Earth + - Id: 3102 + Title: Consolidating Heavy Debt - Bond of Debt Found, but... + - Id: 3103 + Title: Consolidating Heavy Debt - Inventor Dorian + - Id: 3104 + Title: Consolidating Heavy Debt - Repair Materials of Magic Dryer + - Id: 3105 + Title: Consolidating Heavy Debt - Repairing Magic Dryer + - Id: 3106 + Title: Consolidating Heavy Debt - Repairing Magic Dryer Failed + - Id: 3107 + Title: Consolidating Heavy Debt - Repairing Magic Dryer Successful + - Id: 3108 + Title: Consolidating Heavy Debt - Let's Run the Magic Dryer + - Id: 3109 + Title: Consolidating Heavy Debt - Restoring the Bond of Debt + - Id: 3110 + Title: Stolen Diamond - Tracking the Diamond + - Id: 3111 + Title: Stolen Diamond - Leblo's Favor + - Id: 3112 + Title: Stolen Diamond - Wola the Doctor + - Id: 3113 + Title: Stolen Diamond - Wola the Doctor + - Id: 3114 + Title: Stolen Diamond - Wola the Doctor + - Id: 3115 + Title: Stolen Diamond - Leblo's Information + - Id: 3116 + Title: Stolen Diamond - Information from Rogue Investigator + - Id: 3117 + Title: Stolen Diamond - Odd Switches + - Id: 3118 + Title: Stolen Diamond - Diamond Found! + - Id: 3119 + Title: Z Gang Wanted - Wanted Notice + - Id: 3120 + Title: Z Gang Wanted - About Z Gang + - Id: 3121 + Title: Z Gang Wanted - Valdes's Favor + - Id: 3122 + Title: Z Gang Wanted - Information from Valdes + - Id: 3123 + Title: Z Gang Wanted - Marybell's Test + - Id: 3124 + Title: Z Gang Wanted - Challenging Moonho Ahn + - Id: 3125 + Title: Z Gang Wanted - Challenging Moonho Ahn + - Id: 3126 + Title: Z Gang Wanted - Information from Marybell + - Id: 3127 + Title: Z Gang Wanted - Z Gang's Attack + - Id: 3128 + Title: Z Gang Wanted - Z Gang's Attack + - Id: 3129 + Title: Z Gang Wanted - Strange Letter + - Id: 3130 + Title: Z Gang Wanted - Decrypting the letter... + - Id: 3131 + Title: Z Gang Wanted - Code's Broken! + - Id: 3132 + Title: Z Gang Wanted - Find the Z Gang's Agit + - Id: 3133 + Title: Z Gang Wanted - Agit Found! + - Id: 3134 + Title: Z Gang Wanted - Clean Sweep of Z Gang + - Id: 3135 + Title: Nidhoggur's Nest + TimeLimit: +3d + - Id: 3136 + Title: Nidhoggur's Nest Time Limit + TimeLimit: +4h + - Id: 3200 + Title: Job changes to Rune knight - Recommendation for Rune knight + - Id: 3201 + Title: Job changes to Rune knight - Secret rendezvous of Rune knight + - Id: 3202 + Title: Job changes to Rune knight - The first test + - Id: 3203 + Title: Job changes to Rune knight - The first test + - Id: 3204 + Title: Job changes to Rune knight - Pass the first test + - Id: 3205 + Title: Job changes to Rune knight - The second test + - Id: 3206 + Title: Job changes to Rune knight - The second test + - Id: 3207 + Title: Job changes to Rune knight - The second test + - Id: 3208 + Title: Job changes to Rune knight - The second test + - Id: 3209 + Title: Job changes to Rune knight - Accumulation of magic energy1 + Targets: + - Mob: DULLAHAN + Count: 10 + - Id: 3210 + Title: Job changes to Rune knight - Accumulation of magic energy2 + Targets: + - Mob: DISGUISE + Count: 10 + - Id: 3211 + Title: Job changes to Rune knight - Accumulation of magic energy3 + Targets: + - Mob: QUVE + Count: 10 + - Id: 3212 + Title: Job changes to Rune knight - Accumulation of magic energy4 + Targets: + - Mob: HYLOZOIST + Count: 10 + - Id: 3213 + Title: Job changes to Rune knight - The second test + - Id: 3214 + Title: Job changes to Rune knight - The second test + - Id: 3215 + Title: Job changes to Rune knight - Pass the second test + - Id: 3216 + Title: Job changes to Rune knight - The final test + - Id: 3217 + Title: Job changes to Rune knight - The final test + - Id: 3218 + Title: Job changes to Rune knight - Pass the final test + - Id: 3219 + Title: Job changes to Rune knight - The end of all test + - Id: 3220 + Title: Job changes to Rune knight - Waiting time of test + TimeLimit: +10mn + - Id: 3250 + Title: Request - What is this bandage for? + Targets: + - Mob: MUMMY + Count: 30 + - Id: 3251 + Title: Request - An alligator of Counterattack + Targets: + - Mob: ALLIGATOR + Count: 30 + - Id: 3252 + Title: Request - My mermaid don't do like this way! + Targets: + - Mob: MERMAN + Count: 30 + - Id: 3253 + Title: Request - Missing occult mania + - Id: 3254 + Title: Request - A country wants you + - Id: 3255 + Title: Request - A wild boar subjugate operation + Targets: + - Mob: SAVAGE + Count: 30 + - Id: 3256 + Title: Request - Ready for waiting summer + - Id: 3257 + Title: Request - A grudge of women + Targets: + - Mob: SOHEE + Count: 30 + - Id: 3258 + Title: Request - A material of delicacy + - Id: 3259 + Title: Request - A agony of a doll master + Targets: + - Mob: MARIONETTE + Count: 30 + - Id: 3260 + Title: Request - Tiresome flies + Targets: + - Mob: HUNTER_FLY + Count: 30 + - Id: 3261 + Title: Request - Unclean girl + Targets: + - Mob: MUNAK + Count: 30 + - Id: 3262 + Title: Request - Queer hobby + - Id: 3263 + Title: Request - A mallet of goblin + - Id: 3265 + Title: Request - Missing occult mania + - Id: 4000 + Title: Sherin's Job Interview + - Id: 4001 + Title: Job Change to Hunter + - Id: 4002 + Title: Job Change to Hunter + - Id: 4003 + Title: Job Change to Hunter + - Id: 4004 + Title: Job Change to Hunter + - Id: 4005 + Title: Job Change to Hunter + - Id: 4006 + Title: Job Change to Hunter + - Id: 4007 + Title: Job Change to Hunter + - Id: 4008 + Title: Job Change to Hunter + - Id: 4009 + Title: Job Change to Hunter + - Id: 4010 + Title: Job Change to Hunter + - Id: 4011 + Title: Job Change to Hunter - Test + - Id: 4012 + Title: Job Change to Hunter + - Id: 4013 + Title: Job Change to Hunter + - Id: 4133 + Title: Iara + - Id: 4134 + Title: Iara + - Id: 4135 + Title: Iara + TimeLimit: +1d + - Id: 4154 + Title: Homunculus Researcher + - Id: 4155 + Title: Homunculus S Mutation Mission - 1 + - Id: 4156 + Title: Homunculus S Mutation Mission - 2 + - Id: 4157 + Title: Homunculus S Mutation Mission - 3 + - Id: 4158 + Title: Homunculus S Mutation Mission - 4 + - Id: 4159 + Title: Homunculus S Mutation Mission - 5 + - Id: 4160 + Title: Homunculus S Mutation Mission - 6 + - Id: 4161 + Title: Siege Expert + - Id: 4162 + Title: Party Recruiting Expert + - Id: 4163 + Title: Battleground Expert + - Id: 4164 + Title: Memorial Dungeon Expert + - Id: 4165 + Title: Map Expert + - Id: 4166 + Title: Passing Grades + - Id: 4167 + Title: "Paradise: Dragon Tail Hunting" + Targets: + - Mob: DRAGON_TAIL + Count: 30 + - Id: 4168 + Title: "Paradise: Spring Rabbit Hunting" + Targets: + - Mob: SPRING_RABBIT + Count: 30 + - Id: 4169 + Title: "Paradise: Pest Hunting" + Targets: + - Mob: PEST + Count: 30 + - Id: 4170 + Title: "Paradise: Bathory Hunting" + Targets: + - Mob: BATHORY + Count: 30 + - Id: 4171 + Title: "Paradise: Alarm Hunting" + Targets: + - Mob: ALARM + Count: 30 + - Id: 4172 + Title: "Paradise: Babayaga Hunting" + Targets: + - Mob: VAVAYAGA + Count: 30 + - Id: 4173 + Title: "Paradise: Hyegun Hunting" + Targets: + - Mob: HYEGUN + Count: 30 + - Id: 4174 + Title: "Paradise: Antique Firelock Hunting" + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 30 + - Id: 4175 + Title: "Paradise: Zipper Bear Hunting" + Targets: + - Mob: ZIPPER_BEAR + Count: 30 + - Id: 4176 + Title: "Paradise: Earth Petite Hunting" + Targets: + - Mob: PETIT + Count: 30 + - Id: 4177 + Title: "Paradise: Rafflesia Hunting" + Targets: + - Mob: RAFFLESIA + Count: 30 + - Id: 4178 + Title: "Paradise: Venomous Hunting" + Targets: + - Mob: VENOMOUS + Count: 30 + - Id: 4179 + Title: "Paradise: Pitman Hunting" + Targets: + - Mob: PITMAN + Count: 30 + - Id: 4180 + Title: "Paradise: Yellow Novus Hunting" + Targets: + - Mob: NOVUS_ + Count: 30 + - Id: 4181 + Title: "Paradise: Solider Hunting" + Targets: + - Mob: SOLIDER + Count: 30 + - Id: 4182 + Title: "Paradise: Freezer Hunting" + Targets: + - Mob: FREEZER + Count: 30 + - Id: 4183 + Title: "Paradise: Heater Hunting" + Targets: + - Mob: HEATER + Count: 30 + - Id: 4184 + Title: "Paradise: Injustice Hunting" + Targets: + - Mob: INJUSTICE + Count: 30 + - Id: 4185 + Title: "Paradise: Rybio Hunting" + Targets: + - Mob: RYBIO + Count: 30 + - Id: 4186 + Title: "Paradise: Dark Priest Hunting" + Targets: + - Mob: DARK_PRIEST + Count: 30 + - Id: 4187 + Title: "Paradise: Stapo Hunting" + Targets: + - Mob: STAPO + Count: 30 + - Id: 4188 + Title: "Paradise: Roween Hunting" + Targets: + - Mob: ROWEEN + Count: 30 + - Id: 4189 + Title: "Paradise: Siroma Hunting" + Targets: + - Mob: SIROMA + Count: 30 + - Id: 4190 + Title: "Paradise: Shinobi Hunting" + Targets: + - Mob: SHINOBI + Count: 30 + - Id: 4191 + Title: "Paradise: Evil Nymph Hunting" + Targets: + - Mob: WICKED_NYMPH + Count: 30 + - Id: 4192 + Title: "Paradise: Deviruchi Hunting" + Targets: + - Mob: DEVIRUCHI + Count: 30 + - Id: 4193 + Title: "Paradise: Mineral Hunting" + Targets: + - Mob: MINERAL + Count: 30 + - Id: 4194 + Title: "Paradise: Kaho Hunting" + Targets: + - Mob: KAHO + Count: 30 + - Id: 4195 + Title: "Paradise: Neraid Hunting" + Targets: + - Mob: NERAID + Count: 30 + - Id: 4196 + Title: "Paradise: Disguise Hunting" + Targets: + - Mob: DISGUISE + Count: 30 + - Id: 4197 + Title: Octopus + TimeLimit: +3h + - Id: 4198 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4199 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4200 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4201 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4202 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4203 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4204 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4205 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4206 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4207 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4208 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4209 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4210 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4211 + Title: 86-90 Mission Board Timer + TimeLimit: +3h + - Id: 4212 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4213 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4214 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4215 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4216 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4217 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4218 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4219 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4220 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4221 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4222 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4223 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4224 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4225 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4226 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4227 + Title: 91-99 Mission Board Timer + TimeLimit: +3h + - Id: 4229 + Title: Devil in the Cave + TimeLimit: +23h + - Id: 4254 + Title: Fairy with a stomache + - Id: 4255 + Title: Revenge! + Targets: + - Mob: MENBLATT + Count: 20 + - Id: 4256 + Title: An accomplice? + - Id: 4257 + Title: Conspiracy + - Id: 4258 + Title: Eirinn + - Id: 4259 + Title: Bourbon + - Id: 4260 + Title: Bee + - Id: 4261 + Title: Counterattack (1) + - Id: 4262 + Title: Counterattack (2) + - Id: 4263 + Title: Counteroffensive (1) + - Id: 4264 + Title: Counteroffensive (2) + - Id: 4265 + Title: Bookshelf use + - Id: 4266 + Title: ????? ?? + - Id: 4267 + Title: ????? ?? + - Id: 4268 + Title: Ninja trainer + - Id: 4269 + Title: Registration at the Academy + - Id: 4270 + Title: Ninja training - stat explanation + - Id: 4271 + Title: Ninja training-explanation about the skills + - Id: 4272 + Title: Ninja training- conversation about the skills + - Id: 4273 + Title: Ninja training- explanation about the weapons + - Id: 4274 + Title: Ninjas training- explanation about job change + - Id: 4275 + Title: Ninja training-Exercise1 + Targets: + - Mob: DROPS + Count: 10 + - Id: 4276 + Title: Ninja training-Exercise2 + Targets: + - Mob: PORING + Count: 10 + - Id: 4277 + Title: Ninja training-Actual battle2 + Targets: + - Mob: ROCKER + Count: 10 + - Id: 4278 + Title: Ninja training-Actual battle1 + Targets: + - Mob: WORM_TAIL + Count: 10 + - Id: 4279 + Title: Ninja training-test + - Id: 4280 + Title: Ninja training-test + - Id: 4281 + Title: Beginner's training-Ninja + - Id: 4282 + Title: Ninja training-exercise1 + Targets: + - Mob: DROPS + Count: 10 + - Id: 4283 + Title: Ninja training-exercise2 + Targets: + - Mob: PORING + Count: 10 + - Id: 4284 + Title: Ninja training-actual battle2 + Targets: + - Mob: ROCKER + Count: 10 + - Id: 4285 + Title: Ninja training-actual battle1 + Targets: + - Mob: WORM_TAIL + Count: 10 + - Id: 4286 + Title: Ninja training-test + - Id: 4287 + Title: Ninja training-test + - Id: 4295 + Title: Wandering Bard + - Id: 4296 + Title: Take a Break + TimeLimit: +23h + - Id: 4297 + Title: "Bard's Story: Some Corporation" + - Id: 4298 + Title: "Bard's Story: The President" + - Id: 4299 + Title: "Bard's Story: a Scholar in Juno" + - Id: 4300 + Title: "Bard's Story: a Mad Scientist" + - Id: 4301 + Title: "Bard's Story: Hugel" + - Id: 4302 + Title: "Bard's Story: Odin Temple" + - Id: 4999 + Title: Extermination Crisis + - Id: 5000 + Title: The Crow of the Fate - 7 + - Id: 5001 + Title: King Froggie VII's revenge + Targets: + - Mob: SIDE_WINDER + Count: 50 + - Id: 5002 + Title: The hero of the frogs + - Id: 5003 + Title: Frog Hiding Skill + - Id: 5004 + Title: Food Shortage + Targets: + - Mob: ARGIOPE + Count: 50 + - Id: 5016 + Title: Bring me a Research Tool Bag + - Id: 5017 + Title: Revenge of the Reseacher + - Id: 5018 + Title: Revenge of the Reseacher + - Id: 5019 + Title: Bathroom Sample Studying + - Id: 5020 + Title: Sample Researching + TimeLimit: +1d + - Id: 5021 + Title: Sample Collecting + - Id: 5022 + Title: Sample Collecting + - Id: 5023 + Title: Inspection of the Sample + TimeLimit: +6h + - Id: 5024 + Title: Eastern Pool Research + - Id: 5025 + Title: Western Pool Research + - Id: 5026 + Title: Southern Pool Research + - Id: 5027 + Title: Northern Pool Research + - Id: 5028 + Title: Inspection of the Sample + TimeLimit: +12h + - Id: 5029 + Title: Unidentified Creature + TimeLimit: +1h + - Id: 5030 + Title: The creature's family + - Id: 5031 + Title: The creature's family + - Id: 5032 + Title: The creature's family + - Id: 5033 + Title: The creature's family + - Id: 5034 + Title: News from the family + - Id: 5035 + Title: Help the old man! + - Id: 5036 + Title: Help the old man! + - Id: 5037 + Title: Help the old man! + - Id: 5038 + Title: Help the old man! + - Id: 5039 + Title: Help the old man! + - Id: 5040 + Title: Help the old man! + - Id: 5041 + Title: Help the old man! + - Id: 5042 + Title: Help the old man! + - Id: 5043 + Title: Help the old man! + TimeLimit: +5mn + - Id: 5044 + Title: Help the old man! + TimeLimit: +1d + - Id: 5045 + Title: Help the old man! + - Id: 5046 + Title: Help the old man! + - Id: 5047 + Title: Help the old man! + - Id: 5048 + Title: Help the old man! + - Id: 5049 + Title: Help the old man! + - Id: 5050 + Title: Help the old man! + - Id: 5051 + Title: Help the old man! + - Id: 5052 + Title: Traditional Weapon + - Id: 5053 + Title: Traditional Weapon + - Id: 5054 + Title: Traditional Weapon + - Id: 5055 + Title: Local Rising - Headless Horse + Targets: + - Mob: HEADLESS_MULE + Count: 15 + - Id: 5056 + Title: Local Rising - Tamruan + Targets: + - Mob: TAMRUAN + Count: 15 + - Id: 5057 + Title: Local Rising - Ready the Festival + - Id: 5058 + Title: The mood of the players-(1) + - Id: 5059 + Title: The mood of the players-(2) + - Id: 5060 + Title: Cat Shock + TimeLimit: +3mn + - Id: 5061 + Title: Am I scared? + - Id: 5062 + Title: I met Eryu. + - Id: 5063 + Title: I met Stew. + - Id: 5064 + Title: I met Ketchup. + - Id: 5065 + Title: I met Eff. + - Id: 5066 + Title: Scary image-(1) + - Id: 5067 + Title: Scary image-(2) + - Id: 5068 + Title: Collecting complaint + TimeLimit: +20h + - Id: 5069 + Title: Token of honor + TimeLimit: +1h + - Id: 5070 + Title: Rock Paper Scissors + TimeLimit: +1d + - Id: 5071 + Title: Chamchamcham + TimeLimit: +1d + - Id: 5072 + Title: Kkongnyangkkong + TimeLimit: +1d + - Id: 5073 + Title: Challenging of flag wave + TimeLimit: +1d + - Id: 5074 + Title: Cat's Meal + Targets: + - Mob: PHEN + Count: 30 + - Id: 5075 + Title: Health food + Targets: + - Mob: MARSE + Count: 50 + - Id: 5076 + Title: Enemies + Targets: + - Mob: KOBOLD_ARCHER + Count: 30 + - Id: 5077 + Title: Reaction Training + Targets: + - Mob: CRAMP + Count: 10 + - Id: 5078 + Title: Light bird food + Targets: + - Mob: PECOPECO + Count: 50 + - Id: 5079 + Title: How to stabilize the mind + - Id: 5080 + Title: Lack of Snack + - Id: 5081 + Title: Banned foods + - Id: 5082 + Title: Cool food + - Id: 5083 + Title: Please come back Eryu-(1) + - Id: 5084 + Title: Please come back Eryu-(2) + - Id: 5085 + Title: Please come back Stew-(1) + - Id: 5086 + Title: Please come back Stew-(2) + - Id: 5087 + Title: Please come back Ketchup-(1) + - Id: 5088 + Title: Please come back Ketchup-(2) + - Id: 5089 + Title: Please come back Eff-(1) + - Id: 5090 + Title: Please come back Eff-(2) + - Id: 5091 + Title: Go Malangdo + - Id: 5092 + Title: Unlocking the Ultimate Mediocrity + - Id: 5093 + Title: Unlocking the Ultimate Mediocrity + - Id: 5094 + Title: Unlocking the Ultimate Mediocrity + Targets: + - Mob: PORING + Count: 1000 + - Id: 5095 + Title: Unlocking the Ultimate Mediocrity + Targets: + - Mob: LUNATIC + Count: 1000 + - Id: 5096 + Title: Unlocking the Ultimate Mediocrity + Targets: + - Mob: FABRE + Count: 1000 + - Id: 5097 + Title: Unlocking the Ultimate Mediocrity + Targets: + - Mob: PICKY + Count: 1000 + - Id: 5098 + Title: Unlocking the Ultimate Mediocrity + - Id: 5099 + Title: Unlocking the Ultimate Mediocrity + - Id: 5100 + Title: Unlocking the Ultimate Mediocrity + - Id: 5109 + Title: Light but Unconfirmed Rumor + - Id: 5110 + Title: The Rumored Character + - Id: 5111 + Title: To the Lab... + - Id: 5112 + Title: Laboratory Restricted Access + TimeLimit: +3d + - Id: 5113 + Title: "[Rest] Lord Knight" + Targets: + - Mob: B_SEYREN + Count: 1 + - Id: 5114 + Title: "[Rest] Paladin" + Targets: + - Mob: B_RANDEL + Count: 1 + - Id: 5115 + Title: "[Rest] High Priest" + Targets: + - Mob: B_MAGALETA + Count: 1 + - Id: 5116 + Title: "[Rest] Champion" + Targets: + - Mob: B_CHEN + Count: 1 + - Id: 5117 + Title: "[Rest] High Wizard" + Targets: + - Mob: B_KATRINN + Count: 1 + - Id: 5118 + Title: "[Rest] Professor" + Targets: + - Mob: B_CELIA + Count: 1 + - Id: 5119 + Title: "[Rest] Whitesmith" + Targets: + - Mob: B_HARWORD + Count: 1 + - Id: 5120 + Title: "[Rest] Creator" + Targets: + - Mob: B_FLAMEL + Count: 1 + - Id: 5121 + Title: "[Rest] Assassin Cross" + Targets: + - Mob: B_EREMES + Count: 1 + - Id: 5122 + Title: "[Rest] Stalker" + Targets: + - Mob: B_GERTIE + Count: 1 + - Id: 5123 + Title: "[Rest] Sniper" + Targets: + - Mob: B_SHECIL + Count: 1 + - Id: 5124 + Title: "[Rest] Clown" + Targets: + - Mob: B_ALPHOCCIO + Count: 1 + - Id: 5125 + Title: "[Rest] Gypsy" + Targets: + - Mob: B_TRENTINI + Count: 1 + - Id: 5131 + Title: Strange Conversation + - Id: 5132 + Title: Family Business-(1) + - Id: 5133 + Title: Family Business-(2) + - Id: 5134 + Title: New path + - Id: 5135 + Title: 4 tests + - Id: 5136 + Title: Knowledge test + - Id: 5137 + Title: Survival test + - Id: 5138 + Title: Weapons test + - Id: 5139 + Title: The guy looks familiar!! + - Id: 5140 + Title: Uncertain chilliness + - Id: 5141 + Title: Got a curse!! + TimeLimit: +2mn + - Id: 5142 + Title: Prototype-(1) + - Id: 5143 + Title: Prototype-(2) + - Id: 5144 + Title: Prototype-(2) + - Id: 5145 + Title: Prototype-(3) + - Id: 5146 + Title: Battle test + - Id: 5147 + Title: Gunslinger basic training(1) + - Id: 5148 + Title: Gunslinger basic training(2) + - Id: 5149 + Title: + Targets: + - Mob: HORNET + Count: 10 + - Id: 5150 + Title: + Targets: + - Mob: RODA_FROG + Count: 10 + - Id: 5151 + Title: + Targets: + - Mob: SAVAGE_BABE + Count: 10 + - Id: 5152 + Title: + Targets: + - Mob: ROCKER + Count: 10 + - Id: 5153 + Title: Refining tutorial (1) + - Id: 5154 + Title: Refining tutorial (2) + - Id: 5155 + Title: Refining tutorial (3) + - Id: 5156 + Title: Refining tutorial (4) + - Id: 5157 + Title: Enchant tutorial (1) + - Id: 5158 + Title: Enchant tutorial (2) + - Id: 5159 + Title: Enchant tutorial (3) + - Id: 5161 + Title: Low Level collection request[Stand by] + TimeLimit: +1d + - Id: 5162 + Title: Low Level collection request + Targets: + - Mob: REQUIEM + Count: 100 + - Id: 5163 + Title: Low Level collection request + Targets: + - Mob: BATHORY + Count: 100 + - Id: 5164 + Title: Low Level collection request + Targets: + - Mob: SPRING_RABBIT + Count: 100 + - Id: 5165 + Title: Low Level collection request + Targets: + - Mob: SLEEPER + Count: 100 + - Id: 5166 + Title: Low Level collection request + Targets: + - Mob: EVIL_DRUID + Count: 100 + - Id: 5167 + Title: Low Level collection request + Targets: + - Mob: PETIT + Count: 100 + - Id: 5168 + Title: Low Level collection request + Targets: + - Mob: CLOCK + Count: 100 + - Id: 5169 + Title: Mid-Level collection request[Stand by] + TimeLimit: +1d + - Id: 5170 + Title: Mid-Level collection request + Targets: + - Mob: SIROMA + Count: 100 + - Id: 5171 + Title: Mid-Level collection request + Targets: + - Mob: DARK_PRIEST + Count: 100 + - Id: 5172 + Title: Mid-Level collection request + Targets: + - Mob: STAPO + Count: 100 + - Id: 5173 + Title: Mid-Level collection request + Targets: + - Mob: SOLIDER + Count: 100 + - Id: 5174 + Title: High level collectiong request[Stand by] + TimeLimit: +1d + - Id: 5175 + Title: High level collection request + Targets: + - Mob: DESERT_WOLF + Count: 100 + - Id: 5176 + Title: High level collection request + Targets: + - Mob: MEDUSA + Count: 100 + - Id: 5177 + Title: High level collection request + Targets: + - Mob: PINGUICULA + Count: 100 + - Id: 5178 + Title: High level collection request + Targets: + - Mob: MAJORUROS + Count: 100 + - Id: 5179 + Title: Highest level collection request + Targets: + - Mob: RAYDRIC + Count: 100 + - Id: 5180 + Title: Highest level collection request + Targets: + - Mob: NAGA + Count: 100 + - Id: 5181 + Title: Highest level collection request + Targets: + - Mob: ANCIENT_MUMMY + Count: 100 + - Id: 5182 + Title: Highest level collection request + Targets: + - Mob: ANCIENT_MIMIC + Count: 100 + - Id: 5222 + Title: Saving the energy crystals + - Id: 5223 + Title: Saving the energy crystals + - Id: 5224 + Title: Saving the energy crystals + - Id: 5225 + Title: Saving energy crystal[Stand by] + TimeLimit: +2h + - Id: 5226 + Title: Saving energy crystal[Stand by] + TimeLimit: +2h + - Id: 5227 + Title: Saving energy crystal[Stand by] + TimeLimit: +2h + - Id: 5304 + Title: Police Chief Kesler + - Id: 5305 + Title: Police Officer Salgran + - Id: 5306 + Title: Police Officer Gerev + - Id: 5307 + Title: Police Officer Seiden + - Id: 5308 + Title: Police Officer Piffs + - Id: 5309 + Title: Police Chief's Request + - Id: 5310 + Title: Salgran's Problem + - Id: 5311 + Title: Gerev's Problem + - Id: 5312 + Title: Seiden's Problem + - Id: 5313 + Title: Piffs's Problem + - Id: 5314 + Title: Salgran's Request + Targets: + - Mob: ILLEGAL_PROMOTION + Count: 10 + - Id: 5315 + Title: Gerev's Request + - Id: 5316 + Title: Seiden's Request + - Id: 5317 + Title: Piffs's Request + - Id: 5318 + Title: Come Back Tomorrow + TimeLimit: +23h + - Id: 5341 + Title: Restriction on the Journey + TimeLimit: +22h + - Id: 5342 + Title: Help Her + - Id: 5343 + Title: Making a Head Count + - Id: 5344 + Title: Making a Head Count + - Id: 5345 + Title: Making a Head Count + - Id: 5346 + Title: Making a Head Count + - Id: 5347 + Title: Finishing a Head Count + - Id: 5348 + Title: Finishing a Head Count + - Id: 5349 + Title: Finishing a Head Count + - Id: 5350 + Title: Finishing a Head Count + - Id: 5351 + Title: Restriction on the Journey + TimeLimit: +22h + - Id: 5352 + Title: Air Purifier + - Id: 5353 + Title: Delivered to C-0 + - Id: 5354 + Title: Delivered to F-1 + - Id: 5355 + Title: Delivered to F-2 + - Id: 5356 + Title: Delivered to I-0 + - Id: 5357 + Title: Delivered to Z-0 + - Id: 5358 + Title: Restriction on the Journey + TimeLimit: +22h + - Id: 5359 + Title: Grape Harvest + - Id: 5360 + Title: Grape Delivery + - Id: 5361 + Title: Grape Delivery + - Id: 5362 + Title: Grape Delivery + - Id: 5363 + Title: Restriction on the Journey + TimeLimit: +22h + - Id: 5364 + Title: Subdue Hysterical Patients + - Id: 5365 + Title: Urgent News + - Id: 5366 + Title: Restriction on the Journey + TimeLimit: +22h + - Id: 5367 + Title: Daily Necessities Transport + - Id: 5368 + Title: Delivered Supplies + - Id: 5369 + Title: Delivered the Message + - Id: 5370 + Title: Memory Record + - Id: 5402 + Title: The Royal Richard + - Id: 5403 + Title: The Royal Richard + - Id: 5404 + Title: "[Repeat]Warrior Discipline-Human" + - Id: 5405 + Title: "[Repeat]Warrior Discipline-Animal" + - Id: 5406 + Title: "[Repeat]Warrior Discipline-Insect" + - Id: 5407 + Title: "[Repeat]Warrior Discipline-Fish" + - Id: 5408 + Title: "[Repeat]Warrior Discipline-Plant" + - Id: 5409 + Title: "[Repeat]Warrior Discipline-Devil" + - Id: 5410 + Title: "[Repeat]Warrior Discipline-Angel" + - Id: 5411 + Title: "[Repeat]Warrior Discipline-Immortal" + - Id: 5412 + Title: "[Repeat]Warrior Discipline-Intangible" + - Id: 5413 + Title: "[Repeat]Warrior Discipline-Dragon" + - Id: 5414 + Title: "[Stand by]Warrior Discipline" + TimeLimit: 4h + - Id: 5415 + Title: Restricted Sector + - Id: 5416 + Title: Restricted Sector A + - Id: 5417 + Title: Restricted Sector B + - Id: 5418 + Title: Restricted Sector C + - Id: 5419 + Title: Restricted Sector D + - Id: 5420 + Title: Restricted Sector E + - Id: 5421 + Title: Restricted Sector F + - Id: 5422 + Title: Restricted Sector G + - Id: 5423 + Title: Restricted Sector H + - Id: 5424 + Title: "[Complete]Restricted Sector" + - Id: 5425 + Title: To My Beloved Fellow + - Id: 5426 + Title: "[Stand by]To My Beloved Fellow" + TimeLimit: 4h + - Id: 5427 + Title: "[Repeat]To My Beloved Fellow" + - Id: 5428 + Title: Lowly Standards + Drops: + - Mob: WATCHER + Item: Red_Eye + Rate: 2000 + - Id: 5429 + Title: "[Stand by]Lowly Standards" + TimeLimit: 4h + - Id: 5430 + Title: "[Repeat]Lowly Standards" + Drops: + - Mob: WATCHER + Item: Red_Eye + Rate: 2000 + - Id: 5431 + Title: Clean Life + - Id: 5432 + Title: "[Repeat]Cleaning is complete." + - Id: 5433 + Title: "[Stand by]Clean Life" + TimeLimit: 4h + - Id: 5434 + Title: "[Repeat]Clean Life" + - Id: 5435 + Title: "[Repeat]Cleaning is complete." + - Id: 5436 + Title: Finding Lights + - Id: 5437 + Title: "[Stand by]Finding Lights" + TimeLimit: 4h + - Id: 5438 + Title: "[Repeat]Finding Lights" + - Id: 5439 + Title: Refreshing Prison Life + Drops: + - Mob: FROZENWOLF + Item: Dehumidifiers + Rate: 2000 + - Id: 5440 + Title: "[Stand by]Refreshing Prison Life" + TimeLimit: 4h + - Id: 5441 + Title: "[Repeat]Refreshing Prison Life" + Drops: + - Mob: FROZENWOLF + Item: Dehumidifiers + Rate: 2000 + - Id: 5442 + Title: Suppressing Darkness + - Id: 5443 + Title: "[Stand by]Suppressing Darkness" + TimeLimit: 4h + - Id: 5444 + Title: "[Repeat]Suppressing Darkness" + - Id: 5445 + Title: Bothersome Little Thing + Drops: + - Mob: TAFFY + Item: Sandpaper + Rate: 2000 + - Id: 5446 + Title: "[Stand by]Bothersome Little Thing" + TimeLimit: 4h + - Id: 5447 + Title: "[Repeat]Bothersome Little Thing" + Drops: + - Mob: TAFFY + Item: Sandpaper + Rate: 2000 + - Id: 5448 + Title: Request from Chief Guard + - Id: 5449 + Title: Request from Chief Guard + - Id: 5450 + Title: Request from Chief Guard + - Id: 5451 + Title: Request from Chief Guard + - Id: 5452 + Title: "[Stand by]Request from Chief Guard" + TimeLimit: 4h + - Id: 5453 + Title: Ungrateful(1) + - Id: 5454 + Title: Ungrateful(2) + - Id: 5455 + Title: Ungrateful(3) + - Id: 5456 + Title: Ungrateful(4) + - Id: 5457 + Title: Find My Sister(1) + - Id: 5458 + Title: Find My Sister(2) + - Id: 5459 + Title: Find My Sister(3) + - Id: 5460 + Title: Blatant Bluff(1) + - Id: 5461 + Title: Blatant Bluff(2) + - Id: 5462 + Title: Blatant Bluff(3) + - Id: 5463 + Title: Mad Love for Wife(1) + - Id: 5464 + Title: Mad Love for Wife(2) + - Id: 5465 + Title: Mad Love for Wife(3) + - Id: 5466 + Title: Mad Love for Wife(4) + - Id: 5467 + Title: Mad Love for Wife(5) + - Id: 5468 + Title: Mad Love for Wife(6) + - Id: 6000 + Title: Job Change to Taekwon + - Id: 6001 + Title: Job Change to Taekwon + - Id: 6002 + Title: Job Change to Taekwon + - Id: 6005 + Title: Job Change to Soul-Linker + - Id: 6006 + Title: Job Change to Soul-Linker + - Id: 6007 + Title: Job Change to Soul-Linker + - Id: 6008 + Title: Job Change to Soul-Linker + - Id: 6010 + Title: Job Change to Super Novice + - Id: 6015 + Title: A favor from Cougar + - Id: 6016 + Title: A favor from a Suspicious Man + - Id: 6017 + Title: Red Leopard Joe's Reply + - Id: 6018 + Title: Cougar's Madness + - Id: 6020 + Title: Master Miller's Letter + - Id: 6021 + Title: Wise Bull Horn's voucher + - Id: 6022 + Title: Making a voucher + - Id: 6023 + Title: Wise Bull Horn's Favor + - Id: 6024 + Title: Job Change to Gunslinger! + - Id: 6025 + Title: KVM Guillaume + TimeLimit: +5mn + - Id: 6026 + Title: KVM Croix + TimeLimit: +5mn + - Id: 6027 + Title: KVM Indicator + TimeLimit: +5mn + - Id: 7000 + Title: Job Change to Dancer! + - Id: 7001 + Title: Job Change to Dancer! + - Id: 7002 + Title: Job Change to Dancer! + - Id: 7003 + Title: Job Change to Dancer! + - Id: 7004 + Title: Job Change to Dancer! + - Id: 7005 + Title: Job Change to Dancer! + - Id: 7006 + Title: Job Change to Dancer! + - Id: 7007 + Title: Warrior of the Sun, the Moon, and the Stars + - Id: 7008 + Title: Warrior of the Sun, the Moon, and the Stars - Nature + - Id: 7009 + Title: Warrior of the Sun, the Moon, and the Stars - the Altar + - Id: 7010 + Title: Warrior of the Sun, the Moon, and the Stars - Stars? + - Id: 7011 + Title: Warrior of the Sun, the Moon, and the Stars + - Id: 7012 + Title: Pursuing Rayan Moore + - Id: 7013 + Title: Pursuing Rayan Moore + - Id: 7014 + Title: Pursuing Rayan Moore + - Id: 7015 + Title: Pursuing Rayan Moore + - Id: 7016 + Title: Pursuing Rayan Moore + - Id: 7017 + Title: Pursuing Rayan Moore + - Id: 7018 + Title: Pursuing Rayan Moore + - Id: 7019 + Title: Pursuing Rayan Moore + - Id: 7020 + Title: Pursuing Rayan Moore + - Id: 7021 + Title: Pursuing Rayan Moore + - Id: 7022 + Title: Pursuing Rayan Moore + - Id: 7023 + Title: Pursuing Rayan Moore + - Id: 7024 + Title: Pursuing Rayan Moore + - Id: 7025 + Title: Pursuing Rayan Moore + - Id: 7026 + Title: Pursuing Rayan Moore + - Id: 7027 + Title: Pursuing Rayan Moore + - Id: 7028 + Title: Pursuing Rayan Moore + - Id: 7029 + Title: Pursuing Rayan Moore + - Id: 7030 + Title: Pursuing Rayan Moore + - Id: 7031 + Title: Pursuing Rayan Moore + - Id: 7032 + Title: Pursuing Rayan Moore + - Id: 7033 + Title: Pursuing Rayan Moore + - Id: 7034 + Title: Pursuing Rayan Moore + - Id: 7035 + Title: Pursuing Rayan Moore + - Id: 7036 + Title: Pursuing Rayan Moore + - Id: 7037 + Title: Case closed? + - Id: 7038 + Title: Passion for Baked Sweet Potatoes + - Id: 7039 + Title: Dodging the conversation + - Id: 7040 + Title: Dodging the conversation + - Id: 7041 + Title: Politics is for the Politicians + - Id: 7042 + Title: Part-time Job - Tatacho's feed + - Id: 7043 + Title: Part-time Job - Cornus's feed + - Id: 7044 + Title: Part-time Job - Hillthrion's feed1 + - Id: 7045 + Title: Part-time Job - Hillthrion's feed2 + - Id: 7046 + Title: Part-time Job - warm rugs + - Id: 7047 + Title: Part-time Job - Let's call it a day! + TimeLimit: +5h + - Id: 7048 + Title: Thanatos Tower - Burled's Favor + - Id: 7049 + Title: Thanatos Tower - Sealed Tower + - Id: 7050 + Title: Thanatos Tower - Sealed Tower + - Id: 7051 + Title: Thanatos Tower - Sealed Tower + - Id: 7052 + Title: Thanatos Tower - Sealed Tower + - Id: 7053 + Title: Thanatos Tower - What they want is.. + - Id: 7054 + Title: Myu's Favor - Teach them a lesson! + Targets: + - Mob: KOBOLD_ARCHER + Count: 1000 + - Id: 7055 + Title: Myu's Favor - Not the cat! + Targets: + - Mob: WILD_ROSE + Count: 1 + - Id: 7056 + Title: Messenger - Arc's Favor + - Id: 7057 + Title: Messenger - Arc's Favor + - Id: 7058 + Title: Messenger - Arc's Favor + - Id: 7059 + Title: Messenger - Terra's Whereabouts + - Id: 7060 + Title: Messenger - Terra's Whereabouts + - Id: 7061 + Title: Messenger - Terra's Whereabouts + - Id: 7062 + Title: Messenger - Terra's Whereabouts + - Id: 7063 + Title: Messenger - Terra's Whereabouts + - Id: 7064 + Title: Messenger - Terra's Whereabouts + - Id: 7065 + Title: Messenger - Terra's Whereabouts + - Id: 7066 + Title: Messenger - Prove the Truth + - Id: 7067 + Title: Messenger - Prove the Truth + - Id: 7068 + Title: Messenger - Prove the Truth + - Id: 7069 + Title: Messenger - Too late! + - Id: 7070 + Title: Messenger - Terra's Return + - Id: 7071 + Title: Messenger - Invitation + - Id: 7074 + Title: Rata Hunt + Targets: + - Mob: RATA + Count: 1 + - Id: 7075 + Title: Duneyrr Hunt + Targets: + - Mob: DUNEYRR + Count: 1 + - Id: 7076 + Title: "Wanted: Dandelion" + Targets: + - Mob: DANDELION_ + Count: 1 + - Id: 7077 + Title: Collecting Dragon Eggs + - Id: 7078 + Title: Collecting Dragon Eggs + TimeLimit: +1d + - Id: 7079 + Title: Finding Refined Bradium + - Id: 7080 + Title: Finding Refined Bradium + TimeLimit: +1d + - Id: 7081 + Title: Helping the Laphine Craftsman + - Id: 7082 + Title: Helping the Laphine Craftsman + TimeLimit: +1d + - Id: 7091 + Title: An advice of Diora 01 + - Id: 7092 + Title: An advice of Diora 02 + - Id: 7093 + Title: An advice of Diora 03 + - Id: 7094 + Title: An advice of Diora 04 + - Id: 7095 + Title: An advice of Diora 05 + - Id: 7096 + Title: A proof of new requirement + - Id: 7097 + Title: A proof of new requirement + - Id: 7098 + Title: A proof of new requirement + - Id: 7099 + Title: A proof of new requirement + - Id: 7100 + Title: A message of Bercascell + - Id: 7101 + Title: Special task of an assassin guild 1 + - Id: 7102 + Title: Special task of an assassin guild 2 + - Id: 7103 + Title: Special task of an assassin guild 3 + - Id: 7104 + Title: Special task of an assassin guild 4 + TimeLimit: +50mn + - Id: 7105 + Title: Special task of an assassin guild 4 + TimeLimit: +10mn + - Id: 7106 + Title: Special task of an assassin guild 5 + - Id: 7107 + Title: Special task of an assassin guild 6 + TimeLimit: +3h + - Id: 7108 + Title: Special task of an assassin guild 7 + - Id: 7109 + Title: Special task of an assassin guild 8 + - Id: 7110 + Title: Special task of an assassin guild 9 + TimeLimit: +10mn + Targets: + - Mob: HIDEN_PRIEST + Count: 1 + - Id: 7111 + Title: Special task of an assassin guild 10 + - Id: 7112 + Title: Information of Madelle + - Id: 7113 + Title: Information of Crave + - Id: 7114 + Title: Information of Trovan + - Id: 7115 + Title: Information of a peddler + - Id: 7116 + Title: Information of a old man + - Id: 7117 + Title: Your first quest! + - Id: 7118 + Title: Novice Training + - Id: 7119 + Title: Novice Training + - Id: 7120 + Title: Novice Training + - Id: 7121 + Title: Novice Training + - Id: 7122 + Title: First battle - Poring Hunt + Targets: + - Mob: PORING + Count: 1 + - Id: 7123 + Title: Battle Basics -Swordman + Targets: + - Mob: PICKY + Count: 2 + - Id: 7124 + Title: Battle Basics -Mage + Targets: + - Mob: LUNATIC + Count: 5 + - Id: 7126 + Title: Selling items + - Id: 7127 + Title: Battle Basics -Thief + Targets: + - Mob: WILOW + Count: 5 + - Id: 7128 + Title: Training course 'conquest a desert!' -start + - Id: 7129 + Title: The training course 'conquer the desert!' - A real battle 1 + Targets: + - Mob: CONDOR + Count: 10 + - Id: 7130 + Title: The training course 'conquer the desert!' - A real battle 2 + Targets: + - Mob: DESERT_WOLF_B + Count: 10 + - Id: 7131 + Title: The training course 'conquer the desert!' - A real battle 3 + Targets: + - Mob: SCORPION + Count: 5 + - Id: 7132 + Title: The training course 'conquer the desert!' - Complete a quest + - Id: 7133 + Title: The training course 'conquer the culvert!' - Start + - Id: 7134 + Title: The training course 'conquer the culvert!' - A real battle 1 + Targets: + - Mob: THIEF_BUG + Count: 10 + - Id: 7135 + Title: The training course 'conquer the culvert!' - A real battle 2 + Targets: + - Mob: TAROU + Count: 10 + - Id: 7136 + Title: The training course 'conquer the culvert!' - A real battle 3 + Targets: + - Mob: FARMILIAR + Count: 5 + - Id: 7137 + Title: The training course 'conquer the culvert!' - Complete a quest + - Id: 7138 + Title: The training course 'conquer the haunted cave!' - Start + - Id: 7139 + Title: The training course 'conquer the haunted cave!' - A real battle 1 + Targets: + - Mob: SKELETON + Count: 15 + - Id: 7140 + Title: The training course 'conquer the haunted cave!' - A real battle 2 + Targets: + - Mob: POPORING + Count: 10 + - Id: 7141 + Title: The training course 'conquer the haunted cave!' - Complete a quest + - Id: 7142 + Title: The training course 'conquer ant hell!' - Start + - Id: 7143 + Title: The training course 'conquer ant hell!' - A real battle 1 + Targets: + - Mob: PIERE + Count: 15 + - Id: 7144 + Title: The training course 'conquer ant hell!' - A real battle 2 + Targets: + - Mob: ANDRE + Count: 15 + - Id: 7145 + Title: The training course 'conquer ant hell!' - A real battle 3 + Targets: + - Mob: VITATA + Count: 10 + - Id: 7146 + Title: The training course 'conquer ant hell!' - Complete a quest + - Id: 7147 + Title: The training course 'conquer the orc village!' - start + - Id: 7148 + Title: The training course 'conquer the orc village!' - A real battle 1 + Targets: + - Mob: ORC_BABY + Count: 10 + - Id: 7149 + Title: The training course 'conquer the orc village!' - A real battle 2 + Targets: + - Mob: ORK_WARRIOR + Count: 10 + - Id: 7150 + Title: The training course 'conquer the orc village!' - A real battle 3 + Targets: + - Mob: ORC_LADY + Count: 10 + - Id: 7151 + Title: The training course 'conquer the orc village!' - Complete a quest + - Id: 7152 + Title: The training course 'conquer the orc dungeon!' - start + - Id: 7153 + Title: The training course 'conquer the orc dungeon!' - A real battle 1 + Targets: + - Mob: ORC_ZOMBIE + Count: 20 + - Id: 7154 + Title: The training course 'conquer the orc dungeon!'- A real battle 2 + Targets: + - Mob: ORC_SKELETON + Count: 20 + - Id: 7155 + Title: The training course 'conquer the orc dungeon!' - complete a quest + - Id: 7156 + Title: The training course 'conquer an undersea city!' - start + - Id: 7157 + Title: The training course 'conquer an undersea city!' - A real battle 1 + Targets: + - Mob: MERMAN + Count: 15 + - Id: 7158 + Title: The training course 'conquer an undersea city!' - A real battle 2 + Targets: + - Mob: STROUF + Count: 10 + - Id: 7159 + Title: The training course 'conquer an undersea city!' - Complete a quest + - Id: 7160 + Title: Mysterious Cryptogram + - Id: 7161 + Title: Mysterious Cryptogram - 2nd + - Id: 7162 + Title: Mysterious Cryptogram - 2nd + - Id: 7163 + Title: Mysterious Cryptogram - 2nd + - Id: 7164 + Title: Hunt for shadow of deception + Targets: + - Mob: S_WIND_GHOST + Count: 1 + - Id: 7165 + Title: Key of deception + - Id: 7166 + Title: Rachel Branch of Shadow Workshop + - Id: 7167 + Title: Mysterious Cryptogram - 3rd + - Id: 7168 + Title: Mysterious Cryptogram - 3rd + - Id: 7169 + Title: Mysterious Cryptogram - 3rd + - Id: 7170 + Title: Mysterious Cryptogram - 3rd + - Id: 7171 + Title: Hunt for shadow of delusion + Targets: + - Mob: S_SKOGUL + Count: 1 + - Id: 7172 + Title: Key of delusion + - Id: 7173 + Title: Message to Halled from Paul + - Id: 7174 + Title: Mysterious Cryptogram - 4th + - Id: 7175 + Title: Hunft for shadow of gaiety + Targets: + - Mob: S_SUCCUBUS + Count: 1 + - Id: 7176 + Title: Key of Gaiety + - Id: 7177 + Title: A young guy in Lighthalzen + - Id: 7178 + Title: Destination of Deception, Delusion and Gaiety + - Id: 7179 + Title: Vicente, you dare! + - Id: 7180 + Title: Message from Doomk + - Id: 7181 + Title: Karakas's ring + - Id: 7182 + Title: Sapha's Visit + - Id: 7183 + Title: Invitation from Sapha + - Id: 7184 + Title: To El Dicastes! + - Id: 7185 + Title: Inspector Doha + - Id: 7186 + Title: Secret Order from Doha - Investigation + - Id: 7187 + Title: Secret Order from Doha - Shay + - Id: 7188 + Title: Information Gathering - in the Plaza + - Id: 7189 + Title: Information Gathering - in the Factory + - Id: 7190 + Title: Information Gathering - at the Guards + - Id: 7191 + Title: Shay's designation - BK + - Id: 7192 + Title: BK's Information + - Id: 7193 + Title: Dimensional Crack Investigation + - Id: 7194 + Title: What's this bloodstain? + - Id: 7195 + Title: What's this skin piece? + - Id: 7196 + Title: What's this suspicious magic power? + - Id: 7197 + Title: Sapha Certifications? + - Id: 7198 + Title: Audience with Ahat + - Id: 7199 + Title: Secret Order from Ahat + - Id: 7200 + Title: Cheshire's call + TimeLimit: +23h + - Id: 7201 + Title: Removing traces + - Id: 7202 + Title: Secret order from Doha - Collect proof + - Id: 7203 + Title: Secret order from Doha - Final Report + - Id: 7206 + Title: New Day for Cheshire + - Id: 7207 + Title: Cheshire's Box + - Id: 7208 + Title: Wait for Cheshire? + TimeLimit: +1d + - Id: 7209 + Title: Forget the box. + - Id: 7210 + Title: Daily delivery + - Id: 7211 + Title: Misty Forest Labyrinth Exploration + TimeLimit: +2h30mn + - Id: 7212 + Title: Loki's Search + - Id: 7213 + Title: Wandering Protector + - Id: 7214 + Title: "Paradise Advanced: Romeo Training" + - Id: 7215 + Title: "Paradise Advanced: Romeo Hunt 1" + Targets: + - Mob: STALACTIC_GOLEM + Count: 3 + - Id: 7216 + Title: "Paradise Advanced: Romeo Hunt 2" + Targets: + - Mob: STALACTIC_GOLEM + Count: 10 + - Id: 7217 + Title: "Paradise Advanced: Romeo Hunt 3" + - Id: 7218 + Title: "Paradise Advanced: Romeo Complete" + - Id: 7219 + Title: "Paradise Advanced: Johan Training" + - Id: 7220 + Title: "Paradise Advanced: Johan Hunt 1" + Targets: + - Mob: WRAITH + Count: 20 + - Id: 7221 + Title: "Paradise Advanced: Johan Hunt 2" + Targets: + - Mob: EVIL_DRUID + Count: 10 + - Id: 7222 + Title: "Paradise Advanced: Johan Complete" + - Id: 7223 + Title: "Paradise Advanced: Kiren Training" + - Id: 7224 + Title: "Paradise Advanced: Kiren Hunt 1" + Targets: + - Mob: PORCELLIO + Count: 30 + - Id: 7225 + Title: "Paradise Advanced: Removed" + Targets: + - Mob: NOXIOUS + Count: 30 + - Id: 7226 + Title: "Paradise Advanced: Kiren Hunt 2 (Part A)" + Targets: + - Mob: VENOMOUS + Count: 30 + - Id: 7227 + Title: "Paradise Advanced: Kiren Hunt 2 (Part B)" + Targets: + - Mob: TEDDY_BEAR + Count: 5 + - Id: 7228 + Title: "Paradise Advanced: Kiren Complete" + - Id: 7229 + Title: "Paradise Advanced: Naomi Training" + - Id: 7230 + Title: "Paradise Advanced: Naomi Hunt 1" + Targets: + - Mob: SIROMA + Count: 30 + - Id: 7231 + Title: "Paradise Advanced: Naomi Hunt 2" + Targets: + - Mob: SIROMA + Count: 30 + - Id: 7232 + Title: "Paradise Advanced: Naomi Complete" + - Id: 7233 + Title: "Paradise Advanced: Margaret Training" + - Id: 7234 + Title: "Paradise Advanced: Margaret's Favor" + - Id: 7235 + Title: "Paradise Advanced: Margaret Hunt 1" + Targets: + - Mob: NEPENTHES + Count: 1 + - Id: 7236 + Title: "Paradise Advanced: Margaret Hunt 2" + Targets: + - Mob: PINGUICULA + Count: 5 + - Id: 7237 + Title: "Paradise Advanced: Margaret Complete" + - Id: 7238 + Title: Toren's Errands (Easy) + - Id: 7239 + Title: Toren's Errands (Normal) + - Id: 7240 + Title: Strengthening Equipment + - Id: 7241 + Title: Toren's Errands - Tomorrow + TimeLimit: +1d + - Id: 7242 + Title: Play with the baby cat + - Id: 7243 + Title: Nyadventure-Duruduru Compass + - Id: 7244 + Title: Nyadventure-Duruduru Race + TimeLimit: +3mn + - Id: 7245 + Title: Nyadventure-Duruduru Race + TimeLimit: +3mn + - Id: 7246 + Title: Nyadventure-I'm coming now. + - Id: 7247 + Title: Nyadventure-Stop the Bang! + - Id: 7249 + Title: Nyadventure-Bang! See you next time + TimeLimit: +1d + - Id: 7250 + Title: Nyadventure-Hidden Treasure? + - Id: 7251 + Title: Nyadventure-The First piece of Painting + - Id: 7252 + Title: Nyadventure-The Second piece of Painting + - Id: 7253 + Title: Nyadventure-The Third piece of Painting + - Id: 7254 + Title: Nyadventure-The Fourth piece of Painting + - Id: 7255 + Title: Nyadventure-The Fifth piece of Painting + - Id: 7256 + Title: Nyadventure-The Sixth piece of Painting + - Id: 7257 + Title: Nyadventure-Race, Come back tomorrow! + TimeLimit: +1d + - Id: 7258 + Title: Nyadventure-Painting completed + - Id: 7259 + Title: Gift from the Mew Bravery Team + - Id: 7260 + Title: The origin of Bugs + - Id: 7261 + Title: Cat Biscuits - Table + - Id: 7262 + Title: Cat Biscuits - Mattress + - Id: 7263 + Title: Cat Biscuits - Grill + - Id: 7264 + Title: To Chef Nyas + - Id: 7265 + Title: Rage of Chef Nyas + - Id: 7266 + Title: Declaration of Chef Nyas + - Id: 7267 + Title: Appointed time with Cleanyang + TimeLimit: +1d + - Id: 7268 + Title: Find the Cat's hard biscuits! + - Id: 7269 + Title: Cat Biscuits - Resting Place + - Id: 7270 + Title: Cat Biscuits - Sand + - Id: 7271 + Title: Cat Biscuits - Bottom of the Stairs + - Id: 7272 + Title: Cat Biscuits - Corner + - Id: 7273 + Title: Cat Biscuits - Locker + - Id: 7274 + Title: Cat Biscuits - Foothold + - Id: 7275 + Title: Cat Biscuits - Sand + - Id: 7276 + Title: Promise to deliver more food + TimeLimit: +1d + - Id: 7281 + Title: List of Errands + - Id: 7282 + Title: List of Errands + - Id: 7283 + Title: List of Errands + - Id: 7284 + Title: List of Errands + - Id: 7285 + Title: List of Errands + - Id: 7286 + Title: List of Errands + - Id: 7287 + Title: List of Errands + - Id: 7288 + Title: List of Errands + - Id: 7289 + Title: List of Errands + - Id: 7290 + Title: List of Errands + - Id: 7291 + Title: List of Errands + - Id: 7292 + Title: List of Errands + - Id: 7293 + Title: List of Errands + - Id: 7294 + Title: List of Errands + - Id: 7295 + Title: List of Errands + - Id: 7296 + Title: List of Errands + - Id: 7297 + Title: List of Errands + - Id: 7298 + Title: List of Errands + - Id: 7299 + Title: List of Errands + - Id: 7300 + Title: List of Errands + - Id: 7301 + Title: List of Errands + - Id: 7302 + Title: List of Errands + - Id: 7303 + Title: List of Errands + - Id: 7304 + Title: List of Errands + - Id: 7305 + Title: List of Errands + - Id: 7306 + Title: List of Errands + - Id: 7307 + Title: List of Errands + - Id: 7308 + Title: List of Errands + - Id: 7309 + Title: List of Errands + - Id: 7310 + Title: List of Errands + - Id: 7311 + Title: List of Errands + - Id: 7312 + Title: List of Errands + - Id: 7313 + Title: List of Errands + - Id: 7314 + Title: List of Errands + - Id: 7315 + Title: List of Errands + - Id: 7316 + Title: List of Errands + - Id: 7317 + Title: List of Errands + - Id: 7318 + Title: List of Errands + - Id: 7319 + Title: List of Errands + - Id: 7320 + Title: List of Errands + - Id: 7321 + Title: List of Errands + - Id: 7322 + Title: List of Errands + - Id: 7323 + Title: List of Errands + - Id: 7324 + Title: List of Errands + - Id: 7325 + Title: List of Errands + - Id: 7326 + Title: List of Errands + - Id: 7327 + Title: List of Errands + - Id: 7328 + Title: List of Errands + - Id: 7329 + Title: List of Errands + - Id: 7330 + Title: List of Errands + - Id: 7331 + Title: List of Errands + - Id: 7332 + Title: List of Errands + - Id: 7333 + Title: List of Errands + - Id: 7334 + Title: List of Errands + - Id: 7335 + Title: List of Errands + - Id: 7336 + Title: List of Errands + - Id: 7337 + Title: List of Errands + - Id: 7338 + Title: List of Errands + - Id: 7339 + Title: List of Errands + - Id: 7340 + Title: List of Errands + - Id: 7341 + Title: List of Errands + - Id: 7342 + Title: List of Errands + - Id: 7343 + Title: List of Errands + - Id: 7344 + Title: List of Errands + - Id: 7345 + Title: List of Errands + - Id: 7346 + Title: List of Errands + - Id: 7349 + Title: Vote + TimeLimit: +30mn + - Id: 7350 + Title: Cautious Village + - Id: 7351 + Title: Better than My Old Button + - Id: 7352 + Title: Sailor Wants a Button + - Id: 7353 + Title: Old Man Wants a Button + - Id: 7354 + Title: Young Man Wants a Button + - Id: 7355 + Title: Merchant Wants a Button + - Id: 7356 + Title: Little Kid Wants a Button + - Id: 7357 + Title: Middle-aged Guy Wants a Button + - Id: 7358 + Title: Why do they want my Buttons? + - Id: 7359 + Title: Deliver Holy Item to Sailor + - Id: 7360 + Title: Deliver Holy Item to Old Man + - Id: 7361 + Title: Deliver Holy Item to Young Man + - Id: 7362 + Title: Deliver Holy Item to Merchant + - Id: 7363 + Title: Deliver Holy Item to Little Kid + - Id: 7364 + Title: Deliver Holy Item to Middle-aged Man + - Id: 7365 + Title: Better than My Old Button-2 + - Id: 7366 + Title: Traditional Spiritual Protection and Impudent Girl-1 + - Id: 7367 + Title: Traditional Spiritual Protection and Impudent Girl-2 + TimeLimit: +10mn + - Id: 7368 + Title: Deliver Spiritual Protection-Pedro + - Id: 7369 + Title: Deliver Spiritual Protection-Nardo + - Id: 7370 + Title: Deliver Spiritual Protection-Pandoi + - Id: 7371 + Title: Deliver Spiritual Protection-Woeon + - Id: 7372 + Title: Deliver Spiritual Protection-Talah + - Id: 7373 + Title: Deliver Spiritual Protection-Romel + - Id: 7374 + Title: Love and Spiritual Protection for All + - Id: 7375 + Title: Love and Spiritual Protection Continues + TimeLimit: +23h + - Id: 7376 + Title: Old Man and Cast-Iron Caldron-1 + - Id: 7377 + Title: Old Man and Cast-Iron Caldron-2 + - Id: 7378 + Title: Old Man and Cast-Iron Caldron-Regular Trades + TimeLimit: +23h + - Id: 7379 + Title: Peace Preacher + - Id: 7380 + Title: To Smith a Traditional Spiritual Protection + - Id: 7381 + Title: High Demand on Spiritual Protection Material + TimeLimit: +23h + - Id: 7382 + Title: Deliver to Pedro + - Id: 7383 + Title: Deliver to Nardo + - Id: 7384 + Title: Deliver to Pandoi + - Id: 7385 + Title: Deliver to Woeon + - Id: 7386 + Title: Deliver to Talah + - Id: 7387 + Title: Deliver to Romel + - Id: 7388 + Title: Maries's Child + - Id: 7389 + Title: Give the Shirt to Maries's Child + - Id: 7390 + Title: Worried about Maries's Child + TimeLimit: +23h + - Id: 7391 + Title: Jejeling and Jejellopy + Drops: + - Mob: JEJELING + Item: Jejellopy + Rate: 5000 + - Id: 7392 + Title: Collect Jejellopy Regularly + TimeLimit: +1d + - Id: 7393 + Title: Shiny Silver Blade + Targets: + - Mob: TIYANAK + Count: 10 + - Mob: MANANANGGAL + Count: 10 + - Id: 7394 + Title: Shiny Tomorrow + TimeLimit: +23h + - Id: 7395 + Title: Ghost on the Ferry Ship + - Id: 7396 + Title: Angry Soul on Ferry Ship + - Id: 7397 + Title: Mumbaki Phong's Advice + Drops: + - Mob: ENGKANTO + Item: Elegant_Flower + Rate: 3000 + - Id: 7398 + Title: Offering Bouquet Recommended by Mumbaki + - Id: 7399 + Title: Soul Diwata's Story + - Id: 7400 + Title: Mumbaki of Port Malaya + - Id: 7401 + Title: All Aboard for Perry Sailing + TimeLimit: +23h + - Id: 7402 + Title: Bouquet for Diwata + Drops: + - Mob: ENGKANTO + Item: Elegant_Flower + Rate: 3000 + - Id: 7403 + Title: Stabilized Perry + - Id: 7404 + Title: Get Rid of Jejeling + Targets: + - Mob: JEJELING + Count: 20 + - Id: 7405 + Title: Get Rid of Jejeling - Same Time Tomorrow + TimeLimit: +23h + - Id: 7406 + Title: Agree to Collecting Bones! + Drops: + - Mob: BUNGISNGIS + Item: Evil_Bone + Rate: 5000 + - Mob: TIKBALANG + Item: Evil_Bone + Rate: 5000 + - Mob: TIYANAK + Item: Evil_Bone + Rate: 5000 + - Id: 7407 + Title: Purified Bone + - Id: 7408 + Title: Agree to Come Back Tomorrow? + TimeLimit: +23h + - Id: 7409 + Title: Cannot Meet Eyes with Him! + Targets: + - Mob: BUNGISNGIS + Count: 10 + - Id: 7410 + Title: Teach Another Lesson Tomorrow! + TimeLimit: +23h + - Id: 7411 + Title: The traveler, Fome's story + - Id: 7412 + Title: The traveler, Litrip's story + - Id: 7413 + Title: The traveler, Chiba's story + - Id: 7414 + Title: Eclage guard's message + - Id: 7415 + Title: Laphine's Chief of Staff + - Id: 7416 + Title: Waiting to meet + TimeLimit: +10mn + - Id: 7417 + Title: Kardui's request + - Id: 7418 + Title: For Eclage 1 + - Id: 7419 + Title: For Eclage 2 + - Id: 7420 + Title: For Eclage 3 + - Id: 7421 + Title: That's enough + - Id: 7422 + Title: Kardui's gift + - Id: 7423 + Title: A rumor about the King 1 + - Id: 7424 + Title: A rumor about the King 2 + - Id: 7425 + Title: A rumor about the King 3 + - Id: 7426 + Title: A rumor about the King 4 + - Id: 7427 + Title: At times like this, face it straight on! + - Id: 7428 + Title: Yai of the wild + - Id: 7429 + Title: Wild recent trend! + TimeLimit: +23h + - Id: 7430 + Title: Deliveryman that runs through space + - Id: 7431 + Title: A mailman never rests! + TimeLimit: +23h + - Id: 7432 + Title: The troublemakers in the land of blooming flowers + Targets: + - Mob: MENBLATT + Count: 5 + - Mob: PETAL + Count: 5 + - Id: 7433 + Title: Need constant guidance + TimeLimit: +23h + - Id: 7434 + Title: Kardui's big brother + - Id: 7435 + Title: Time for reading the letter + TimeLimit: +3mn + - Id: 7436 + Title: Avant the Scholar of Magics + - Id: 7437 + Title: Shenime's favor + - Id: 7438 + Title: Secret sponsorship + - Id: 7439 + Title: The scholar of magics sponsored by Shenime + - Id: 7440 + Title: Minuel's witness + - Id: 7441 + Title: Mail is here! + - Id: 7442 + Title: The identity of the scholar of magics + - Id: 7443 + Title: Interfere with the research! + - Id: 7444 + Title: What Avant was researching + - Id: 7445 + Title: Avant's back + - Id: 7446 + Title: Unfruitful conversation + - Id: 7447 + Title: Dilemma surrounding the Orb + - Id: 7448 + Title: Something's not right + - Id: 7449 + Title: Temptation toward the Orb + - Id: 7450 + Title: Orb's lighting room + - Id: 7451 + Title: Betrayal + - Id: 7452 + Title: Find the chief of staff! + - Id: 7453 + Title: The last of the chief of staff + - Id: 7471 + Title: First time talking after being born + - Id: 7472 + Title: First step towards a new world + - Id: 7473 + Title: Cool drink + - Id: 7474 + Title: Searching for treasure + - Id: 7475 + Title: Discovered the Airship + - Id: 7476 + Title: Discovered the Arena + - Id: 7477 + Title: Bridge to Prontera + - Id: 7478 + Title: Basic Medical Botany + - Id: 7479 + Title: Friend or Foe? + - Id: 7480 + Title: Regarding Thief job + - Id: 7481 + Title: Vicente's class + - Id: 7482 + Title: Vercassel's class + - Id: 7483 + Title: Use the Thief Manual + - Id: 7484 + Title: Shop owner! Order to steal! + - Id: 7485 + Title: Assassin! Use Envenom + Targets: + - Mob: R_PORING + Count: 1 + - Id: 7486 + Title: With Lumin + - Id: 7487 + Title: 30 seconds duel + TimeLimit: +30s + Targets: + - Mob: R_PORING + Count: 4 + - Id: 7488 + Title: Trio set of Fire Elements + - Id: 7489 + Title: Silent liquidation plan + - Id: 7490 + Title: Mushroom soup calling memories + - Id: 7491 + Title: Get away to Paradise! + - Id: 7492 + Title: Invincible pumpkin knight + - Id: 7493 + Title: Battle of 17 vs. 1 + - Id: 7494 + Title: Cleanup of the mushroom farm + - Id: 7501 + Title: 1 Suspicious Babe + TimeLimit: +4h + Targets: + - Mob: BABY_STRANGE + Count: 1 + - Id: 7502 + Title: 10 Suspicious Babes + TimeLimit: +4h + Targets: + - Mob: BABY_STRANGE + Count: 10 + - Id: 7503 + Title: 30 Suspicious Babes + TimeLimit: +4h + Targets: + - Mob: BABY_STRANGE + Count: 30 + - Id: 7504 + Title: Destroy 1 Emperium + TimeLimit: +4h + Targets: + - Mob: EMPELIUM + Count: 1 + - Id: 7505 + Title: Destroy 3 Emperiums + TimeLimit: +4h + Targets: + - Mob: EMPELIUM + Count: 3 + - Id: 7506 + Title: Destroy 5 Emperiums + TimeLimit: +4h + Targets: + - Mob: EMPELIUM + Count: 5 + - Id: 7507 + Title: 10 Small Wooden Boxes + TimeLimit: +4h + - Id: 7508 + Title: 20 Small Wooden Boxes + TimeLimit: +4h + - Id: 7509 + Title: 30 Small Wooden Boxes + TimeLimit: +4h + - Id: 7510 + Title: Fight Off a Thief + TimeLimit: +4h + Targets: + - Mob: THIEF_PORING + Count: 1 + - Id: 7511 + Title: Fight Off 10 Thieves + TimeLimit: +4h + Targets: + - Mob: THIEF_PORING + Count: 10 + - Id: 7512 + Title: Fight Off 30 Thieves + TimeLimit: +4h + Targets: + - Mob: THIEF_PORING + Count: 30 + - Id: 7513 + Title: 10 Paychecks + TimeLimit: +4h + - Id: 7514 + Title: 20 Paychecks + TimeLimit: +4h + - Id: 7515 + Title: 30 Paychecks + TimeLimit: +4h + - Id: 7516 + Title: A break for Commercial Development + TimeLimit: +20mn + - Id: 7517 + Title: Occupy Valkyrie Realm + TimeLimit: +1h + - Id: 7518 + Title: Occupy Luina + TimeLimit: +1h + - Id: 7519 + Title: Occupy Britoniah + TimeLimit: +1h + - Id: 7520 + Title: Occupy Greenwood Lake + TimeLimit: +1h + - Id: 7521 + Title: Occupy Nidabehl + TimeLimit: +1h + - Id: 7522 + Title: Occupy Valfreyja + TimeLimit: +1h + - Id: 7523 + Title: Occupy Gloria + TimeLimit: +1h + - Id: 7524 + Title: Occupy Kafragaten + TimeLimit: +1h + - Id: 7525 + Title: Valkyrie Realm Challenge 1 + Targets: + - Mob: CATERPILLAR + Count: 50 + - Mob: CREMY_FEAR + Count: 50 + - Id: 7526 + Title: Valkyrie Realm Challenge 2 + Targets: + - Mob: GLD_KOBOLD_1 + Count: 30 + - Mob: GLD_KOBOLD_2 + Count: 30 + - Mob: GLD_KOBOLD_3 + Count: 30 + - Id: 7527 + Title: Valkyrie Realm Challenge 3 + Targets: + - Mob: PYURIEL + Count: 1 + - Mob: LORA + Count: 1 + - Id: 7528 + Title: Luina Challenge 1 + Targets: + - Mob: ANCIENT_WORM + Count: 50 + - Mob: GIANT_HONET + Count: 50 + - Id: 7529 + Title: Luina Challenge 2 + Targets: + - Mob: KILLER_MANTIS + Count: 40 + - Mob: ANGRA_MANTIS + Count: 50 + - Id: 7530 + Title: Luina Challenge 3 + Targets: + - Mob: GIOIA + Count: 1 + - Mob: ELVIRA + Count: 1 + - Id: 7531 + Title: Britoniah Challenge 1 + Targets: + - Mob: ZOMBIE_MASTER + Count: 50 + - Mob: WRAITH_DEAD + Count: 50 + - Id: 7532 + Title: Britoniah Challenge 2 + Targets: + - Mob: GLD_DARK_FRAME + Count: 20 + - Mob: GLD_DARK_PRIEST + Count: 20 + - Mob: GLD_DARK_SHADOW + Count: 50 + - Id: 7533 + Title: Britoniah Challenge 3 + Targets: + - Mob: KADES + Count: 1 + - Mob: RUDO + Count: 1 + - Id: 7534 + Title: Greenwood Lake Challenge 1 + Targets: + - Mob: GULLINBURSTI + Count: 50 + - Mob: LEIB_OLMAI + Count: 50 + - Id: 7535 + Title: Greenwood Lake Challenge 2 + Targets: + - Mob: SKELETON_GENERAL + Count: 45 + - Mob: AM_MUT + Count: 20 + - Mob: GAJOMART + Count: 25 + - Id: 7536 + Title: Greenwood Lake Challenge 3 + Targets: + - Mob: DAEHYON + Count: 1 + - Mob: SOHEON + Count: 1 + - Id: 7537 + Title: Nidabehl Challenge 1 + Targets: + - Mob: HELL_APOCALIPS + Count: 50 + - Mob: ZAKUDAM + Count: 50 + - Id: 7538 + Title: Nidabehl Challenge 2 + Targets: + - Mob: SKELETON_GENERAL + Count: 35 + - Mob: AM_MUT + Count: 35 + - Id: 7539 + Title: Valfreyja Challenge 1 + Targets: + - Mob: BANSHEE_MASTER + Count: 50 + - Mob: BEHOLDER_MASTER + Count: 30 + - Id: 7540 + Title: Valfreyja Challenge 2 + Targets: + - Mob: AUNOE + Count: 50 + - Mob: FANAT + Count: 20 + - Id: 7541 + Title: Gloria Challenge 1 + Targets: + - Mob: L_SEYREN + Count: 30 + - Mob: L_EREMES + Count: 30 + - Mob: L_HARWORD + Count: 30 + - Id: 7542 + Title: Gloria Challenge 2 + Targets: + - Mob: L_KATRINN + Count: 30 + - Mob: L_MAGALETA + Count: 30 + - Mob: L_SHECIL + Count: 30 + - Id: 7543 + Title: Standby for Valkyrie Realm Challenge 1 + TimeLimit: +20h + - Id: 7544 + Title: Standby for Valkyrie Realm Challenge 2 + TimeLimit: +20h + - Id: 7545 + Title: Standby for Valkyrie Realm Challenge 3 + TimeLimit: +20h + - Id: 7546 + Title: Standby for Luina Challenge 1 + TimeLimit: +20h + - Id: 7547 + Title: Standby for Luina Challenge 2 + TimeLimit: +20h + - Id: 7548 + Title: Standby for Luina Challenge 3 + TimeLimit: +20h + - Id: 7549 + Title: Standby for Britoniah Challenge 1 + TimeLimit: +20h + - Id: 7550 + Title: Standby for Britoniah Challenge 2 + TimeLimit: +20h + - Id: 7551 + Title: Standby for Britoniah Challenge 3 + TimeLimit: +20h + - Id: 7552 + Title: Standby for Greenwood Lake Challenge 1 + TimeLimit: +20h + - Id: 7553 + Title: Standby for Greenwood Lake Challenge 2 + TimeLimit: +20h + - Id: 7554 + Title: Standby for Greenwood Lake Challenge 3 + TimeLimit: +20h + - Id: 7555 + Title: Standby for Nidabehl Challenge 1 + TimeLimit: +20h + - Id: 7556 + Title: Standby for Nidabehl Challenge 2 + TimeLimit: +20h + - Id: 7557 + Title: Standby for Valfreyja Challenge 1 + TimeLimit: +20h + - Id: 7558 + Title: Standby for Valfreyja Challenge 2 + TimeLimit: +20h + - Id: 7559 + Title: Standby for Gloria Challenge 1 + TimeLimit: +20h + - Id: 7560 + Title: Standby for Gloria Challenge 2 + TimeLimit: +20h + - Id: 7561 + Title: Kafragaten Challenge 1 + Targets: + - Mob: L_YGNIZEM + Count: 30 + - Mob: L_WHIKEBAIN + Count: 30 + - Mob: L_ARMAIA + Count: 30 + - Id: 7562 + Title: Kafragaten Challenge 2 + Targets: + - Mob: L_RAWREL + Count: 30 + - Mob: L_EREND + Count: 30 + - Mob: L_KAVAC + Count: 30 + - Id: 7563 + Title: Standby for Kafragaten Challenge 1 + TimeLimit: +20h + - Id: 7564 + Title: Standby for Kafragaten Challenge 2 + TimeLimit: +20h + - Id: 7568 + Title: Explore the tower + TimeLimit: +1h30mn + - Id: 7569 + Title: Treat the injured + - Id: 7570 + Title: Destroy the demons + Targets: + - Mob: MM_EVIL_SHADOW1 + Count: 7 + - Mob: MM_EVIL_SHADOW2 + Count: 7 + - Mob: MM_EVIL_SHADOW3 + Count: 7 + - Id: 7571 + Title: Tower Expedition + - Id: 7572 + Title: Lucile...? + - Id: 7573 + Title: Magic Swordman Thanatos + - Id: 7574 + Title: Thanatos Tower + - Id: 7576 + Title: Morocc castle seal + - Id: 7577 + Title: Space distortion + TimeLimit: +23h + - Id: 7578 + Title: Rampaging Box + Targets: + - Mob: E_ANGRY_MIMIC + Count: 1 + Drops: + - Mob: E_ANGRY_MIMIC + Item: Bradium_Box + Rate: 10000 + - Id: 7579 + Title: Collecting Bradiums + Targets: + - Mob: E_ANGRY_MIMIC + Count: 10 + Drops: + - Mob: E_ANGRY_MIMIC + Item: Bradium_Box + Rate: 10000 + - Id: 7580 + Title: Collecting Every Day + TimeLimit: +23h + - Id: 7581 + Title: Eliminating Risks + Targets: + - Mob: B_MOROCC_1 + Count: 1 + - Mob: B_MOROCC_2 + Count: 1 + - Mob: B_MOROCC_4 + Count: 1 + - Id: 7582 + Title: Daily Cleaning + TimeLimit: +23h + - Id: 7583 + Title: Collecting Mana + Drops: + - Mob: B_MOROCC_1 + Item: Mana_crystal + Rate: 10000 + - Mob: B_MOROCC_2 + Item: Mana_crystal + Rate: 10000 + - Mob: B_MOROCC_4 + Item: Mana_crystal + Rate: 10000 + - Id: 7584 + Title: Unending Battle + TimeLimit: +23h + - Id: 7593 + Title: Demon God Subjugation + Targets: + - Mob: MM_MOROCC_ADT + Count: 1 + - Id: 7594 + Title: Frost Spider and Fire Wolf + Targets: + - Mob: MM_BRINARANEA + Count: 1 + - Mob: MM_MUSPELLSKOLL + Count: 1 + - Id: 7595 + Title: Wandering Orb Magic + Targets: + - Mob: MM_MANA_WHITE + Count: 3 + - Mob: MM_MANA_RED + Count: 3 + - Mob: MM_MANA_YELLOW + Count: 3 + - Id: 7597 + Title: Fall of the False God + - Id: 7598 + Title: Caged God + TimeLimit: +23h + - Id: 7599 + Title: Unending Hunt + TimeLimit: +23h + - Id: 7600 + Title: Promising Tomorrow + TimeLimit: +23h + - Id: 7606 + Title: Phantasmagorika Excavator Recruitment + - Id: 7607 + Title: Eden Group Leader + - Id: 7608 + Title: Artnard Excavation Team 1 + - Id: 7609 + Title: Artnard Excavation Team 2 + - Id: 7610 + Title: Registered Excavator + - Id: 7611 + Title: Passage Cleaning + Targets: + - Mob: RECON_ROBOT + Count: 10 + - Id: 7612 + Title: Passage Cleaning - Down + TimeLimit: +23h + - Id: 7613 + Title: Eliminating Risks + Targets: + - Mob: REPAIR_ROBOT + Count: 15 + - Mob: EXPLORATION_ROVER + Count: 15 + - Id: 7614 + Title: Eliminating Risks - Down + TimeLimit: +23h + - Id: 7615 + Title: Core Collection + Drops: + - Mob: RECON_ROBOT + Item: Operation_Control_Device + Rate: 5000 + - Mob: REPAIR_ROBOT + Item: Operation_Control_Device + Rate: 5000 + - Mob: EXPLORATION_ROVER + Item: Operation_Control_Device + Rate: 5000 + - Id: 7616 + Title: Core Collection - Down + TimeLimit: +23h + - Id: 7617 + Title: Turning In Excavation Report + - Id: 7618 + Title: Reporting the Results - Down + TimeLimit: +23h + - Id: 7619 + Title: Assisting the Excavation Team + - Id: 7620 + Title: Young Blood? + - Id: 7621 + Title: Bottling the Energy + - Id: 7622 + Title: Good News! + - Id: 7623 + Title: Artnard's Summon + - Id: 7624 + Title: In Search of a Delicacy + - Id: 7625 + Title: Count On Me + - Id: 7626 + Title: Delicacy for Him + - Id: 7627 + Title: Last Exploration + - Id: 7628 + Title: New Power Source + - Id: 7629 + Title: Tomorrow for Tomorrow's Energy + TimeLimit: +23h + - Id: 7641 + Title: Access Permitted + - Id: 7642 + Title: Explore Research facilities + - Id: 7643 + Title: Mysterious Piece + - Id: 7644 + Title: Record Player + - Id: 7645 + Title: Piece of Memory Record + - Id: 7646 + Title: Play Memory Record + - Id: 7647 + Title: Report Memory Record + - Id: 7648 + Title: Memory Records of the Laboratories + - Id: 7649 + Title: Report Memory Record Content + - Id: 7650 + Title: Collect Memory Records of Research facilities + - Id: 7651 + Title: One Memory a Day + TimeLimit: +23h + - Id: 7652 + Title: Collect Memory Records of Laboratories + - Id: 7653 + Title: One Memory a Day 2 + TimeLimit: +23h + - Id: 7654 + Title: Play Research facilities Memory Records + - Id: 7655 + Title: Play Laboratories Memory Records + - Id: 7656 + Title: Invitation of Rekenber + - Id: 7681 + Title: Invitation to Royal Banquet + - Id: 7682 + Title: Socializing Starts from an Eye Contact + - Id: 7683 + Title: Visit the Heines + - Id: 7684 + Title: Visit the Nerius + - Id: 7685 + Title: What Is the Next Thing on the Schedule ? + - Id: 7686 + Title: Nyhill and Skia + - Id: 7687 + Title: Participating in the Banquet + - Id: 7688 + Title: Suspicious Movement + - Id: 7689 + Title: Find Nyhill + - Id: 7690 + Title: Where Is Nyhill? + - Id: 7691 + Title: Waiting for the Ritual + - Id: 7692 + Title: Attend the Ritual + - Id: 7693 + Title: Surprise Attack + - Id: 7694 + Title: I'd Like to See that Too + - Id: 7695 + Title: Escape from the Past Memories of the Royal Family + - Id: 7696 + Title: What's Next? + - Id: 7697 + Title: Invitation from the Nerius + - Id: 7698 + Title: Heine Now + - Id: 7699 + Title: To the Past + - Id: 7700 + Title: Once More! + - Id: 7701 + Title: Lost Imir Heart + - Id: 7702 + Title: Prontera at the Time + - Id: 7703 + Title: Who Knows the Truth + - Id: 7705 + Title: Hope You Cannot Let Go + Targets: + - Mob: BIJOU + Count: 1 + - Id: 7706 + Title: Nillem Is Not Almighty + TimeLimit: 4h + - Id: 7711 + Title: Beginning + - Id: 7712 + Title: Where am I? Who am I?? + - Id: 7713 + Title: First Battle! + Targets: + - Mob: DR_EGGRING + Count: 3 + - Id: 7714 + Title: Refreshing Apple Juice + - Id: 7715 + Title: Midding Box + Drops: + - Mob: DR_EGGRING + Item: Merchant_Box_1 + Rate: 5000 + - Id: 7716 + Title: To the Village! + - Id: 7717 + Title: Merchant's Kindness + - Id: 7718 + Title: I'm used to this + - Id: 7719 + Title: Time to Digest + Targets: + - Mob: RED_PLANT + Count: 3 + - Id: 7720 + Title: Service Manual + - Id: 7721 + Title: Cat showoff contest + TimeLimit: +10mn + Targets: + - Mob: DR_LUNATIC + Count: 3 + - Mob: DR_FABRE + Count: 2 + - Id: 7722 + Title: EMT + - Id: 7723 + Title: The potential within + - Id: 7790 + Title: Rock Ridge, Land of Opportunities + - Id: 7791 + Title: Problems in Rock Ridge + - Id: 7792 + Title: Problems in Rock Ridge 2 + - Id: 7793 + Title: Good News + - Id: 7794 + Title: Expected Response + - Id: 7795 + Title: Negotiation on the Railroad + - Id: 7796 + Title: Unexpected Arrest + - Id: 7797 + Title: Hear Me Out 1 + - Id: 7798 + Title: Perfectly Prime + - Id: 7799 + Title: Shawn McCurdy's Weapon 1 + - Id: 7800 + Title: Shawn McCurdy's Weapon 2 + - Id: 7801 + Title: Shawn McCurdy's Weapon 3 + Drops: + - Mob: PURPLESTONE + Item: Purple_Ore + Rate: 10000 + - Id: 7802 + Title: Hear Me Out 2 + - Id: 7803 + Title: Happy for Broken Trust + - Id: 7804 + Title: Location of the Ores + - Id: 7805 + Title: Location of the Ores 2 + - Id: 7806 + Title: Location of the Ores 3 + - Id: 7807 + Title: Ace up Our Sleeve + Targets: + - Mob: COWRAIDERS1 + Count: 3 + - Mob: COWRAIDERS2 + Count: 3 + - Mob: COWRAIDERS3 + Count: 3 + - Id: 7808 + Title: Case Solved + - Id: 7809 + Title: Collecting Ores + - Id: 8000 + Title: Quitting Job Change + - Id: 8001 + Title: Job Change to Assassin + - Id: 8002 + Title: Job Change to Assassin + - Id: 8003 + Title: Job Change to Assassin + - Id: 8004 + Title: Job Change to Assassin + - Id: 8005 + Title: Job Change to Assassin + - Id: 8006 + Title: Find the Guild Master! + - Id: 8007 + Title: Acceptance from the Guild Master + - Id: 8008 + Title: Job Change to Assassin + - Id: 8009 + Title: Applying for Job Change to Priest + - Id: 8010 + Title: Job Change to Priest + - Id: 8011 + Title: Job Change to Priest + - Id: 8012 + Title: Job Change to Priest + - Id: 8013 + Title: Job Change to Priest + - Id: 8014 + Title: Job Change to Priest + - Id: 8015 + Title: Job Change to Priest + - Id: 8016 + Title: Job Change to Priest + - Id: 8017 + Title: Factory Inspection + - Id: 8018 + Title: Factory Inspection + - Id: 8019 + Title: Factory Inspection + - Id: 8020 + Title: Factory Inspection + - Id: 8021 + Title: Factory Inspection + - Id: 8022 + Title: Factory Inspection + - Id: 8023 + Title: Factory Inspection + - Id: 8024 + Title: Factory Inspection + - Id: 8025 + Title: Factory Inspection + - Id: 8026 + Title: Factory Inspection + - Id: 8027 + Title: Factory Inspection + - Id: 8028 + Title: Factory Inspection + - Id: 8029 + Title: Factory Inspection + - Id: 8030 + Title: Factory Inspection + - Id: 8031 + Title: Factory Inspection + - Id: 8032 + Title: Tarlock's Favor + - Id: 8033 + Title: Ferlock's Favor + - Id: 8034 + Title: Ferlock's Favor + - Id: 8035 + Title: How the Airship Works + - Id: 8036 + Title: Hallen's Favor + - Id: 8037 + Title: The Dice Roller + - Id: 8038 + Title: The Dice Roller + - Id: 8039 + Title: Secret of Airships + - Id: 8040 + Title: Secret of Airships + - Id: 8041 + Title: Secret of Airships + - Id: 8042 + Title: Secret of Airships + - Id: 8043 + Title: Secret of Airships + - Id: 8044 + Title: Euslan's Fiancee + - Id: 8045 + Title: Tips from Kaci + - Id: 8046 + Title: Ferlock's Passengers list + - Id: 8047 + Title: Euslan's Favor + - Id: 8048 + Title: Eukran's Testimony + - Id: 8049 + Title: Thierry's Favor + - Id: 8050 + Title: Danger coming on to Thierry + - Id: 8051 + Title: Euslan's Medicine + - Id: 8052 + Title: Thierry's Favor + - Id: 8053 + Title: Find Postell + - Id: 8054 + Title: Message from Postell + - Id: 8055 + Title: Nursing Allen + - Id: 8056 + Title: Little something in return + - Id: 8057 + Title: Grumbling Manainne + - Id: 8058 + Title: Conversation with El Schatt + - Id: 8059 + Title: Conversation with Perfitz + - Id: 8060 + Title: Stubborn El Schatt + - Id: 8061 + Title: Stories of the past + - Id: 8062 + Title: Kanainne + - Id: 8063 + Title: Kanainne's spirit + - Id: 8064 + Title: Cellette's Fish Cake Soup + - Id: 8065 + Title: Cellette's Fish Cake Soup + - Id: 8066 + Title: Cellette's Fish Cake Soup + - Id: 8067 + Title: Cellette's Fish Cake Soup + - Id: 8068 + Title: Cellette's Fish Cake Soup + - Id: 8069 + Title: Cellette's Fish Cake Soup + - Id: 8070 + Title: Cellette's Fish Cake Soup + - Id: 8071 + Title: Cellette's Fish Cake Soup + - Id: 8072 + Title: Cellette's Fish Cake Soup + - Id: 8073 + Title: Cellette's Fish Cake Soup + - Id: 8074 + Title: Cellette's Fish Cake Soup + - Id: 8075 + Title: Cellette's Fish Cake Soup + - Id: 8076 + Title: Klitzer and Calla + - Id: 8077 + Title: Klitzer and Calla + - Id: 8078 + Title: Klitzer and Calla + - Id: 8079 + Title: Klitzer and Calla + - Id: 8080 + Title: Klitzer and Calla + - Id: 8081 + Title: Klitzer and Calla + - Id: 8082 + Title: Klitzer and Calla + - Id: 8083 + Title: Klitzer and Calla + - Id: 8084 + Title: Klitzer and Calla + - Id: 8085 + Title: Klitzer and Calla + - Id: 8086 + Title: Klitzer and Calla + - Id: 8087 + Title: Klitzer and Calla + - Id: 8088 + Title: Klitzer and Calla + - Id: 8089 + Title: Stolen Gemstone + - Id: 8090 + Title: Mr. Manson + - Id: 8091 + Title: Jenny the gardener + - Id: 8092 + Title: Searching the Market + - Id: 8093 + Title: Mysterious Message + - Id: 8094 + Title: Double Crossed? + - Id: 8095 + Title: Find Phobe + - Id: 8096 + Title: Stolen Gemstone Found + - Id: 8097 + Title: Informing Jenny + - Id: 8098 + Title: Keeping the Secret + - Id: 8099 + Title: Vincent's Recommendation + - Id: 8100 + Title: Recommendation from High Priest Zhed + - Id: 8101 + Title: Recommendation from High Priest Zhed + - Id: 8102 + Title: Recommendation from High Priest Zhed + - Id: 8103 + Title: Recommendation from High Priest Zhed + - Id: 8104 + Title: Recommendation from High Priest Zhed + - Id: 8105 + Title: Recommendation from High Priest Zhed + - Id: 8106 + Title: Mr. Shendar's daughter + - Id: 8107 + Title: Lachellen's Testimony + - Id: 8108 + Title: A Foreigner, Katinshuell + - Id: 8109 + Title: Bruspetti's scent + - Id: 8110 + Title: Bruspetti's scent + - Id: 8111 + Title: Lachellen's Testimony + - Id: 8112 + Title: Freya's Spring + - Id: 8113 + Title: Bruspetti's Diary + - Id: 8114 + Title: Bruspetti's Diary + - Id: 8115 + Title: Suspicious Katinshuell + - Id: 8116 + Title: Lachellen's Testimony + - Id: 8117 + Title: Freya's Spring + - Id: 8118 + Title: Conversation with Mr. Shendar + - Id: 8119 + Title: Bruspetti's Diary + - Id: 8120 + Title: Conversation with Katinshuell + - Id: 8121 + Title: Conversation with Katinshuell + - Id: 8122 + Title: Bruspetti's resting place + - Id: 8123 + Title: Ayothaya's world famous dish, Tom Yum Goong + - Id: 8124 + Title: Ayothaya's world famous dish, Tom Yum Goong + - Id: 8125 + Title: Ayothaya's world famous dish, Tom Yum Goong + - Id: 8126 + Title: Ayothaya's world famous dish, Tom Yum Goong + - Id: 8127 + Title: Momotaro Field Trip + - Id: 8128 + Title: Momotaro Field Trip + - Id: 8129 + Title: Momotaro Field Trip + - Id: 8130 + Title: Momotaro Field Trip + - Id: 8131 + Title: The mother of lord in Amatsu + - Id: 8132 + Title: The mother of lord in Amatsu + - Id: 8133 + Title: Song of the fox + - Id: 8134 + Title: Boy at the Northern Shrine + - Id: 8135 + Title: Fox Expelled + - Id: 8136 + Title: The Gray Wolf's Warning + - Id: 8137 + Title: Finding the Keymaker + - Id: 8138 + Title: Blacksmith's Request + - Id: 8139 + Title: The Golden Key + - Id: 8140 + Title: The Red Ring + - Id: 8141 + Title: Mashenka's Red Ring + - Id: 8142 + Title: Searching the Marsh + - Id: 8143 + Title: The Flute's Voice + - Id: 8144 + Title: Ryubaba's Confession + - Id: 8145 + Title: Worried Mother's Request + - Id: 8146 + Title: Finding Lusalka + - Id: 8147 + Title: Lusalka's Beloved + - Id: 8148 + Title: Lusalka's Beloved + - Id: 8149 + Title: Searching for Igor + - Id: 8150 + Title: Igor's message + - Id: 8151 + Title: Marozka's Cave + - Id: 8152 + Title: The Golden Thread + - Id: 8153 + Title: Test of mind and wisdom + - Id: 8154 + Title: The Keymaker + - Id: 8155 + Title: Baba Yaga's Favor + - Id: 8156 + Title: Baba Yaga's Favor + - Id: 8157 + Title: Baba Yaga's Favor + - Id: 8158 + Title: Baba Yaga's Favor + - Id: 8159 + Title: Baba Yaga's Favor + - Id: 8160 + Title: Baba Yaga's Favor + - Id: 8161 + Title: Baba Yaga's Favor + - Id: 8162 + Title: Baba Yaga's Favor + - Id: 8163 + Title: Baba Yaga's Favor + - Id: 8164 + Title: Baba Yaga's Favor + - Id: 8165 + Title: Baba Yaga's Favor + - Id: 8166 + Title: Baba Yaga's Favor + - Id: 8167 + Title: The Golden Key + - Id: 8168 + Title: Koshei, the Immortal + - Id: 8169 + Title: Living and Dead Water + - Id: 8170 + Title: Living and Dead Water + - Id: 8171 + Title: Living and Dead Water + - Id: 8181 + Title: Sight Blaster + - Id: 8182 + Title: Push Back Theory + - Id: 8183 + Title: Sight Blaster + - Id: 8184 + Title: Elemental Converter + - Id: 8185 + Title: Elemental Change + - Id: 8186 + Title: Fire Elemental Change + - Id: 8187 + Title: Earth Elemental Change + - Id: 8188 + Title: Wind Elemental Change + - Id: 8189 + Title: Water Elemental Change + - Id: 8190 + Title: Charming Wink + - Id: 8191 + Title: Charming Advisor + - Id: 8192 + Title: Selfish Advisor + - Id: 8193 + Title: Selfish Advisor + - Id: 8194 + Title: Drunken Advisor + - Id: 8195 + Title: Kind Canell + - Id: 8196 + Title: The Tripartite Union's Feud + - Id: 8197 + Title: Document Delivery + - Id: 8198 + Title: Report to the United Research Official + - Id: 8199 + Title: United Research Official's Favor + - Id: 8200 + Title: Ryosen's Document Requests + - Id: 8201 + Title: Missing Document + - Id: 8202 + Title: Document Restoration + - Id: 8203 + Title: Document Restoration + - Id: 8204 + Title: Ryosen + - Id: 8205 + Title: Report to the United Research Official + - Id: 8206 + Title: Researchers' Meeting + - Id: 8207 + Title: Hansenne is not guilty. + - Id: 8208 + Title: Hansenne's Favor + - Id: 8209 + Title: Hue's Report + - Id: 8210 + Title: Report to the United Research Official + - Id: 8211 + Title: Shurank's Lecture + - Id: 8212 + Title: Shurank's Lecture + - Id: 8213 + Title: Shurank's Lecture + - Id: 8214 + Title: Shurank's Lecture + - Id: 8215 + Title: Shurank's Lecture + - Id: 8216 + Title: Shurank's Order + - Id: 8217 + Title: Dequ'ee's Message + - Id: 8218 + Title: Shurank's Lecture + - Id: 8219 + Title: Shurank's Lecture + - Id: 8220 + Title: Shurank's Lecture + - Id: 8221 + Title: Shurank's Lecture + - Id: 8222 + Title: Shurank's order + - Id: 8223 + Title: Dequ'ee's order + - Id: 8224 + Title: The clue + - Id: 8225 + Title: Dequ'ee's Reasoning + - Id: 8226 + Title: Bankley's Death + - Id: 8227 + Title: Return to Shurank + - Id: 8228 + Title: Shurank's Lecture + - Id: 8229 + Title: Guarnien's Lecture + - Id: 8230 + Title: Guarnien's Lecture + - Id: 8231 + Title: Guarnien's Lecture + - Id: 8232 + Title: Guarnien's Lecture + - Id: 8233 + Title: Guarnien's Lecture + - Id: 8234 + Title: Prontera Market Research + - Id: 8235 + Title: Guarnien's Lecture + - Id: 8236 + Title: Guarnien's Lecture + - Id: 8237 + Title: Guarnien's Lecture + - Id: 8238 + Title: Guarnien's Lecture + - Id: 8239 + Title: Guarnien's Lecture + - Id: 8240 + Title: Guarnien's Lecture + - Id: 8241 + Title: Collection of Red Jewel + - Id: 8242 + Title: Collection of blue Jewel + - Id: 8243 + Title: Learning new languages + - Id: 8244 + Title: Fairies and Tree Giants + - Id: 8245 + Title: Language sample investigation + - Id: 8246 + Title: Language sample investigation + - Id: 8247 + Title: Research progress + - Id: 8248 + Title: Research progress + - Id: 8249 + Title: Compressing Information + - Id: 8250 + Title: Storage Gem + - Id: 8251 + Title: Injection of Magic + - Id: 8252 + Title: Handworked jewels + - Id: 8253 + Title: Language translation device + TimeLimit: +1h + - Id: 8254 + Title: with a light heart and body + - Id: 8255 + Title: The test of power for existence + - Id: 8256 + Title: The test of power for existence + - Id: 8257 + Title: Providing food of Teardrop + - Id: 8258 + Title: Providing food of Teardrop + - Id: 8259 + Title: to a place for taking a practical technique test + - Id: 8260 + Title: Mission! Documents delivery + - Id: 8261 + Title: When you play the flute,then the wolf show up! + - Id: 8262 + Title: Ranger master never again + - Id: 8265 + Title: One time a one hour! + - Id: 8266 + Title: Hunting poison spore! + Targets: + - Mob: POISON_SPORE + Count: 10 + - Id: 8267 + Title: Hunting smokie! + Targets: + - Mob: SMOKIE + Count: 10 + - Id: 8268 + Title: Hunt elder wilow! + Targets: + - Mob: ELDER_WILOW + Count: 10 + - Id: 8269 + Title: Hunt coco! + Targets: + - Mob: COCO + Count: 10 + - Id: 8270 + Title: Hunt tharafrog! + Targets: + - Mob: THARA_FROG + Count: 10 + - Id: 8271 + Title: Toxic sprays delivery! + - Id: 8272 + Title: Deliver a honey! + - Id: 8273 + Title: Deliver a blanket! + - Id: 8274 + Title: Collect bones! + - Id: 8275 + Title: Collect feet! + - Id: 8276 + Title: Collect scell! + - Id: 8277 + Title: Collect tails! + - Id: 8278 + Title: Collect cookies! + - Id: 8279 + Title: Collect mustache! + - Id: 9000 + Title: Job Change to Knight + - Id: 9001 + Title: Loyalty of a Knight + - Id: 9002 + Title: Loyalty of a Knight + - Id: 9003 + Title: The Honor of a Knight + - Id: 9004 + Title: The Honor of a Knight + - Id: 9005 + Title: Tenacity of a Knight + - Id: 9006 + Title: Tenacity of a Knight + - Id: 9007 + Title: The Honor of a Knight + - Id: 9008 + Title: Etiquette as a Knight + - Id: 9009 + Title: Life as a Knight + - Id: 9010 + Title: Quality of reverence + - Id: 9011 + Title: Life as a Knight + - Id: 9012 + Title: Glory of a Knight! + - Id: 9013 + Title: Job Change to Wizard + - Id: 9014 + Title: Job Change to Wizard + - Id: 9015 + Title: Job Change to Wizard + - Id: 9016 + Title: Job Change to Wizard + - Id: 9017 + Title: Job Change to Wizard + - Id: 9018 + Title: Certified as a Wizard! + - Id: 9058 + Title: O'Riley's Request + - Id: 9059 + Title: Happy St. Patrick's Day + - Id: 9117 + Title: Lina's Curse + - Id: 9118 + Title: Lina's Curse - Deviruchi Hunt + Targets: + - Mob: DEVIRUCHI + Count: 50 + - Id: 9119 + Title: Lina's Curse - Wraith Dead Hunt + Targets: + - Mob: WRAITH_DEAD + Count: 50 + - Id: 9120 + Title: Lina's Curse - Dullahan Hunt + Targets: + - Mob: DULLAHAN + Count: 50 + - Id: 9121 + Title: Lina's Curse - Nightmare Terror Hunt + Targets: + - Mob: NIGHTMARE_TERROR + Count: 50 + - Id: 9122 + Title: Lina's Curse + - Id: 9123 + Title: Lina's Curse + - Id: 9024 + Title: An errand boy from Einbroch + - Id: 9028 + Title: Strange Hydra + - Id: 9029 + Title: "Strange Hydra : present conditions" + TimeLimit: +1d + - Id: 9030 + Title: Find a puppy + - Id: 9031 + Title: Find a puppy + - Id: 9032 + Title: Find a puppy + TimeLimit: +1d + - Id: 9155 + Title: Getting materials for the Jaty Crown + - Id: 9156 + Title: Make the Jaty Crown + - Id: 9157 + Title: Reward from Sage, Kasyapa + - Id: 9158 + Title: Delivery of Good News(1) + - Id: 9159 + Title: Back to Paiko + - Id: 9160 + Title: Delivery of Good News(2) + - Id: 9161 + Title: Back to Paiko + - Id: 9162 + Title: Delivery of Good News(3) + - Id: 9163 + Title: Back to Paiko + - Id: 9164 + Title: Delivery of Good News(4) + - Id: 9165 + Title: Reward from Paiko for success of Jaty Crown + - Id: 9167 + Title: Tutorial - Mercenary for Hire + - Id: 9168 + Title: Quest Window Check + - Id: 9169 + Title: Window Shopper Catalogue + - Id: 9170 + Title: Window Shopper Catalogue + - Id: 9171 + Title: Enchanting Items + - Id: 9172 + Title: Enchanted Items + - Id: 9173 + Title: Tutorial Timer Cooldown + TimeLimit: +20h + - Id: 9222 + Title: Get Rid of Bangungot from Hospital 2F + Targets: + - Mob: BANGUNGOT_3 + Count: 1 + - Id: 9223 + Title: Will there be Peace at the Hospital? + TimeLimit: +7d + - Id: 9224 + Title: Explore Hospital 2F + TimeLimit: +1h + - Id: 9225 + Title: Mystery Robbery Incident 1 + - Id: 9226 + Title: Mystery Robbery Incident 2 + - Id: 9227 + Title: Mystery Robbery Incident 3 + - Id: 9228 + Title: Mystery Robbery Incident 4 + - Id: 9229 + Title: Mystery Robbery Incident 5 + - Id: 9230 + Title: Mystery Robbery Incident 6 + - Id: 9231 + Title: Mystery Robbery Incident 7 + - Id: 9232 + Title: Mystery Robbery Incident 8 + - Id: 9233 + Title: Mystery Robbery Incident 9 + - Id: 9234 + Title: Mystery Robbery Incident 10 + - Id: 9235 + Title: Mystery Robbery Incident 11 + - Id: 9236 + Title: Mystery Robbery Incident 12 + - Id: 9237 + Title: Mystery Robbery Incident 13 + - Id: 9238 + Title: Mystery Robbery Incident 14 + - Id: 9239 + Title: Mystery Robbery Incident 15 + - Id: 9240 + Title: Luen's statement notes + - Id: 9241 + Title: Luen's statement notes + - Id: 9242 + Title: Luen's statement notes + - Id: 9243 + Title: Luen's statement notes + - Id: 9244 + Title: Dames's statement notes + - Id: 9245 + Title: Dames's statement notes + - Id: 9246 + Title: Dames's statement notes + - Id: 9247 + Title: Dames's statement notes + - Id: 9248 + Title: Rosa's statement notes + - Id: 9249 + Title: Rosa's statement notes + - Id: 9250 + Title: Rosa's statement notes + - Id: 9251 + Title: Rosa's statement notes + - Id: 9252 + Title: Observing Poppy + - Id: 9253 + Title: Examining a messy bookshelf + - Id: 9254 + Title: Examining a damaged book + - Id: 9255 + Title: Examining a container for soda cans + - Id: 9256 + Title: Examining a messed up table + - Id: 9257 + Title: Examining a foreign object + - Id: 9258 + Title: Field examination results + - Id: 9259 + Title: Confirming Cruyan's statements + Targets: + - Mob: MENBLATT + Count: 5 + - Mob: PETAL + Count: 30 + - Id: 9260 + Title: Survey investigation notes + - Id: 9262 + Title: Mystery Robbery Incident 16 + - Id: 9264 + Title: Job change to Mage + - Id: 9265 + Title: Job change to Mage + - Id: 9266 + Title: Job change to Mage + - Id: 9267 + Title: The way to be a strong Mage - 1 + - Id: 9268 + Title: The way to be a strong Mage - 2 + - Id: 9269 + Title: The way to be a strong Mage - 3 + - Id: 9270 + Title: The way to be a strong Mage - 4 + - Id: 9284 + Title: Stopping Geffen Gangsters + - Id: 9285 + Title: Beating Geffen Gangsters + - Id: 9286 + Title: Stop Geffen Gangsters + - Id: 9287 + Title: Defeating Geffen Gangsters + - Id: 9288 + Title: Catch a Geffen thief + - Id: 9289 + Title: Get things back from the thief + - Id: 9290 + Title: Participate in Magic competitions + - Id: 9291 + Title: Participate in Magic competitions + - Id: 9292 + Title: Participate in Magic competitions + - Id: 9293 + Title: Register in Magic Competition + Targets: + - Mob: DESERT_WOLF + Count: 1 + - Id: 9294 + Title: Registration Complete + - Id: 9295 + Title: 1st match of the Tournament has started + - Id: 9296 + Title: 2nd match of the Competition has started + - Id: 9297 + Title: 3rd match of the Competition has started + - Id: 9298 + Title: 4th match of the Competition has started + - Id: 9299 + Title: 5th match of the Competition has started + - Id: 9300 + Title: 6th match of the Competition has started + - Id: 9301 + Title: 7th match of the Competition has started + - Id: 9302 + Title: 8th match of the Competition has started + - Id: 9303 + Title: 9th match of the Competition has started + - Id: 9304 + Title: 10th match of the Competition has started + - Id: 9305 + Title: 11th match of the Competition has started + - Id: 9306 + Title: 12th match of the Competition has started + - Id: 9307 + Title: Final match of the Competition has started + - Id: 9308 + Title: Magic Competition Win~! + - Id: 9309 + Title: Magic Tournament defeat + - Id: 9310 + Title: Encounter Iris + - Id: 9311 + Title: Encounter Chaos + - Id: 9312 + Title: Encounter Lydia + - Id: 9313 + Title: Encounter Fenrir + - Id: 9314 + Title: Encounter Loki + - Id: 9315 + Title: Exploring the dimensional gap + TimeLimit: +23h + - Id: 9316 + Title: Re-exploring the crack of spaces + TimeLimit: +23h + - Id: 9318 + Title: Pursuing Hiding Morocc + Targets: + - Mob: EP14_MORS_BOSSB + Count: 1 + - Id: 9319 + Title: Pursuing Hiding Morocc Continues + TimeLimit: +23h + - Id: 9335 + Title: Search for shards of Gigantes + - Id: 9336 + Title: Go back to Professor Bernhard + TimeLimit: +7d + - Id: 9337 + Title: Wrapping up the Adventure + - Id: 9457 + Title: Solved Anyway + - Id: 9458 + Title: Pipe Cleaning + Targets: + - Mob: SEAANEMONE + Count: 20 + - Id: 9459 + Title: Too Early for Pipe Cleaning + TimeLimit: 4h + - Id: 9460 + Title: Collecting Ore Fragments + Drops: + - Mob: COWRAIDERS1 + Item: Fragment_of_Purple_Ore + Rate: 5000 + - Mob: COWRAIDERS2 + Item: Fragment_of_Purple_Ore + Rate: 5000 + - Mob: COYOTE + Item: Fragment_of_Purple_Ore + Rate: 5000 + - Id: 9461 + Title: Enough Ores + TimeLimit: 4h + - Id: 10000 + Title: To the Prontera Royal Court + - Id: 10001 + Title: Qualification Test + - Id: 10002 + Title: Qualification Review + - Id: 10003 + Title: Instructions on what to do + - Id: 10004 + Title: Interim Report + - Id: 10005 + Title: Prince Eigen Ahrum + - Id: 10006 + Title: Prince Ernst + - Id: 10007 + Title: Prince Poe + - Id: 10008 + Title: Prince Peter + - Id: 10009 + Title: Prince Urugen + - Id: 10010 + Title: Prince Helmut + - Id: 10011 + Title: Prince Erich + - Id: 10012 + Title: Conversation of the two princes + - Id: 10013 + Title: Searching for the unknown girl + - Id: 10014 + Title: Back to Peter + - Id: 10015 + Title: Test 15 + - Id: 10016 + Title: A Guest from the Walter Family + - Id: 10017 + Title: Conspiracy + - Id: 10018 + Title: Villainous Ahrum - Poe + - Id: 10019 + Title: Villainous Ahrum - Peter + - Id: 10020 + Title: Villainous Ahrum - Erich + - Id: 10021 + Title: Villainous Ahrum - Urugen + - Id: 10022 + Title: Villainous Ahrum - Helmut + - Id: 10023 + Title: Eigen Ahrum and Ernst -Former- + - Id: 10024 + Title: Eigen Ahrum and Ernst -Latter- + - Id: 10025 + Title: Good-bye, dear! + - Id: 10026 + Title: Reforming Meto + - Id: 10027 + Title: Reforming Meto + - Id: 10028 + Title: Reforming Meto + - Id: 10029 + Title: Reforming Meto + - Id: 10030 + Title: Reforming Meto + - Id: 10031 + Title: Reforming Meto + - Id: 10032 + Title: Reforming Meto + - Id: 10033 + Title: Reforming Meto + - Id: 10034 + Title: Search the knife + - Id: 10035 + Title: Deliver the knife + - Id: 10036 + Title: Material Supply-Candy + - Id: 10037 + Title: Material Supply-Crap Shells + - Id: 10038 + Title: Material Supply-Conch + - Id: 10039 + Title: Material Supply-Fish Tail + - Id: 10040 + Title: Material Supply-White Platter + - Id: 10041 + Title: Material Supply-? + - Id: 10042 + Title: Find the Piano Keys-5 remained + - Id: 10043 + Title: Find the Piano Keys-5 remained + - Id: 10044 + Title: Find the Piano Keys-4 remained + - Id: 10045 + Title: Find the Piano Keyboard-4 remained + - Id: 10046 + Title: Find the Piano Keyboard-3 remained + - Id: 10047 + Title: Find the Piano Keyboard-3 remained + - Id: 10048 + Title: Find the Piano Keyboard-2 remained + - Id: 10049 + Title: Find the Piano Keyboard-2 remained + - Id: 10050 + Title: Find the Piano Keyboard-1 remained + - Id: 10051 + Title: Find the Piano Keyboard-1 remained + - Id: 10052 + Title: Find the Piano Keyboard-To the piano + - Id: 10053 + Title: Find the Piano Keyboard-Fill the empty spot + - Id: 10054 + Title: On the Verge of the Escape-Clint Kana + - Id: 10055 + Title: Understanding the culture of Utan + - Id: 10056 + Title: Learning Utan Language + - Id: 10057 + Title: Onward to the Other World + - Id: 10058 + Title: Onward to the Other World + - Id: 10059 + Title: Onward to the Other World + - Id: 10060 + Title: Onward to the Other World + - Id: 10061 + Title: Onward to the Other World + - Id: 10062 + Title: Onward to the Other World + - Id: 10063 + Title: Onward to the Other World + - Id: 10064 + Title: Onward to the Other World + - Id: 10065 + Title: Onward to the Other World + - Id: 10066 + Title: Onward to the Other World + - Id: 10067 + Title: Onward to the Other World + - Id: 10068 + Title: Onward to the Other World + - Id: 10069 + Title: Onward to the Other World + - Id: 10070 + Title: Onward to the Other World + - Id: 10071 + Title: Onward to the Other World + - Id: 10072 + Title: Onward to the Other World + - Id: 10073 + Title: Onward to the Other World + - Id: 10074 + Title: Onward to the Other World + - Id: 10075 + Title: Onward to the Other World + - Id: 10076 + Title: Onward to the Other World + - Id: 10077 + Title: Onward to the Other World + - Id: 10078 + Title: Onward to the Other World + - Id: 10079 + Title: Escape from the reality, into the broad world + - Id: 10080 + Title: Escape from the reality, into the broad world + - Id: 10081 + Title: Escape from the reality, into the broad world + - Id: 10082 + Title: Escape from the reality, into the broad world + - Id: 10083 + Title: Escape from the reality, into the broad world + - Id: 10084 + Title: Escape from the reality, into the broad world + - Id: 10085 + Title: Escape from the reality, into the broad world + TimeLimit: +1d + - Id: 10086 + Title: Escape from the reality, into the broad world + - Id: 10087 + Title: Escape from the reality, into the broad world + TimeLimit: +1d + - Id: 10088 + Title: Escape from the reality, into the broad world + - Id: 10089 + Title: Escape from the reality, into the broad world + - Id: 10090 + Title: Job changes to Mechanic + - Id: 10091 + Title: Job changes to Mechanic + - Id: 10092 + Title: Job changes to Mechanic + - Id: 10093 + Title: Job changes to Mechanic + - Id: 10094 + Title: Job changes to Mechanic + - Id: 10095 + Title: Job changes to Mechanic + - Id: 10096 + Title: Job changes to Mechanic + - Id: 10097 + Title: Job changes to Mechanic + - Id: 10098 + Title: Job changes to Mechanic + - Id: 10099 + Title: Job changes to Mechanic + - Id: 10100 + Title: Job changes to Mechanic + - Id: 10101 + Title: Job changes to Mechanic + - Id: 10102 + Title: To client - the chapter of the sphinx dungeon + - Id: 10103 + Title: To client - the chapter of Glast heim + - Id: 10104 + Title: To client - the chapter of Juno + - Id: 10105 + Title: To client - the chapter of a clock tower + - Id: 10106 + Title: "To client - the chapter of localizing " + - Id: 10107 + Title: Sphinx dungeon - Requiem + Targets: + - Mob: REQUIEM + Count: 10 + - Id: 10108 + Title: Sphinx dungeon - Marduk + Targets: + - Mob: MARDUK + Count: 10 + - Id: 10109 + Title: Sphinx dungeon - Pasana + Targets: + - Mob: PASANA + Count: 10 + - Id: 10110 + Title: Glast heim - Dark Frame + Targets: + - Mob: DARK_FRAME + Count: 10 + - Id: 10111 + Title: Glast heim - Evil druid + Targets: + - Mob: EVIL_DRUID + Count: 10 + - Id: 10112 + Title: Glast heim - Wraith + Targets: + - Mob: WRAITH + Count: 10 + - Id: 10113 + Title: Glast Heim - Raydric Archer + Targets: + - Mob: RAYDRIC_ARCHER + Count: 10 + - Id: 10114 + Title: Juno - Grand Peco + Targets: + - Mob: GRAND_PECO + Count: 20 + - Id: 10115 + Title: Juno - sleeper + Targets: + - Mob: SLEEPER + Count: 20 + - Id: 10116 + Title: Juno - Goat + Targets: + - Mob: GOAT + Count: 20 + - Id: 10117 + Title: Juno - Harpy + Targets: + - Mob: HARPY + Count: 20 + - Id: 10118 + Title: Clock tower - Clock + Targets: + - Mob: CLOCK + Count: 15 + - Id: 10119 + Title: Clock tower - Punk + Targets: + - Mob: PUNK + Count: 15 + - Id: 10120 + Title: Clock tower - Rideword + Targets: + - Mob: RIDEWORD + Count: 15 + - Id: 10121 + Title: Localizing - Uzhas + Targets: + - Mob: UZHAS + Count: 15 + - Id: 10122 + Title: Localizing - Miyabi Doll + Targets: + - Mob: MIYABI_NINGYO + Count: 15 + - Id: 10123 + Title: Localizing - Mi Gao + Targets: + - Mob: INCREASE_SOIL + Count: 15 + - Id: 11000 + Title: Inspection of Odin Shrine + - Id: 11001 + Title: Inspection of Odin Shrine + - Id: 11002 + Title: Inspection of Odin Shrine + - Id: 11003 + Title: Inspection of Odin Shrine + - Id: 11004 + Title: Inspection of Odin Shrine + - Id: 11005 + Title: Inspection of Odin Shrine + - Id: 11006 + Title: Inspection of Odin Shrine + - Id: 11007 + Title: Inspection of Odin Shrine + - Id: 11008 + Title: Inspection of Odin Shrine + - Id: 11009 + Title: Morriphen's Request + - Id: 11010 + Title: Fetching the medicine + - Id: 11011 + Title: Medicine for two + - Id: 11012 + Title: Find Makkie + - Id: 11013 + Title: Red Plant Stem Powder + - Id: 11014 + Title: The researcher's medicine + - Id: 11015 + Title: Siria's cure + - Id: 11016 + Title: Morriphen's story + - Id: 11017 + Title: Exploring Juperos + - Id: 11018 + Title: Exploring Juperos + - Id: 11019 + Title: Exploring Juperos + - Id: 11020 + Title: Exploring Juperos + - Id: 11021 + Title: Exploring Juperos + - Id: 11022 + Title: Exploring Juperos + - Id: 11029 + Title: Going to the Turtle Island.. + - Id: 11030 + Title: Going to the Turtle Island.. + - Id: 11031 + Title: Going to the Turtle Island.. + - Id: 11032 + Title: Going to the Turtle Island.. + - Id: 11033 + Title: Going to the Turtle Island.. + - Id: 11034 + Title: Going to the Turtle Island.. + - Id: 11035 + Title: Going to the Turtle Island.. + - Id: 11036 + Title: Going to the Turtle Island.. + - Id: 11037 + Title: Going to the Turtle Island.. + - Id: 11038 + Title: Meet the Dead + - Id: 11039 + Title: Meet the Dead + - Id: 11040 + Title: Meet the Dead + - Id: 11041 + Title: Meet the Dead + - Id: 11042 + Title: Meet the Dead + - Id: 11043 + Title: Meet the Dead + - Id: 11044 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11045 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11046 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11047 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11048 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11049 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11050 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11051 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11052 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11053 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11054 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11055 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11056 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11057 + Title: Herb Medicine - Being a Doctor's Assistance + - Id: 11070 + Title: Poison King + - Id: 11071 + Title: Poison King + - Id: 11072 + Title: Poison King + - Id: 11073 + Title: Poison King + - Id: 11074 + Title: Poison King + - Id: 11075 + Title: Poison King + - Id: 11076 + Title: Poison King + - Id: 11077 + Title: Poison King + - Id: 11078 + Title: Poison King + - Id: 11079 + Title: Poison King + - Id: 11080 + Title: Poison King + - Id: 11081 + Title: Poison King + - Id: 11082 + Title: Poison King + - Id: 11083 + Title: Poison King + - Id: 11084 + Title: New Surroundings + - Id: 11085 + Title: New Surroundings + - Id: 11086 + Title: New Surroundings + - Id: 11087 + Title: Repairing the Tent + - Id: 11088 + Title: Repairing the Tent + - Id: 11089 + Title: Repairing the Tent + - Id: 11090 + Title: Repairing the Tent + - Id: 11091 + Title: Delivering Supplies + - Id: 11092 + Title: Delivering Supplies + - Id: 11093 + Title: Delivering Supplies + - Id: 11094 + Title: Delivering Supplies + - Id: 11095 + Title: Delivering Supplies + - Id: 11096 + Title: Delivering Supplies + - Id: 11097 + Title: Delivering Supplies + - Id: 11098 + Title: Delivering Supplies + - Id: 11099 + Title: To My Friend + - Id: 11100 + Title: To My Friend + - Id: 11101 + Title: Secret note of Bazet + - Id: 11102 + Title: Secret note of Bazet + - Id: 11103 + Title: Secret note of Bazet + - Id: 11104 + Title: Resting time + TimeLimit: +23h + - Id: 11105 + Title: Tendrilrion skin + - Id: 11106 + Title: Job changing to Warlock + - Id: 11107 + Title: Job changing to Warlock + - Id: 11108 + Title: Job changing to Warlock + - Id: 11109 + Title: Job changing to Warlock + - Id: 11110 + Title: Job changing to Warlock + - Id: 11111 + Title: Job changing to Warlock + - Id: 11112 + Title: Job changing to Warlock + - Id: 11113 + Title: Until radering is functioning + TimeLimit: +23h + - Id: 11114 + Title: "Request : Hunt Honet" + Targets: + - Mob: HORNET + Count: 10 + - Id: 11115 + Title: "Request : Hunt Condor" + Targets: + - Mob: CONDOR + Count: 20 + - Id: 11116 + Title: "Request : Hunt Grasshopper's Leg" + Targets: + - Mob: ROCKER + Count: 10 + - Id: 11117 + Title: "Request : Hunt Worm tail" + Targets: + - Mob: WORM_TAIL + Count: 20 + - Id: 11118 + Title: "Request : Hunt Spore" + Targets: + - Mob: SPORE + Count: 30 + - Id: 11119 + Title: "Request : Pest Control" + Targets: + - Mob: THIEF_BUG_EGG + Count: 20 + - Id: 11120 + Title: "Request : Hunt Muka" + Targets: + - Mob: MUKA + Count: 20 + - Id: 11121 + Title: "Request : Hunt Farmiliar" + Targets: + - Mob: FARMILIAR + Count: 20 + - Id: 11122 + Title: "Request : Collect Feather" + Targets: + - Mob: PECOPECO + Count: 30 + - Id: 11123 + Title: "Request : Collect Poison Spore" + Targets: + - Mob: POISON_SPORE + Count: 30 + - Id: 11124 + Title: "Request : Hunt Honet - Complete" + TimeLimit: +1d + - Id: 11125 + Title: "Request : Hunt Condor - Complete" + TimeLimit: +1d + - Id: 11126 + Title: "Request : Hunt Grasshopper's Leg - Complete" + TimeLimit: +1d + - Id: 11127 + Title: "Request : Hunt Worm Tail - Complete" + TimeLimit: +1d + - Id: 11128 + Title: "Request : Hunt Spore - Complete" + TimeLimit: +1d + - Id: 11129 + Title: "Request : Pest Control - Complete" + TimeLimit: +1d + - Id: 11130 + Title: "Request : Hunt Muka - Complete" + TimeLimit: +1d + - Id: 11131 + Title: "Request : Hunt Farmiliar - Complete" + TimeLimit: +1d + - Id: 11132 + Title: "Request : Collect Feather - Complete" + TimeLimit: +1d + - Id: 11133 + Title: "Request : Collect Poison Spore - Complete" + TimeLimit: +1d + - Id: 11135 + Title: Looking for Maestro Song + - Id: 11136 + Title: Looking for Maestro Song + - Id: 11137 + Title: Looking for Maestro Song + - Id: 11138 + Title: Looking for Maestro Song + - Id: 11139 + Title: Looking for Maestro Song + - Id: 11140 + Title: The sky, plane and travel sickness. + - Id: 11141 + Title: Human & gossip is towarding to the bar + - Id: 11142 + Title: Fearful metalic sound + - Id: 11143 + Title: Thanatos tower + - Id: 11144 + Title: "Juno manager : click" + - Id: 11145 + Title: "I want to get the " + Targets: + - Mob: TEDDY_BEAR + Count: 33 + - Id: 11146 + Title: to ice tunnel... + - Id: 11147 + Title: Lared's dew + - Id: 11148 + Title: Toward Comodo with the bow + - Id: 11149 + Title: Just pour the water. Pour! Pour!... + - Id: 11150 + Title: Looking for Maestro Song + - Id: 11151 + Title: Looking for Maestro Song + - Id: 11152 + Title: to the quiet place!... + - Id: 11153 + Title: Missing watch top + - Id: 11154 + Title: I will remember the memories with you.... + - Id: 11155 + Title: undefinable battler + - Id: 11156 + Title: annoying homework + Targets: + - Mob: DESERT_WOLF + Count: 100 + - Id: 11157 + Title: "Helmes valley " + - Id: 11158 + Title: On the way for meditation + - Id: 11159 + Title: Story of Brian + - Id: 11160 + Title: Story of John + - Id: 11161 + Title: Story of Tyler + - Id: 11162 + Title: Story of Rose + - Id: 11163 + Title: Story of Bain + - Id: 11164 + Title: Story of Lash + - Id: 11165 + Title: Delivery to Brian + - Id: 11166 + Title: Delivery to John + - Id: 11167 + Title: Delivery to Tyler + - Id: 11168 + Title: Delivery to Rose + - Id: 11169 + Title: Delivery to Bain + - Id: 11170 + Title: Delivery to Lash + - Id: 11171 + Title: Request from Frede + - Id: 11172 + Title: Request from Frede + - Id: 11173 + Title: Request from Frede + - Id: 11174 + Title: Supply Shortage + - Id: 11175 + Title: Supply Shortage + TimeLimit: +2h + - Id: 11176 + Title: For my friends + - Id: 11182 + Title: Theore's Report + TimeLimit: +1mn + - Id: 11183 + Title: Theore's Favor + - Id: 11184 + Title: Runaway Laphine + - Id: 11185 + Title: Pouch + - Id: 11186 + Title: Pouch + - Id: 11187 + Title: Pouch + - Id: 11188 + Title: Pouch + - Id: 11189 + Title: Roast Beef + - Id: 11190 + Title: Roast Beef + - Id: 11191 + Title: Shortage of Roast Beef + - Id: 11192 + Title: Mora Village... + - Id: 11193 + Title: Sonya's Friend + - Id: 11194 + Title: Runaway Laphine + - Id: 11195 + Title: Pouch + - Id: 11196 + Title: Pouch + - Id: 11197 + Title: Pouch + - Id: 11198 + Title: Mora Village... + - Id: 11199 + Title: Theo's Friend + - Id: 11200 + Title: Pouch + - Id: 11201 + Title: Roast Beef + - Id: 11202 + Title: Roast Beef + - Id: 11203 + Title: Shortage of Roast Beef + - Id: 11204 + Title: Mora Village... + - Id: 11205 + Title: Pauchon's Friend + - Id: 11206 + Title: Quick Delivery Yoneseu + - Id: 11207 + Title: A Very Heavy Burden + - Id: 11208 + Title: Daphne + - Id: 11209 + Title: Hardships of Thomas + - Id: 11210 + Title: Malangdo Reunion + - Id: 11211 + Title: Malangdo Reunion + - Id: 11212 + Title: Malangdo Reunion + - Id: 11213 + Title: Malangdo Reunion + - Id: 11214 + Title: Malangdo Reunion + - Id: 11215 + Title: Malangdo Reunion + - Id: 11216 + Title: Malangdo Reunion + - Id: 11217 + Title: Malangdo Reunion + - Id: 11218 + Title: Malangdo Reunion + - Id: 11219 + Title: Malangdo Reunion + - Id: 11220 + Title: Malangdo Reunion + - Id: 11221 + Title: Repair of cracks + - Id: 11222 + Title: Repair of cracks + - Id: 11223 + Title: Repair of cracks + - Id: 11224 + Title: Repair of cracks + - Id: 11225 + Title: Repair of cracks + - Id: 11226 + Title: Repair of cracks + - Id: 11227 + Title: Repair of cracks + - Id: 11228 + Title: Repair of cracks + - Id: 11229 + Title: Repair of cracks + - Id: 11230 + Title: Repair of cracks + - Id: 11231 + Title: Repair of cracks + - Id: 11232 + Title: Repair of cracks + - Id: 11233 + Title: Repair of cracks + - Id: 11234 + Title: Repair of cracks + - Id: 11235 + Title: Repair of cracks + - Id: 11236 + Title: Repair of cracks + - Id: 11237 + Title: Repair of cracks + - Id: 11238 + Title: Malangdo Fruits + - Id: 11239 + Title: Malangdo Fruits + TimeLimit: +23h + - Id: 11240 + Title: Repair of cracks + - Id: 11241 + Title: Repair of cracks + - Id: 11242 + Title: Repair of cracks + - Id: 11243 + Title: Repair of cracks + TimeLimit: +23h + - Id: 11244 + Title: Soft Jelly + - Id: 11245 + Title: Soft Jelly + TimeLimit: +23h + - Id: 11255 + Title: Otter Ssamsun + - Id: 11284 + Title: Nurse at Port Malaya-1 + - Id: 11285 + Title: Nurse at Port Malaya-2 + - Id: 11286 + Title: Nurse at Port Malaya-3 + - Id: 11287 + Title: Nurse at Port Malaya-4 + - Id: 11288 + Title: Nurse at Port Malaya-5 + - Id: 11289 + Title: Nurse at Port Malaya-6 + - Id: 11290 + Title: Nurse at Port Malaya-7 + - Id: 11291 + Title: Nurse at Port Malaya-8 + - Id: 11292 + Title: Nurse at Port Malaya-9 + - Id: 11293 + Title: Nurse at Port Malaya-10 + - Id: 11294 + Title: Nurse at Port Malaya-11 + - Id: 11295 + Title: Nurse at Port Malaya-12 + - Id: 11296 + Title: Nurse at Port Malaya-13 + - Id: 11297 + Title: Nurse at Port Malaya-14 + - Id: 11298 + Title: Nurse at Port Malaya-15 + - Id: 11299 + Title: Nurse at Port Malaya-16 + - Id: 11300 + Title: Nurse at Port Malaya-17 + - Id: 11301 + Title: Nurse at Port Malaya-18 + - Id: 11302 + Title: Nurse at Port Malaya-19 + - Id: 11303 + Title: Nurse at Port Malaya-20 + - Id: 11304 + Title: Nurse at Port Malaya-21 + - Id: 11305 + Title: Nurse at Port Malaya-22 + - Id: 11306 + Title: Nurse at Port Malaya-23 + - Id: 11307 + Title: Nurse at Port Malaya-24 + - Id: 11308 + Title: Nurse at Port Malaya-25 + - Id: 11309 + Title: Nurse at Port Malaya-26 + Targets: + - Mob: BANGUNGOT_3 + Count: 1 + - Id: 11310 + Title: Eclage's Entrance + TimeLimit: +30s + - Id: 11311 + Title: Eclage's Entrance + - Id: 11312 + Title: Goliath + - Id: 11313 + Title: Goliath + - Id: 11314 + Title: Goliath + - Id: 11315 + Title: And time keeps on flowing + - Id: 11316 + Title: And time keeps on flowing + - Id: 11317 + Title: And time keeps on flowing + - Id: 11318 + Title: And time keeps on flowing + - Id: 11319 + Title: And time keeps on flowing + - Id: 11320 + Title: And time keeps on flowing + - Id: 11321 + Title: And time keeps on flowing + - Id: 11322 + Title: And time keeps on flowing + - Id: 11323 + Title: And time keeps on flowing + - Id: 11324 + Title: And time keeps on flowing + - Id: 11325 + Title: The chicken or the egg + - Id: 11326 + Title: The chicken or the egg + - Id: 11327 + Title: The chicken or the egg + - Id: 11328 + Title: The chicken or the egg + - Id: 11329 + Title: The chicken or the egg + - Id: 11330 + Title: The chicken or the egg + - Id: 11331 + Title: The chicken or the egg + - Id: 11332 + Title: The chicken or the egg + - Id: 11333 + Title: Red seed and green seed + - Id: 11334 + Title: Red seed and green seed + - Id: 11335 + Title: Dreaming boy + - Id: 11336 + Title: Dreaming boy + - Id: 11337 + Title: Dreaming boy + - Id: 11338 + Title: Conversation with Subino + - Id: 11339 + Title: The most delicious on earth + Targets: + - Mob: PORING + Count: 10 + - Id: 11340 + Title: Carrots are delicious! + Targets: + - Mob: LUNATIC + Count: 10 + - Id: 11341 + Title: Rolling Fabre's clothing + Targets: + - Mob: FABRE + Count: 10 + - Id: 11342 + Title: Antidote Material~ + Targets: + - Mob: HORNET + Count: 10 + - Id: 11343 + Title: Conversation with Alice + - Id: 11344 + Title: Barrier!! + Targets: + - Mob: PUPA + Count: 5 + - Id: 11345 + Title: Conversation with Alice + - Id: 11346 + Title: Acolyte_damped creatures(LV.13) + - Id: 11347 + Title: Acolyte_soft bone(LV.18) + - Id: 11348 + Title: Acolyte_Solid bone(LV.23) + - Id: 11349 + Title: Dimensional Travel + - Id: 11350 + Title: Dimensional Travel + - Id: 11351 + Title: Dimensional Travel + - Id: 11352 + Title: Dimensional Travel + - Id: 11353 + Title: Dimensional Travel + - Id: 11354 + Title: Specimen Collection + - Id: 11355 + Title: Specimen Collection + Targets: + - Mob: FIREPIT + Count: 20 + - Id: 11356 + Title: Specimen Collection + - Id: 11357 + Title: Specimen Collection + Targets: + - Mob: SONIA + Count: 25 + - Id: 11358 + Title: Specimen Collection + - Id: 11359 + Title: Antidote + - Id: 11360 + Title: Antidote + - Id: 11361 + Title: Antidote + - Id: 11362 + Title: Antidote + - Id: 11363 + Title: To Phantasmagorika! + - Id: 11364 + Title: To Phantasmagorika! + - Id: 11365 + Title: To Phantasmagorika! + - Id: 11366 + Title: To Phantasmagorika! + - Id: 11367 + Title: Looking for the Traces + - Id: 11368 + Title: Looking for the Traces + - Id: 11369 + Title: Looking for the Traces + - Id: 11370 + Title: Looking for the Traces + - Id: 11371 + Title: Looking for the Traces + - Id: 11372 + Title: Looking for the Traces + - Id: 11373 + Title: Looking for the Traces + - Id: 11374 + Title: Looking for the Traces + - Id: 11375 + Title: Looking for the Traces + - Id: 11376 + Title: Let the Specialists Handle It + - Id: 11377 + Title: Act of Kindness + - Id: 11378 + Title: "Trick or treat " + - Id: 11379 + Title: Final Room + TimeLimit: +23h + - Id: 11380 + Title: Final Room + Targets: + - Mob: T_W_O + Count: 1 + - Id: 11381 + Title: Vestige + - Id: 11382 + Title: Vestige + - Id: 11383 + Title: Vestige + - Id: 11384 + Title: Vestige + - Id: 11385 + Title: Vestige + - Id: 11386 + Title: Vestige + - Id: 11387 + Title: Vestige + - Id: 11388 + Title: Vestige + - Id: 11389 + Title: Vestige + - Id: 11394 + Title: Call of the Royal Head Chef + - Id: 11395 + Title: Why Should I Prepare for the Banquets? + - Id: 11396 + Title: Why Should I Prepare for the Banquets? + - Id: 11397 + Title: Why Should I Prepare for the Banquets? + - Id: 11398 + Title: Why Should I Prepare for the Banquets? + - Id: 11399 + Title: Why Should I Prepare for the Banquets? + - Id: 11400 + Title: The Geoborgs + - Id: 11401 + Title: The Geoborgs + - Id: 11402 + Title: The Geoborgs + - Id: 11403 + Title: The Geoborgs + - Id: 11404 + Title: The Geoborgs + - Id: 11405 + Title: The Geoborgs + - Id: 11406 + Title: The Geoborgs + - Id: 11407 + Title: The Geoborgs + - Id: 11408 + Title: The Geoborgs + - Id: 11409 + Title: The Geoborgs + - Id: 11410 + Title: The Geoborgs + - Id: 11411 + Title: The Geoborgs + - Id: 11412 + Title: The Geoborgs + - Id: 11413 + Title: Why Should I Prepare for the Banquets? + - Id: 11414 + Title: Why Should I Prepare for the Banquets? + - Id: 11415 + Title: Why Should I Prepare for the Banquets? + - Id: 11416 + Title: Why Should I Prepare for the Banquets? + - Id: 11417 + Title: Why Should I Prepare for the Banquets? + - Id: 11418 + Title: Why Should I Prepare for the Banquets? + - Id: 11419 + Title: Why Should I Prepare for the Banquets? + Drops: + - Mob: GLASS_PLATE + Item: Advanced_Dish + Rate: 3000 + - Id: 11420 + Title: Why Should I Prepare for the Banquets? + - Id: 11421 + Title: "Banquet: Unexpected Sauce" + - Id: 11422 + Title: Complete Today's Sauce + TimeLimit: 4h + - Id: 11423 + Title: "Banquet: Griffin Barbecue" + - Id: 11424 + Title: "Banquet: Griffin Barbecue" + - Id: 11425 + Title: Complete Today's Grilled Griffin + TimeLimit: 4h + - Id: 11426 + Title: "Banquet: Washing 15 Dishes" + Drops: + - Mob: GLASS_PLATE + Item: Advanced_Dish + Rate: 3000 + - Id: 11427 + Title: Complete Today's Dish Collecting + TimeLimit: 4h + - Id: 11428 + Title: Ingredient for the Sauce + - Id: 11429 + Title: Ingredient for the Sauce + - Id: 11430 + Title: Ingredient for the Sauce + - Id: 11431 + Title: Ingredient for the Sauce + - Id: 11435 + Title: Vigilante Corp + - Id: 11436 + Title: Vigilante Corp + - Id: 11437 + Title: Vigilante Corp + - Id: 11438 + Title: Vigilante Corp + - Id: 11439 + Title: Vigilante Corp + - Id: 11440 + Title: Vigilante Corp + - Id: 11441 + Title: Vigilante Corp + - Id: 11442 + Title: Vigilante Corp + - Id: 11443 + Title: Vigilante Corp + - Id: 11444 + Title: Vigilante Corp + Drops: + - Mob: DR_RODA_FROG + Item: Luxurious_Cloth + Rate: 5000 + - Id: 11445 + Title: Vigilante Corp + - Id: 12000 + Title: An old friend + - Id: 12001 + Title: Digotz, Maku's old friend + - Id: 12002 + Title: Messenger of Friendship + - Id: 12003 + Title: Digotz's message + - Id: 12004 + Title: Maku's other friend + - Id: 12005 + Title: Benkaistein + - Id: 12006 + Title: Benkaistein's lost item + - Id: 12007 + Title: Kazien + - Id: 12008 + Title: Researcher Garins + - Id: 12009 + Title: Failed mission + - Id: 12010 + Title: No entrance + - Id: 12011 + Title: Lyozien + - Id: 12012 + Title: Meet Mr. Ahman + - Id: 12013 + Title: Delivery complete + - Id: 12014 + Title: More missions + - Id: 12015 + Title: Ghalstein + - Id: 12016 + Title: Sneaking into the Laboratory + - Id: 12017 + Title: Membership approved + - Id: 12018 + Title: Meeting the President + - Id: 12019 + Title: The President's Mission + - Id: 12020 + Title: Rescuing a Secret Wing Member + - Id: 12021 + Title: The Sealed File Folder + - Id: 12022 + Title: The Sealed File Folder + - Id: 12023 + Title: Shinokas the researcher + - Id: 12024 + Title: Kafra Corporation Agent + - Id: 12025 + Title: Rekenber's Secret Archive + - Id: 12026 + Title: Rekenber's Secret Archive + - Id: 12027 + Title: Rekenber's Secret Archive + - Id: 12028 + Title: Kurelle the traitor + - Id: 12029 + Title: Lost Engagement Ring + - Id: 12030 + Title: Engagement Ring Found + - Id: 12031 + Title: Find Annon + - Id: 12032 + Title: Searching for Annon + - Id: 12033 + Title: Traces of blood + - Id: 12034 + Title: Annon's side of the story + - Id: 12035 + Title: Holy Threads + - Id: 12036 + Title: The Stone Slate Message + - Id: 12037 + Title: Holier Threads + - Id: 12038 + Title: Searching for the Sa-mhing Tiger + - Id: 12039 + Title: Boonthom's Comrade + - Id: 12040 + Title: Benkaistein's Journal + - Id: 12041 + Title: Benkaistein's Journal + - Id: 12042 + Title: Benkaistein's Journal + - Id: 12043 + Title: Pass to the Slums + - Id: 12044 + Title: Soothing a crying child 1 + - Id: 12045 + Title: Soothing a crying child 2 + - Id: 12046 + Title: Soothing a crying child 3 + - Id: 12047 + Title: Soothing a crying child 4 + - Id: 12048 + Title: Soothing a crying child 5 + - Id: 12049 + Title: Job Quest 1 - Rogue + - Id: 12050 + Title: Job Quest 2 - Rogue + - Id: 12051 + Title: Job Quest 3 - Rogue + - Id: 12052 + Title: Job Quest 4 - Rogue + - Id: 12053 + Title: Job Quest 5 - Rogue + - Id: 12054 + Title: Job Quest 6 - Rogue + - Id: 12055 + Title: Job Quest - Assassin + - Id: 12056 + Title: Job Quest - Assassin + - Id: 12057 + Title: Pass to the Lab + - Id: 12058 + Title: Admission Restricted to the 102 Tower + TimeLimit: +7d + - Id: 12059 + Title: Orc's Memory Time Limit + TimeLimit: +2h + - Id: 12060 + Title: Today's Fishing Closed + TimeLimit: +1d + - Id: 12061 + Title: Concentration + TimeLimit: +10s + - Id: 12062 + Title: Today's Mining Closed + TimeLimit: +1d + - Id: 12070 + Title: Limited time for enter + TimeLimit: +4h + - Id: 12071 + Title: Stamp a seal on the attendance book + TimeLimit: +1d + - Id: 12072 + Title: Hunt tharafrog + Targets: + - Mob: THARA_FROG + Count: 20 + - Id: 12073 + Title: Remove Cruiser + Targets: + - Mob: CRUISER + Count: 15 + - Id: 12074 + Title: Remove Kukre + Targets: + - Mob: KUKRE + Count: 30 + - Id: 12075 + Title: Remove orcbaby + Targets: + - Mob: ORC_BABY + Count: 15 + - Id: 12076 + Title: Remove orcwarroir + Targets: + - Mob: ORK_WARRIOR + Count: 20 + - Id: 12077 + Title: Hunt vadon + Targets: + - Mob: VADON + Count: 15 + - Id: 12078 + Title: Hunt Megalodon + Targets: + - Mob: MEGALODON + Count: 30 + - Id: 12079 + Title: Hunt Marse + Targets: + - Mob: MARSE + Count: 15 + - Id: 12080 + Title: Hunt Cornutus + Targets: + - Mob: CORNUTUS + Count: 20 + - Id: 12081 + Title: Remove Myst + Targets: + - Mob: MYST + Count: 15 + - Id: 12082 + Title: Hunt shellfish + Targets: + - Mob: SHELLFISH + Count: 30 + - Id: 12083 + Title: Hunt Marine sphere + Targets: + - Mob: MARINE_SPHERE + Count: 15 + - Id: 12084 + Title: Hunt Phen + Targets: + - Mob: PHEN + Count: 20 + - Id: 12085 + Title: Remove orcskeleton + Targets: + - Mob: ORC_SKELETON + Count: 15 + - Id: 12086 + Title: Remove Zenorc + Targets: + - Mob: ZENORC + Count: 30 + - Id: 12087 + Title: Remove mummy + Targets: + - Mob: MUMMY + Count: 15 + - Id: 12088 + Title: Accomplishing a request + - Id: 12090 + Title: Mysterious guy + - Id: 12091 + Title: Just save the burning heart + - Id: 12092 + Title: Long lasting story + - Id: 12093 + Title: the record the intelligence Lyoda left + - Id: 12094 + Title: The damaged shield letter + - Id: 12096 + Title: Towards Karakas + - Id: 12097 + Title: Basic preparation + - Id: 12098 + Title: Tour of dungeon + - Id: 12099 + Title: Remove Root Cause + Targets: + - Mob: DRACO_EGG + Count: 10 + - Id: 12100 + Title: Violent Winged Insect + Targets: + - Mob: LUCIOLA_VESPA + Count: 12 + - Id: 12101 + Title: Work Interference + Targets: + - Mob: DRACO + Count: 5 + - Id: 12102 + Title: Intelligent Snakes + Targets: + - Mob: NAGA + Count: 10 + - Id: 12103 + Title: Legendary Creature + Targets: + - Mob: CORNUS + Count: 1 + - Id: 12104 + Title: Insects with an Appetite + Targets: + - Mob: CENTIPEDE + Count: 15 + - Id: 12105 + Title: Moving Rocks + Targets: + - Mob: BRADIUM_GOLEM + Count: 10 + - Id: 12106 + Title: A child on a flower + Targets: + - Mob: PINGUICULA + Count: 15 + - Id: 12107 + Title: Twisted Love + Targets: + - Mob: PINGUICULA_D + Count: 10 + - Id: 12108 + Title: Dangerous Plant Removal + Targets: + - Mob: NEPENTHES + Count: 12 + - Id: 12109 + Title: Larva Extermination + Targets: + - Mob: CENTIPEDE_LARVA + Count: 14 + - Id: 12110 + Title: Demon of Water + Targets: + - Mob: AQUA_ELEMENTAL + Count: 7 + - Id: 12111 + Title: Bird with ugly face + Targets: + - Mob: TATACHO + Count: 10 + - Id: 12117 + Title: Withered Flower + - Id: 12118 + Title: Welcomed Mineral + - Id: 12119 + Title: Valuable Textile + - Id: 12120 + Title: Curious Meat + - Id: 12121 + Title: Materials to Clear Snow + - Id: 12122 + Title: Best Cooler Material + - Id: 12123 + Title: Best Paint + - Id: 12124 + Title: Rare Valuable + - Id: 12125 + Title: Armory Material + - Id: 12126 + Title: Advanced Armory Material + - Id: 12127 + Title: Supervisor's Tool + - Id: 12128 + Title: Preparation for Heating + - Id: 12129 + Title: Suspicious Food + - Id: 12130 + Title: Useful Material + - Id: 12131 + Title: Essential Material for Construction + - Id: 12132 + Title: Essential Material for Construction 2 + - Id: 12133 + Title: Decoration arrangement + - Id: 12134 + Title: Instant Receptacle + - Id: 12135 + Title: Not enough medicine + - Id: 12136 + Title: Honey robber + - Id: 12137 + Title: Tools for Experiment + - Id: 12138 + Title: Fine Gift Samples + - Id: 12139 + Title: Respect for Taste! + - Id: 12140 + Title: Courtesy for Regulars + - Id: 12141 + Title: Special Package + - Id: 12142 + Title: Dangerous Request + - Id: 12143 + Title: Strange Trend + - Id: 12144 + Title: Unknown Usage + - Id: 12145 + Title: Other World Cuisine + - Id: 12146 + Title: Filling in Cracks + - Id: 12147 + Title: Adhesive Material + - Id: 12148 + Title: Bait for Tatacho Hunting + - Id: 12149 + Title: Swordmanship Practice + - Id: 12150 + Title: Pretty reddish vegetable + - Id: 12151 + Title: Tenacity of the pub owner + - Id: 12152 + Title: Tastes like home cooking + - Id: 12153 + Title: Hazardous plant when burnt + - Id: 12154 + Title: Unexpectedly Normal + - Id: 12155 + Title: Gift with heart + - Id: 12156 + Title: Respect personal appetite! + - Id: 12157 + Title: Resolution of the pub owner + - Id: 12158 + Title: Rage of the pub owner + - Id: 12159 + Title: Quest record from Laponte + TimeLimit: +23h + - Id: 12160 + Title: Quest record from Kalipo + TimeLimit: +23h + - Id: 12161 + Title: Quest record from Pura + TimeLimit: +23h + - Id: 12162 + Title: Quest record from Tragis + TimeLimit: +23h + - Id: 12163 + Title: Quest record from Calyon + TimeLimit: +23h + - Id: 12164 + Title: Quest record from Moltuka + TimeLimit: +23h + - Id: 12165 + Title: Dizziness + TimeLimit: +6h + - Id: 12166 + Title: Tree Root Doc. + - Id: 12167 + Title: Reptile Tongue Doc. + - Id: 12168 + Title: Scorpion Tail Doc. + - Id: 12169 + Title: Stem Doc. + - Id: 12170 + Title: Pointed Scale Doc. + - Id: 12171 + Title: Resin Doc. + - Id: 12172 + Title: Spawn Doc. + - Id: 12173 + Title: Jellopy Doc. + - Id: 12174 + Title: Fish Tail Doc. + - Id: 12175 + Title: Worm Peeling Doc. + - Id: 12176 + Title: Gill Doc. + - Id: 12177 + Title: Tooth of Bat Doc. + - Id: 12178 + Title: Fluff Doc. + - Id: 12179 + Title: Chrysalis Doc. + - Id: 12180 + Title: Feather of Birds Doc. + - Id: 12181 + Title: Talon Document Doc. + - Id: 12182 + Title: Sticky Webfoot Doc. + - Id: 12183 + Title: Animal Skin Doc. + - Id: 12184 + Title: Wolf Claw Doc. + - Id: 12185 + Title: Mushroom Spore Doc. + - Id: 12186 + Title: Orc's Fang Doc. + - Id: 12187 + Title: Evil Horn Doc. + - Id: 12188 + Title: Powder of Butterfly Doc. + - Id: 12189 + Title: Bill of Birds Doc. + - Id: 12190 + Title: Snake Scale Doc. + - Id: 12191 + Title: Insect Feeler Doc. + - Id: 12192 + Title: Immortal Heart Doc. + - Id: 12193 + Title: Rotten Bandage Doc. + - Id: 12194 + Title: Decayed Nail Doc. + - Id: 12195 + Title: Horrendous Mouth Doc. + - Id: 12196 + Title: Tentacle Doc. + - Id: 12197 + Title: Shell Doc. + - Id: 12198 + Title: Scale Shell Doc. + - Id: 12199 + Title: Venom Canine Doc. + - Id: 12200 + Title: Sticky Mucus Doc. + - Id: 12201 + Title: Bee Sting Doc. + - Id: 12202 + Title: Grasshopper's Leg Doc. + - Id: 12203 + Title: Royal Jelly Doc. + - Id: 12204 + Title: Yoyo Tail Doc. + - Id: 12205 + Title: Solid Shell Doc. + - Id: 12206 + Title: Yam Doc. + - Id: 12207 + Title: Raccoon Leaf Doc. + - Id: 12208 + Title: Snail's Shell Doc. + - Id: 12209 + Title: Horn Doc. + - Id: 12210 + Title: Bear's Footskin Doc. + - Id: 12211 + Title: Feather Doc. + - Id: 12212 + Title: Red Herb Doc. + - Id: 12213 + Title: Carrot Doc. + - Id: 12214 + Title: Cactus Needle Doc. + - Id: 12215 + Title: Stone Heart Doc. + - Id: 12216 + Title: Pouty Jahbong + TimeLimit: +6h + - Id: 12217 + Title: Request - Traces of wild boar hunt + - Id: 12218 + Title: How to make lava elixir + - Id: 12219 + Title: How to creat flame elixir + - Id: 12220 + Title: How to create glaicer elixir + - Id: 12221 + Title: How to create fossil elixir + - Id: 12222 + Title: How to create storm elixir + - Id: 12225 + Title: Pom Spider Hunting + Targets: + - Mob: POM_SPIDER + Count: 3 + - Id: 12226 + Title: Angra Mantis Hunting + Targets: + - Mob: ANGRA_MANTIS + Count: 4 + - Id: 12227 + Title: Parus Hunting + Targets: + - Mob: PARUS + Count: 5 + - Id: 12228 + Title: Little Fatam Hunting + Targets: + - Mob: LITTLE_FATUM + Count: 6 + - Id: 12229 + Title: Miming Hunting + Targets: + - Mob: MIMING + Count: 7 + - Id: 12230 + Title: Mora Monster Hunt + TimeLimit: +23h + - Id: 12231 + Title: Insect Feeler Collecting + - Id: 12232 + Title: Immortal Heart Collecting + - Id: 12233 + Title: Rotten Bandage Collecting + - Id: 12234 + Title: Orcish Voucher Collecting + - Id: 12235 + Title: Skeleton Bone Collecting + - Id: 12236 + Title: Memento Collecting + - Id: 12237 + Title: Shell Collecting + - Id: 12238 + Title: Scale Shell Collecting + - Id: 12239 + Title: Venom Canine Collecting + - Id: 12240 + Title: Sticky Mucus Collecting + - Id: 12241 + Title: Mora Item Request 1 + TimeLimit: +23h + - Id: 12242 + Title: Mora Item Request 2 + TimeLimit: +23h + - Id: 12243 + Title: Missing Information on Tajareu + - Id: 12244 + Title: Missing Information on Tokenizer + - Id: 12245 + Title: Missing Information on Mesile + - Id: 12246 + Title: Missing Information on Noir + - Id: 12247 + Title: Missing Information on Pajama God + - Id: 12248 + Title: Missing Information on Mendel + - Id: 12249 + Title: Missing Information on Miles + - Id: 12250 + Title: Missing Information on Kunmune + - Id: 12251 + Title: Missing Information on Chayihokin + - Id: 12252 + Title: Missing Information on Tuale + - Id: 12253 + Title: Missing Person Search Time Limit + TimeLimit: +23h + - Id: 12254 + Title: Now it's cleaning + TimeLimit: +1h + - Id: 12255 + Title: Hunt deep sea crab + Targets: + - Mob: MD_CRAB + Count: 20 + - Id: 12256 + Title: Hunt deep sea squid + Targets: + - Mob: MD_MARSE + Count: 20 + - Id: 12257 + Title: Hunt Ancient crustacean + Targets: + - Mob: MD_VADON + Count: 20 + - Id: 12258 + Title: Hunt deep sea shell + Targets: + - Mob: MD_SHELLFISH + Count: 20 + - Id: 12259 + Title: Hunt ancient kukre + Targets: + - Mob: MD_KUKRE + Count: 20 + - Id: 12260 + Title: Hunt deep sea conch + Targets: + - Mob: MD_CORNUTUS + Count: 20 + - Id: 12261 + Title: Hunt deep sea horse + Targets: + - Mob: MD_MARC + Count: 30 + - Id: 12262 + Title: Hunt ancient sword fish + Targets: + - Mob: MD_SWORD_FISH + Count: 30 + - Id: 12263 + Title: Hunt ancient sea god + Targets: + - Mob: MD_STROUF + Count: 30 + - Id: 12264 + Title: Hunt mutation anolian + Targets: + - Mob: MD_ANOLIAN + Count: 30 + - Id: 12265 + Title: Hunt deep sea mermaid + Targets: + - Mob: MD_OBEAUNE + Count: 30 + - Id: 12266 + Title: Hunt transformable kapha + Targets: + - Mob: MD_KAPHA + Count: 30 + - Id: 12267 + Title: Hunt weird coelacanth + Targets: + - Mob: COELACANTH_N_M + Count: 1 + - Id: 12268 + Title: Hunt dark coelacanth + Targets: + - Mob: COELACANTH_N_A + Count: 1 + - Id: 12269 + Title: Hunt Cruel coelacanth + Targets: + - Mob: COELACANTH_H_A + Count: 1 + - Id: 12270 + Title: Hunt mutation coelacanth + Targets: + - Mob: COELACANTH_H_M + Count: 1 + - Id: 12271 + Title: In progress general culvert single day service + TimeLimit: +23h + - Id: 12272 + Title: In progress hard culvert single day service + TimeLimit: +23h + - Id: 12273 + Title: In progress general culvert weekly service + TimeLimit: +6d17h + - Id: 12274 + Title: In progress hard culvert weekly service + TimeLimit: +6d17h + - Id: 12278 + Title: Towards Bakonawa Lake... + TimeLimit: +7d + - Id: 12279 + Title: Get Rid of Bakonawa + Targets: + - Mob: BAKONAWA_3 + Count: 1 + - Id: 12280 + Title: A suspicious prisoner + - Id: 12281 + Title: An unwanted favor + - Id: 12282 + Title: Gossip king Clever + - Id: 12283 + Title: The rift researcher + - Id: 12284 + Title: A cat merchant's source of information + - Id: 12285 + Title: A way to calm down a cat + - Id: 12286 + Title: Information traded for some canned foods + - Id: 12287 + Title: A weird experience + - Id: 12288 + Title: A successful experience + - Id: 12289 + Title: Another visitation + - Id: 12290 + Title: Clever's historical documents + - Id: 12291 + Title: Hidden historical documents (?) + - Id: 12292 + Title: The unknown ones + - Id: 12293 + Title: Figures in history + - Id: 12294 + Title: Tour of Eclage + - Id: 12295 + Title: Error + - Id: 12296 + Title: Fun times with the reactor + - Id: 12297 + Title: Encountering Etran + - Id: 12298 + Title: Two wishes + - Id: 12299 + Title: Revisiting Robert + - Id: 12300 + Title: Revisiting Etran + - Id: 12301 + Title: Two remaining friends + - Id: 12302 + Title: Salim Hamid + - Id: 12303 + Title: Applicant for trader + - Id: 12304 + Title: Introduction to merchantology + - Id: 12305 + Title: About the capability figure + - Id: 12306 + Title: Experience of disounts + - Id: 12307 + Title: Way to the Merchant + - Id: 12308 + Title: Removal of Worm Tails + - Id: 12309 + Title: Removal of Boa + - Id: 12310 + Title: Removal of Spore + - Id: 12311 + Title: Removal of Pirate Skeletons + - Id: 12312 + Title: Supplementary to the theory lesson + - Id: 12313 + Title: About stats + - Id: 12314 + Title: About skills + - Id: 12316 + Title: Meeting Hugin + - Id: 12317 + Title: Trace of Time Travel + TimeLimit: +23h + - Id: 12318 + Title: Corrupted Soul Hunt + Targets: + - Mob: MG_CORRUPTION_ROOT + Count: 1 + - Id: 12319 + Title: Amdarais Hunt + Targets: + - Mob: MG_AMDARAIS + Count: 1 + - Id: 12320 + Title: Time Traveler + - Id: 12321 + Title: Time Conqueror + - Id: 12322 + Title: Space Distortion + - Id: 12325 + Title: Faceworm's Nest after-effects + TimeLimit: +23h + - Id: 12326 + Title: The owner of old ring + TimeLimit: +1d + - Id: 12327 + Title: The memory of old photo album + TimeLimit: +1d + - Id: 12328 + Title: Dol-Seoi's Sorrow + TimeLimit: +1d + - Id: 12329 + Title: Keaton's Bracelet + TimeLimit: +1d + - Id: 12330 + Title: Skull-faced Girl + - Id: 12331 + Title: Trail of Toy Factory + TimeLimit: +23h + - Id: 12334 + Title: Trace of Time Travel + TimeLimit: +23h + - Id: 12335 + Title: Space Distortion + - Id: 12338 + Title: Time Traveler + - Id: 12339 + Title: Time Conqueror + - Id: 12340 + Title: Rebellion Job Change Quest + - Id: 12341 + Title: Rebellion Job Change Quest + - Id: 12342 + Title: Rebellion Job Change Quest + - Id: 12343 + Title: Rebellion Job Change Quest + Targets: + - Mob: J_REB_SHECIL1 + Count: 10 + - Id: 12344 + Title: Rebellion Job Change Quest + Targets: + - Mob: J_REB_SHECIL2 + Count: 3 + - Id: 12345 + Title: Rebellion Job Change Quest + - Id: 12346 + Title: Strange Ancient Science + - Id: 12347 + Title: Trace of Laboratory Access + TimeLimit: +23h + - Id: 12363 + Title: ?????? ?? ?? + - Id: 12369 + Title: Secret Business Relation + - Id: 12381 + Title: New Continent's Food Supplier + - Id: 12382 + Title: Distributing Food + TimeLimit: 4h + - Id: 12383 + Title: Sweet Potato Delivery + - Id: 12384 + Title: Meat Delivery + - Id: 12385 + Title: Carrot Delivery + - Id: 12386 + Title: Banana Delivery + - Id: 12387 + Title: Pumpkin Delivery + - Id: 12388 + Title: Mushroom Delivery + - Id: 12389 + Title: Guardian of Rock Ridge + - Id: 12390 + Title: Relieved for Now + TimeLimit: 4h + - Id: 12391 + Title: Buffaloes with Rifles + Targets: + - Mob: COWRAIDERS1 + Count: 15 + - Id: 12392 + Title: Punishing the Red Masks + Targets: + - Mob: COWRAIDERS2 + Count: 15 + - Id: 12393 + Title: Eye Patch Desperadoes + Targets: + - Mob: COWRAIDERS3 + Count: 15 + - Id: 12394 + Title: Exterminate Gray Four-legged Beasts + Targets: + - Mob: COYOTE + Count: 20 + - Id: 12395 + Title: Exterminate Swamp Arclouzes + Targets: + - Mob: RR_ARCLOUSE + Count: 10 + - Id: 12396 + Title: Exterminate Brown Rats + Targets: + - Mob: RR_CRAMP + Count: 10 + - Id: 12398 + Title: You're Good + TimeLimit: 4h + - Id: 12399 + Title: Hunt Heinous Criminals + Targets: + - Mob: E_COWRAIDERS1 + Count: 10 + - Id: 12400 + Title: Hunt Heinous Criminals + Targets: + - Mob: E_COWRAIDERS2 + Count: 10 + - Id: 12401 + Title: Hunt Heinous Criminals + Targets: + - Mob: E_COWRAIDERS3 + Count: 10 + - Id: 12402 + Title: Eliminate Dangerous Gas + Targets: + - Mob: GASTER + Count: 10 + - Id: 12403 + Title: Laborers of Rock Ridge + - Id: 12404 + Title: Are You Not Tired? + TimeLimit: 4h + - Id: 12405 + Title: Maintain the Red Pipe + - Id: 12406 + Title: Maintain the Blue Pipe + - Id: 12407 + Title: Maintain the Yellow Pipe + - Id: 12408 + Title: Maintain the White Pipe + - Id: 12409 + Title: Pipes Maintained + - Id: 12410 + Title: Contract with the Wealthy Merchant + - Id: 12411 + Title: Come Back Tomorrow + TimeLimit: 4h + - Id: 13000 + Title: RWC2011Card Gathering + - Id: 13001 + Title: RWC2011Card Gathering - Hold + TimeLimit: +23h + - Id: 13002 + Title: Brigan collecting + - Id: 13003 + Title: Carat Request + Targets: + - Mob: CARAT + Count: 30 + - Id: 13004 + Title: Carat Request timer + TimeLimit: +1h + - Id: 13005 + Title: Arclouse Request + Targets: + - Mob: ARCLOUSE + Count: 22 + - Id: 13006 + Title: Arclouse Request timer + TimeLimit: +1h + - Id: 13007 + Title: Anolian Request + Targets: + - Mob: ANOLIAN + Count: 30 + - Id: 13008 + Title: Anolian Request timer + TimeLimit: +1h + - Id: 13009 + Title: Sting Request + Targets: + - Mob: STING + Count: 30 + - Id: 13010 + Title: Sting Request timer + TimeLimit: +1h + - Id: 13011 + Title: Majoruros Request + Targets: + - Mob: MAJORUROS + Count: 30 + - Id: 13012 + Title: Majoruros Request timer + TimeLimit: +1h + - Id: 13013 + Title: Pinguicula Request + Targets: + - Mob: PINGUICULA + Count: 30 + - Id: 13014 + Title: Pinguicula Request timer + TimeLimit: +1h + - Id: 13015 + Title: Luciola Vespa Request + Targets: + - Mob: LUCIOLA_VESPA + Count: 30 + - Id: 13016 + Title: Luciola Vespa Request timer + TimeLimit: +1h + - Id: 13017 + Title: Desert Wolf Request + Targets: + - Mob: DESERT_WOLF + Count: 30 + - Id: 13018 + Title: Desert Wolf Request timer + TimeLimit: +1h + - Id: 13019 + Title: Snowier Request + Targets: + - Mob: SNOWIER + Count: 30 + - Id: 13020 + Title: Snowier Request timer + TimeLimit: +1h + - Id: 13021 + Title: Ice Titan Request + Targets: + - Mob: ICE_TITAN + Count: 30 + - Id: 13022 + Title: Ice Titan Request Timer + TimeLimit: +1h + - Id: 13023 + Title: Nightmare Terror Request + Targets: + - Mob: NIGHTMARE_TERROR + Count: 30 + - Id: 13024 + Title: Nightmare Terror Request Timer + TimeLimit: +1h + - Id: 13025 + Title: Flying Deleter Request + Targets: + - Mob: DELETER + Count: 30 + - Id: 13026 + Title: Deleter Request Timer + TimeLimit: +1h + - Id: 13040 + Title: Loli Ruri Request + Targets: + - Mob: LOLI_RURI + Count: 30 + - Id: 13041 + Title: Loli Ruri Request Timer + TimeLimit: +1h + - Id: 13042 + Title: Medusa Request + Targets: + - Mob: MEDUSA + Count: 30 + - Id: 13043 + Title: Medusa Request Timer + TimeLimit: +1h + - Id: 13044 + Title: Anubis Request + Targets: + - Mob: ANUBIS + Count: 20 + - Id: 13045 + Title: Anubis Request Timer + TimeLimit: +1h + - Id: 13046 + Title: Tendrilion Request + Targets: + - Mob: TENDRILRION + Count: 1 + - Id: 13047 + Title: Tendrilion Request Timer + TimeLimit: +1h + - Id: 13048 + Title: Tendrilion Request + Targets: + - Mob: TENDRILRION + Count: 1 + - Id: 13049 + Title: Tendrilion Request Timer + TimeLimit: +1h + - Id: 13050 + Title: The Laphine that loves the land + - Id: 13051 + Title: The singing Laphine + - Id: 13052 + Title: The watering Laphine + - Id: 13053 + Title: The dancing Laphine + - Id: 13054 + Title: The smiling Laphine + - Id: 13055 + Title: See if all the adventurers are safe + - Id: 13056 + Title: Reporter Rossi + - Id: 13057 + Title: Adventurer Euncheong + - Id: 13058 + Title: Troublemaker New Oz + - Id: 13059 + Title: End of project + TimeLimit: +22h + - Id: 13060 + Title: Safety confirmation complete! + TimeLimit: +22h + - Id: 13061 + Title: Food support + - Id: 13062 + Title: Food support - complete + TimeLimit: +22h + - Id: 13063 + Title: Dusting off + Targets: + - Mob: CENERE + Count: 20 + - Id: 13064 + Title: Dusting off - complete + TimeLimit: +22h + - Id: 13065 + Title: Collecting a souvenir + - Id: 13066 + Title: This is enough for souvenirs + TimeLimit: +22h + - Id: 13067 + Title: Raydric research + Targets: + - Mob: RAYDRIC + Count: 30 + - Id: 13068 + Title: Raydric research - timer + TimeLimit: +1h + - Id: 13069 + Title: Khalitzburg research + Targets: + - Mob: KHALITZBURG + Count: 30 + - Id: 13070 + Title: Khalitzburg research - timer + TimeLimit: +1h + - Id: 13071 + Title: Wander Man research + Targets: + - Mob: WANDER_MAN + Count: 30 + - Id: 13072 + Title: Wander Man research - timer + TimeLimit: +1h + - Id: 13073 + Title: Ancient Mimic research + Targets: + - Mob: ANCIENT_MIMIC + Count: 30 + - Id: 13074 + Title: Ancient Mimic research - timer + TimeLimit: +1h + - Id: 13075 + Title: Death Word research + Targets: + - Mob: DEATHWORD + Count: 30 + - Id: 13076 + Title: Death Word research - timer + TimeLimit: +1h + - Id: 13077 + Title: Owl Baron research + Targets: + - Mob: OWL_BARON + Count: 20 + - Id: 13078 + Title: Owl Baron research - timer + TimeLimit: +1h + - Id: 13079 + Title: Bloody Page Research + - Id: 13080 + Title: Bloody Page Research - Wait + TimeLimit: +1h + - Id: 13081 + Title: Dark Pinguicula research + Targets: + - Mob: PINGUICULA_D + Count: 30 + - Id: 13082 + Title: Dark Pinguicula research - timer + TimeLimit: +1h + - Id: 13083 + Title: Nepenthes research + Targets: + - Mob: NEPENTHES + Count: 30 + - Id: 13084 + Title: Nepenthes research - timer + TimeLimit: +1h + - Id: 13085 + Title: Naga research + Targets: + - Mob: NAGA + Count: 30 + - Id: 13086 + Title: Naga research - timer + TimeLimit: +1h + - Id: 13087 + Title: Centipede Larva research + Targets: + - Mob: CENTIPEDE_LARVA + Count: 20 + - Id: 13088 + Title: Centipede Larva research - timer + TimeLimit: +1h + - Id: 13089 + Title: Cornus research + Targets: + - Mob: CORNUS + Count: 30 + - Id: 13090 + Title: Cornus research - timer + TimeLimit: +1h + - Id: 13091 + Title: Mystic Horn Research + - Id: 13092 + Title: Mystic Horn Research - Wait + TimeLimit: +1h + - Id: 13093 + Title: Ancient Mummy research + Targets: + - Mob: ANCIENT_MUMMY + Count: 30 + - Id: 13094 + Title: Ancient Mummy research - timer + TimeLimit: +1h + - Id: 13095 + Title: Geffenia expedition + Targets: + - Mob: INCUBUS + Count: 10 + - Mob: SUCCUBUS + Count: 10 + - Mob: VIOLY + Count: 10 + - Id: 13096 + Title: Geffenia expedition - Wait + TimeLimit: +1h + - Id: 13097 + Title: Juperos expedition + Targets: + - Mob: VENATU_2 + Count: 30 + - Mob: VENATU_3 + Count: 30 + - Mob: VENATU_4 + Count: 30 + - Id: 13098 + Title: Juperos expedition - Wait + TimeLimit: +1h + - Id: 13099 + Title: Fragments and Rusty Screw + - Id: 13100 + Title: Fragments and Rusty Screw - Wait + TimeLimit: +1h + - Id: 13101 + Title: The way of Taekwon + - Id: 13102 + Title: Spinning kick + - Id: 13103 + Title: Breaking Willows + - Id: 13104 + Title: Breaking Spores + - Id: 13105 + Title: Breaking Zombies + - Id: 13106 + Title: Breaking Skeletons + - Id: 13107 + Title: Thanatos Tower Search + - Id: 13108 + Title: Rachel holy ground Search + - Id: 13109 + Title: Unknown island Search + - Id: 13110 + Title: Abyss Lake Search + - Id: 13111 + Title: Thanatos Tower Search - Reporting results + - Id: 13112 + Title: Rachel holy ground Search - Reporting results + - Id: 13113 + Title: Nameless Island Search - Reporting results + - Id: 13114 + Title: Abyss Lake Search - Reporting results + - Id: 13115 + Title: Thanatos Tower Search - Wait + TimeLimit: +1h + - Id: 13116 + Title: Rachel holy ground Search - Wait + TimeLimit: +1h + - Id: 13117 + Title: Unknown island Search - Wait + TimeLimit: +1h + - Id: 13118 + Title: Abyss Lake Search - Wait + TimeLimit: +1h + - Id: 13119 + Title: Combat Baroness of Retribution + Targets: + - Mob: RETRIBUTION + Count: 30 + - Id: 13120 + Title: Combat Baroness of Retribution - Wait + TimeLimit: +1h + - Id: 13121 + Title: Combat Lady Solace + Targets: + - Mob: SOLACE + Count: 30 + - Id: 13122 + Title: Combat Lady Solace - Wait + TimeLimit: +1h + - Id: 13123 + Title: Combat Mistress of Shelter + Targets: + - Mob: SHELTER + Count: 30 + - Id: 13124 + Title: Combat Mistress of Shelter - Wait + TimeLimit: +1h + - Id: 13125 + Title: Combat Dame of Sentinel + Targets: + - Mob: OBSERVATION + Count: 30 + - Id: 13126 + Title: Combat Dame of Sentinel - Wait + TimeLimit: +1h + - Id: 13127 + Title: Combat Vanberk and Isilla + Targets: + - Mob: VANBERK + Count: 20 + - Mob: ISILLA + Count: 20 + - Id: 13128 + Title: Combat Vanberk and Isilla - Wait + TimeLimit: +1h + - Id: 13129 + Title: Combat Hodremlin + Targets: + - Mob: HODREMLIN + Count: 30 + - Id: 13130 + Title: Combat Hodremlin - Wait + TimeLimit: +1h + - Id: 13131 + Title: Combat Agav and Echio + Targets: + - Mob: AGAV + Count: 20 + - Mob: ECHIO + Count: 20 + - Id: 13132 + Title: Combat Agav and Echio - Wait + TimeLimit: +1h + - Id: 13133 + Title: Combat Ragged Zombie + Targets: + - Mob: RAGGED_ZOMBIE + Count: 30 + - Id: 13134 + Title: Combat Ragged Zombie - Wait + TimeLimit: +1h + - Id: 13135 + Title: Combat Zombie Slaughter + Targets: + - Mob: ZOMBIE_SLAUGHTER + Count: 30 + - Id: 13136 + Title: Combat Zombie Slaughter - Wait + TimeLimit: +1h + - Id: 13137 + Title: Combat Banshee + Targets: + - Mob: BANSHEE + Count: 30 + - Id: 13138 + Title: Combat Banshee - Wait + TimeLimit: +1h + - Id: 13139 + Title: Combat Ferus and Bewler + Targets: + - Mob: FERUS + Count: 30 + - Mob: FERUS_ + Count: 30 + - Id: 13140 + Title: Combat Ferus and Bewler - Wait + TimeLimit: +1h + - Id: 13141 + Title: Combat Acidus + Targets: + - Mob: ACIDUS + Count: 30 + - Mob: ACIDUS_ + Count: 30 + - Id: 13142 + Title: Combat Acidus - Wait + TimeLimit: +1h + - Id: 13143 + Title: Egnigem Story + Targets: + - Mob: YGNIZEM + Count: 30 + - Id: 13144 + Title: Egnigem Story - Wait + TimeLimit: +1h + - Id: 13145 + Title: Armeyer Story + Targets: + - Mob: ARMAIA + Count: 30 + - Id: 13146 + Title: Armeyer Story - Wait + TimeLimit: +1h + - Id: 13147 + Title: Whikebain Story + Targets: + - Mob: WHIKEBAIN + Count: 30 + - Id: 13148 + Title: Whikebain Story - Wait + TimeLimit: +1h + - Id: 13149 + Title: Kavach Story + Targets: + - Mob: KAVAC + Count: 30 + - Id: 13150 + Title: Kavach Story - Wait + TimeLimit: +1h + - Id: 13151 + Title: Errende Story + Targets: + - Mob: EREND + Count: 30 + - Id: 13152 + Title: Errende Story - Wait + TimeLimit: +1h + - Id: 13153 + Title: Laurell Story + Targets: + - Mob: RAWREL + Count: 30 + - Id: 13154 + Title: Laurell Story - Wait + TimeLimit: +1h + - Id: 13155 + Title: Morocc Story1 + Targets: + - Mob: MOROCC_1 + Count: 30 + - Id: 13156 + Title: Morocc Story1 - Wait + TimeLimit: +1h + - Id: 13157 + Title: Morocc Story2 + Targets: + - Mob: MOROCC_2 + Count: 30 + - Id: 13158 + Title: Morocc Story2 - Wait + TimeLimit: +1h + - Id: 13159 + Title: Morocc Story3 + Targets: + - Mob: MOROCC_4 + Count: 30 + - Id: 13160 + Title: Morocc Story3 - Wait + TimeLimit: +1h + - Id: 13161 + Title: Uni-horn Scaraba Story + Targets: + - Mob: HORN_SCARABA + Count: 30 + - Id: 13162 + Title: Uni-horn Scaraba Story - Wait + TimeLimit: +1h + - Id: 13163 + Title: Horn Scaraba Story + Targets: + - Mob: HORN_SCARABA2 + Count: 30 + - Id: 13164 + Title: Horn Scaraba Story - Wait + TimeLimit: +1h + - Id: 13165 + Title: Antler Scaraba Story + Targets: + - Mob: ANTLER_SCARABA + Count: 30 + - Id: 13166 + Title: Antler Scaraba Story - Wait + TimeLimit: +1h + - Id: 13167 + Title: Rake horn Scaraba Story + Targets: + - Mob: RAKE_SCARABA + Count: 30 + - Id: 13168 + Title: Rake horn Scaraba Story - Wait + TimeLimit: +1h + - Id: 13181 + Title: Nightmarish Jitterbug + - Id: 13182 + Title: "Nightmarish Jitterbug: Waiting" + TimeLimit: +23h + - Id: 13183 + Title: "Nightmarish Jitterbug: Completed" + - Id: 13184 + Title: Charleston Factory + - Id: 13185 + Title: Charleston Factory - Hold + TimeLimit: +20h + - Id: 13186 + Title: Charleston Factory - Complete + - Id: 13187 + Title: Deal with the Staff + Targets: + - Mob: STEP + Count: 50 + - Id: 13188 + Title: Deal with the Staff - Hold + TimeLimit: +20h + - Id: 13195 + Title: Monthly Brigan + - Id: 13196 + Title: Monthly Brigan + - Id: 13197 + Title: Monthly Brigan + - Id: 13198 + Title: "Monthly Brigan : Krotzel's Request" + - Id: 13199 + Title: Krotzel's Request - Complete + TimeLimit: +20h + - Id: 13200 + Title: "Monthly Brigan : Rookie's Request" + Targets: + - Mob: CENERE_G + Count: 30 + - Id: 13201 + Title: Rookie's Request - Complete + TimeLimit: +20h + - Id: 13202 + Title: "Monthly Brigan : Photo Journalist's Request" + Targets: + - Mob: REPAIR_ROBOT_T + Count: 30 + - Id: 13203 + Title: Photo Journalist's Request - Complete + TimeLimit: +20h + - Id: 13204 + Title: "Monthly Brigan : Grylls' Request" + - Id: 13205 + Title: Grylls' Request - Complete + TimeLimit: +20h + - Id: 14118 + Title: Wuhari's concern + - Id: 14119 + Title: Test of patience + - Id: 14120 + Title: Test of patience 2 + - Id: 14121 + Title: Test of patience 3 + - Id: 14122 + Title: Time for two + - Id: 14123 + Title: Wuharu's favor + - Id: 14125 + Title: Surveying the area + - Id: 14126 + Title: Searching for Ms. Goatie + - Id: 14127 + Title: Searching for Ms. Goatie's husband + - Id: 14128 + Title: Obtaining the research report + - Id: 14131 + Title: Analysis time + TimeLimit: +5mn + - Id: 14133 + Title: Another favor + - Id: 14134 + Title: Sharp Ms. Goatie + - Id: 14135 + Title: Searching for Mr. Pompe + - Id: 14136 + Title: A terrible scene in the field + - Id: 14137 + Title: An interesting proposition + - Id: 14138 + Title: The big corpse + - Id: 14139 + Title: To Wuhuru + - Id: 14140 + Title: To Wuhari + - Id: 14141 + Title: Ingredients for research + - Id: 14142 + Title: To the Archer's town! + - Id: 14143 + Title: Application for the Archer's job change + - Id: 14144 + Title: Retest - Stats + - Id: 14145 + Title: Archer Skills + - Id: 14146 + Title: Hunting training + - Id: 14147 + Title: Retest - Skills + - Id: 14148 + Title: To the next step + - Id: 14149 + Title: Listening to the 2nd job change + - Id: 14150 + Title: To the next step + - Id: 14151 + Title: Hunting training - Spoa + - Id: 14152 + Title: Hunting training - Creamy + - Id: 14153 + Title: Hunting training - Skeleton + - Id: 14154 + Title: Fragrant herb mix + - Id: 14155 + Title: Crunchy salad + - Id: 14156 + Title: Anything shabushabu + - Id: 14157 + Title: Baked golden apple + - Id: 14158 + Title: Presentation of the Archer manual + - Id: 14159 + Title: Met with the PR staff + - Id: 14160 + Title: Met with the PR staff + - Id: 14161 + Title: Test of stats + - Id: 14162 + Title: Test of skills + - Id: 14163 + Title: Caught Spores + - Id: 14164 + Title: Caught Creamy + - Id: 14165 + Title: Caught Skeletons + - Id: 14469 + Title: Look around the Walther Family + - Id: 14470 + Title: In Search of the Guardian Knight + - Id: 14471 + Title: To the Royal Prison + - Id: 14472 + Title: Gourmet Bigfoot + - Id: 14473 + Title: To Veins + - Id: 14474 + Title: Report to Isenhonor + - Id: 14475 + Title: To Jurgen + - Id: 14476 + Title: To Levuiere and His Wife + - Id: 14477 + Title: What Is Going on? + - Id: 14478 + Title: Searching for the Clue + - Id: 14479 + Title: Clean-up out of Apology + - Id: 14480 + Title: Conquer the Grease + - Id: 14481 + Title: Conquer the Mold + - Id: 14482 + Title: Conquer the Dirt of Devil + - Id: 14483 + Title: Report the Completion of the Clean-up + - Id: 14484 + Title: There Was a Furniture Delivery Man + - Id: 14485 + Title: I Am Upset + - Id: 14486 + Title: I Heard the Story + - Id: 14487 + Title: Please Find the Token of Memory + Drops: + - Mob: MEDUSA + Item: Stone_That_Contained_Sea + Rate: 3000 + - Id: 14488 + Title: Please Deliver My Love + - Id: 14489 + Title: I Have to Turn It Down + - Id: 14490 + Title: My Love Once More + Drops: + - Mob: MEDUSA + Item: Stone_That_Contained_Sea + Rate: 3000 + - Id: 14491 + Title: I Have to Turn It Down Again + - Id: 14492 + Title: There Is a Silver Lining + TimeLimit: 4h + - Id: 14493 + Title: Today I Feel + Drops: + - Mob: MEDUSA + Item: Stone_That_Contained_Sea + Rate: 3000 + - Id: 14494 + Title: I Have to Turn It Down Again + - Id: 14495 + Title: To Wolf + - Id: 14496 + Title: To Isaac + - Id: 14497 + Title: Delivery for Wolf + - Id: 14498 + Title: Which Rumor + - Id: 14499 + Title: Prove Yourself + Targets: + - Mob: MAJORUROS + Count: 33 + - Id: 14500 + Title: Complete checking out the book + - Id: 14501 + Title: Report to Wolf + - Id: 14502 + Title: To Isaac + - Id: 14503 + Title: Report to Wolf + - Id: 14504 + Title: In Search of Helmut + - Id: 14505 + Title: I Won't go Back + - Id: 14506 + Title: Things Turned out This Way + - Id: 14507 + Title: To Maximilian + - Id: 14508 + Title: Jewel and Cloth + - Id: 14509 + Title: Still Making It + TimeLimit: 4h + - Id: 14510 + Title: Pink Petal-like Dress + - Id: 14511 + Title: Beautiful Flower Decoration + - Id: 14512 + Title: Dress of the Night Sky + - Id: 14513 + Title: Shawl of the Blazing Sun + - Id: 14514 + Title: Step of the Fairy + - Id: 14515 + Title: Sparkling Star + - Id: 14516 + Title: Suspicious Shadow + - Id: 14531 + Title: Everything about Con-Chliina + - Id: 14532 + Title: Greetings to Captain Gamberi + - Id: 14533 + Title: Say hi to recorder + - Id: 14534 + Title: To the kitchen + - Id: 14535 + Title: To Purser + - Id: 14536 + Title: Delivery to Chef + - Id: 14537 + Title: When do we take off? + - Id: 14538 + Title: Can we take off? + - Id: 14539 + Title: Crazy Dragon + - Id: 14540 + Title: An errand out of nowhere + Drops: + - Mob: DR_BASILISK1 + Item: Basilac_Clam + Rate: 5000 + - Id: 14541 + Title: No news is not a good news + - Id: 14542 + Title: How is the Dragon + - Id: 14543 + Title: Basilisk Hunt + Targets: + - Mob: DR_BASILISK1 + Count: 20 + - Id: 14544 + Title: Now I can leave + - Id: 14545 + Title: To Purser + - Id: 14546 + Title: Take care of grass thief + Targets: + - Mob: DR_LUNATIC + Count: 5 + - Mob: DR_FABRE + Count: 5 + - Id: 14547 + Title: Can we set out the sailing? + - Id: 14548 + Title: Crazy Dragon + - Id: 14549 + Title: No news is not a good news + - Id: 14550 + Title: How is the Dragon + - Id: 14551 + Title: Chief Basilisk + - Id: 14552 + Title: Lord Imuk's message + - Id: 14553 + Title: Basilisk Hunt + Targets: + - Mob: DR_BASILISK3 + Count: 20 + - Id: 14554 + Title: We can start sail now + - Id: 14555 + Title: Whole new world of taste + - Id: 14556 + Title: There also is a scary thing for me + - Id: 14557 + Title: Truth is alway harsh + - Id: 14558 + Title: Dirty Creatures + Drops: + - Mob: DR_BASILISK2 + Item: Basilac_Clam + Rate: 5000 + - Id: 14559 + Title: Charm Effect Duration + TimeLimit: 4h + - Id: 14560 + Title: New Ingredient + Drops: + - Mob: DR_BASILISK2 + Item: Basilac_Clam + Rate: 5000 + - Id: 14561 + Title: Dirty and Filty + Drops: + - Mob: DR_BASILISK2 + Item: Basilac_Clam + Rate: 5000 + - Id: 14562 + Title: The basic are the best + Drops: + - Mob: DR_BASILISK2 + Item: Basilac_Clam + Rate: 5000 + - Id: 14563 + Title: Free time + TimeLimit: 4h + - Id: 14565 + Title: Emergency food supplies + - Id: 14566 + Title: Brilliant idea + - Id: 14567 + Title: Kaluna milk is in Danger! + - Id: 14568 + Title: Time to persuade + - Id: 14569 + Title: Babysitter + - Id: 14570 + Title: Processing Anchovy + - Id: 14571 + Title: Anchovy fishing ship + - Id: 14572 + Title: Helpless... + - Id: 14573 + Title: I need the time on my own + - Id: 14574 + Title: Meal Box Delivery + - Id: 14575 + Title: Delivery Complete Report + - Id: 14576 + Title: Meal Box Delivery Time + TimeLimit: 4h + - Id: 14579 + Title: Interview with Captain + - Id: 14580 + Title: To Recorder + - Id: 14581 + Title: Interview with the Chief + - Id: 14582 + Title: To Recorder + - Id: 14583 + Title: To Granma + - Id: 14584 + Title: Back to Recorder + - Id: 14588 + Title: The Competition + Targets: + - Mob: DR_HORNET + Count: 10 + - Id: 14589 + Title: Sticky ingredient + Targets: + - Mob: DR_RODA_FROG + Count: 10 + - Id: 14590 + Title: Hunter's destination + Targets: + - Mob: DR_DESERT_WOLF_B + Count: 10 + - Id: 14591 + Title: Secret Ingredient + Targets: + - Mob: DR_SPORE + Count: 10 + - Id: 14592 + Title: Resting Time + TimeLimit: 4h + - Id: 14672 + Title: Preparing for the Firework Festival + Targets: + - Mob: GASTER + Count: 15 + - Id: 14673 + Title: Time to Make Bombs + TimeLimit: 4h + - Id: 14683 + Title: Mysterious Device + - Id: 14684 + Title: Mysterious Device + TimeLimit: +1h + - Id: 14685 + Title: Mysterious Device + TimeLimit: +1h + - Id: 14686 + Title: Mysterious Device + TimeLimit: +1h + - Id: 14687 + Title: Mysterious Device + TimeLimit: +1h + - Id: 15000 + Title: Experiencing abnormal statuses + - Id: 15001 + Title: Hold your breath + TimeLimit: +20s + - Id: 15002 + Title: "Memorial dungeon: Sara's Memory" + TimeLimit: +20h + - Id: 15003 + Title: Adventurer leon + - Id: 15005 + Title: "Memorial Dungeon: Isle of Bios" + TimeLimit: +23h + - Id: 15006 + Title: Isle of Bios Exploration + - Id: 15007 + Title: "Memorial Dungeon: Isle of Bios" + TimeLimit: +5mn + - Id: 15008 + Title: "Memorial Dungeon: Isle of Bios" + TimeLimit: +5mn + - Id: 15050 + Title: "Memorial Dungeon: Airship Assault" + TimeLimit: +23h + - Id: 15051 + Title: "Memorial Dungeon: Airship Assault" + TimeLimit: +5mn + - Id: 15055 + Title: "Christmas : We are the great Single Union Army!" + - Id: 15056 + Title: "Christmas : Declare war against couples!" + - Id: 15057 + Title: "Christmas : Prepare the festival!" + - Id: 15059 + Title: "Christmas : Cooldown Timer" + TimeLimit: +1d + - Id: 15060 + Title: "Christmas : Kwami has joined" + - Id: 15061 + Title: "Christmas : Willer has joined" + - Id: 15062 + Title: "Christmas : Rinka has joined" + - Id: 15063 + Title: "Christmas : Jee has joined" + - Id: 15064 + Title: "Christmas : Marty has joined" + - Id: 16000 + Title: Metz Brayde's Notice + - Id: 16001 + Title: First examination + - Id: 16002 + Title: Fetching Items for Arian -1 + - Id: 16003 + Title: Fetching Items for Arian -2 + - Id: 16004 + Title: Fetching Items for Arian -3 + - Id: 16005 + Title: Fetching Items for Arian -4 + - Id: 16006 + Title: Fetching Items for Arian -5 + - Id: 16007 + Title: Fetching Items for Arian -6 + - Id: 16008 + Title: Quiz time! + - Id: 16009 + Title: Quiz time! + - Id: 16010 + Title: Daewoon's Test + - Id: 16011 + Title: Sir Jore's Test + - Id: 16012 + Title: Sir Jore's Materials + - Id: 16013 + Title: The Stone of Sage + - Id: 16014 + Title: The Stone of Sage + - Id: 16015 + Title: Lady Jesqurienne + - Id: 16016 + Title: Jesquerinne's Quiz Challenge + - Id: 16017 + Title: Failed Quiz Challenge + - Id: 16018 + Title: Quiz Challenge Triumph + - Id: 16019 + Title: Search for Dearles + - Id: 16020 + Title: Dearles' Test + - Id: 16021 + Title: Test of Appreciation + - Id: 16022 + Title: Dearles' Test Part Two + - Id: 16023 + Title: Rhythm Test Passed + - Id: 16024 + Title: Find Bakerlan + - Id: 16025 + Title: Bakerlan's delivery + - Id: 16026 + Title: Mahatra's delivery + - Id: 16027 + Title: Bakerlan's Receipt + - Id: 16028 + Title: Find Seylin + - Id: 16029 + Title: Vigorgra Medicine + - Id: 16030 + Title: Vigorgra Ingredients + - Id: 16031 + Title: Vigorgra Ingredients + - Id: 16032 + Title: Seylin's Request + - Id: 16033 + Title: Back to Seylin + - Id: 16034 + Title: Back to Mahatra + - Id: 16035 + Title: Report to Bakerlan + - Id: 16036 + Title: The last Crumb + - Id: 16037 + Title: Finding Engel Howard + - Id: 16038 + Title: Liana's Letter + - Id: 16039 + Title: Combining the Starlight + - Id: 16040 + Title: Letter to Engel's Family + - Id: 16041 + Title: Talk to Liana + - Id: 16042 + Title: Sobbing Starlight Progress + - Id: 16043 + Title: Restored Sobbing Starlight + - Id: 16044 + Title: Combining the Starlight + - Id: 16045 + Title: Starlight message + - Id: 16046 + Title: The man in Umbala + - Id: 16047 + Title: Into the Tree + - Id: 16048 + Title: Ancient Papers + - Id: 16049 + Title: Record of Ancient Language + - Id: 16050 + Title: The Fastidious Old Man + - Id: 16051 + Title: Blurry Vision + - Id: 16052 + Title: Translating the Document + - Id: 16053 + Title: Translated Ancient Language + - Id: 16054 + Title: Where the rejected live + - Id: 16055 + Title: Misfortunate of Niflheim + - Id: 16056 + Title: Removed Curse + - Id: 16057 + Title: Meeting the witch + - Id: 16058 + Title: Wing Of Crow + - Id: 16059 + Title: Wing Of Crow + - Id: 16060 + Title: Misfortunate of Niflheim + - Id: 16061 + Title: Bard in Niflheim + - Id: 16062 + Title: Gen of Niflheim + - Id: 16063 + Title: The Witch's Aid + - Id: 16064 + Title: Misfortunate of Niflheim + - Id: 16065 + Title: The Queen's Symbol + - Id: 16066 + Title: Knowledge of the Symbol + - Id: 16067 + Title: Knowledge of Asgard + - Id: 16068 + Title: Finding the Soul Pieces + - Id: 16069 + Title: Finding the Soul Pieces + - Id: 16070 + Title: Finding the Soul Pieces + - Id: 16071 + Title: Finding the Soul Pieces + - Id: 16072 + Title: Finding the Soul Pieces + - Id: 16073 + Title: Agrboda's Soul + - Id: 16074 + Title: Symbol of the Nine Realms + - Id: 16075 + Title: Serin's Ambitions + - Id: 16076 + Title: Witch's Tonic + - Id: 16077 + Title: Serin's Release + - Id: 16078 + Title: Peace of the Family + Targets: + - Mob: COYOTE + Count: 30 + - Id: 16079 + Title: Back for More Coyotes Tomorrow + TimeLimit: 4h + - Id: 16080 + Title: Hunting Coyotes Again + Targets: + - Mob: COYOTE + Count: 30 + - Id: 16081 + Title: Failed to Get Juice Mix Package + - Id: 16082 + Title: Discovered Suspicious Sand Pile + - Id: 16083 + Title: Discovered Wasteland Cactuten + - Id: 16084 + Title: Discovered Suspicious Sand Pile + - Id: 16085 + Title: Discovered Coyote + - Id: 16086 + Title: Discovered Suspicious Sand Pile + - Id: 16087 + Title: Discovered Cactus Girl + - Id: 16088 + Title: Discovered Coyote + - Id: 16089 + Title: Discovered Suspicious Sand Pile + - Id: 16090 + Title: Discovered Suspicious Sand Pile + - Id: 16091 + Title: Discovered Suspicious Sand Pile + - Id: 16092 + Title: Discovered Suspicious Sand Pile + - Id: 16093 + Title: Discovered Suspicious Sand Pile + - Id: 16094 + Title: Discovered Suspicious Sand Pile + - Id: 16095 + Title: Discovered Suspicious Sand Pile + - Id: 16101 + Title: Kiel Hyre Academy + - Id: 16102 + Title: Kiel Hyre Academy + - Id: 16103 + Title: Kiel Hyre Academy + - Id: 16104 + Title: Kiel Hyre Academy + - Id: 16105 + Title: Kiel Hyre Academy + - Id: 16106 + Title: Kiel Hyre Academy + - Id: 16107 + Title: Kiel Hyre Academy + - Id: 16108 + Title: Kiel Hyre Academy + - Id: 16109 + Title: Kiel Hyre Academy + - Id: 16110 + Title: Kiel Hyre Academy + - Id: 16111 + Title: Kiel Hyre Academy + - Id: 16112 + Title: Kiel Hyre Academy + - Id: 16113 + Title: Kiel Hyre Academy + - Id: 16114 + Title: Kiel Hyre Academy + - Id: 16115 + Title: Kiel Hyre Academy + - Id: 16116 + Title: Kiel Hyre Academy + - Id: 16117 + Title: Mysterious World Map + - Id: 16118 + Title: Hidden poem + - Id: 16119 + Title: Snake swords + - Id: 16120 + Title: A dream? + - Id: 16121 + Title: Secret Code? + - Id: 16122 + Title: Old Copper Key + - Id: 16123 + Title: Green Keycard + - Id: 16124 + Title: Steel Box + - Id: 16125 + Title: Kiel Hyre Academy + - Id: 16126 + Title: Kiel Hyre Academy + - Id: 16127 + Title: Kiel Hyre Academy + - Id: 16128 + Title: Kiel Hyre Academy + - Id: 16129 + Title: Kiel Hyre Academy + - Id: 16130 + Title: Kiel Hyre Academy + - Id: 16131 + Title: Kiel Hyre Academy + - Id: 16132 + Title: Kiel Hyre Academy + - Id: 16133 + Title: Kiel Hyre Academy + - Id: 16134 + Title: Kiel Hyre Academy + - Id: 16135 + Title: Kiel Hyre Academy + - Id: 16136 + Title: Kiel Hyre Academy + - Id: 16137 + Title: Kiel Hyre Academy + - Id: 16138 + Title: Kiel Hyre Academy + - Id: 16139 + Title: Kiel Hyre Academy + - Id: 16140 + Title: Kiel Hyre Academy + - Id: 16141 + Title: Kiel Hyre Academy + - Id: 16142 + Title: Kiel Hyre Academy + - Id: 16143 + Title: Kiel Hyre Academy + - Id: 16144 + Title: Kiel Hyre Academy + - Id: 16145 + Title: Kiel Hyre Academy + - Id: 16146 + Title: Kiel Hyre Academy + - Id: 16200 + Title: Limberg's Request + - Id: 16201 + Title: TPS Report + - Id: 16202 + Title: TPS Report + - Id: 16203 + Title: TPS Report + - Id: 16204 + Title: Crack in the Wall + - Id: 16205 + Title: The Empty Lava Tube + - Id: 17000 + Title: Meet with Father Bamph + - Id: 17001 + Title: Meet with Larjes + - Id: 17002 + Title: Report to Father Bamph + - Id: 17003 + Title: Travel to Rachel + - Id: 17004 + Title: Travel to Veins + - Id: 17005 + Title: Frustrated Magistrate + - Id: 17006 + Title: Interrogated Smugglers + - Id: 17007 + Title: Written Orders + - Id: 17008 + Title: Investigating + - Id: 17009 + Title: More Investigating + - Id: 17010 + Title: Further Investigations + - Id: 17011 + Title: Kurdi's Father + - Id: 17012 + Title: Karyn's Boat + - Id: 17013 + Title: To the Island + - Id: 17014 + Title: Investigating the Island + - Id: 17015 + Title: The Research Note + - Id: 17016 + Title: Regicide + - Id: 17017 + Title: Reporting the King's Death + - Id: 18001 + Title: Delivery for Rooney + - Id: 18002 + Title: Delivery for Rooney + - Id: 18003 + Title: Delivery for Rooney + - Id: 18004 + Title: Lasda's Request + - Id: 18005 + Title: Jesse's Request + - Id: 18006 + Title: Sir Krieg's Approval + - Id: 18007 + Title: Sir Krieg's Trust + - Id: 18008 + Title: Sir Krieg's Trust + - Id: 18009 + Title: Into the prison + - Id: 18010 + Title: Jail Break + - Id: 18011 + Title: Bodyguard work + - Id: 18012 + Title: Bodyguard work + - Id: 18013 + Title: Bodyguard work + - Id: 18014 + Title: Bodyguard work + - Id: 18015 + Title: Bodyguard work + - Id: 18016 + Title: Bodyguard work + - Id: 18017 + Title: Jail Break + - Id: 18018 + Title: Jail Break + - Id: 18019 + Title: Vitre's Songs + - Id: 18020 + Title: Vitre's Songs + - Id: 18021 + Title: Vitre's Songs + - Id: 18022 + Title: Vitre's Songs + - Id: 18023 + Title: Vitre the Spy + - Id: 18030 + Title: Gaebolg Family Curse + - Id: 18031 + Title: Gaebolg Family Curse + - Id: 18032 + Title: Gaebolg Family Curse + - Id: 18033 + Title: Gaebolg Family Curse + - Id: 18034 + Title: Gaebolg Family Curse + - Id: 18035 + Title: Gaebolg Family Curse + - Id: 18036 + Title: Gaebolg Family Curse + - Id: 18037 + Title: Gaebolg Family Curse + - Id: 18038 + Title: Gaebolg Family Curse + - Id: 18039 + Title: Gaebolg Family Curse + - Id: 18040 + Title: Gaebolg Family Curse + - Id: 18041 + Title: Gaebolg Family Curse + - Id: 18042 + Title: Gaebolg Family Curse + - Id: 18043 + Title: Gaebolg Family Curse + - Id: 18044 + Title: Gaebolg Family Curse + - Id: 18045 + Title: Gaebolg Family Curse + - Id: 18046 + Title: Gaebolg Family Curse + - Id: 18047 + Title: Gaebolg Family Curse + - Id: 18048 + Title: Gaebolg Family Curse + - Id: 18049 + Title: Gaebolg Family Curse + - Id: 18050 + Title: Gaebolg Family Curse + - Id: 18051 + Title: Gaebolg Family Curse + - Id: 18052 + Title: Gaebolg Family Curse + - Id: 18060 + Title: Missing boy Mikhail + - Id: 18061 + Title: Mikhail's Whereabouts + - Id: 18062 + Title: Missing boy Mikhail + - Id: 18063 + Title: The isolated swamp + - Id: 18064 + Title: Back to the Village + - Id: 18065 + Title: High-strength Adhesive + - Id: 18066 + Title: Back to the swamp + - Id: 18067 + Title: Make the paste + - Id: 18068 + Title: Fixing the Matrushka + - Id: 18069 + Title: Report to Gallina + - Id: 18070 + Title: Banishing Winter + - Id: 18071 + Title: Making the magic dust + - Id: 18072 + Title: Making the magic dust + - Id: 18073 + Title: The Dragon's Lair + - Id: 18074 + Title: The Magic Gourd Bottle + - Id: 18075 + Title: Containing People's Speech + - Id: 18076 + Title: Containing People's Speech + - Id: 18077 + Title: Csar's Request + - Id: 18078 + Title: Baba Yaga's Secret Medicine + - Id: 18079 + Title: Winter is Banished + - Id: 18100 + Title: Legends from Moscovia + - Id: 18101 + Title: The Moving Island + - Id: 18102 + Title: In Search of The Moving Island + - Id: 18103 + Title: In Search of The Moving Island + - Id: 18104 + Title: Mr. Ibanoff's New Friend + - Id: 18105 + Title: Repairing Charabel + - Id: 18106 + Title: As the Tide Turns + - Id: 18107 + Title: Departing + - Id: 18108 + Title: The Moving Island? + - Id: 18109 + Title: The Moving Island??? + - Id: 18110 + Title: The Aged Stranger + - Id: 18111 + Title: Whale Island! + - Id: 18112 + Title: A Story for the Csar + - Id: 18113 + Title: Evidence for the Csar + - Id: 18114 + Title: Before Sunset + - Id: 18115 + Title: Departing + - Id: 18116 + Title: Whale Island! + - Id: 18117 + Title: Materials for Evidence + - Id: 18118 + Title: Mysterious Musical Instrument + - Id: 18119 + Title: Gusli + - Id: 18120 + Title: Gusli + - Id: 18121 + Title: Shafka + - Id: 19101 + Title: The Eye of Hellion + - Id: 19102 + Title: The Eye of Hellion + - Id: 19103 + Title: The Eye of Hellion + - Id: 19104 + Title: The Eye of Hellion + - Id: 19105 + Title: The Eye of Hellion + - Id: 19106 + Title: The Eye of Hellion + - Id: 19107 + Title: The Eye of Hellion + - Id: 19108 + Title: The Eye of Hellion + - Id: 19109 + Title: The Eye of Hellion + - Id: 19110 + Title: The Eye of Hellion + - Id: 19111 + Title: The Eye of Hellion + - Id: 19112 + Title: The Eye of Hellion + - Id: 19113 + Title: The Eye of Hellion + - Id: 19114 + Title: The Eye of Hellion + - Id: 19115 + Title: The Eye of Hellion + - Id: 19116 + Title: The Eye of Hellion + - Id: 19117 + Title: The Eye of Hellion + - Id: 19118 + Title: The Eye of Hellion + - Id: 19119 + Title: The Eye of Hellion + - Id: 19120 + Title: The Eye of Hellion + - Id: 19121 + Title: The Eye of Hellion + - Id: 19122 + Title: The Eye of Hellion + - Id: 19123 + Title: The Eye of Hellion + - Id: 19124 + Title: The Eye of Hellion + - Id: 19125 + Title: The Eye of Hellion + - Id: 19126 + Title: The Eye of Hellion + - Id: 19127 + Title: The Eye of Hellion + - Id: 19128 + Title: The Eye of Hellion + - Id: 19129 + Title: The Eye of Hellion + - Id: 21001 + Title: Escape the Wreck + - Id: 21002 + Title: The first battle + - Id: 21008 + Title: The first battle + Drops: + - Mob: G_PORING + Item: Wood + Rate: 10000 + - Id: 50000 + Title: Pirate Dagger materials + - Id: 50001 + Title: Weather Beaten Old Man + - Id: 50002 + Title: Lost Treasure? + - Id: 50003 + Title: Lost Treasure? + - Id: 50004 + Title: The Old Man's Treasure + - Id: 50005 + Title: The Old Man's Treasure + - Id: 50006 + Title: The Old Man's Treasure + - Id: 50007 + Title: The Old Man's Treasure + - Id: 50008 + Title: The Old Man's Treasure + - Id: 50009 + Title: The Old Man's Treasure + - Id: 50010 + Title: A special lock pick + - Id: 50011 + Title: The special lock pick + - Id: 50012 + Title: Use the lock pick + - Id: 50013 + Title: Broken lock pick + - Id: 50015 + Title: The empty treasure box + - Id: 50016 + Title: The empty treasure box + - Id: 50017 + Title: The empty treasure box + - Id: 50018 + Title: The empty treasure box + - Id: 50019 + Title: The empty treasure box + - Id: 50020 + Title: The empty treasure box + - Id: 50021 + Title: J Roger + - Id: 50022 + Title: J Roger's key materials + - Id: 50023 + Title: Conversation with J Roger + - Id: 50024 + Title: Bury the treasure + - Id: 50025 + Title: Bury the treasure + - Id: 50026 + Title: Bury the treasure + - Id: 50027 + Title: Buried treasure + - Id: 50028 + Title: Stolen treasure! + - Id: 50029 + Title: A Pirate's Spirit! + - Id: 60001 + Title: Monster Extermination + - Id: 60002 + Title: Monster Extermination + - Id: 60003 + Title: Monster Extermination + - Id: 60004 + Title: Monster Extermination + - Id: 60005 + Title: Monster Extermination + - Id: 60006 + Title: Monster Extermination + - Id: 60007 + Title: Endless Tower Effect + - Id: 60008 + Title: Endless Tower Time Limit + - Id: 60009 + Title: Orc Hero + - Id: 60010 + Title: Derik Ver's Request + - Id: 60011 + Title: Investigation of Byalan + - Id: 60012 + Title: Investigation of Abyss + - Id: 60013 + Title: Monster Investigation + - Id: 60014 + Title: Geffen Dungeon's Monster Investigation + - Id: 60015 + Title: Geffen Dungeon's Monster Investigation + - Id: 60016 + Title: Geffen Dungeon's Monster Investigation + - Id: 60017 + Title: Geffen Dungeon's Monster Investigation + - Id: 60018 + Title: Byalan Dungeon's Monster Investigation + - Id: 60019 + Title: Byalan Dungeon's Monster Investigation + - Id: 60020 + Title: Byalan Dungeon's Monster Investigation + - Id: 60021 + Title: Byalan Dungeon's Monster Investigation + - Id: 60022 + Title: Abyss Lake's Monster Investigation + - Id: 60023 + Title: Abyss Lake's Monster Investigation + - Id: 60024 + Title: Abyss Lake's Monster Investigation + - Id: 60025 + Title: Abyss Lake's Monster Investigation + - Id: 60026 + Title: Continuing the Investigation + - Id: 60027 + Title: Investigating Aldebaran + - Id: 60028 + Title: Monster Investigation + - Id: 60029 + Title: Aldebaran Monster Investigation + - Id: 60030 + Title: Clock Tower Monster Investigation + - Id: 60031 + Title: Clock Tower Monster Investigation + - Id: 60032 + Title: Lutie Field Monster Investigation + - Id: 60033 + Title: Clock Tower Monster Investigation + - Id: 60034 + Title: Clock Tower Monster Investigation + - Id: 60035 + Title: Aldebaran Monster Investigation + - Id: 60036 + Title: Clock Tower Monster Investigation + - Id: 60037 + Title: Clock Tower Monster Investigation + - Id: 60038 + Title: Aldebaran Monster Investigation + - Id: 60039 + Title: Investigation of Glastheim + - Id: 60040 + Title: Investigation of Glastheim + - Id: 60041 + Title: Monster Investigation + - Id: 60042 + Title: Investigation of Glastheim + - Id: 60043 + Title: Glastheim Monster Investigation + - Id: 60044 + Title: Glastheim Monster Investigation + - Id: 60045 + Title: Investigation of Glastheim + - Id: 60046 + Title: Glastheim Monster Investigation + - Id: 60047 + Title: Glastheim Monster Investigation + - Id: 60048 + Title: Investigation of Glastheim + - Id: 60049 + Title: Glastheim Monster Investigation + - Id: 60050 + Title: Glastheim Monster Investigation + - Id: 60051 + Title: Investigation of Glastheim + - Id: 60052 + Title: Glastheim Monster Investigation + - Id: 60053 + Title: Glastheim Monster Investigation + - Id: 60054 + Title: Investigation of Glastheim + - Id: 60055 + Title: Glastheim Monster Investigation + - Id: 60056 + Title: Glastheim Monster Investigation + - Id: 60057 + Title: Glastheim Monster Investigation + - Id: 60058 + Title: Derik Ver's Brother + - Id: 60059 + Title: A history lesson + - Id: 60060 + Title: The Crown of Deceit + - Id: 60061 + Title: A magic solvent + - Id: 60062 + Title: Rendering the crown Inert + - Id: 60101 + Title: Hunting Peco Pecos + Targets: + - Mob: PECOPECO + Count: 50 + - Id: 60102 + Title: Hunting Peco Pecos + Targets: + - Mob: PECOPECO + Count: 100 + - Id: 60103 + Title: Hunting Peco Pecos + Targets: + - Mob: PECOPECO + Count: 150 + - Id: 60104 + Title: Hunting Hodes + Targets: + - Mob: HODE + Count: 50 + - Id: 60105 + Title: Hunting Hodes + Targets: + - Mob: HODE + Count: 100 + - Id: 60106 + Title: Hunting Hodes + Targets: + - Mob: HODE + Count: 150 + - Id: 60107 + Title: Hunting Fabres + Targets: + - Mob: FABRE + Count: 50 + - Id: 60108 + Title: Hunting Fabres + Targets: + - Mob: FABRE + Count: 100 + - Id: 60109 + Title: Hunting Fabres + Targets: + - Mob: FABRE + Count: 150 + - Id: 60110 + Title: Hunting Pupa + Targets: + - Mob: PUPA + Count: 50 + - Id: 60111 + Title: Hunting Pupa + Targets: + - Mob: PUPA + Count: 100 + - Id: 60112 + Title: Hunting Pupa + Targets: + - Mob: PUPA + Count: 150 + - Id: 60113 + Title: Hunting Cocos + Targets: + - Mob: COCO + Count: 50 + - Id: 60114 + Title: Hunting Cocos + Targets: + - Mob: COCO + Count: 100 + - Id: 60115 + Title: Hunting Cocos + Targets: + - Mob: COCO + Count: 150 + - Id: 60116 + Title: Hunting Caramels + Targets: + - Mob: CARAMEL + Count: 50 + - Id: 60117 + Title: Hunting Caramels + Targets: + - Mob: CARAMEL + Count: 100 + - Id: 60118 + Title: Hunting Caramels + Targets: + - Mob: CARAMEL + Count: 150 + - Id: 60119 + Title: Hunting Alligators + Targets: + - Mob: ALLIGATOR + Count: 50 + - Id: 60120 + Title: Hunting Alligators + Targets: + - Mob: ALLIGATOR + Count: 100 + - Id: 60121 + Title: Hunting Alligators + Targets: + - Mob: ALLIGATOR + Count: 150 + - Id: 60122 + Title: Hunting Creamys + Targets: + - Mob: CREAMY + Count: 50 + - Id: 60123 + Title: Hunting Creamys + Targets: + - Mob: CREAMY + Count: 100 + - Id: 60124 + Title: Hunting Creamys + Targets: + - Mob: CREAMY + Count: 150 + - Id: 60125 + Title: Hunting Demon Pungus + Targets: + - Mob: DEMON_PUNGUS + Count: 50 + - Id: 60126 + Title: Hunting Demon Pungus + Targets: + - Mob: DEMON_PUNGUS + Count: 100 + - Id: 60127 + Title: Hunting Demon Pungus + Targets: + - Mob: DEMON_PUNGUS + Count: 150 + - Id: 60128 + Title: Hunting Dokebi + Targets: + - Mob: DOKEBI + Count: 50 + - Id: 60129 + Title: Hunting Dokebi + Targets: + - Mob: DOKEBI + Count: 100 + - Id: 60130 + Title: Hunting Dokebi + Targets: + - Mob: DOKEBI + Count: 150 + - Id: 60131 + Title: Hunting Dryads + Targets: + - Mob: DRYAD + Count: 50 + - Id: 60132 + Title: Hunting Dryads + Targets: + - Mob: DRYAD + Count: 100 + - Id: 60133 + Title: Hunting Dryads + Targets: + - Mob: DRYAD + Count: 150 + - Id: 60134 + Title: Hunting Frilldora + Targets: + - Mob: FRILLDORA + Count: 50 + - Id: 60135 + Title: Hunting Frilldora + Targets: + - Mob: FRILLDORA + Count: 100 + - Id: 60136 + Title: Hunting Frilldora + Targets: + - Mob: FRILLDORA + Count: 150 + - Id: 60137 + Title: Hunting Goats + Targets: + - Mob: GOAT + Count: 50 + - Id: 60138 + Title: Hunting Goats + Targets: + - Mob: GOAT + Count: 100 + - Id: 60139 + Title: Hunting Goats + Targets: + - Mob: GOAT + Count: 150 + - Id: 60140 + Title: Hunting Golems + Targets: + - Mob: GOLEM + Count: 50 + - Id: 60141 + Title: Hunting Golems + Targets: + - Mob: GOLEM + Count: 100 + - Id: 60142 + Title: Hunting Golems + Targets: + - Mob: GOLEM + Count: 150 + - Id: 60143 + Title: Hunting Leaf Cats + Targets: + - Mob: LEAF_CAT + Count: 50 + - Id: 60144 + Title: Hunting Leaf Cats + Targets: + - Mob: LEAF_CAT + Count: 100 + - Id: 60145 + Title: Hunting Leaf Cats + Targets: + - Mob: LEAF_CAT + Count: 150 + - Id: 60146 + Title: Hunting Skeletons + Targets: + - Mob: SKELETON + Count: 50 + - Id: 60147 + Title: Hunting Skeletons + Targets: + - Mob: SKELETON + Count: 100 + - Id: 60148 + Title: Hunting Skeletons + Targets: + - Mob: SKELETON + Count: 150 + - Id: 60149 + Title: Hunting Munaks + Targets: + - Mob: MUNAK + Count: 50 + - Id: 60150 + Title: Hunting Munaks + Targets: + - Mob: MUNAK + Count: 100 + - Id: 60151 + Title: Hunting Munaks + Targets: + - Mob: MUNAK + Count: 150 + - Id: 60152 + Title: Hunting Sohees + Targets: + - Mob: SOHEE + Count: 50 + - Id: 60153 + Title: Hunting Sohees + Targets: + - Mob: SOHEE + Count: 100 + - Id: 60154 + Title: Hunting Sohees + Targets: + - Mob: SOHEE + Count: 150 + - Id: 60155 + Title: Hunting Firelock Soldiers + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 50 + - Id: 60156 + Title: Hunting Firelock Soldiers + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 100 + - Id: 60157 + Title: Hunting Firelock Soldiers + Targets: + - Mob: ANTIQUE_FIRELOCK + Count: 150 + - Id: 60158 + Title: Hunting Tengus + Targets: + - Mob: TENGU + Count: 50 + - Id: 60159 + Title: Hunting Tengus + Targets: + - Mob: TENGU + Count: 100 + - Id: 60160 + Title: Hunting Tengus + Targets: + - Mob: TENGU + Count: 150 + - Id: 60161 + Title: Hunting Venatu + Targets: + - Mob: VENATU + Count: 25 + - Id: 60162 + Title: Hunting Venatu + Targets: + - Mob: VENATU + Count: 50 + - Id: 60163 + Title: Hunting Venatu + Targets: + - Mob: VENATU + Count: 75 + - Id: 60164 + Title: Hunting Archdam + Targets: + - Mob: ARCHDAM + Count: 50 + - Id: 60165 + Title: Hunting Archdam + Targets: + - Mob: ARCHDAM + Count: 100 + - Id: 60166 + Title: Hunting Archdam + Targets: + - Mob: ARCHDAM + Count: 150 + - Id: 60167 + Title: Hunting Siromas + Targets: + - Mob: SIROMA + Count: 50 + - Id: 60168 + Title: Hunting Siromas + Targets: + - Mob: SIROMA + Count: 100 + - Id: 60169 + Title: Hunting Siroma + Targets: + - Mob: SIROMA + Count: 150 + - Id: 60170 + Title: Hunting Ice Titans + Targets: + - Mob: ICE_TITAN + Count: 50 + - Id: 60171 + Title: Hunting Ice Titans + Targets: + - Mob: ICE_TITAN + Count: 100 + - Id: 60172 + Title: Hunting Ice Titans + Targets: + - Mob: ICE_TITAN + Count: 150 + - Id: 60173 + Title: Hunting Disguises + Targets: + - Mob: DISGUISE + Count: 50 + - Id: 60174 + Title: Hunting Disguises + Targets: + - Mob: DISGUISE + Count: 100 + - Id: 60175 + Title: Hunting Disguises + Targets: + - Mob: DISGUISE + Count: 150 + - Id: 60176 + Title: Hunting Loli Ruri + Targets: + - Mob: LOLI_RURI + Count: 50 + - Id: 60177 + Title: Hunting Loli Ruri + Targets: + - Mob: LOLI_RURI + Count: 100 + - Id: 60178 + Title: Hunting Loli Ruri + Targets: + - Mob: LOLI_RURI + Count: 150 + - Id: 60179 + Title: Hunting Mantis + Targets: + - Mob: MANTIS + Count: 50 + - Id: 60180 + Title: Hunting Mantis + Targets: + - Mob: MANTIS + Count: 100 + - Id: 60181 + Title: Hunting Mantis + Targets: + - Mob: MANTIS + Count: 150 + - Id: 60182 + Title: Hunting Dancing Dragons + Targets: + - Mob: DANCING_DRAGON + Count: 50 + - Id: 60183 + Title: Hunting Dancing Dragons + Targets: + - Mob: DANCING_DRAGON + Count: 100 + - Id: 60184 + Title: Hunting Dancing Dragons + Targets: + - Mob: DANCING_DRAGON + Count: 150 + - Id: 60185 + Title: Hunting Necromancers + Targets: + - Mob: NECROMANCER + Count: 20 + - Id: 60186 + Title: Hunting Necromancers + Targets: + - Mob: NECROMANCER + Count: 40 + - Id: 60187 + Title: Hunting Necromancers + Targets: + - Mob: NECROMANCER + Count: 60 + - Id: 60188 + Title: Hunting Apocalypse + Targets: + - Mob: APOCALIPS + Count: 50 + - Id: 60189 + Title: Hunting Apocalypse + Targets: + - Mob: APOCALIPS + Count: 100 + - Id: 60190 + Title: Hunting Apocalypse + Targets: + - Mob: APOCALIPS + Count: 150 + - Id: 60200 + Title: Endless Tower Effect + TimeLimit: +7d + - Id: 60201 + Title: Endless Tower Time Limit + TimeLimit: +4h + - Id: 60211 + Title: Thor Volcano base camp + - Id: 60212 + Title: Thor Volcano base camp + - Id: 60213 + Title: Thor Volcano base camp + - Id: 60301 + Title: Dragon Hunting + Targets: + - Mob: PETIT + Count: 100 + - Id: 60302 + Title: Dragon Hunting + Targets: + - Mob: PETIT + Count: 200 + - Id: 60303 + Title: Dragon Hunting + Targets: + - Mob: FERUS + Count: 100 + - Id: 60304 + Title: Dragon Hunting + Targets: + - Mob: FERUS + Count: 200 + - Id: 60305 + Title: Dragon Hunting + Targets: + - Mob: FERUS_ + Count: 100 + - Id: 60306 + Title: Dragon Hunting + Targets: + - Mob: FERUS_ + Count: 200 + - Id: 60307 + Title: Dragon Hunting + Targets: + - Mob: ACIDUS + Count: 100 + - Id: 60308 + Title: Dragon Hunting + Targets: + - Mob: ACIDUS + Count: 200 + - Id: 60309 + Title: Dragon Hunting + Targets: + - Mob: ACIDUS_ + Count: 100 + - Id: 60310 + Title: Dragon Hunting + Targets: + - Mob: ACIDUS_ + Count: 200 + - Id: 60351 + Title: Bathroom Ghost + - Id: 60352 + Title: Bathroom Ghost + - Id: 60353 + Title: Bathroom Ghost + - Id: 60354 + Title: Bathroom Ghost + - Id: 60355 + Title: Bathroom Ghost + - Id: 62238 + Title: Midgardian Mercenary timer + TimeLimit: +1h diff --git a/doc/yaml/db/quest_db.yml b/doc/yaml/db/quest_db.yml new file mode 100644 index 0000000000..4f2fe56861 --- /dev/null +++ b/doc/yaml/db/quest_db.yml @@ -0,0 +1,23 @@ +########################################################################### +# Quest Database +########################################################################### +# +# Quest Settings +# +########################################################################### +# - Id Quest ID. +# Title Quest title. +# TimeLimit Amount of time before the quest expires. (Default: 0) +# Use a number following by "d" for day(s), "h" for hour(s), "mn" for minute(s), and "s" for second(s). +# Specify with "+" for how long until the quest expires. +# Specify without "+" for the exact time the quest expires using "d" (optionnal), [0-23]"h" (required), [0-59]"mn" (optionnal), [0-59]"s" (optionnal) format. +# Please note the number before "d" only shift the exact timer to the given day(s). +# Targets: Quest objective target. (Default: null) +# - Mob Monster to kill. +# Count Amount of monsters to kill. +# Drops: Quest item drop targets. (Default: null) +# - Mob Monster to kill. 0 will apply to all monsters. (Default: 0) +# Item Item to drop. +# Count Amount of items that will drop. Non-stackable items default to 1. (Default: 1) +# Rate Item drop rate. (10000 = 100%) +########################################################################### diff --git a/src/char/int_quest.cpp b/src/char/int_quest.cpp index ea7c2f2ed8..7f99991a14 100644 --- a/src/char/int_quest.cpp +++ b/src/char/int_quest.cpp @@ -102,7 +102,7 @@ bool mapif_quest_delete(uint32 char_id, int quest_id) { * @return false in case of errors, true otherwise */ bool mapif_quest_add(uint32 char_id, struct quest qd) { - if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s`(`quest_id`, `char_id`, `state`, `time`, `count1`, `count2`, `count3`) VALUES ('%d', '%d', '%d','%d', '%d', '%d', '%d')", schema_config.quest_db, qd.quest_id, char_id, qd.state, qd.time, qd.count[0], qd.count[1], qd.count[2]) ) + if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s`(`quest_id`, `char_id`, `state`, `time`, `count1`, `count2`, `count3`) VALUES ('%d', '%d', '%d', '%u', '%d', '%d', '%d')", schema_config.quest_db, qd.quest_id, char_id, qd.state, qd.time, qd.count[0], qd.count[1], qd.count[2]) ) { Sql_ShowDebug(sql_handle); return false; diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index 0df0c87f79..896faadb3b 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -69,7 +69,6 @@ #define MAX_GUILDLEVEL 50 ///Max Guild level #define MAX_GUARDIANS 8 ///Local max per castle. If this value is increased, need to add more fields on MySQL `guild_castle` table [Skotlex] #define MAX_QUEST_OBJECTIVES 3 ///Max quest objectives for a quest -#define MAX_QUEST_DROPS 3 ///Max quest drops for a quest #define MAX_PC_BONUS_SCRIPT 50 ///Max bonus script can be fetched from `bonus_script` table on player load [Cydh] #define MAX_ITEM_RDM_OPT 5 /// Max item random option [Napster] #define DB_NAME_LEN 256 //max len of dbs @@ -212,7 +211,7 @@ enum e_mode { #define CL_MASK 0xF000000 // Questlog states -enum quest_state { +enum e_quest_state : uint8 { Q_INACTIVE, ///< Inactive quest (the user can toggle between active and inactive quests) Q_ACTIVE, ///< Active quest Q_COMPLETE, ///< Completed quest @@ -221,9 +220,9 @@ enum quest_state { /// Questlog entry struct quest { int quest_id; ///< Quest ID - unsigned int time; ///< Expiration time + uint32 time; ///< Expiration time int count[MAX_QUEST_OBJECTIVES]; ///< Kill counters of each quest objective - enum quest_state state; ///< Current quest state + e_quest_state state; ///< Current quest state }; struct s_item_randomoption { diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index d75e9fa42c..e8a86d415a 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -4027,8 +4027,8 @@ ACMD_FUNC(reload) { map_msg_reload(); clif_displaymessage(fd, msg_txt(sd,463)); // Message configuration has been reloaded. } else if (strstr(command, "questdb") || strncmp(message, "questdb", 3) == 0) { - do_reload_quest(); - clif_displaymessage(fd, msg_txt(sd,1377)); // Quest database has been reloaded. + if (quest_db.reload()) + clif_displaymessage(fd, msg_txt(sd,1377)); // Quest database has been reloaded. } else if (strstr(command, "instancedb") || strncmp(message, "instancedb", 4) == 0) { instance_reload(); clif_displaymessage(fd, msg_txt(sd,516)); // Instance database has been reloaded. diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 44a6aec285..c5ef959f34 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -16929,25 +16929,24 @@ void clif_quest_send_list(struct map_session_data *sd) WFIFOL(fd, 4) = limit; for (i = 0; i < limit; i++) { - struct quest_db *qi = quest_search(sd->quest_log[i].quest_id); + std::shared_ptr qi = quest_search(sd->quest_log[i].quest_id); WFIFOL(fd, offset) = sd->quest_log[i].quest_id; offset += 4; WFIFOB(fd, offset) = sd->quest_log[i].state; offset++; - WFIFOL(fd, offset) = sd->quest_log[i].time - qi->time; + WFIFOL(fd, offset) = static_cast(sd->quest_log[i].time - qi->time); offset += 4; - WFIFOL(fd, offset) = sd->quest_log[i].time; + WFIFOL(fd, offset) = static_cast(sd->quest_log[i].time); offset += 4; - WFIFOW(fd, offset) = qi->objectives_count; + WFIFOW(fd, offset) = static_cast(qi->objectives.size()); offset += 2; - if( qi->objectives_count > 0 ){ - int j; + if (!qi->objectives.empty()) { struct mob_db *mob; - for( j = 0; j < qi->objectives_count; j++ ){ - mob = mob_db(qi->objectives[j].mob); + for (int j = 0; j < qi->objectives.size(); j++) { + mob = mob_db(qi->objectives[j]->mob_id); #if PACKETVER >= 20150513 WFIFOL(fd, offset) = sd->quest_log[i].quest_id * 1000 + j; @@ -16955,7 +16954,7 @@ void clif_quest_send_list(struct map_session_data *sd) WFIFOL(fd, offset) = 0; // TODO: Find info - mobType offset += 4; #endif - WFIFOL(fd, offset) = qi->objectives[j].mob; + WFIFOL(fd, offset) = qi->objectives[j]->mob_id; offset += 4; #if PACKETVER >= 20150513 WFIFOW(fd, offset) = 0; // TODO: Find info - levelMin @@ -16965,7 +16964,7 @@ void clif_quest_send_list(struct map_session_data *sd) #endif WFIFOW(fd, offset) = sd->quest_log[i].count[j]; offset += 2; - WFIFOW(fd, offset) = qi->objectives[j].count; + WFIFOW(fd, offset) = qi->objectives[j]->count; offset += 2; safestrncpy((char*)WFIFOP(fd, offset), mob->jname, NAME_LENGTH); offset += NAME_LENGTH; @@ -16998,7 +16997,7 @@ void clif_quest_send_list(struct map_session_data *sd) void clif_quest_send_mission(struct map_session_data *sd) { int fd = sd->fd; - int i, j, limit = 0; + int limit = 0; int len = sd->avail_quests*104+8; struct mob_db *mob; @@ -17008,18 +17007,18 @@ void clif_quest_send_mission(struct map_session_data *sd) WFIFOW(fd, 2) = len; WFIFOL(fd, 4) = limit; - for (i = 0; i < limit; i++) { - struct quest_db *qi = quest_search(sd->quest_log[i].quest_id); + for (int i = 0; i < limit; i++) { + std::shared_ptr qi = quest_search(sd->quest_log[i].quest_id); WFIFOL(fd, i*104+8) = sd->quest_log[i].quest_id; - WFIFOL(fd, i*104+12) = sd->quest_log[i].time - qi->time; - WFIFOL(fd, i*104+16) = sd->quest_log[i].time; - WFIFOW(fd, i*104+20) = qi->objectives_count; + WFIFOL(fd, i*104+12) = static_cast(sd->quest_log[i].time - qi->time); + WFIFOL(fd, i*104+16) = static_cast(sd->quest_log[i].time); + WFIFOW(fd, i*104+20) = static_cast(qi->objectives.size()); - for (j = 0 ; j < qi->objectives_count; j++) { - WFIFOL(fd, i*104+22+j*30) = qi->objectives[j].mob; + for (int j = 0 ; j < qi->objectives.size(); j++) { + WFIFOL(fd, i*104+22+j*30) = qi->objectives[j]->mob_id; WFIFOW(fd, i*104+26+j*30) = sd->quest_log[i].count[j]; - mob = mob_db(qi->objectives[j].mob); + mob = mob_db(qi->objectives[j]->mob_id); safestrncpy(WFIFOCP(fd, i*104+28+j*30), mob->jname, NAME_LENGTH); } } @@ -17035,8 +17034,7 @@ void clif_quest_send_mission(struct map_session_data *sd) void clif_quest_add(struct map_session_data *sd, struct quest *qd) { int fd = sd->fd; - int i, offset; - struct quest_db *qi = quest_search(qd->quest_id); + std::shared_ptr qi = quest_search(qd->quest_id); #if PACKETVER >= 20150513 int cmd = 0x9f9; #else @@ -17047,11 +17045,11 @@ void clif_quest_add(struct map_session_data *sd, struct quest *qd) WFIFOW(fd, 0) = cmd; WFIFOL(fd, 2) = qd->quest_id; WFIFOB(fd, 6) = qd->state; - WFIFOB(fd, 7) = qd->time - qi->time; - WFIFOL(fd, 11) = qd->time; - WFIFOW(fd, 15) = qi->objectives_count; + WFIFOB(fd, 7) = static_cast(qd->time - qi->time); + WFIFOL(fd, 11) = static_cast(qd->time); + WFIFOW(fd, 15) = static_cast(qi->objectives.size()); - for (i = 0, offset = 17; i < qi->objectives_count; i++) { + for (int i = 0, offset = 17; i < qi->objectives.size(); i++) { struct mob_db *mob; #if PACKETVER >= 20150513 WFIFOL(fd, offset) = qd->quest_id * 1000 + i; @@ -17059,7 +17057,7 @@ void clif_quest_add(struct map_session_data *sd, struct quest *qd) WFIFOL(fd, offset) = 0; // TODO: Find info - mobType offset += 4; #endif - WFIFOL(fd, offset) = qi->objectives[i].mob; + WFIFOL(fd, offset) = qi->objectives[i]->mob_id; offset += 4; #if PACKETVER >= 20150513 WFIFOW(fd, offset) = 0; // TODO: Find info - levelMin @@ -17069,7 +17067,7 @@ void clif_quest_add(struct map_session_data *sd, struct quest *qd) #endif WFIFOW(fd, offset) = qd->count[i]; offset += 2; - mob = mob_db(qi->objectives[i].mob); + mob = mob_db(qi->objectives[i]->mob_id); safestrncpy(WFIFOCP(fd, offset), mob->jname, NAME_LENGTH); offset += NAME_LENGTH; } @@ -17077,16 +17075,16 @@ void clif_quest_add(struct map_session_data *sd, struct quest *qd) WFIFOSET(fd, packet_len(cmd)); #if PACKETVER >= 20150513 - int len = 4 + qi->objectives_count * 12; + int len = 4 + qi->objectives.size() * 12; WFIFOHEAD(fd, len); WFIFOW(fd, 0) = 0x8fe; WFIFOW(fd, 2) = len; - for( i = 0, offset = 4; i < qi->objectives_count; i++, offset += 12 ){ + for (int i = 0, offset = 4; i < qi->objectives.size(); i++, offset += 12) { WFIFOL(fd, offset) = qd->quest_id * 1000 + i; - WFIFOL(fd, offset+4) = qi->objectives[i].mob; - WFIFOW(fd, offset + 10) = qi->objectives[i].count; + WFIFOL(fd, offset+4) = qi->objectives[i]->mob_id; + WFIFOW(fd, offset + 10) = qi->objectives[i]->count; WFIFOW(fd, offset + 12) = qd->count[i]; } @@ -17115,9 +17113,9 @@ void clif_quest_delete(struct map_session_data *sd, int quest_id) void clif_quest_update_objective(struct map_session_data *sd, struct quest *qd, int mobid) { int fd = sd->fd; - int i, offset; - struct quest_db *qi = quest_search(qd->quest_id); - int len = qi->objectives_count * 12 + 6; + int offset = 6; + std::shared_ptr qi = quest_search(qd->quest_id); + int len = qi->objectives.size() * 12 + 6; #if PACKETVER >= 20150513 int cmd = 0x9fa; #else @@ -17126,20 +17124,20 @@ void clif_quest_update_objective(struct map_session_data *sd, struct quest *qd, WFIFOHEAD(fd, len); WFIFOW(fd, 0) = cmd; - WFIFOW(fd, 4) = qi->objectives_count; + WFIFOW(fd, 4) = static_cast(qi->objectives.size()); - for (i = 0, offset = 6; i < qi->objectives_count; i++) { - if (mobid == 0 || mobid == qi->objectives[i].mob) { + for (int i = 0; i < qi->objectives.size(); i++) { + if (mobid == 0 || mobid == qi->objectives[i]->mob_id) { WFIFOL(fd, offset) = qd->quest_id; offset += 4; #if PACKETVER >= 20150513 WFIFOL(fd, offset) = qd->quest_id * 1000 + i; offset += 4; #else - WFIFOL(fd, offset) = qi->objectives[i].mob; + WFIFOL(fd, offset) = qi->objectives[i].mob_id; offset += 4; #endif - WFIFOW(fd, offset) = qi->objectives[i].count; + WFIFOW(fd, offset) = qi->objectives[i]->count; offset += 2; WFIFOW(fd, offset) = qd->count[i]; offset += 2; diff --git a/src/map/intif.cpp b/src/map/intif.cpp index 3f15c5e3cc..30513cc581 100644 --- a/src/map/intif.cpp +++ b/src/map/intif.cpp @@ -2041,15 +2041,15 @@ void intif_parse_questlog(int fd) } } else { struct quest *received = (struct quest *)RFIFOP(fd,8); - int i, k = num_received; + int k = num_received; if(sd->quest_log) RECREATE(sd->quest_log, struct quest, num_received); else CREATE(sd->quest_log, struct quest, num_received); - for(i = 0; i < num_received; i++) { - if(quest_search(received[i].quest_id) == &quest_dummy) { + for(int i = 0; i < num_received; i++) { + if(!quest_search(received[i].quest_id)) { ShowError("intif_parse_QuestLog: quest %d not found in DB.\n", received[i].quest_id); continue; } diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj index 1a17793446..721e354c7a 100644 --- a/src/map/map-server.vcxproj +++ b/src/map/map-server.vcxproj @@ -357,7 +357,7 @@ - + diff --git a/src/map/quest.cpp b/src/map/quest.cpp index 901798bb36..a047b02451 100644 --- a/src/map/quest.cpp +++ b/src/map/quest.cpp @@ -12,6 +12,8 @@ #include "../common/showmsg.hpp" #include "../common/socket.hpp" #include "../common/strlib.hpp" +#include "../common/utilities.hpp" +#include "../common/utils.hpp" #include "battle.hpp" #include "chrif.hpp" @@ -24,20 +26,296 @@ #include "party.hpp" #include "pc.hpp" -static DBMap *questdb; -static void questdb_free_sub(struct quest_db *quest, bool free); -struct quest_db quest_dummy; +static int split_exact_quest_time(char* modif_p, int* day, int* hour, int* minute, int *second); + +const std::string QuestDatabase::getDefaultLocation() { + return std::string(db_path) + "/quest_db.yml"; +} + +/** + * Reads and parses an entry from the quest_db. + * @param node: YAML node containing the entry. + * @return count of successfully parsed rows + */ +uint64 QuestDatabase::parseBodyNode(const YAML::Node &node) { + uint32 quest_id; + + if (!this->asUInt32(node, "Id", quest_id)) + return 0; + + std::shared_ptr quest = this->find(quest_id); + bool exists = quest != nullptr; + + if (!exists) { + if (!this->nodesExist(node, { "Title" })) + return 0; + + quest = std::make_shared(); + quest->id = quest_id; + } + + if (this->nodeExists(node, "Title")) { + std::string name; + + if (!this->asString(node, "Title", name)) + return 0; + + quest->name = name; + } + + if (this->nodeExists(node, "TimeLimit")) { + std::string time; + + if (!this->asString(node, "TimeLimit", time)) + return 0; + + if (time.find("+") != std::string::npos) { + double timediff = solve_time(const_cast(time.c_str())); + + if (timediff <= 0) { + this->invalidWarning(node["TimeLimit"], "Incorrect TimeLimit format %s given, skipping.\n", time.c_str()); + return 0; + } + quest->time = static_cast(timediff); + } + else {// '+' not found, set to specific time + int32 day, hour, minute, second; + + if (split_exact_quest_time(const_cast(time.c_str()), &day, &hour, &minute, &second) == 0) { + this->invalidWarning(node["TimeLimit"], "Incorrect TimeLimit format %s given, skipping.\n", time.c_str()); + return 0; + } + quest->time = day * 86400 + hour * 3600 + minute * 60 + second; + quest->time_at = true; + } + + } else { + if (!exists) { + quest->time = 0; + quest->time_at = false; + } + } + + if (this->nodeExists(node, "Targets")) { + const YAML::Node &targets = node["Targets"]; + + for (const YAML::Node &targetNode : targets) { + if (quest->objectives.size() >= MAX_QUEST_OBJECTIVES) { + this->invalidWarning(targetNode, "Targets list exceeds the maximum of %d, skipping.\n", MAX_QUEST_OBJECTIVES); + return 0; + } + + if (!this->nodeExists(targetNode, "Mob")) + continue; + + std::string mob_name; + + if (!this->asString(targetNode, "Mob", mob_name)) + return 0; + + struct mob_db *mob = mobdb_search_aegisname(mob_name.c_str()); + + if (!mob) { + this->invalidWarning(targetNode["Mob"], "Mob %s does not exist, skipping.\n", mob_name.c_str()); + continue; + } + + //std::shared_ptr target = util::vector_find(quest->objectives, mob->vd.class_); + std::shared_ptr target; + std::vector>::iterator it = std::find_if(quest->objectives.begin(), quest->objectives.end(), [&](std::shared_ptr const &v) { + return (*v).mob_id == mob->vd.class_; + }); + + if (it != quest->objectives.end()) + target = (*it); + else + target = nullptr; + + bool targetExists = target != nullptr; + + if (!targetExists) { + if (!this->nodeExists(targetNode, "Count")) { + this->invalidWarning(targetNode["Count"], "Targets has no Count value specified, skipping.\n"); + continue; + } + + target = std::make_shared(); + target->mob_id = mob->vd.class_; + } + + if (this->nodeExists(targetNode, "Count")) { + uint16 count; + + if (!this->asUInt16(targetNode, "Count", count)) + return 0; + + target->count = count; + } + + quest->objectives.push_back(target); + } + } + + if (this->nodeExists(node, "Drops")) { + const YAML::Node &drops = node["Drops"]; + + for (const YAML::Node &dropNode : drops) { + if (quest->objectives.size() >= MAX_QUEST_OBJECTIVES) { + this->invalidWarning(dropNode, "Drops list exceeds the maximum of %d, skipping.\n", MAX_QUEST_OBJECTIVES); + return 0; + } + + uint32 mob_id = 0; // Can be 0 which means all monsters + + if (this->nodeExists(dropNode, "Mob")) { + std::string mob_name; + + if (!this->asString(dropNode, "Mob", mob_name)) + return 0; + + struct mob_db *mob = mobdb_search_aegisname(mob_name.c_str()); + + if (!mob) { + this->invalidWarning(dropNode["Mob"], "Mob %s does not exist, skipping.\n", mob_name.c_str()); + continue; + } + + mob_id = mob->vd.class_; + } + + //std::shared_ptr target = util::vector_find(quest->dropitem, mob_id); + std::shared_ptr target; + std::vector>::iterator it = std::find_if(quest->dropitem.begin(), quest->dropitem.end(), [&](std::shared_ptr const &v) { + return (*v).mob_id == mob_id; + }); + + if (it != quest->dropitem.end()) + target = (*it); + else + target = nullptr; + + bool targetExists = target != nullptr; + + if (!targetExists) { + if (!this->nodeExists(dropNode, "Item")) { + this->invalidWarning(dropNode["Item"], "Drops has no Item value specified, skipping.\n"); + continue; + } + + if (!this->nodeExists(dropNode, "Rate")) { + this->invalidWarning(dropNode["Item"], "Drops has no Rate value specified, skipping.\n"); + continue; + } + + target = std::make_shared(); + target->mob_id = mob_id; + } + + if (this->nodeExists(dropNode, "Item")) { + std::string item_name; + + if (!this->asString(dropNode, "Item", item_name)) + return 0; + + struct item_data *item = itemdb_search_aegisname(item_name.c_str()); + + if (!item) { + this->invalidWarning(dropNode["Item"], "Item %s does not exist, skipping.\n", item_name.c_str()); + continue; + } + + target->nameid = item->nameid; + } + + if (this->nodeExists(dropNode, "Count")) { + uint16 count; + + if (!this->asUInt16(dropNode, "Count", count)) + return 0; + + if (!itemdb_isstackable(target->nameid)) { + this->invalidWarning(dropNode["Count"], "Item %s is not stackable, capping to 1.\n", itemdb_name(target->nameid)); + count = 1; + } + + target->count = count; + } else { + if (!targetExists) + target->count = 1; + } + + if (this->nodeExists(dropNode, "Rate")) { + uint16 rate; + + if (!this->asUInt16(dropNode, "Rate", rate)) + return 0; + + target->rate = rate; + } + + quest->dropitem.push_back(target); + } + } + + if (!exists) + this->put(quest_id, quest); + + return 1; +} + + +static int split_exact_quest_time(char* modif_p, int* day, int* hour, int* minute, int *second) { + int d = -1, h = -1, mn = -1, s = -1; + + nullpo_retr(0, modif_p); + + while (modif_p[0] != '\0') { + int value = atoi(modif_p); + + if (modif_p[0] == '-' || modif_p[0] == '+') + modif_p++; + while (modif_p[0] >= '0' && modif_p[0] <= '9') + modif_p++; + if (modif_p[0] == 's') { + s = value; + modif_p++; + } else if (modif_p[0] == 'm' && modif_p[1] == 'n') { + mn = value; + modif_p = modif_p + 2; + } else if (modif_p[0] == 'h') { + h = value; + modif_p++; + } else if (modif_p[0] == 'd' || modif_p[0] == 'j') { + d = value; + modif_p++; + } else if (modif_p[0] != '\0') { + modif_p++; + } + } + + if (h < 0 || h > 23 || mn > 59 || s > 59) // hour is required + return 0; + + *day = max(0,d); + *hour = h; + *minute = max(0,mn); + *second = max(0,s); + + return 1; +} /** * Searches a quest by ID. * @param quest_id : ID to lookup - * @return Quest entry (equals to &quest_dummy if the ID is invalid) + * @return Quest entry or nullptr on failure */ -struct quest_db *quest_search(int quest_id) +std::shared_ptr quest_search(int quest_id) { - struct quest_db *quest = (struct quest_db *)idb_get(questdb, quest_id); + auto quest = quest_db.find(quest_id); + if (!quest) - return &quest_dummy; + return nullptr; + return quest; } @@ -46,13 +324,9 @@ struct quest_db *quest_search(int quest_id) * @param sd : Player's data * @return 0 in case of success, nonzero otherwise (i.e. the player has no quests) */ -int quest_pc_login(TBL_PC *sd) +int quest_pc_login(struct map_session_data *sd) { -#if PACKETVER < 20141022 - int i; -#endif - - if( sd->avail_quests == 0 ) + if (!sd->avail_quests) return 1; clif_quest_send_list(sd); @@ -61,13 +335,39 @@ int quest_pc_login(TBL_PC *sd) clif_quest_send_mission(sd); //@TODO[Haru]: Is this necessary? Does quest_send_mission not take care of this? - for( i = 0; i < sd->avail_quests; i++ ) + for (int i = 0; i < sd->avail_quests; i++) clif_quest_update_objective(sd, &sd->quest_log[i], 0); #endif return 0; } +/** + * Determine a quest's time limit. + * @param qi: Quest data + * @return Time limit value + */ +static time_t quest_time(std::shared_ptr qi) +{ + if (!qi || qi->time < 0) + return 0; + + if (!qi->time_at && qi->time > 0) + return time(nullptr) + qi->time; + else if (qi->time_at) { + time_t t = time(nullptr); + struct tm *lt = localtime(&t); + uint32 time_today = lt->tm_hour * 3600 + lt->tm_min * 60 + lt->tm_sec; + + if (time_today < (qi->time % 86400)) + return static_cast(t + qi->time - time_today); + else // Carry over to the next day + return static_cast(t + 86400 + qi->time - time_today); + } + + return 0; +} + /** * Adds a quest to the player's list. * New quest will be added as Q_ACTIVE. @@ -75,53 +375,34 @@ int quest_pc_login(TBL_PC *sd) * @param quest_id : ID of the quest to add. * @return 0 in case of success, nonzero otherwise */ -int quest_add(TBL_PC *sd, int quest_id) +int quest_add(struct map_session_data *sd, int quest_id) { - int n; - struct quest_db *qi = quest_search(quest_id); + std::shared_ptr qi = quest_search(quest_id); - if( qi == &quest_dummy ) { + if (!qi) { ShowError("quest_add: quest %d not found in DB.\n", quest_id); return -1; } - if( quest_check(sd, quest_id, HAVEQUEST) >= 0 ) { + if (quest_check(sd, quest_id, HAVEQUEST) >= 0) { ShowError("quest_add: Character %d already has quest %d.\n", sd->status.char_id, quest_id); return -1; } - n = sd->avail_quests; //Insertion point + int n = sd->avail_quests; //Insertion point sd->num_quests++; sd->avail_quests++; RECREATE(sd->quest_log, struct quest, sd->num_quests); //The character has some completed quests, make room before them so that they will stay at the end of the array - if( sd->avail_quests != sd->num_quests ) + if (sd->avail_quests != sd->num_quests) memmove(&sd->quest_log[n + 1], &sd->quest_log[n], sizeof(struct quest) * (sd->num_quests-sd->avail_quests)); - memset(&sd->quest_log[n], 0, sizeof(struct quest)); - + sd->quest_log[n] = {}; sd->quest_log[n].quest_id = qi->id; - if (qi->time) { - if (qi->time_type == 0) - sd->quest_log[n].time = (unsigned int)(time(NULL) + qi->time); - else { // quest time limit at HH:MM - int time_today; - time_t t; - struct tm * lt; - - t = time(NULL); - lt = localtime(&t); - time_today = (lt->tm_hour) * 3600 + (lt->tm_min) * 60 + (lt->tm_sec); - if (time_today < qi->time) - sd->quest_log[n].time = (unsigned int)(time(NULL) + qi->time - time_today); - else // next day - sd->quest_log[n].time = (unsigned int)(time(NULL) + 86400 + qi->time - time_today); - } - } + sd->quest_log[n].time = (uint32)quest_time(qi); sd->quest_log[n].state = Q_ACTIVE; - sd->save_quest = true; clif_quest_add(sd, &sd->quest_log[n]); @@ -140,55 +421,37 @@ int quest_add(TBL_PC *sd, int quest_id) * @param qid2 : New quest to add * @return 0 in case of success, nonzero otherwise */ -int quest_change(TBL_PC *sd, int qid1, int qid2) +int quest_change(struct map_session_data *sd, int qid1, int qid2) { - int i; - struct quest_db *qi = quest_search(qid2); + std::shared_ptr qi = quest_search(qid2); - if( qi == &quest_dummy ) { + if (!qi) { ShowError("quest_change: quest %d not found in DB.\n", qid2); return -1; } - if( quest_check(sd, qid2, HAVEQUEST) >= 0 ) { + if (quest_check(sd, qid2, HAVEQUEST) >= 0) { ShowError("quest_change: Character %d already has quest %d.\n", sd->status.char_id, qid2); return -1; } - if( quest_check(sd, qid1, HAVEQUEST) < 0 ) { + if (quest_check(sd, qid1, HAVEQUEST) < 0) { ShowError("quest_change: Character %d doesn't have quest %d.\n", sd->status.char_id, qid1); return -1; } + int i; + ARR_FIND(0, sd->avail_quests, i, sd->quest_log[i].quest_id == qid1); - if( i == sd->avail_quests ) { + if (i == sd->avail_quests) { ShowError("quest_change: Character %d has completed quest %d.\n", sd->status.char_id, qid1); return -1; } - memset(&sd->quest_log[i], 0, sizeof(struct quest)); + sd->quest_log[i] = {}; sd->quest_log[i].quest_id = qi->id; - - if (qi->time) { - if (qi->time_type == 0) - sd->quest_log[i].time = (unsigned int)(time(NULL) + qi->time); - else { // quest time limit at HH:MM - int time_today; - time_t t; - struct tm * lt; - - t = time(NULL); - lt = localtime(&t); - time_today = (lt->tm_hour) * 3600 + (lt->tm_min) * 60 + (lt->tm_sec); - if (time_today < qi->time) - sd->quest_log[i].time = (unsigned int)(time(NULL) + qi->time - time_today); - else // next day - sd->quest_log[i].time = (unsigned int)(time(NULL) + 86400 + qi->time - time_today); - } - } - + sd->quest_log[i].time = (uint32)quest_time(qi); sd->quest_log[i].state = Q_ACTIVE; - sd->save_quest = true; clif_quest_delete(sd, qid1); @@ -207,24 +470,24 @@ int quest_change(TBL_PC *sd, int qid1, int qid2) * @param quest_id : ID of the quest to remove * @return 0 in case of success, nonzero otherwise */ -int quest_delete(TBL_PC *sd, int quest_id) +int quest_delete(struct map_session_data *sd, int quest_id) { int i; //Search for quest ARR_FIND(0, sd->num_quests, i, sd->quest_log[i].quest_id == quest_id); - if( i == sd->num_quests ) { + if (i == sd->num_quests) { ShowError("quest_delete: Character %d doesn't have quest %d.\n", sd->status.char_id, quest_id); return -1; } - if( sd->quest_log[i].state != Q_COMPLETE ) + if (sd->quest_log[i].state != Q_COMPLETE) sd->avail_quests--; - if( i < --sd->num_quests ) //Compact the array + if (i < --sd->num_quests) //Compact the array memmove(&sd->quest_log[i], &sd->quest_log[i + 1], sizeof(struct quest) * (sd->num_quests - i)); - if( sd->num_quests == 0 ) { + if (sd->num_quests == 0) { aFree(sd->quest_log); sd->quest_log = NULL; } else @@ -273,53 +536,49 @@ int quest_update_objective_sub(struct block_list *bl, va_list ap) * @param sd : Character's data * @param mob_id : Monster ID */ -void quest_update_objective(TBL_PC *sd, int mob_id) +void quest_update_objective(struct map_session_data *sd, int mob_id) { - int i, j; - - for( i = 0; i < sd->avail_quests; i++ ) { - struct quest_db *qi = NULL; - - if( sd->quest_log[i].state == Q_COMPLETE ) // Skip complete quests + for (int i = 0; i < sd->avail_quests; i++) { + if (sd->quest_log[i].state == Q_COMPLETE) // Skip complete quests continue; - qi = quest_search(sd->quest_log[i].quest_id); + std::shared_ptr qi = quest_search(sd->quest_log[i].quest_id); - for( j = 0; j < qi->objectives_count; j++ ) { - if( qi->objectives[j].mob == mob_id && sd->quest_log[i].count[j] < qi->objectives[j].count ) { + // Process quest objectives + for (int j = 0; j < qi->objectives.size(); j++) { + if (qi->objectives[j]->mob_id == mob_id && sd->quest_log[i].count[j] < qi->objectives[j]->count) { sd->quest_log[i].count[j]++; sd->save_quest = true; clif_quest_update_objective(sd, &sd->quest_log[i], mob_id); } } - // process quest-granted extra drop bonuses - for (j = 0; j < qi->dropitem_count; j++) { - struct quest_dropitem *dropitem = &qi->dropitem[j]; - struct item item; - int temp; - - if (dropitem->mob_id != 0 && dropitem->mob_id != mob_id) + // Process quest-granted extra drop bonuses + for (const auto &it : qi->dropitem) { + if (it->mob_id != 0 && it->mob_id != mob_id) continue; - // TODO: Should this be affected by server rates? - if (dropitem->rate < 10000 && rnd()%10000 >= dropitem->rate) - continue; - if (!itemdb_exists(dropitem->nameid)) + if (it->rate < 10000 && rnd()%10000 >= it->rate) + continue; // TODO: Should this be affected by server rates? + if (!itemdb_exists(it->nameid)) continue; - memset(&item,0,sizeof(item)); - item.nameid = dropitem->nameid; - item.identify = itemdb_isidentified(dropitem->nameid); - item.amount = dropitem->count; + struct item item = {}; + + item.nameid = it->nameid; + item.identify = itemdb_isidentified(it->nameid); + item.amount = it->count; //#ifdef BOUND_ITEMS -// item.bound = dropitem->bound; +// item.bound = it.bound; //#endif -// if (dropitem->isGUID) +// if (it.isGUID) // item.unique_id = pc_generate_unique_id(sd); - if ((temp = pc_additem(sd, &item, 1, LOG_TYPE_QUEST)) != 0) // Failed to obtain the item + + char temp; + + if ((temp = pc_additem(sd, &item, 1, LOG_TYPE_QUEST)) != ADDITEM_SUCCESS) // Failed to obtain the item clif_additem(sd, 0, 0, temp); -// else if (dropitem->isAnnounced || itemdb_exists(dropitem->nameid)->flag.broadcast) -// intif_broadcast_obtain_special_item(sd, dropitem->nameid, dropitem->mob_id, ITEMOBTAIN_TYPE_MONSTER_ITEM); +// else if (it.isAnnounced || itemdb_exists(it.nameid)->flag.broadcast) +// intif_broadcast_obtain_special_item(sd, it.nameid, it.mob_id, ITEMOBTAIN_TYPE_MONSTER_ITEM); } } pc_show_questinfo(sd); @@ -334,12 +593,12 @@ void quest_update_objective(TBL_PC *sd, int mob_id) * @return 0 in case of success, nonzero otherwise * @author [Inkfish] */ -int quest_update_status(TBL_PC *sd, int quest_id, enum quest_state status) +int quest_update_status(struct map_session_data *sd, int quest_id, e_quest_state status) { int i; ARR_FIND(0, sd->avail_quests, i, sd->quest_log[i].quest_id == quest_id); - if( i == sd->avail_quests ) { + if (i == sd->avail_quests) { ShowError("quest_update_status: Character %d doesn't have quest %d.\n", sd->status.char_id, quest_id); return -1; } @@ -347,13 +606,13 @@ int quest_update_status(TBL_PC *sd, int quest_id, enum quest_state status) sd->quest_log[i].state = status; sd->save_quest = true; - if( status < Q_COMPLETE ) { + if (status < Q_COMPLETE) { clif_quest_update_status(sd, quest_id, status == Q_ACTIVE ? true : false); return 0; } // The quest is complete, so it needs to be moved to the completed quests block at the end of the array. - if( i < (--sd->avail_quests) ) { + if (i < (--sd->avail_quests)) { struct quest tmp_quest; memcpy(&tmp_quest, &sd->quest_log[i], sizeof(struct quest)); @@ -363,7 +622,7 @@ int quest_update_status(TBL_PC *sd, int quest_id, enum quest_state status) clif_quest_delete(sd, quest_id); - if( save_settings&CHARSAVE_QUEST ) + if (save_settings&CHARSAVE_QUEST) chrif_save(sd, CSAVE_NORMAL); return 0; @@ -383,30 +642,30 @@ int quest_update_status(TBL_PC *sd, int quest_id, enum quest_state status) * 1 if the quest's timeout has expired * 0 otherwise */ -int quest_check(TBL_PC *sd, int quest_id, enum quest_check_type type) +int quest_check(struct map_session_data *sd, int quest_id, e_quest_check_type type) { int i; ARR_FIND(0, sd->num_quests, i, sd->quest_log[i].quest_id == quest_id); - if( i == sd->num_quests ) + if (i == sd->num_quests) return -1; - switch( type ) { + switch (type) { case HAVEQUEST: if (sd->quest_log[i].state == Q_INACTIVE) // Player has the quest but it's in the inactive state; send it as Q_ACTIVE. return 1; return sd->quest_log[i].state; case PLAYTIME: - return (sd->quest_log[i].time < (unsigned int)time(NULL) ? 2 : sd->quest_log[i].state == Q_COMPLETE ? 1 : 0); + return (sd->quest_log[i].time < (unsigned int)time(nullptr) ? 2 : sd->quest_log[i].state == Q_COMPLETE ? 1 : 0); case HUNTING: - if( sd->quest_log[i].state == Q_INACTIVE || sd->quest_log[i].state == Q_ACTIVE ) { + if (sd->quest_log[i].state == Q_INACTIVE || sd->quest_log[i].state == Q_ACTIVE) { int j; - struct quest_db *qi = quest_search(sd->quest_log[i].quest_id); + std::shared_ptr qi = quest_search(sd->quest_log[i].quest_id); - ARR_FIND(0, qi->objectives_count, j, sd->quest_log[i].count[j] < qi->objectives[j].count); - if( j == qi->objectives_count ) + ARR_FIND(0, qi->objectives.size(), j, sd->quest_log[i].count[j] < qi->objectives[j]->count); + if (j == qi->objectives.size()) return 2; - if( sd->quest_log[i].time < (unsigned int)time(NULL) ) + if (sd->quest_log[i].time < (unsigned int)time(nullptr)) return 1; } return 0; @@ -418,153 +677,6 @@ int quest_check(TBL_PC *sd, int quest_id, enum quest_check_type type) return -1; } -/** - * Loads quests from the quest db.txt - * @return Number of loaded quests, or -1 if the file couldn't be read. - */ -void quest_read_txtdb(void) -{ - const char* dbsubpath[] = { - DBPATH, - DBIMPORT"/", - }; - uint8 f; - - for (f = 0; f < ARRAYLENGTH(dbsubpath); f++) { - FILE *fp; - char line[1024]; - uint32 ln = 0, count = 0; - char filename[256]; - - sprintf(filename, "%s/%s%s", db_path, dbsubpath[f], "quest_db.txt"); - if ((fp = fopen(filename, "r")) == NULL) { - if (f == 0) - ShowError("Can't read %s\n", filename); - return; - } - - while(fgets(line, sizeof(line), fp)) { - struct quest_db *quest = NULL; - char *str[19], *p; - int quest_id = 0; - uint8 i; - - ++ln; - if (line[0] == '\0' || (line[0] == '/' && line[1] == '/')) - continue; - - p = trim(line); - - if (*p == '\0') - continue; // empty line - - memset(str, 0, sizeof(str)); - for(i = 0, p = line; i < 18 && p; i++) { - str[i] = p; - p = strchr(p,','); - if (p) - *p++ = 0; - } - if (str[0] == NULL) - continue; - if (i < 18) { - ShowError("quest_read_txtdb: Insufficient columns in '%s' line %d (%d of %d)\n", filename, ln, i, 18); - continue; - } - - quest_id = atoi(str[0]); - - if (quest_id < 0 || quest_id >= INT_MAX) { - ShowError("quest_read_txtdb: Invalid quest ID '%d' in '%s' line '%d' (min: 0, max: %d.)\n", quest_id, filename, ln, INT_MAX); - continue; - } - - if (!(quest = (struct quest_db *)idb_get(questdb, quest_id))) - CREATE(quest, struct quest_db, 1); - else { - if (quest->objectives) { - aFree(quest->objectives); - quest->objectives = NULL; - quest->objectives_count = 0; - } - if (quest->dropitem) { - aFree(quest->dropitem); - quest->dropitem = NULL; - quest->dropitem_count = 0; - } - } - - if (strchr(str[1],':') == NULL) { - quest->time = atoi(str[1]); - quest->time_type = 0; - } - else { - unsigned char hour, min; - - hour = atoi(str[1]); - str[1] = strchr(str[1],':'); - *str[1] ++= 0; - min = atoi(str[1]); - - quest->time = hour * 3600 + min * 60; - quest->time_type = 1; - } - - for(i = 0; i < MAX_QUEST_OBJECTIVES; i++) { - uint16 mob_id = (uint16)atoi(str[2 * i + 2]); - - if (!mob_id) - continue; - if (mob_db(mob_id) == NULL) { - ShowWarning("quest_read_txtdb: Invalid monster as objective '%d' in line %d.\n", mob_id, ln); - continue; - } - RECREATE(quest->objectives, struct quest_objective, quest->objectives_count+1); - quest->objectives[quest->objectives_count].mob = mob_id; - quest->objectives[quest->objectives_count].count = (uint16)atoi(str[2 * i + 3]); - quest->objectives_count++; - } - - for(i = 0; i < MAX_QUEST_DROPS; i++) { - uint16 mob_id = (uint16)atoi(str[3 * i + (2 * MAX_QUEST_OBJECTIVES + 2)]), nameid = (uint16)atoi(str[3 * i + (2 * MAX_QUEST_OBJECTIVES + 3)]); - - if (!nameid) - continue; - if (!itemdb_exists(nameid) || (mob_id && mob_db(mob_id) == NULL)) { - ShowWarning("quest_read_txtdb: Invalid item reward '%d' (mob %d, optional) in line %d.\n", nameid, mob_id, ln); - continue; - } - RECREATE(quest->dropitem, struct quest_dropitem, quest->dropitem_count+1); - quest->dropitem[quest->dropitem_count].mob_id = mob_id; - quest->dropitem[quest->dropitem_count].nameid = nameid; - quest->dropitem[quest->dropitem_count].count = 1; - quest->dropitem[quest->dropitem_count].rate = atoi(str[3 * i + (2 * MAX_QUEST_OBJECTIVES + 4)]); - quest->dropitem_count++; - } - - //StringBuf_Init(&entry.name); - //StringBuf_Printf(&entry.name, "%s", str[17]); - - if (!quest->id) { - quest->id = quest_id; - idb_put(questdb, quest->id, quest); - } - count++; - } - - fclose(fp); - ShowStatus("Done reading '" CL_WHITE "%d" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n", count, filename); - } -} - -/** - * Loads Quest DB - */ -static void quest_read_db(void) -{ - quest_read_txtdb(); -} - /** * Map iterator to ensures a player has no invalid quest log entries. * Any entries that are no longer in the db are removed. @@ -572,23 +684,22 @@ static void quest_read_db(void) * @param sd : Character's data * @param ap : Ignored */ -int quest_reload_check_sub(struct map_session_data *sd, va_list ap) +static int quest_reload_check_sub(struct map_session_data *sd, va_list ap) { - int i, j; - nullpo_ret(sd); - j = 0; - for( i = 0; i < sd->num_quests; i++ ) { - struct quest_db *qi = quest_search(sd->quest_log[i].quest_id); + int i, j = 0; - if( qi == &quest_dummy ) { //Remove no longer existing entries - if( sd->quest_log[i].state != Q_COMPLETE ) //And inform the client if necessary + for (i = 0; i < sd->num_quests; i++) { + std::shared_ptr qi = quest_search(sd->quest_log[i].quest_id); + + if (!qi) { //Remove no longer existing entries + if (sd->quest_log[i].state != Q_COMPLETE) //And inform the client if necessary clif_quest_delete(sd, sd->quest_log[i].quest_id); continue; } - if( i != j ) { + if (i != j) { //Move entries if there's a gap to fill memcpy(&sd->quest_log[j], &sd->quest_log[i], sizeof(struct quest)); } @@ -603,50 +714,23 @@ int quest_reload_check_sub(struct map_session_data *sd, va_list ap) return 1; } -/** - * Clear quest single entry - * @param quest - * @param free Will free quest from memory - **/ -static void questdb_free_sub(struct quest_db *quest, bool free) -{ - if (quest->objectives) { - aFree(quest->objectives); - quest->objectives = NULL; - quest->objectives_count = 0; - } - if (quest->dropitem) { - aFree(quest->dropitem); - quest->dropitem = NULL; - quest->dropitem_count = 0; - } - if (&quest->name) - StringBuf_Destroy(&quest->name); - if (free) - aFree(quest); +bool QuestDatabase::reload() { + if (!TypesafeYamlDatabase::reload()) + return false; + + // Update quest data for players, to ensure no entries about removed quests are left over. + map_foreachpc(&quest_reload_check_sub); + return true; } -/** - * Clears the quest database for shutdown or reload. - */ -static int questdb_free(DBKey key, DBData *data, va_list ap) -{ - struct quest_db *quest = (struct quest_db *)db_data2ptr(data); - - if (!quest) - return 0; - - questdb_free_sub(quest, true); - return 1; -} +QuestDatabase quest_db; /** * Initializes the quest interface. */ void do_init_quest(void) { - questdb = idb_alloc(DB_OPT_BASE); - quest_read_db(); + quest_db.load(); } /** @@ -654,20 +738,4 @@ void do_init_quest(void) */ void do_final_quest(void) { - memset(&quest_dummy, 0, sizeof(quest_dummy)); - questdb->destroy(questdb, questdb_free); -} - -/** - * Reloads the quest database. - */ -void do_reload_quest(void) -{ - memset(&quest_dummy, 0, sizeof(quest_dummy)); - questdb->clear(questdb, questdb_free); - - quest_read_db(); - - //Update quest data for players, to ensure no entries about removed quests are left over. - map_foreachpc(&quest_reload_check_sub); } diff --git a/src/map/quest.hpp b/src/map/quest.hpp index 17ed05f241..a69f9994f4 100644 --- a/src/map/quest.hpp +++ b/src/map/quest.hpp @@ -4,14 +4,17 @@ #ifndef QUEST_HPP #define QUEST_HPP +#include + #include "../common/cbasetypes.hpp" +#include "../common/database.hpp" #include "../common/strlib.hpp" #include "map.hpp" struct map_session_data; -struct quest_dropitem { +struct s_quest_dropitem { uint16 nameid; uint16 count; uint16 rate; @@ -21,46 +24,53 @@ struct quest_dropitem { //bool isGUID; }; -struct quest_objective { - uint16 mob; +struct s_quest_objective { + uint16 mob_id; uint16 count; }; -struct quest_db { - // TODO: find out if signed or unsigned in client - int id; - unsigned int time; - bool time_type; - uint8 objectives_count; - struct quest_objective *objectives; - uint8 dropitem_count; - struct quest_dropitem *dropitem; - StringBuf name; +struct s_quest_db { + int32 id; + time_t time; + bool time_at; + std::vector> objectives; + std::vector> dropitem; + std::string name; }; -extern struct quest_db quest_dummy; ///< Dummy entry for invalid quest lookups - // Questlog check types -enum quest_check_type { +enum e_quest_check_type : uint8 { HAVEQUEST, ///< Query the state of the given quest PLAYTIME, ///< Check if the given quest has been completed or has yet to expire HUNTING, ///< Check if the given hunting quest's requirements have been met }; -int quest_pc_login(TBL_PC *sd); +class QuestDatabase : public TypesafeYamlDatabase { +public: + QuestDatabase() : TypesafeYamlDatabase("QUEST_DB", 1) { -int quest_add(TBL_PC * sd, int quest_id); -int quest_delete(TBL_PC * sd, int quest_id); -int quest_change(TBL_PC * sd, int qid1, int qid2); + } + + const std::string getDefaultLocation(); + uint64 parseBodyNode(const YAML::Node& node); + bool reload(); +}; + +extern QuestDatabase quest_db; + +int quest_pc_login(struct map_session_data *sd); + +int quest_add(struct map_session_data *sd, int quest_id); +int quest_delete(struct map_session_data *sd, int quest_id); +int quest_change(struct map_session_data *sd, int qid1, int qid2); int quest_update_objective_sub(struct block_list *bl, va_list ap); -void quest_update_objective(TBL_PC * sd, int mob_id); -int quest_update_status(TBL_PC * sd, int quest_id, enum quest_state status); -int quest_check(TBL_PC * sd, int quest_id, enum quest_check_type type); +void quest_update_objective(struct map_session_data *sd, int mob_id); +int quest_update_status(struct map_session_data *sd, int quest_id, e_quest_state status); +int quest_check(struct map_session_data *sd, int quest_id, e_quest_check_type type); -struct quest_db *quest_search(int quest_id); +std::shared_ptr quest_search(int quest_id); void do_init_quest(void); void do_final_quest(void); -void do_reload_quest(void); #endif /* QUEST_HPP */ diff --git a/src/map/script.cpp b/src/map/script.cpp index 28f59bfd7f..e9e10a6437 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -19587,10 +19587,10 @@ BUILDIN_FUNC(changequest) BUILDIN_FUNC(checkquest) { struct map_session_data *sd; - enum quest_check_type type = HAVEQUEST; + e_quest_check_type type = HAVEQUEST; if( script_hasdata(st, 3) ) - type = (enum quest_check_type)script_getnum(st, 3); + type = (e_quest_check_type)script_getnum(st, 3); if (!script_charid2sd(4,sd)) return SCRIPT_CMD_FAILURE; @@ -19606,12 +19606,11 @@ BUILDIN_FUNC(checkquest) BUILDIN_FUNC(isbegin_quest) { struct map_session_data *sd; - int i; if (!script_charid2sd(3,sd)) return SCRIPT_CMD_FAILURE; - i = quest_check(sd, script_getnum(st, 2), (enum quest_check_type) HAVEQUEST); + int i = quest_check(sd, script_getnum(st, 2), HAVEQUEST); script_pushint(st, i + (i < 1)); return SCRIPT_CMD_SUCCESS; diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index d30bbf0224..68bd257d1e 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -70,6 +70,7 @@ int getch( void ){ #define MAX_SKILL_ITEM_REQUIRE 10 #define MAX_SKILL_STATUS_REQUIRE 3 #define MAX_SKILL_EQUIP_REQUIRE 10 +#define MAX_QUEST_DROPS 3 struct s_skill_unit_csv : s_skill_db { std::string target_str; @@ -98,6 +99,7 @@ static bool skill_parse_row_unitdb(char* split[], int columns, int current); static bool skill_parse_row_copyabledb(char* split[], int columns, int current); static bool skill_parse_row_nonearnpcrangedb(char* split[], int columns, int current); static bool skill_parse_row_skilldb(char* split[], int columns, int current); +static bool quest_read_db(char *split[], int columns, int current); // Constants for conversion std::unordered_map aegis_itemnames; @@ -352,6 +354,12 @@ int do_init( int argc, char** argv ){ return 0; } + if (!process("QUEST_DB", 1, root_paths, "quest_db", [](const std::string &path, const std::string &name_ext) -> bool { + return sv_readdb(path.c_str(), name_ext.c_str(), ',', 3 + MAX_QUEST_OBJECTIVES * 2 + MAX_QUEST_DROPS * 3, 100, -1, &quest_read_db, false); + })) { + return 0; + } + // TODO: add implementations ;-) return 0; @@ -2390,3 +2398,138 @@ static bool skill_parse_row_skilldb(char* split[], int columns, int current) { return true; } + +// Copied and adjusted from quest.cpp +static bool quest_read_db(char *split[], int columns, int current) { + int quest_id = atoi(split[0]); + + if (quest_id < 0 || quest_id >= INT_MAX) { + ShowError("quest_read_db: Invalid quest ID '%d'.\n", quest_id); + return false; + } + + body << YAML::BeginMap; + body << YAML::Key << "Id" << YAML::Value << quest_id; + + std::string title = split[17]; + + if (columns > 18) { // If the title has a comma in it, concatenate + int col = 18; + + while (col < columns) { + title += ',' + std::string(split[col]); + col++; + } + } + + title.erase(std::remove(title.begin(), title.end(), '"'), title.end()); // Strip double quotes out + body << YAML::Key << "Title" << YAML::Value << title; + + if (strchr(split[1], ':') == NULL) { + uint32 time = atoi(split[1]); + + if (time > 0) { + int day = time / 86400; + + time %= (24 * 3600); + int hour = time / 3600; + + time %= 3600; + int minute = time / 60; + + time %= 60; + int second = time; + + std::string output = "+"; + + if (day > 0) + output += std::to_string(day) + "d"; + if (hour > 0) + output += std::to_string(hour) + "h"; + if (minute > 0) + output += std::to_string(minute) + "mn"; + if (second > 0) + output += std::to_string(second) + "s"; + + body << YAML::Key << "TimeLimit" << YAML::Value << output; + } + } else { + if (*split[1]) { + std::string time_str(split[1]), hour = time_str.substr(0, time_str.find(':')), output = {}; + + time_str.erase(0, 3); // Remove "HH:" + + if (std::stoi(hour) > 0) + output = std::to_string(std::stoi(hour)) + "h"; + if (std::stoi(time_str) > 0) + output += std::to_string(std::stoi(time_str)) + "mn"; + + body << YAML::Key << "TimeLimit" << YAML::Value << output; // No quests in TXT format had days, default to 0 + } + } + + if (atoi(split[2]) > 0) { + body << YAML::Key << "Targets"; + body << YAML::BeginSeq; + + for (size_t i = 0; i < MAX_QUEST_OBJECTIVES; i++) { + int32 mob_id = (int32)atoi(split[i * 2 + 2]), count = atoi(split[i * 2 + 3]); + + if (!mob_id || !count) + continue; + + std::string *mob_name = util::umap_find(aegis_mobnames, static_cast(mob_id)); + + if (!mob_name) { + ShowError("quest_read_db: Invalid mob-class %hu, target not read.\n", mob_id); + continue; + } + + body << YAML::BeginMap; + body << YAML::Key << "Mob" << YAML::Value << *mob_name; + body << YAML::Key << "Count" << YAML::Value << count; + body << YAML::EndMap; + } + + body << YAML::EndSeq; + } + + if (atoi(split[2 * MAX_QUEST_OBJECTIVES + 2]) > 0) { + body << YAML::Key << "Drops"; + body << YAML::BeginSeq; + + for (size_t i = 0; i < MAX_QUEST_DROPS; i++) { + int32 mob_id = (int32)atoi(split[3 * i + (2 * MAX_QUEST_OBJECTIVES + 2)]), nameid = (uint16)atoi(split[3 * i + (2 * MAX_QUEST_OBJECTIVES + 3)]); + + if (!mob_id || !nameid) + continue; + + std::string *mob_name = util::umap_find(aegis_mobnames, static_cast(mob_id)); + + if (!mob_name) { + ShowError("quest_read_db: Invalid mob-class %hu, drop not read.\n", mob_id); + continue; + } + + std::string *item_name = util::umap_find(aegis_itemnames, static_cast(nameid)); + + if (!item_name) { + ShowError("quest_read_db: Invalid item name %hu, drop not read.\n", nameid); + return false; + } + + body << YAML::BeginMap; + body << YAML::Key << "Mob" << YAML::Value << *mob_name; + body << YAML::Key << "Item" << YAML::Value << *item_name; + //body << YAML::Key << "Count" << YAML::Value << 1; // Default is 1 + body << YAML::Key << "Rate" << YAML::Value << atoi(split[3 * i + (2 * MAX_QUEST_OBJECTIVES + 4)]); + body << YAML::EndMap; + } + + body << YAML::EndSeq; + } + + body << YAML::EndMap; + + return true; +} From 2b49d12d7384a12ec0c8b1f9ce1c7db713741fc6 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Tue, 31 Mar 2020 06:00:36 +0200 Subject: [PATCH 007/212] Mob and NPC Identity Update --- db/re/mob_db.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/re/mob_db.txt b/db/re/mob_db.txt index 140fa94012..a96343fdfe 100644 --- a/db/re/mob_db.txt +++ b/db/re/mob_db.txt @@ -3966,5 +3966,7 @@ //20884,G_ILL_STROUF //20885,G_ILL_PHEN +//20919,CARAT_TWEVENT + //31999,HUNTING_GID_DEFAULT //32000,MONSTER_2ND_END From d7833244148421d88c80eb8e856bafdbc0efe9b3 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Tue, 31 Mar 2020 06:00:46 +0200 Subject: [PATCH 008/212] SQL synchronization --- sql-files/mob_db_re.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql-files/mob_db_re.sql b/sql-files/mob_db_re.sql index 1459d411dd..a283c1164e 100644 --- a/sql-files/mob_db_re.sql +++ b/sql-files/mob_db_re.sql @@ -4033,6 +4033,8 @@ REPLACE INTO `mob_db_re` VALUES (3790,'SWEETS_DROPS','Sweets Drops','Sweets Drop #20884,G_ILL_STROUF #20885,G_ILL_PHEN +#20919,CARAT_TWEVENT + #31999,HUNTING_GID_DEFAULT #32000,MONSTER_2ND_END From 6edcf4a3a1112393a96129422050974663e39a3c Mon Sep 17 00:00:00 2001 From: Aleos Date: Tue, 31 Mar 2020 08:20:04 -0400 Subject: [PATCH 009/212] Fixes Wall of Thorn knockback (#4685) * Fixes #4645. * The knockback should be based on self and not the caster of the skill. Thanks to @devLOOLP! --- db/pre-re/skill_db.yml | 2 +- db/re/skill_db.yml | 2 +- src/map/skill.cpp | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index e3fdc5b649..aa2e90d678 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -26897,7 +26897,7 @@ Body: Hit: Single HitCount: 1 ActiveInstance: 1 - Knockback: 2 + Knockback: 1 CopyFlags: Skill: Reproduce: true diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 623cbb5cc6..12b78e9ba3 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -27962,7 +27962,7 @@ Body: Hit: Single HitCount: 1 ActiveInstance: 1 - Knockback: 2 + Knockback: 1 CopyFlags: Skill: Reproduce: true diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 1e1c99e459..8e7736bbd2 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -3211,7 +3211,6 @@ void skill_attack_blow(struct block_list *src, struct block_list *dsrc, struct b // Skill specific direction switch (skill_id) { case MG_FIREWALL: - case GN_WALLOFTHORN: case EL_FIRE_MANTLE: dir = unit_getdir(target); // Backwards break; @@ -14803,7 +14802,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; if (status_bl_has_mode(bl,MD_STATUS_IMMUNE)) break; // This skill doesn't affect to Boss monsters. [iRO Wiki] - skill_blown(&unit->bl, bl, skill_get_blewcount(sg->skill_id, sg->skill_lv), -1, BLOWN_NONE); + skill_blown(&unit->bl, bl, skill_get_blewcount(sg->skill_id, sg->skill_lv), unit_getdir(bl), BLOWN_IGNORE_NO_KNOCKBACK); skill_addtimerskill(ss, tick + 100, bl->id, unit->bl.x, unit->bl.y, sg->skill_id, sg->skill_lv, skill_get_type(sg->skill_id), 4|SD_LEVEL); break; From 568fc0122603d9f2d044328663ee1a3755f77577 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Wed, 1 Apr 2020 04:00:37 +0200 Subject: [PATCH 010/212] Mob and NPC Identity Update --- db/re/mob_db.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/db/re/mob_db.txt b/db/re/mob_db.txt index a96343fdfe..0f381dc5a0 100644 --- a/db/re/mob_db.txt +++ b/db/re/mob_db.txt @@ -3953,6 +3953,23 @@ //20846,MD_HIDDEN_GROUND01 //20847,MD_HIDDEN_GROUND02 +//20856,MD_N_ARENA_1 +//20857,MD_N_ARENA_2 +//20858,MD_N_ARENA_3_1 +//20859,MD_N_ARENA_3_2 +//20860,MD_N_ARENA_3_3 +//20861,MD_N_ARENA_4 +//20862,MD_N_ARENA_5 +//20863,MD_N_ARENA_6 +//20864,MD_N_ARENA_7 +//20865,MD_N_ARENA_8 +//20866,MD_N_ARENA_9 +//20867,MD_N_ARENA_10 +//20868,MD_N_ARENA_11 +//20869,MD_N_ARENA_12 +//20870,MD_KANABIAN_N +//20871,MD_ALPHONSE_N +//20872,MD_GEFFEN_FENRIR_N //20873,WAR_NUT //20874,MOLE_TW From ad820c168b167ec71fb69472fc5e6e93bc826ae6 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Wed, 1 Apr 2020 04:00:48 +0200 Subject: [PATCH 011/212] SQL synchronization --- sql-files/mob_db_re.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/sql-files/mob_db_re.sql b/sql-files/mob_db_re.sql index a283c1164e..93c2340398 100644 --- a/sql-files/mob_db_re.sql +++ b/sql-files/mob_db_re.sql @@ -4020,6 +4020,23 @@ REPLACE INTO `mob_db_re` VALUES (3790,'SWEETS_DROPS','Sweets Drops','Sweets Drop #20846,MD_HIDDEN_GROUND01 #20847,MD_HIDDEN_GROUND02 +#20856,MD_N_ARENA_1 +#20857,MD_N_ARENA_2 +#20858,MD_N_ARENA_3_1 +#20859,MD_N_ARENA_3_2 +#20860,MD_N_ARENA_3_3 +#20861,MD_N_ARENA_4 +#20862,MD_N_ARENA_5 +#20863,MD_N_ARENA_6 +#20864,MD_N_ARENA_7 +#20865,MD_N_ARENA_8 +#20866,MD_N_ARENA_9 +#20867,MD_N_ARENA_10 +#20868,MD_N_ARENA_11 +#20869,MD_N_ARENA_12 +#20870,MD_KANABIAN_N +#20871,MD_ALPHONSE_N +#20872,MD_GEFFEN_FENRIR_N #20873,WAR_NUT #20874,MOLE_TW From 044acebd75b67c117cc504975c225d00bd942980 Mon Sep 17 00:00:00 2001 From: victorgawk Date: Thu, 2 Apr 2020 06:04:07 -0300 Subject: [PATCH 012/212] Added config option for legacy NPC EMOTION behavior (#4728) Co-authored-by: Victor Ferreira --- conf/battle/skill.conf | 7 +++++++ src/map/battle.cpp | 1 + src/map/battle.hpp | 1 + src/map/skill.cpp | 5 +++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/conf/battle/skill.conf b/conf/battle/skill.conf index a142722495..d5b9e3b0fd 100644 --- a/conf/battle/skill.conf +++ b/conf/battle/skill.conf @@ -370,6 +370,13 @@ can_damage_skill: 1 // Legacy Athena: 1 land_protector_behavior: 0 +// NPC EMOTION behavior (Note 1) +// On official servers, certain mobs cast NPC EMOTION skill which displays an emoticon and change their mode from +// Aggressive to Passive for a certain time. The Athena behavior does not change their mode to Passive. +// Official: 0 +// Legacy Athena: 1 +npc_emotion_behavior: 0 + // Should Tarot Card of Fate have the same chance for each card to occur? (Note 1) // Official chances: 15%: LOVERS | 10%: FOOL, MAGICIAN, HIGH PRIESTESS, STRENGTH, SUN | 8%: TEMPERANCE // 7%: CHARIOT | 6%: THE HANGED MAN | 5%: DEATH, STAR | 2%: TOWER | 1%: WHEEL OF FORTUNE, DEVIL diff --git a/src/map/battle.cpp b/src/map/battle.cpp index bdf00579fc..14c5df30b0 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -8717,6 +8717,7 @@ static const struct _battle_data { { "mail_show_status", &battle_config.mail_show_status, 0, 0, 2, }, { "client_limit_unit_lv", &battle_config.client_limit_unit_lv, 0, 0, BL_ALL, }, { "land_protector_behavior", &battle_config.land_protector_behavior, 0, 0, 1, }, + { "npc_emotion_behavior", &battle_config.npc_emotion_behavior, 0, 0, 1, }, // BattleGround Settings { "bg_update_interval", &battle_config.bg_update_interval, 1000, 100, INT_MAX, }, { "bg_short_attack_damage_rate", &battle_config.bg_short_damage_rate, 80, 0, INT_MAX, }, diff --git a/src/map/battle.hpp b/src/map/battle.hpp index 48adb7317f..1ebd060839 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -349,6 +349,7 @@ struct Battle_Config int prevent_logout; // Added by RoVeRT int prevent_logout_trigger; int land_protector_behavior; + int npc_emotion_behavior; int alchemist_summon_reward; // [Valaris] int drops_by_luk; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 8e7736bbd2..2c2546f64a 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -8798,7 +8798,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui status_change_end(bl, type, INVALID_TIMER); //If mode gets set by NPC_EMOTION then the target should be reset [Playtester] - if(skill_id == NPC_EMOTION && md->db->skill[md->skill_idx].val[1]) + if(!battle_config.npc_emotion_behavior && skill_id == NPC_EMOTION && md->db->skill[md->skill_idx].val[1]) mob_unlocktarget(md,tick); if(md->db->skill[md->skill_idx].val[1] || md->db->skill[md->skill_idx].val[2]) @@ -8809,7 +8809,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui skill_get_time(skill_id, skill_lv)); //Reset aggressive state depending on resulting mode - md->state.aggressive = status_has_mode(&md->status,MD_ANGRY)?1:0; + if (!battle_config.npc_emotion_behavior) + md->state.aggressive = status_has_mode(&md->status,MD_ANGRY)?1:0; } break; From 4f11020a4e59704f1909ec615857b6af098b3683 Mon Sep 17 00:00:00 2001 From: aleos Date: Thu, 2 Apr 2020 10:11:26 -0400 Subject: [PATCH 013/212] Adds missing SQL upgrade script * Fixes #4757. * Adds SQL script to give players back skill points from removed skills. Thanks to @reunite-ro! --- sql-files/upgrades/upgrade_20200402.sql | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 sql-files/upgrades/upgrade_20200402.sql diff --git a/sql-files/upgrades/upgrade_20200402.sql b/sql-files/upgrades/upgrade_20200402.sql new file mode 100644 index 0000000000..00c104e84c --- /dev/null +++ b/sql-files/upgrades/upgrade_20200402.sql @@ -0,0 +1,16 @@ +-- AB_EUCHARISTICA +UPDATE `char` c, `skill` s SET `c`.skill_point = `c`.skill_point + `s`.lv WHERE `s`.id = 2049 AND `c`.char_id = `s`.char_id; +DELETE FROM `skill` WHERE `id` = 2049; + +-- GN_SLINGITEM +UPDATE `char` c, `skill` s SET `c`.skill_point = `c`.skill_point + `s`.lv WHERE `s`.id = 2493 AND `c`.char_id = `s`.char_id; +DELETE FROM `skill` WHERE `id` = 2493; + +-- GN_MAKEBOMB +UPDATE `char` c, `skill` s SET `c`.skill_point = `c`.skill_point + `s`.lv WHERE `s`.id = 2496 AND `c`.char_id = `s`.char_id; +DELETE FROM `skill` WHERE `id` = 2496; + +-- ONLY RUN THE BELOW QUERIES IF YOU ARE ON RENEWAL +-- CR_CULTIVATION +UPDATE `char` c, `skill` s SET `c`.skill_point = `c`.skill_point + `s`.lv WHERE `s`.id = 491 AND `c`.char_id = `s`.char_id; +DELETE FROM `skill` WHERE `id` = 491; From 3d3c22b358ade8a1f75b068b86be7db62d9c2cc6 Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 3 Apr 2020 15:42:53 +0200 Subject: [PATCH 014/212] Small correction in item DB (#4367) * Corrected Runaway_Magic, Bear's_Power, Muscle_Fool, Hawkeye and Lucky_Day item's data Closes #4273 Thanks to @Questune09, @attackjom --- db/re/item_db.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index d9a607755b..354202f385 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -3061,12 +3061,12 @@ 4871,SP75,SP+75,6,20,,10,,,,,,,,,,,,,{ bonus bMaxSP,75; },{},{} 4872,Attack_Delay_2,DelayafterAttack2Lv,6,10,,,,,,,,,,,,,,,{ bonus bAspdRate,6; },{},{} 4873,Attack_Delay_3,DelayafterAttack3Lv,6,10,,,,,,,,,,,,,,,{ bonus bAspdRate,8; },{},{} -4875,Bear's_Power,Bear's Power,6,20,,10,,,,,,,,,,,,,{ autobonus2 "{ bonus bStr,200; bonus2 bHPLossRate,500,1000; }",20,5000,BF_WEAPON,"{ active_transform 1060,5000; specialeffect2 EF_POTION_BERSERK; showscript \"Bigfoot Power !\"; }"; },{},{} -4876,Runaway_Magic,Runaway Magic,6,20,,10,,,,,,,,,,,,,{ autobonus "{ bonus bInt,200; bonus2 bSPLossRate,200,1000; }",10,10000,BF_MAGIC,"{ specialeffect2 EF_LAMADAN; }"; },{},{ heal 0,-2000; } -4877,Speed_Of_Light,Speed of Light,6,20,,10,,,,,,,,,,,,,{ /*TODO: Confirm the rate*/ autobonus "{ bonus bAspdRate,100; bonus bFlee,100; bonus2 bHPLossRate,400,1000; bonus2 bSPLossRate,50,1000;}",10,5000,BF_WEAPON,"{ specialeffect2 EF_AGIUP2; }"; },{},{ heal 0,-300; } -4878,Muscle_Fool,Muscle Fool,6,20,,10,,,,,,,,,,,,,{ autobonus2 "{ bonus bVit,200; bonus2 bAddRace,RC_All,-50; bonus bMatkRate,-50; }",10,5000,BF_WEAPON,"{ specialeffect2 EF_GUARD3; }"; },{},{ heal 0,-300; } -4879,Hawkeye,Hawkeye,6,20,,10,,,,,,,,,,,,,{ autobonus "{ bonus bDex,200; bonus2 bSPLossRate,50,1000; }",10,5000,BF_WEAPON,"{ specialeffect2 EF_BASH3D6; }"; },{},{ heal 0,-300; } -4880,Lucky_Day,Lucky Day,6,20,,10,,,,,,,,,,,,,{ autobonus "{ bonus bLuk,200; }",10,5000,BF_WEAPON|BF_MAGIC,"{ specialeffect2 EF_DANCE_BLADE_ATK; }"; },{},{ heal 0,-300; } +4875,Bear's_Power,Bear's Power,6,0,,0,,,,,,,,,,,,,{ autobonus2 "{ bonus bStr,200; bonus2 bHPLossRate,500,1000; }",20,5000,BF_WEAPON,"{ active_transform 1060,5000; specialeffect2 EF_POTION_BERSERK; showscript \"Bigfoot Power !\"; }"; },{},{} +4876,Runaway_Magic,Runaway Magic,6,0,,0,,,,,,,,,,,,,{ autobonus "{ bonus bInt,200; bonus2 bSPLossRate,200,1000; }",15,10000,BF_MAGIC,"{ specialeffect2 EF_LAMADAN; }"; },{},{} +4877,Speed_Of_Light,Speed of Light,6,0,,0,,,,,,,,,,,,,{ autobonus "{ bonus bAspdRate,100; bonus bFlee,100; bonus2 bHPLossRate,400,1000; bonus2 bSPLossRate,40,1000;}",10,5000,BF_WEAPON,"{ specialeffect2 EF_FLASHER; }"; },{},{} +4878,Muscle_Fool,Muscle Fool,6,0,,0,,,,,,,,,,,,,{ autobonus2 "{ bonus bDef,1000; bonus2 bAddRace,RC_All,-50; bonus bMatkRate,-50; }",20,5000,BF_WEAPON,"{ specialeffect2 EF_MAGNUMBREAK; }"; },{},{} +4879,Hawkeye,Hawkeye,6,0,,0,,,,,,,,,,,,,{ autobonus "{ bonus bDex,200; bonus2 bSPLossRate,50,1000; }",30,5000,BF_WEAPON,"{ specialeffect2 EF_FLASHER; }"; },{},{} +4880,Lucky_Day,Lucky Day,6,0,,0,,,,,,,,,,,,,{ autobonus "{ bonus bLuk,200; bonus2 bAddMonsterDropItem,7444,10; }",15,5000,BF_WEAPON|BF_MAGIC,"{ specialeffect2 EF_MVP; showscript \"LUCKY MAX !!\"; }"; autobonus2 "{ bonus bLuk,200; bonus2 bAddMonsterDropItem,7444,1; }",1,5000,BF_WEAPON|BF_MAGIC,"{ specialeffect2 EF_MVP; showscript \"LUCKY MAX !!\"; }"; },{},{} 4881,Attack_Delay_4,Attack Delay 4,6,10,,,,,,,,,,,,,,,{ bonus bAspdRate,10; },{},{} 4882,Atk1p,ATK + 1%,6,10,,,,,,,,,,,,,,,{ bonus2 bAddClass,Class_All,1; },{},{} 4883,Matk1p,MATK + 1%,6,10,,,,,,,,,,,,,,,{ bonus bMatkRate,1; },{},{} From e6a07242ebbf24bb56760c1161e4b02f44260f63 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Fri, 3 Apr 2020 15:43:03 +0200 Subject: [PATCH 015/212] SQL synchronization --- sql-files/item_db_re.sql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 2d2a5eb6bc..d108ea3922 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -3093,12 +3093,12 @@ REPLACE INTO `item_db_re` VALUES (4870,'SP25','SP+25',6,20,NULL,10,NULL,NULL,NUL REPLACE INTO `item_db_re` VALUES (4871,'SP75','SP+75',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus bMaxSP,75;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4872,'Attack_Delay_2','DelayafterAttack2Lv',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus bAspdRate,6;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4873,'Attack_Delay_3','DelayafterAttack3Lv',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus bAspdRate,8;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4875,'Bear\'s_Power','Bear\'s Power',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus2 "{ bonus bStr,200; bonus2 bHPLossRate,500,1000; }",20,5000,BF_WEAPON,"{ active_transform 1060,5000; specialeffect2 EF_POTION_BERSERK; showscript \\\"Bigfoot Power !\\\"; }";',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4876,'Runaway_Magic','Runaway Magic',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus "{ bonus bInt,200; bonus2 bSPLossRate,200,1000; }",10,10000,BF_MAGIC,"{ specialeffect2 EF_LAMADAN; }";',NULL,'heal 0,-2000;'); -REPLACE INTO `item_db_re` VALUES (4877,'Speed_Of_Light','Speed of Light',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'/*TODO: Confirm the rate*/ autobonus "{ bonus bAspdRate,100; bonus bFlee,100; bonus2 bHPLossRate,400,1000; bonus2 bSPLossRate,50,1000;}",10,5000,BF_WEAPON,"{ specialeffect2 EF_AGIUP2; }";',NULL,'heal 0,-300;'); -REPLACE INTO `item_db_re` VALUES (4878,'Muscle_Fool','Muscle Fool',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus2 "{ bonus bVit,200; bonus2 bAddRace,RC_All,-50; bonus bMatkRate,-50; }",10,5000,BF_WEAPON,"{ specialeffect2 EF_GUARD3; }";',NULL,'heal 0,-300;'); -REPLACE INTO `item_db_re` VALUES (4879,'Hawkeye','Hawkeye',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus "{ bonus bDex,200; bonus2 bSPLossRate,50,1000; }",10,5000,BF_WEAPON,"{ specialeffect2 EF_BASH3D6; }";',NULL,'heal 0,-300;'); -REPLACE INTO `item_db_re` VALUES (4880,'Lucky_Day','Lucky Day',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus "{ bonus bLuk,200; }",10,5000,BF_WEAPON|BF_MAGIC,"{ specialeffect2 EF_DANCE_BLADE_ATK; }";',NULL,'heal 0,-300;'); +REPLACE INTO `item_db_re` VALUES (4875,'Bear\'s_Power','Bear\'s Power',6,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus2 "{ bonus bStr,200; bonus2 bHPLossRate,500,1000; }",20,5000,BF_WEAPON,"{ active_transform 1060,5000; specialeffect2 EF_POTION_BERSERK; showscript \\\"Bigfoot Power !\\\"; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4876,'Runaway_Magic','Runaway Magic',6,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus "{ bonus bInt,200; bonus2 bSPLossRate,200,1000; }",15,10000,BF_MAGIC,"{ specialeffect2 EF_LAMADAN; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4877,'Speed_Of_Light','Speed of Light',6,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus "{ bonus bAspdRate,100; bonus bFlee,100; bonus2 bHPLossRate,400,1000; bonus2 bSPLossRate,40,1000;}",10,5000,BF_WEAPON,"{ specialeffect2 EF_FLASHER; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4878,'Muscle_Fool','Muscle Fool',6,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus2 "{ bonus bDef,1000; bonus2 bAddRace,RC_All,-50; bonus bMatkRate,-50; }",20,5000,BF_WEAPON,"{ specialeffect2 EF_MAGNUMBREAK; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4879,'Hawkeye','Hawkeye',6,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus "{ bonus bDex,200; bonus2 bSPLossRate,50,1000; }",30,5000,BF_WEAPON,"{ specialeffect2 EF_FLASHER; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4880,'Lucky_Day','Lucky Day',6,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'autobonus "{ bonus bLuk,200; bonus2 bAddMonsterDropItem,7444,10; }",15,5000,BF_WEAPON|BF_MAGIC,"{ specialeffect2 EF_MVP; showscript \\\"LUCKY MAX !!\\\"; }"; autobonus2 "{ bonus bLuk,200; bonus2 bAddMonsterDropItem,7444,1; }",1,5000,BF_WEAPON|BF_MAGIC,"{ specialeffect2 EF_MVP; showscript \\\"LUCKY MAX !!\\\"; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4881,'Attack_Delay_4','Attack Delay 4',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus bAspdRate,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4882,'Atk1p','ATK + 1%',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus2 bAddClass,Class_All,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4883,'Matk1p','MATK + 1%',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus bMatkRate,1;',NULL,NULL); From e7b9e1245b480b46f353fb25ad9c889dbb40b58a Mon Sep 17 00:00:00 2001 From: Amir Azman Date: Fri, 3 Apr 2020 22:04:47 +0800 Subject: [PATCH 016/212] Fix Item Effect For Asgard's Blessing (#4752) Closes #4745 Thanks to @llchrisll --- db/re/item_db.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 354202f385..7f69955866 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -9746,7 +9746,7 @@ 18547,Campus_Festival,Campus Festival,4,20,,100,,0,,0,0xFFFFFFFF,63,2,256,,0,1,721,{},{},{} 18548,Tiny_Hat,Tiny Hat,4,20,,30,,0,,0,0xFFFFFFFF,63,2,256,,0,1,722,{ bonus bInt,1; bonus bAgi,1; },{},{} 18549,Nabi_Hair_Pin,Butterfly Hairpin,4,20,,200,,3,,1,0xFFFFFFFF,63,2,256,,20,1,723,{ bonus bInt,1; bonus bAgi,1; bonus bMdef,3; bonus2 bAddRace,RC_Plant,5; bonus2 bMagicAddRace,RC_Plant,5; bonus2 bSubRace,RC_Plant,5; bonus3 bAddMonsterDropItem,709,RC_Plant,30; },{},{} -18550,Asgard_Blessing,Asgard Blessing,4,20,,300,,3,,1,0xFFFFFFFF,63,2,256,,30,1,724,{ bonus bAllStats,2; bonus2 bSubEle,Ele_All,5; bonus2 bHPRegenRate,(MaxHp/100),10000; },{},{} +18550,Asgard_Blessing,Asgard Blessing,4,20,,300,,3,,1,0xFFFFFFFF,63,2,256,,30,1,724,{ bonus bAllStats,2; bonus2 bSubEle,Ele_All,5; bonus2 bRegenPercentHP,2,10000; bonus2 bRegenPercentSP,1,10000; },{},{} 18551,Galaxy_Circlet,Galaxy Circlet,4,20,,1000,,5,,1,0xFFFFFFFF,63,2,256,,50,1,725,{ .@r = getrefine(); .@a = .@r*10; .@b = .@r/2; bonus bMdef,5; bonus bMaxHP,.@a; bonus bMaxSP,.@a; bonus2 bSubEle,Ele_Earth,.@b; bonus2 bSubEle,Ele_Fire,.@b; bonus2 bSubEle,Ele_Water,.@b; },{},{} 18552,Proba_Angel_Blessing,Proba Angel Blessing,4,20,,1200,,0,,1,0xFFFFFFFF,63,2,256,,10,1,444,{ bonus bLuk,2; },{},{} 18553,Mini_Tree,Mini Tree,4,20,,50,,5,,0,0xFFFFFFFF,63,2,256,,0,1,727,{ bonus2 bResEff,Eff_Stun,20; bonus2 bResEff,Eff_Curse,20; bonus2 bResEff,Eff_Blind,20; bonus2 bResEff,Eff_Confusion,20; bonus2 bAddMonsterDropItem,529,300; bonus2 bAddMonsterDropItem,529,644; },{},{} From 75d51485bf35822230d7c863805da947aa72a6d9 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Fri, 3 Apr 2020 16:04:54 +0200 Subject: [PATCH 017/212] SQL synchronization --- sql-files/item_db_re.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index d108ea3922..16b4401364 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -9778,7 +9778,7 @@ REPLACE INTO `item_db_re` VALUES (18546,'Lover_In_Mouth','Lover In Mouth',4,20,N REPLACE INTO `item_db_re` VALUES (18547,'Campus_Festival','Campus Festival',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',1,721,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18548,'Tiny_Hat','Tiny Hat',4,20,NULL,30,NULL,0,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',1,722,'bonus bInt,1; bonus bAgi,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18549,'Nabi_Hair_Pin','Butterfly Hairpin',4,20,NULL,200,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'20',1,723,'bonus bInt,1; bonus bAgi,1; bonus bMdef,3; bonus2 bAddRace,RC_Plant,5; bonus2 bMagicAddRace,RC_Plant,5; bonus2 bSubRace,RC_Plant,5; bonus3 bAddMonsterDropItem,709,RC_Plant,30;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18550,'Asgard_Blessing','Asgard Blessing',4,20,NULL,300,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'30',1,724,'bonus bAllStats,2; bonus2 bSubEle,Ele_All,5; bonus2 bHPRegenRate,(MaxHp/100),10000;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18550,'Asgard_Blessing','Asgard Blessing',4,20,NULL,300,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'30',1,724,'bonus bAllStats,2; bonus2 bSubEle,Ele_All,5; bonus2 bRegenPercentHP,2,10000; bonus2 bRegenPercentSP,1,10000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18551,'Galaxy_Circlet','Galaxy Circlet',4,20,NULL,1000,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,NULL,'50',1,725,'.@r = getrefine(); .@a = .@r*10; .@b = .@r/2; bonus bMdef,5; bonus bMaxHP,.@a; bonus bMaxSP,.@a; bonus2 bSubEle,Ele_Earth,.@b; bonus2 bSubEle,Ele_Fire,.@b; bonus2 bSubEle,Ele_Water,.@b;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18552,'Proba_Angel_Blessing','Proba Angel Blessing',4,20,NULL,1200,NULL,0,NULL,1,0xFFFFFFFF,63,2,256,NULL,'10',1,444,'bonus bLuk,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18553,'Mini_Tree','Mini Tree',4,20,NULL,50,NULL,5,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',1,727,'bonus2 bResEff,Eff_Stun,20; bonus2 bResEff,Eff_Curse,20; bonus2 bResEff,Eff_Blind,20; bonus2 bResEff,Eff_Confusion,20; bonus2 bAddMonsterDropItem,529,300; bonus2 bAddMonsterDropItem,529,644;',NULL,NULL); From a67f5c5d6a732db511d0484e55189fc742fcde14 Mon Sep 17 00:00:00 2001 From: Aleos Date: Sun, 5 Apr 2020 15:22:36 -0400 Subject: [PATCH 018/212] Fixes heal item recovery effects (#4750) * Fixes #4748. * Recovery item effects should be multiplicatively stacked. Thanks to @Singe-Horizontal! --- src/map/pc.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 7c36b206bf..a79072b2f9 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -8946,28 +8946,27 @@ int pc_itemheal(struct map_session_data *sd, int itemid, int hp, int sp) bonus = 100 + (sd->battle_status.vit << 1) + pc_checkskill(sd, SM_RECOVERY) * 10 + pc_checkskill(sd, AM_LEARNINGPOTION) * 5; // A potion produced by an Alchemist in the Fame Top 10 gets +50% effect [DracoRPG] if (potion_flag == 2) { - bonus += 50; + bonus += bonus * 50 / 100; if (sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_ROGUE) - bonus += 100; // Receive an additional +100% effect from ranked potions to HP only + bonus += bonus; // Receive an additional +100% effect from ranked potions to HP only } //All item bonuses. bonus += sd->bonus.itemhealrate2; //Item Group bonuses - bonus += pc_get_itemgroup_bonus(sd, itemid); + bonus += bonus * pc_get_itemgroup_bonus(sd, itemid) / 100; //Individual item bonuses. for(const auto &it : sd->itemhealrate) { if (it.id == itemid) { - bonus += it.val; + bonus += bonus * it.val / 100; break; } } - // Recovery Potion if (sd->sc.data[SC_INCHEALRATE]) - bonus += sd->sc.data[SC_INCHEALRATE]->val1; + bonus += bonus * sd->sc.data[SC_INCHEALRATE]->val1 / 100; // 2014 Halloween Event : Pumpkin Bonus if (sd->sc.data[SC_MTF_PUMPKIN] && itemid == ITEMID_PUMPKIN) - bonus += sd->sc.data[SC_MTF_PUMPKIN]->val1; + bonus += bonus * sd->sc.data[SC_MTF_PUMPKIN]->val1 / 100; tmp = hp * bonus / 100; // Overflow check if (bonus != 100 && tmp > hp) @@ -8977,7 +8976,7 @@ int pc_itemheal(struct map_session_data *sd, int itemid, int hp, int sp) bonus = 100 + (sd->battle_status.int_ << 1) + pc_checkskill(sd, MG_SRECOVERY) * 10 + pc_checkskill(sd, AM_LEARNINGPOTION) * 5; // A potion produced by an Alchemist in the Fame Top 10 gets +50% effect [DracoRPG] if (potion_flag == 2) - bonus += 50; + bonus += bonus * 50 / 100; tmp = sp * bonus / 100; // Overflow check if (bonus != 100 && tmp > sp) From 8368ce20ccf5aa8964c9c6fa897f9eec9bf4a6f1 Mon Sep 17 00:00:00 2001 From: Kanin Temsrisuk Date: Mon, 6 Apr 2020 19:05:33 +0700 Subject: [PATCH 019/212] Minor doc and db updated. (#4747) * Corrects Ramorushirudo undead bonus. * Corrects Experimental Goat Cap earth bonus. * Adds missing semicolon to a couple item bonuses. * Adds missing RC2, ATF, and SC from documentation. * Removes duplicate documentation for bIgnoreDefRaceRate. Thanks to @kaninhot004! --- db/re/item_combo_db.txt | 12 ++++++------ db/re/item_db.txt | 4 ++-- doc/item_bonus.txt | 6 ++++-- doc/status_change.txt | 6 ++++++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/db/re/item_combo_db.txt b/db/re/item_combo_db.txt index 8af85dfffb..10ecf3fa29 100644 --- a/db/re/item_combo_db.txt +++ b/db/re/item_combo_db.txt @@ -833,9 +833,9 @@ 19201:29343,{ bonus bBaseAtk,20; } 19201:29344,{ bonus bBaseAtk,30; autobonus3 "{ bonus2 bIgnoreDefClassRate,Class_Normal,25; }",1000,60000,"WA_MOONLIT_SERENADE"; } 19201:29345,{ bonus bBaseAtk,40; autobonus3 "{ bonus2 bIgnoreDefClassRate,Class_Normal,50; }",1000,60000,"WA_MOONLIT_SERENADE"; } -19202:29346,{ autobonus3 "{ bonus2 bSkillAtk,\"RL_BANISHING_BUSTER\",20 }",1000,60000,"RL_S_STORM"; } -19202:29347,{ autobonus3 "{ bonus2 bSkillAtk,\"RL_BANISHING_BUSTER\",40 }",1000,60000,"RL_S_STORM"; bonus2 bSkillCooldown,"RL_BANISHING_BUSTER",-1000; } -19202:29348,{ autobonus3 "{ bonus2 bSkillAtk,\"RL_BANISHING_BUSTER\",60 }",1000,60000,"RL_S_STORM"; bonus2 bSkillCooldown,"RL_BANISHING_BUSTER",-1500; } +19202:29346,{ autobonus3 "{ bonus2 bSkillAtk,\"RL_BANISHING_BUSTER\",20; }",1000,60000,"RL_S_STORM"; } +19202:29347,{ autobonus3 "{ bonus2 bSkillAtk,\"RL_BANISHING_BUSTER\",40; }",1000,60000,"RL_S_STORM"; bonus2 bSkillCooldown,"RL_BANISHING_BUSTER",-1000; } +19202:29348,{ autobonus3 "{ bonus2 bSkillAtk,\"RL_BANISHING_BUSTER\",60; }",1000,60000,"RL_S_STORM"; bonus2 bSkillCooldown,"RL_BANISHING_BUSTER",-1500; } 19203:29349,{ bonus bBaseAtk,10; bonus bMatk,10; if (getskilllv("OB_OBOROGENSOU") == 5) bonus bVariableCastrate,-3; autobonus3 "{ bonus bCritAtkRate,5; }",1000,60000,"KG_KAGEMUSYA"; } 19203:29350,{ bonus bBaseAtk,15; bonus bMatk,15; if (getskilllv("OB_OBOROGENSOU") == 5) bonus bVariableCastrate,-7; autobonus3 "{ bonus bCritAtkRate,10; }",1000,60000,"KG_KAGEMUSYA"; autobonus "{ bonus bNoSizeFix; }",30,3000,BF_WEAPON; } 19203:29351,{ bonus bBaseAtk,20; bonus bMatk,20; if (getskilllv("OB_OBOROGENSOU") == 5) bonus bVariableCastrate,-15; autobonus3 "{ bonus bCritAtkRate,30; }",1000,60000,"KG_KAGEMUSYA"; autobonus "{ bonus bNoSizeFix; }",50,5000,BF_WEAPON; } @@ -1152,7 +1152,7 @@ 24254:24249:24265:24278:24297:24310,{ bonus bAllStats,10; bonus bMaxHPrate,5; bonus bMaxSPrate,5; bonus2 bIgnoreDefClassRate,Class_Normal,50; bonus2 bIgnoreMDefClassRate,Class_Normal,50; } 24255:28392,{ .@val = 1; if ((getequiprefinerycnt(EQI_SHADOW_ACC_L)+getequiprefinerycnt(EQI_SHADOW_ACC_R)) >= 10) { .@val += 2; } bonus2 bAddClass,Class_All,.@val; bonus bMaxHPrate,.@val; } 24321:24337:24338,{ bonus bAllStats,1; .@r = getequiprefinerycnt(EQI_SHADOW_SHOES) + getequiprefinerycnt(EQI_SHADOW_ACC_L) + getequiprefinerycnt(EQI_SHADOW_ARMOR); if (.@r >= 25) { bonus bNoWalkDelay; bonus bMaxHPrate,.@r-35; } } -24326:24327,{ .@r1 = getequiprefinerycnt(EQI_SHADOW_ARMOR) .@r2 = getequiprefinerycnt(EQI_SHADOW_SHIELD); if ((.@r1+.@r2) >= 17) { bonus bLuk,1; bonus bVit,1; bonus bHit,.@r1; bonus bDef,5*.@r2; if (BaseClass == Job_Swordman || BaseClass == Job_Thief || (BaseClass == Job_Taekwon && BaseJob != Job_Soul_Linker)) { bonus bBaseAtk,15; bonus bAspd,1; } else if (BaseClass == Job_Merchant || BaseClass == Job_Archer || BaseClass == Job_Gunslinger) { bonus bFlee,15; bonus bLongAtkRate,3; } else if (BaseClass == Job_Mage || BaseClass == Job_Acolyte || BaseClass == Job_Ninja || BaseJob == Job_Soul_Linker) { bonus bMatk,15; bonus bMaxSPrate,2; bonus bHealPower,3; } else if (BaseClass == Job_Novice || BaseJob == Job_Summoner) { bonus bAspdRate,5; bonus bMaxHP,1000; bonus bVariableCastrate,-5; bonus bMaxSP,300; } } } +24326:24327,{ .@r1 = getequiprefinerycnt(EQI_SHADOW_ARMOR); .@r2 = getequiprefinerycnt(EQI_SHADOW_SHIELD); if ((.@r1+.@r2) >= 17) { bonus bLuk,1; bonus bVit,1; bonus bHit,.@r1; bonus bDef,5*.@r2; if (BaseClass == Job_Swordman || BaseClass == Job_Thief || (BaseClass == Job_Taekwon && BaseJob != Job_Soul_Linker)) { bonus bBaseAtk,15; bonus bAspd,1; } else if (BaseClass == Job_Merchant || BaseClass == Job_Archer || BaseClass == Job_Gunslinger) { bonus bFlee,15; bonus bLongAtkRate,3; } else if (BaseClass == Job_Mage || BaseClass == Job_Acolyte || BaseClass == Job_Ninja || BaseJob == Job_Soul_Linker) { bonus bMatk,15; bonus bMaxSPrate,2; bonus bHealPower,3; } else if (BaseClass == Job_Novice || BaseJob == Job_Summoner) { bonus bAspdRate,5; bonus bMaxHP,1000; bonus bVariableCastrate,-5; bonus bMaxSP,300; } } } 24332:24333,{ .@r = getequiprefinerycnt(EQI_SHADOW_SHOES) + getequiprefinerycnt(EQI_SHADOW_SHIELD); bonus bBaseAtk,.@r; if (.@r >= 15) { bonus bCritAtkRate,1; } } 24322:24335:24336,{ bonus bAllStats,1; .@r = getequiprefinerycnt(EQI_SHADOW_ACC_R) + getequiprefinerycnt(EQI_SHADOW_WEAPON) + getequiprefinerycnt(EQI_SHADOW_SHIELD); if (.@r >= 25) { bonus bNoGemStone; bonus bUseSPrate,70-.@r; } } 24341:24342,{ bonus2 bExpAddClass,Class_All,3; } @@ -1233,8 +1233,8 @@ 28502:2202,{ .@a = (readparam(bStr)+readparam(bLuk))/80; .@b = (readparam(bAgi)+readparam(bVit))/80; .@c = (readparam(bInt)+readparam(bDex))/80; bonus bMaxHPrate,5*.@b; bonus2 bAddClass,Class_All,6*.@a; bonus bMatk,120*.@c; bonus bCritical,5*.@a; bonus bAspdRate,5*.@b; bonus bVariableCastrate,-3*.@c; bonus bCritAtkRate,10*.@a; bonus2 bSubRace,RC_DemiHuman,((2*.@b)+2); bonus2 bSubRace,RC_Player,((2*.@b)+2); bonus bHealPower,10*.@c; } 28502:2203,{ .@a = (readparam(bStr)+readparam(bLuk))/80; .@b = (readparam(bAgi)+readparam(bVit))/80; .@c = (readparam(bInt)+readparam(bDex))/80; bonus bMaxHPrate,5*.@b; bonus2 bAddClass,Class_All,6*.@a; bonus bMatk,120*.@c; bonus bCritical,5*.@a; bonus bAspdRate,5*.@b; bonus bVariableCastrate,-3*.@c; bonus bCritAtkRate,10*.@a; bonus2 bSubRace,RC_DemiHuman,((2*.@b)+2); bonus2 bSubRace,RC_Player,((2*.@b)+2); bonus bHealPower,10*.@c; } 28502:2204,{ .@a = (readparam(bStr)+readparam(bLuk))/80; .@b = (readparam(bAgi)+readparam(bVit))/80; .@c = (readparam(bInt)+readparam(bDex))/80; bonus bMaxHPrate,5*.@b; bonus2 bAddClass,Class_All,6*.@a; bonus bMatk,120*.@c; bonus bCritical,5*.@a; bonus bAspdRate,5*.@b; bonus bVariableCastrate,-3*.@c; bonus bCritAtkRate,10*.@a; bonus2 bSubRace,RC_DemiHuman,((2*.@b)+2); bonus2 bSubRace,RC_Player,((2*.@b)+2); bonus bHealPower,10*.@c; } -28506:1414,{ .@r = getequiprefinerycnt(EQI_HAND_R); if (.@r>=7) { .@val = 30; if (.@r>=9) { @val += 20; bonus2 bAddClass,Class_Boss,.@val; bonus2 bAddEle,Ele_Water,.@val; bonus2 bAddEle,Ele_Wind,.@val; bonus2 bAddRace,RC_Fish,.@val; bonus2 bAddRace,RC_Insect,.@val; bonus2 bSkillAtk,"RK_WINDCUTTER",.@val; if (.@r>=10) { bonus2 bVariableCastrate,"RK_WINDCUTTER",-50; } } } } -28506:1449,{ .@r = getequiprefinerycnt(EQI_HAND_R); if (.@r>=7) { .@val = 30; if (.@r>=9) { @val += 20; bonus2 bAddClass,Class_Boss,.@val; bonus2 bAddEle,Ele_Water,.@val; bonus2 bAddEle,Ele_Wind,.@val; bonus2 bAddRace,RC_Fish,.@val; bonus2 bAddRace,RC_Insect,.@val; bonus2 bSkillAtk,"RK_WINDCUTTER",.@val; if (.@r>=10) { bonus2 bVariableCastrate,"RK_WINDCUTTER",-50; } } } } +28506:1414,{ .@r = getequiprefinerycnt(EQI_HAND_R); if (.@r>=7) { .@val = 30; if (.@r>=9) { .@val += 20; bonus2 bAddClass,Class_Boss,.@val; bonus2 bAddEle,Ele_Water,.@val; bonus2 bAddEle,Ele_Wind,.@val; bonus2 bAddRace,RC_Fish,.@val; bonus2 bAddRace,RC_Insect,.@val; bonus2 bSkillAtk,"RK_WINDCUTTER",.@val; if (.@r>=10) { bonus2 bVariableCastrate,"RK_WINDCUTTER",-50; } } } } +28506:1449,{ .@r = getequiprefinerycnt(EQI_HAND_R); if (.@r>=7) { .@val = 30; if (.@r>=9) { .@val += 20; bonus2 bAddClass,Class_Boss,.@val; bonus2 bAddEle,Ele_Water,.@val; bonus2 bAddEle,Ele_Wind,.@val; bonus2 bAddRace,RC_Fish,.@val; bonus2 bAddRace,RC_Insect,.@val; bonus2 bSkillAtk,"RK_WINDCUTTER",.@val; if (.@r>=10) { bonus2 bVariableCastrate,"RK_WINDCUTTER",-50; } } } } 28506:15037,{ .@r = getequiprefinerycnt(EQI_ARMOR); bonus2 bResEff,Eff_Freeze,10000; bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3; if (.@r>=7) { bonus bMaxHPrate,15; bonus2 bSubRace,RC_DemiHuman,2; bonus2 bSubRace,RC_Player,2; } if (.@r>=9) { bonus bMaxHPrate,15; bonus2 bSubRace,RC_DemiHuman,2; bonus2 bSubRace,RC_Player,2; } } 28506:15037:2476:2575:2884,{ autobonus3 "{bonus bDelayrate,-70;}",1000,10000,"LK_AURABLADE","{specialeffect2 EF_ENHANCE;}"; } 28506:2476,{ .@r = getequiprefinerycnt(EQI_SHOES); bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3; if (.@r>=7) { bonus bAspdRate,10; bonus2 bSubRace,RC_DemiHuman,1; bonus2 bSubRace,RC_Player,1; } if (.@r>=9) { bonus bAspdRate,10; bonus2 bSubRace,RC_DemiHuman,1; bonus2 bSubRace,RC_Player,1; } } diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 7f69955866..38a3cdc879 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -1377,7 +1377,7 @@ 2155,Academy_Shield,Academy Shield,4,0,,1500,,3,,1,0xFFFFFFFE,63,2,32,,0,1,4,{},{},{} 2156,Bible_Of_Promise1,Bible of Promise(1st Vol.),4,20,,500,,10,,1,0x00000100,63,2,32,,110,1,5,{ bonus bMdef,2; skill "ALL_ODINS_POWER",1; },{},{} 2157,Insecticide,Pesticide,4,20,,100,,0,,0,0xFFFFFFFF,63,2,32,,0,1,3,{},{},{} -2158,Ramor_Shield_Undead,Ramorushirudo,4,20,,1300,,50,,1,0xFFFFFFFF,63,2,32,,65,1,3,{ bonus2 bSubRace,Ele_Undead,5; bonus2 bSubRace,RC_DemiHuman,-5; },{},{} +2158,Ramor_Shield_Undead,Ramorushirudo,4,20,,1300,,50,,1,0xFFFFFFFF,63,2,32,,65,1,3,{ bonus2 bSubEle,Ele_Undead,5; bonus2 bSubRace,RC_DemiHuman,-5; },{},{} 2159,Sharel_Shield,Sharerushirudo,4,20,,1300,,50,,1,0xFFFFFFFF,63,2,32,,65,1,3,{},{},{} 2160,Giant_Shield,Giant Shield,4,56000,,2800,,130,,1,0x00004082,63,2,32,,100,1,3,{ bonus2 bSubSize,Size_Large,5; if(getrefine()>=9){ bonus2 bSubSize,Size_Large,5; } },{},{} 2161,Geffenia_Book_Water,Geffenia Tomb of Water,4,56000,,1000,,30,,1,0x00000200,63,2,32,,100,1,5,{ bonus bMdef,2; bonus bInt,1; if(readparam(bInt)>=120){ bonus bMatk,10; bonus bMaxHP,800; } },{},{} @@ -10216,7 +10216,7 @@ 19379,Striking_Hat,Striking Hat,4,20,,400,,5,,1,0xFFFFFFFF,63,2,256,,100,1,1759,{ .@r = getrefine(); bonus bDex,5; bonus bAgi,5; bonus bLongAtkRate,5; bonus bAspdRate,10; bonus bPerfectHitAddRate,10; bonus bHit,2*.@r; bonus bDelayrate,-2*.@r; if (.@r>=7) { bonus bPerfectHitAddRate,20; bonus bLongAtkRate,10; } if (.@r>=9) { bonus bPerfectHitAddRate,20; bonus bLongAtkRate,10; } },{},{} 19380,Floating_Ball,Floating Ball,4,10,,200,,,,0,0xFFFFFFFF,63,2,512,,100,,1760,{ bonus bMatk,35; bonus2 bMagicAddClass,Class_Boss,2; if (readparam(bDex)>=90) { bonus bMatk,70; bonus2 bMagicAddClass,Class_Boss,3; } if (readparam(bDex)>=125) { bonus bMatk,140; bonus2 bMagicAddClass,Class_Boss,5; } },{},{} 19381,Protect_Cloth,Protect Cloth,4,20,,300,,0,,0,0xFFFFFFFF,63,2,1,,90,0,1761,{ bonus bMdef,5; bonus bMaxHPrate,5; },{},{} -19387,Experimental_Goat_Cap,Experimental Goat Cap,4,20,,500,,2,,1,0xFFFFFFFF,63,2,256,,40,1,1768,{ .@r = getrefine(); .@sub = 10; .@dmg = 15; if (.@r >= 7) { .@dmg += 15; if (.@r >= 8) { .@sub += 15; if (.@r >= 9) { .@dmg += 20; } } } bonus2 bSubEle,Ele_Earth,.@val; /*bonus2 bAddRace2,RC2_WERNER_LAB,.@dmg; bonus2 bMagicAddRace2,RC2_WERNER_LAB,.@dmg; bonus2 bSubRace2,RC2_WERNER_LAB,.@dmg; Werner's Central lab is not implemented yet */ },{},{} +19387,Experimental_Goat_Cap,Experimental Goat Cap,4,20,,500,,2,,1,0xFFFFFFFF,63,2,256,,40,1,1768,{ .@r = getrefine(); .@sub = 10; .@dmg = 15; if (.@r >= 7) { .@dmg += 15; if (.@r >= 8) { .@sub += 15; if (.@r >= 9) { .@dmg += 20; } } } bonus2 bSubEle,Ele_Earth,.@sub; /*bonus2 bAddRace2,RC2_WERNER_LAB,.@dmg; bonus2 bMagicAddRace2,RC2_WERNER_LAB,.@dmg; bonus2 bSubRace2,RC2_WERNER_LAB,.@dmg; Werner's Central lab is not implemented yet */ },{},{} 19391,Eyes_Of_Illusion,Eyes Of Illusion,4,20,,500,,2,,0,0xFFFFFFFF,63,2,512,,100,0,1779,{ bonus bMaxHPrate,10; bonus bMaxSPrate,10; bonus2 bSubRace,RC_Player,5; bonus2 bResEff,Eff_Blind,10000; if (getskilllv("GN_ILLUSIONDOPING")==5) skill "SA_DISPELL",5; if (getskilllv("GN_MANDRAGORA")==5) bonus2 bFixedCastrate,"GN_MANDRAGORA",-70; },{},{} 19396,Racing_Cap_SG,Racing Cap (Star Gladiator),4,20,,0,,10,,1,0x00400000,63,2,256,,100,1,1134,{ .@r = getrefine(); bonus bBaseAtk,10*(.@r/2); bonus bAspdRate,2*(.@r/3); if (.@r>=8) bonus bBaseatk,5*getskilllv("TK_HPTIME"); if (.@r>=11) autobonus3 "{ bonus2 bSkillAtk,\"SJ_SOLARBURST\",30; }",1000,10000,"SJ_PROMINENCEKICK"; },{},{} 19397,Racing_Cap_SL,Racing Cap (Soul Linker),4,20,,0,,10,,1,0x00800000,63,2,256,,100,1,1134,{ .@r = getrefine(); bonus bMatk,10*(.@r/2); bonus bAspdRate,2*(.@r/3); if (.@r>=8) bonus bMaxSP,100*getskilllv("TK_SPTIME"); if (.@r>=11) autobonus3 "{ bonus2 bSkillAtk,\"SP_SPA\",30; bonus2 bSkillAtk,\"SP_SWHOO\",30; }",1000,10000,"SL_SMA"; },{},{} diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt index 5d3a528fb7..36f10e9e64 100644 --- a/doc/item_bonus.txt +++ b/doc/item_bonus.txt @@ -25,7 +25,8 @@ This list contains all available constants referenced in the 'bonus' commands. RC_Insect, RC_Plant, RC_Player, RC_Undead, RC_All * Monster Race (mr) - RC2_Goblin, RC2_Kobold, RC2_Orc, RC2_Golem, RC2_Guardian, RC2_Ninja + RC2_Goblin, RC2_Kobold, RC2_Orc, RC2_Golem, RC2_Guardian, RC2_Ninja, + RC2_BioLab, RC2_SCARABA, RC2_FACEWORM, RC2_THANATOS, RC2_CLOCKTOWER, RC2_ROCKRIDGE See 'db/(pre-)re/mob_race2_db.txt' * Class (c) @@ -58,6 +59,7 @@ This list contains all available constants referenced in the 'bonus' commands. ATF_LONG = Trigger on ranged attacks Skill/attack type criteria: (Default: Physical/weapon) + ATF_SKILL = Trigger on magic/misc skills ATF_WEAPON = Trigger on weapon skill / physical attacks ATF_MAGIC = Trigger on magic skills ATF_MISC = Trigger on misc skills @@ -274,7 +276,6 @@ Ignore Def ---------- bonus bIgnoreDefEle,e; Disregard DEF against enemies of element e bonus bIgnoreDefRace,r; Disregard DEF against enemies of race r -bonus2 bIgnoreDefRaceRate,r,n; Disregard n% of the target's DEF if the target belongs to race r bonus bIgnoreDefClass,c; Disregard DEF against enemies of class c bonus bIgnoreMDefRace,r; Disregard MDEF against enemies of race r bonus2 bIgnoreDefRaceRate,r,n; Disregard n% of the target's DEF if the target belongs to race r @@ -310,6 +311,7 @@ bonus4 bAddEffWhenHit,eff,n,atf,t; Adds a n/100% chance to cause status eff for ATF_SHORT = trigger on melee attacks ATF_LONG = trigger on ranged attacks Skill/attack type criteria: (Default: Physical/weapon) + ATF_SKILL = trigger on magic/misc skills ATF_WEAPON = trigger on weapon skill / physical attacks ATF_MAGIC = trigger on magic skills ATF_MISC = trigger on misc skills diff --git a/doc/status_change.txt b/doc/status_change.txt index 19ebe1d777..610108bfce 100644 --- a/doc/status_change.txt +++ b/doc/status_change.txt @@ -2710,3 +2710,9 @@ SC_LHZ_DUN_N4 (EFST_LHZ_DUN_N4) desc: Increases and reduces damage against MVPs of Biolab 5. val1: +% Damage val2: +% Defense + +SC_DORAM_BUF_01 () + desc: Recovers 10 HP every 10 seconds. + +SC_DORAM_BUF_02 () + desc: Recovers 5 SP every 10 seconds. From c94bae73593d81cf085600d17064a906192d63d5 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Mon, 6 Apr 2020 14:05:42 +0200 Subject: [PATCH 020/212] SQL synchronization --- sql-files/item_db_re.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 16b4401364..6ae79e0581 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -1409,7 +1409,7 @@ REPLACE INTO `item_db_re` VALUES (2154,'Toy_Shield','Toy Shield',4,0,NULL,500,NU REPLACE INTO `item_db_re` VALUES (2155,'Academy_Shield','Academy Shield',4,0,NULL,1500,NULL,3,NULL,1,0xFFFFFFFE,63,2,32,NULL,'0',1,4,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (2156,'Bible_Of_Promise1','Bible of Promise(1st Vol.)',4,20,NULL,500,NULL,10,NULL,1,0x00000100,63,2,32,NULL,'110',1,5,'bonus bMdef,2; skill "ALL_ODINS_POWER",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2157,'Insecticide','Pesticide',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,32,NULL,'0',1,3,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2158,'Ramor_Shield_Undead','Ramorushirudo',4,20,NULL,1300,NULL,50,NULL,1,0xFFFFFFFF,63,2,32,NULL,'65',1,3,'bonus2 bSubRace,Ele_Undead,5; bonus2 bSubRace,RC_DemiHuman,-5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2158,'Ramor_Shield_Undead','Ramorushirudo',4,20,NULL,1300,NULL,50,NULL,1,0xFFFFFFFF,63,2,32,NULL,'65',1,3,'bonus2 bSubEle,Ele_Undead,5; bonus2 bSubRace,RC_DemiHuman,-5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2159,'Sharel_Shield','Sharerushirudo',4,20,NULL,1300,NULL,50,NULL,1,0xFFFFFFFF,63,2,32,NULL,'65',1,3,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (2160,'Giant_Shield','Giant Shield',4,56000,NULL,2800,NULL,130,NULL,1,0x00004082,63,2,32,NULL,'100',1,3,'bonus2 bSubSize,Size_Large,5; if(getrefine()>=9){ bonus2 bSubSize,Size_Large,5; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2161,'Geffenia_Book_Water','Geffenia Tomb of Water',4,56000,NULL,1000,NULL,30,NULL,1,0x00000200,63,2,32,NULL,'100',1,5,'bonus bMdef,2; bonus bInt,1; if(readparam(bInt)>=120){ bonus bMatk,10; bonus bMaxHP,800; }',NULL,NULL); @@ -10248,7 +10248,7 @@ REPLACE INTO `item_db_re` VALUES (19366,'Illusion_Goibne_Helm','Illusion Goibne REPLACE INTO `item_db_re` VALUES (19379,'Striking_Hat','Striking Hat',4,20,NULL,400,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,NULL,'100',1,1759,'.@r = getrefine(); bonus bDex,5; bonus bAgi,5; bonus bLongAtkRate,5; bonus bAspdRate,10; bonus bPerfectHitAddRate,10; bonus bHit,2*.@r; bonus bDelayrate,-2*.@r; if (.@r>=7) { bonus bPerfectHitAddRate,20; bonus bLongAtkRate,10; } if (.@r>=9) { bonus bPerfectHitAddRate,20; bonus bLongAtkRate,10; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19380,'Floating_Ball','Floating Ball',4,10,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,NULL,'100',NULL,1760,'bonus bMatk,35; bonus2 bMagicAddClass,Class_Boss,2; if (readparam(bDex)>=90) { bonus bMatk,70; bonus2 bMagicAddClass,Class_Boss,3; } if (readparam(bDex)>=125) { bonus bMatk,140; bonus2 bMagicAddClass,Class_Boss,5; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19381,'Protect_Cloth','Protect Cloth',4,20,NULL,300,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'90',0,1761,'bonus bMdef,5; bonus bMaxHPrate,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19387,'Experimental_Goat_Cap','Experimental Goat Cap',4,20,NULL,500,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'40',1,1768,'.@r = getrefine(); .@sub = 10; .@dmg = 15; if (.@r >= 7) { .@dmg += 15; if (.@r >= 8) { .@sub += 15; if (.@r >= 9) { .@dmg += 20; } } } bonus2 bSubEle,Ele_Earth,.@val; /*bonus2 bAddRace2,RC2_WERNER_LAB,.@dmg; bonus2 bMagicAddRace2,RC2_WERNER_LAB,.@dmg; bonus2 bSubRace2,RC2_WERNER_LAB,.@dmg; Werner\'s Central lab is not implemented yet */',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19387,'Experimental_Goat_Cap','Experimental Goat Cap',4,20,NULL,500,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'40',1,1768,'.@r = getrefine(); .@sub = 10; .@dmg = 15; if (.@r >= 7) { .@dmg += 15; if (.@r >= 8) { .@sub += 15; if (.@r >= 9) { .@dmg += 20; } } } bonus2 bSubEle,Ele_Earth,.@sub; /*bonus2 bAddRace2,RC2_WERNER_LAB,.@dmg; bonus2 bMagicAddRace2,RC2_WERNER_LAB,.@dmg; bonus2 bSubRace2,RC2_WERNER_LAB,.@dmg; Werner\'s Central lab is not implemented yet */',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19391,'Eyes_Of_Illusion','Eyes Of Illusion',4,20,NULL,500,NULL,2,NULL,0,0xFFFFFFFF,63,2,512,NULL,'100',0,1779,'bonus bMaxHPrate,10; bonus bMaxSPrate,10; bonus2 bSubRace,RC_Player,5; bonus2 bResEff,Eff_Blind,10000; if (getskilllv("GN_ILLUSIONDOPING")==5) skill "SA_DISPELL",5; if (getskilllv("GN_MANDRAGORA")==5) bonus2 bFixedCastrate,"GN_MANDRAGORA",-70;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19396,'Racing_Cap_SG','Racing Cap (Star Gladiator)',4,20,NULL,0,NULL,10,NULL,1,0x00400000,63,2,256,NULL,'100',1,1134,'.@r = getrefine(); bonus bBaseAtk,10*(.@r/2); bonus bAspdRate,2*(.@r/3); if (.@r>=8) bonus bBaseatk,5*getskilllv("TK_HPTIME"); if (.@r>=11) autobonus3 "{ bonus2 bSkillAtk,\\\"SJ_SOLARBURST\\\",30; }",1000,10000,"SJ_PROMINENCEKICK";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19397,'Racing_Cap_SL','Racing Cap (Soul Linker)',4,20,NULL,0,NULL,10,NULL,1,0x00800000,63,2,256,NULL,'100',1,1134,'.@r = getrefine(); bonus bMatk,10*(.@r/2); bonus bAspdRate,2*(.@r/3); if (.@r>=8) bonus bMaxSP,100*getskilllv("TK_SPTIME"); if (.@r>=11) autobonus3 "{ bonus2 bSkillAtk,\\\"SP_SPA\\\",30; bonus2 bSkillAtk,\\\"SP_SWHOO\\\",30; }",1000,10000,"SL_SMA";',NULL,NULL); From af8dd8b28d579ff365b7c396235476aa3fc84fa0 Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 6 Apr 2020 10:44:17 -0400 Subject: [PATCH 021/212] Fixes issue with power skills (#4751) * Fixes #4743. * Resolves an issue with power skills and default data defined in the skill's array. * Adds back linear determination and documentation for it. * Adds a check in the converter to not print out values of 0 for levels 6 and higher for skill unit layout and skill unit range. * Removes these values from the skill database. Thanks to @Surefirer and @teededung! --- db/pre-re/skill_db.yml | 176 -------------------------------- db/re/skill_db.yml | 176 -------------------------------- doc/mob_skill_db_powerskill.txt | 9 +- src/map/skill.cpp | 34 ++++++ src/tool/csv2yaml.cpp | 4 + 5 files changed, 45 insertions(+), 354 deletions(-) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index aa2e90d678..d6a5e0d6cb 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -1249,10 +1249,6 @@ Body: Size: 2 - Level: 11 Size: 3 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -3321,10 +3317,6 @@ Body: Size: 5 - Level: 11 Size: 7 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Range: 1 Interval: 1250 Target: Enemy @@ -3416,12 +3408,6 @@ Body: Size: 2 - Level: 10 Size: 2 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -7852,22 +7838,6 @@ Body: Size: 4 - Level: 5 Size: 5 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -14944,12 +14914,6 @@ Body: Size: 3 - Level: 10 Size: 4 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -15138,22 +15102,6 @@ Body: Size: 3 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -15764,12 +15712,6 @@ Body: Size: 5 - Level: 10 Size: 13 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Flag: NoOverlap: true @@ -25536,22 +25478,6 @@ Body: Size: 4 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -25621,22 +25547,6 @@ Body: Size: 4 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -25756,22 +25666,6 @@ Body: Size: 4 - Level: 5 Size: 5 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -26007,22 +25901,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -27687,22 +27565,6 @@ Body: Size: 3 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -28710,12 +28572,6 @@ Body: Size: 1 - Level: 10 Size: 2 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -30986,22 +30842,6 @@ Body: Size: 3 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -31602,22 +31442,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 2000 Target: Enemy Flag: diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 12b78e9ba3..b0a2eef985 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -1260,10 +1260,6 @@ Body: Size: 2 - Level: 11 Size: 3 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -3466,10 +3462,6 @@ Body: Size: 6 - Level: 11 Size: 7 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Range: 1 Interval: 1250 Target: Enemy @@ -3562,12 +3554,6 @@ Body: Size: 2 - Level: 10 Size: 2 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -8255,22 +8241,6 @@ Body: Size: 4 - Level: 5 Size: 5 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -15368,12 +15338,6 @@ Body: Size: 3 - Level: 10 Size: 4 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Flag: PathCheck: true @@ -15586,22 +15550,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -16233,12 +16181,6 @@ Body: Size: 5 - Level: 10 Size: 13 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Flag: NoOverlap: true @@ -26494,22 +26436,6 @@ Body: Size: 4 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -26590,22 +26516,6 @@ Body: Size: 4 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -26747,22 +26657,6 @@ Body: Size: 4 - Level: 5 Size: 5 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -27022,22 +26916,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -28767,22 +28645,6 @@ Body: Size: 3 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 500 Target: Enemy Flag: @@ -30811,12 +30673,6 @@ Body: Size: 1 - Level: 10 Size: 2 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: 1000 Target: Enemy Flag: @@ -32393,22 +32249,6 @@ Body: Size: 2 - Level: 5 Size: 3 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Target: Enemy Flag: @@ -33077,22 +32917,6 @@ Body: Size: 3 - Level: 5 Size: 4 - - Level: 6 - Size: 0 - - Level: 7 - Size: 0 - - Level: 8 - Size: 0 - - Level: 9 - Size: 0 - - Level: 10 - Size: 0 - - Level: 11 - Size: 0 - - Level: 12 - Size: 0 - - Level: 13 - Size: 0 Interval: -1 Target: Enemy Flag: diff --git a/doc/mob_skill_db_powerskill.txt b/doc/mob_skill_db_powerskill.txt index 3c7e6075e8..8c191a8771 100644 --- a/doc/mob_skill_db_powerskill.txt +++ b/doc/mob_skill_db_powerskill.txt @@ -3,7 +3,7 @@ //===== By: ================================================== //= rAthena Dev Team //===== Last Updated: ======================================== -//= 20160213 +//= 20200104 //===== Description: ========================================= //= Reference for monster level 10 skills. //============================================================ @@ -12,7 +12,12 @@ When a monster uses a level 10 skill on Aegis, it will be much stronger than the normal player version. On rAthena we reflect this by giving the monster a skill level above the maximum player level. The following lists explains the skill specialities and the corresponding level -you need to put for these skills in the mob_skill_db. +which needs to be put for these skills in the mob_skill_db. + +Note: The "SkillDatabase::parseNode" template has a linear determination feature +where it will attempt to fill the values from the last level defined to MAX_SKILL_LEVEL. +If it can't determine a trend it will fill with the last level defined. + ------------------------------------------------------------------------------- Skill | rAthena Lv | Explanation ------------------------------------------------------------------------------- diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 2c2546f64a..d4e05a9ca7 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -21707,6 +21707,8 @@ template bool SkillDatabase::parseNode(std::string nodeNam for (size_t i = 0; i < S; i++) arr[i] = value; } else { + uint16 max_level = 0; + for (const YAML::Node &it : node[nodeName]) { uint16 skill_lv; @@ -21722,7 +21724,39 @@ template bool SkillDatabase::parseNode(std::string nodeNam continue; arr[skill_lv - 1] = value; + max_level = max(max_level, skill_lv); } + + size_t i = max_level, j; + + // Check for linear change with increasing steps until we reach half of the data acquired. + for (size_t step = 1; step <= i / 2; step++) { + int diff = arr[i - 1] - arr[i - step - 1]; + + for (j = i - 1; j >= step; j--) { + if ((arr[j] - arr[j - step]) != diff) + break; + } + + if (j >= step) // No match, try next step. + continue; + + for (; i < MAX_SKILL_LEVEL; i++) { // Apply linear increase + arr[i] = arr[i - step] + diff; + + if (arr[i] < 1 && arr[i - 1] >= 0) { // Check if we have switched from + to -, cap the decrease to 0 in said cases. + arr[i] = 1; + diff = 0; + step = 1; + } + } + + return true; + } + + // Unable to determine linear trend, fill remaining array values with last value + for (; i < S; i++) + arr[i] = arr[max_level - 1]; } return true; diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index 68bd257d1e..2ed9d6c44e 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -2297,6 +2297,8 @@ static bool skill_parse_row_skilldb(char* split[], int columns, int current) { body << YAML::BeginSeq; for (size_t i = 0; i < ARRAYLENGTH(it_unit->second.unit_layout_type); i++) { + if (it_unit->second.unit_layout_type[i] == 0 && i + 1 > 5) + continue; body << YAML::BeginMap; body << YAML::Key << "Level" << YAML::Value << i + 1; body << YAML::Key << "Size" << YAML::Value << it_unit->second.unit_layout_type[i]; @@ -2314,6 +2316,8 @@ static bool skill_parse_row_skilldb(char* split[], int columns, int current) { body << YAML::BeginSeq; for (size_t i = 0; i < ARRAYLENGTH(it_unit->second.unit_range); i++) { + if (it_unit->second.unit_range[i] == 0 && i + 1 > 5) + continue; body << YAML::BeginMap; body << YAML::Key << "Level" << YAML::Value << i + 1; body << YAML::Key << "Size" << YAML::Value << it_unit->second.unit_range[i]; From dad85750fb722771f50ec2d0c45b790a76a7d08c Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Mon, 6 Apr 2020 20:34:27 +0200 Subject: [PATCH 022/212] Hides players with 'hide_session' and '/ignoreall' from whisper messages (#4762) --- src/map/intif.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/map/intif.cpp b/src/map/intif.cpp index 30513cc581..55b74712c9 100644 --- a/src/map/intif.cpp +++ b/src/map/intif.cpp @@ -27,6 +27,7 @@ #include "mercenary.hpp" #include "party.hpp" #include "pc.hpp" +#include "pc_groups.hpp" #include "pet.hpp" #include "quest.hpp" #include "status.hpp" @@ -1274,7 +1275,7 @@ int intif_parse_WisMessage(int fd) return 0; } if(sd->state.ignoreAll) { - intif_wis_reply(id, 2); + intif_wis_reply(id, (pc_has_permission(sd, PC_PERM_HIDE_SESSION))?1:2); return 0; } wisp_source = RFIFOCP(fd,12); // speed up [Yor] @@ -1285,7 +1286,7 @@ int intif_parse_WisMessage(int fd) if (i < MAX_IGNORE_LIST && sd->ignore[i].name[0] != '\0') { //Ignored - intif_wis_reply(id, 2); + intif_wis_reply(id, (pc_has_permission(sd, PC_PERM_HIDE_SESSION))?1:2); return 0; } //Success to send whisper. From 38cf16edbaa36836072780b4481023e57e014892 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Mon, 6 Apr 2020 20:36:22 +0200 Subject: [PATCH 023/212] Fixed Throw Spirit Sphere/Finger Offensive hits depending on the number of spirit spheres (#4771) --- src/map/battle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 14c5df30b0..bb2e10d5bd 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -5441,8 +5441,8 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block } break; case MO_FINGEROFFENSIVE: - if (sd && battle_config.finger_offensive_type) - wd.div_ = 1; + if (sd) + wd.div_ = (battle_config.finger_offensive_type)?1:sd->spiritball_old; break; case KN_PIERCE: From 02e61abbdd58a89862be18529516dad30fff70ad Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 6 Apr 2020 16:05:25 -0400 Subject: [PATCH 024/212] Fixes a compile error for older clients (#4776) * Fixes #4773. * Resolves a compile error for clients older than 20150513 quest objectives. Thanks to @Cainho! --- src/map/clif.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index c5ef959f34..8b767091cc 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -17134,7 +17134,7 @@ void clif_quest_update_objective(struct map_session_data *sd, struct quest *qd, WFIFOL(fd, offset) = qd->quest_id * 1000 + i; offset += 4; #else - WFIFOL(fd, offset) = qi->objectives[i].mob_id; + WFIFOL(fd, offset) = qi->objectives[i]->mob_id; offset += 4; #endif WFIFOW(fd, offset) = qi->objectives[i]->count; From 3424928fa1286932459d5db0add4b24a88bd7341 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Mon, 6 Apr 2020 22:19:12 +0200 Subject: [PATCH 025/212] Added missing restrictions when writing a mail (#4772) --- src/map/pc.cpp | 3 +++ src/map/unit.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index a79072b2f9..0f5f017470 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -5366,6 +5366,9 @@ int pc_useitem(struct map_session_data *sd,int n) nullpo_ret(sd); + if (sd->state.mail_writing) + return 0; + if (sd->npc_id) { if (sd->progressbar.npc_id) { clif_progressbar_abort(sd); diff --git a/src/map/unit.cpp b/src/map/unit.cpp index a6a7cafd3b..4c34eebe36 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -1384,7 +1384,7 @@ int unit_can_move(struct block_list *bl) { if (DIFF_TICK(ud->canmove_tick, gettick()) > 0) return 0; - if ((sd && (pc_issit(sd) || sd->state.vending || sd->state.buyingstore || (sd->state.block_action & PCBLOCK_MOVE))) || ud->state.blockedmove) + if ((sd && (pc_issit(sd) || sd->state.vending || sd->state.buyingstore || (sd->state.block_action & PCBLOCK_MOVE) || sd->state.mail_writing)) || ud->state.blockedmove) return 0; // Can't move // Status changes that block movement From 75070658856b957806e9d422195863f3f3b3f2c4 Mon Sep 17 00:00:00 2001 From: Aleos Date: Tue, 7 Apr 2020 16:59:38 -0400 Subject: [PATCH 026/212] Corrects Brandish Spear damage stacking (#4740) * Fixes #4739. * Follow up to 24ecebc. * Resolves Brandish Spear damage doing more damage than it should. Thanks to @violent01! --- db/re/skill_db.yml | 2 +- src/map/skill.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index b0a2eef985..b3fd6bd0d6 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -2113,7 +2113,7 @@ Body: HitCount: 3 Element: Weapon SplashArea: 2 - ActiveInstance: 5 + ActiveInstance: 3 Knockback: 2 CastTime: 500 Duration1: 1000 diff --git a/src/map/skill.cpp b/src/map/skill.cpp index d4e05a9ca7..bc2b2c63fe 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5292,7 +5292,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } break; -#ifndef RENEWAL +#ifdef RENEWAL case KN_BRANDISHSPEAR: skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); break; @@ -7589,6 +7589,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), 0, splash_target(src), src, skill_id, skill_lv, tick, flag | BCT_ENEMY | 0, skill_castend_damage_id); + break; #else case KN_BRANDISHSPEAR: #endif From 06c159c405afe23f3c342476d53bbda0f7b57a6d Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 8 Apr 2020 12:52:45 -0400 Subject: [PATCH 027/212] Refactored Instances to utilize C++ features (#3163) * Fixes #3087 and fixes #3095. * Converts database file to YAML. * Converts static array to unordered_map which frees up pre-allocated memory that may never be fully used. * Got rid of all DBMap/ERS features. * Removes MAX_INSTANCE_DATA in favor of INT_MAX. * Includes TXT converter. Thanks to @Lemongrass3110, @secretdataz, @Atemo, @lighta, @InusualZ, @Angelic234, @Normynator, @cydh, and @ecdarreola! --- db/import-tmpl/instance_db.txt | 6 - db/import-tmpl/instance_db.yml | 38 + db/instance_db.yml | 46 ++ db/pre-re/instance_db.txt | 11 - db/pre-re/instance_db.yml | 79 ++ db/re/instance_db.txt | 40 - db/re/instance_db.yml | 276 +++++++ db/readme.md | 14 +- doc/script_commands.txt | 4 +- doc/yaml/db/instance_db.yml | 17 + src/common/utilities.hpp | 17 + src/map/atcommand.cpp | 4 +- src/map/clif.cpp | 26 +- src/map/clif.hpp | 9 +- src/map/instance.cpp | 1272 ++++++++++++++++---------------- src/map/instance.hpp | 126 ++-- src/map/map-server.vcxproj | 2 +- src/map/map.cpp | 49 +- src/map/map.hpp | 4 +- src/map/npc.cpp | 17 +- src/map/script.cpp | 152 ++-- src/tool/csv2yaml.cpp | 49 ++ 22 files changed, 1367 insertions(+), 891 deletions(-) delete mode 100644 db/import-tmpl/instance_db.txt create mode 100644 db/import-tmpl/instance_db.yml create mode 100644 db/instance_db.yml delete mode 100644 db/pre-re/instance_db.txt create mode 100644 db/pre-re/instance_db.yml delete mode 100644 db/re/instance_db.txt create mode 100644 db/re/instance_db.yml create mode 100644 doc/yaml/db/instance_db.yml diff --git a/db/import-tmpl/instance_db.txt b/db/import-tmpl/instance_db.txt deleted file mode 100644 index 5672eec9e4..0000000000 --- a/db/import-tmpl/instance_db.txt +++ /dev/null @@ -1,6 +0,0 @@ -// Instance Database -// -// Structure of Database: -// ID,Name,LimitTime,IdleTimeOut,EnterMap,EnterX,EnterY,Map2,Map3,...,Map255 -// -// EnterMap is considered as Map1 diff --git a/db/import-tmpl/instance_db.yml b/db/import-tmpl/instance_db.yml new file mode 100644 index 0000000000..16dd9900e3 --- /dev/null +++ b/db/import-tmpl/instance_db.yml @@ -0,0 +1,38 @@ +# This file is a part of rAthena. +# Copyright(C) 2019 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Instance Database +########################################################################### +# +# Instance Settings +# +########################################################################### +# - Id Instance ID. +# Name Instance Name. +# TimeLimit Total lifetime of instance in seconds. (Default: 3600) +# IdleTimeOut Time before an idle instance is destroyed in seconds. (Default: 300) +# Enter: Instance entrance coordinates. +# Map Map Name where players start. +# X X Coordinate where players start. +# Y Y Coordinate where players start. +# AdditionalMaps: List of maps that are part of an instance. (Optional) +########################################################################### + +Header: + Type: INSTANCE_DB + Version: 1 diff --git a/db/instance_db.yml b/db/instance_db.yml new file mode 100644 index 0000000000..03bcfba90c --- /dev/null +++ b/db/instance_db.yml @@ -0,0 +1,46 @@ +# This file is a part of rAthena. +# Copyright(C) 2019 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Instance Database +########################################################################### +# +# Instance Settings +# +########################################################################### +# - Id Instance ID. +# Name Instance Name. +# TimeLimit Total lifetime of instance in seconds. (Default: 3600) +# IdleTimeOut Time before an idle instance is destroyed in seconds. (Default: 300) +# Enter: Instance entrance coordinates. +# Map Map Name where players start. +# X X Coordinate where players start. +# Y Y Coordinate where players start. +# AdditionalMaps: List of maps that are part of an instance. (Optional) +########################################################################### + +Header: + Type: INSTANCE_DB + Version: 1 + +Footer: + Imports: + - Path: db/pre-re/instance_db.yml + Mode: Prerenewal + - Path: db/re/instance_db.yml + Mode: Renewal + - Path: db/import/instance_db.yml diff --git a/db/pre-re/instance_db.txt b/db/pre-re/instance_db.txt deleted file mode 100644 index e9cf668f15..0000000000 --- a/db/pre-re/instance_db.txt +++ /dev/null @@ -1,11 +0,0 @@ -// Instance Database -// -// Structure of Database: -// ID,Name,LimitTime,IdleTimeOut,EnterMap,EnterX,EnterY,Map2,Map3,...,Map255 -// -// EnterMap is considered as Map1 - -1,Endless Tower,14400,300,1@tower,50,355,2@tower,3@tower,4@tower,5@tower,6@tower -2,Sealed Catacomb,7200,300,1@cata,100,224,2@cata -3,Orc's Memory,3600,300,1@orcs,179,15,2@orcs -4,Nidhoggur's Nest,14400,300,1@nyd,32,36,2@nyd diff --git a/db/pre-re/instance_db.yml b/db/pre-re/instance_db.yml new file mode 100644 index 0000000000..fdd82c99cc --- /dev/null +++ b/db/pre-re/instance_db.yml @@ -0,0 +1,79 @@ +# This file is a part of rAthena. +# Copyright(C) 2019 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Instance Database +########################################################################### +# +# Instance Settings +# +########################################################################### +# - Id Instance ID. +# Name Instance Name. +# TimeLimit Total lifetime of instance in seconds. (Default: 3600) +# IdleTimeOut Time before an idle instance is destroyed in seconds. (Default: 300) +# Enter: Instance entrance coordinates. +# Map Map Name where players start. +# X X Coordinate where players start. +# Y Y Coordinate where players start. +# AdditionalMaps: List of maps that are part of an instance. (Optional) +########################################################################### + +Header: + Type: INSTANCE_DB + Version: 1 + +Body: + - Id: 1 + Name: Endless Tower + TimeLimit: 14400 + Enter: + Map: 1@tower + X: 50 + Y: 355 + AdditionalMaps: + 2@tower: true + 3@tower: true + 4@tower: true + 5@tower: true + 6@tower: true + - Id: 2 + Name: Sealed Catacomb + TimeLimit: 7200 + Enter: + Map: 1@cata + X: 100 + Y: 224 + AdditionalMaps: + 2@cata: true + - Id: 3 + Name: Orc's Memory + Enter: + Map: 1@orcs + X: 179 + Y: 15 + AdditionalMaps: + 2@orcs: true + - Id: 4 + Name: Nidhoggur's Nest + TimeLimit: 14400 + Enter: + Map: 1@nyd + X: 32 + Y: 36 + AdditionalMaps: + 2@nyd: true diff --git a/db/re/instance_db.txt b/db/re/instance_db.txt deleted file mode 100644 index a0443ffb8d..0000000000 --- a/db/re/instance_db.txt +++ /dev/null @@ -1,40 +0,0 @@ -// Instance Database -// -// Structure of Database: -// ID,Name,LimitTime,IdleTimeOut,EnterMap,EnterX,EnterY,Map2,...,Map255 -// -// EnterMap is considered as Map1 - -1,Endless Tower,14400,300,1@tower,50,355,2@tower,3@tower,4@tower,5@tower,6@tower -2,Sealed Catacomb,7200,300,1@cata,100,224,2@cata -3,Orc's Memory,3600,300,1@orcs,179,15,2@orcs -4,Nidhoggur's Nest,14400,300,1@nyd,32,36,2@nyd -5,Mistwood Maze,7200,300,1@mist,89,29 -6,Culvert,3600,300,1@pump,63,98,2@pump -7,Octopus Cave,3600,300,1@cash,199,99 -8,Bangungot Hospital 2F,3600,300,1@ma_h,40,157 -9,Buwaya Cave,3600,300,1@ma_c,35,57 -10,Bakonawa Lake,7200,300,1@ma_b,64,51 -11,Wolfchev's Laboratory,14400,300,1@lhz,45,148 -12,Old Glast Heim,3600,300,1@gl_k,150,20,2@gl_k -13,Eclage Interior,1200,300,1@ecl,60,50 -14,Sara's Memories,3600,300,1@sara,250,155 -15,Geffen Magic Tournament,7200,300,1@gef,119,209,1@gef_in,1@ge_st -16,Horror Toy Factory,3600,300,1@xm_d,111,22 -17,Faceworm's Nest,3600,300,1@face,112,370 -18,Ghost Palace,3600,300,1@spa,42,196 -19,Devil's Tower,3600,300,1@tnm1,50,104,1@tnm2,1@tnm3 -20,Assault on the Airship,3600,300,1@air1,244,73,1@air2 -21,Fenrir and Sarah,3600,300,1@glast,367,304 -// 22,Wave Mode - Forest,3600,300,1@def01,50,21 -// 23,Wave Mode - Sky,3600,300,1@def02,29,35 -24,Nightmarish Jitterbug,3600,300,1@jtb,16,17 -25,Isle of Bios,3600,300,1@dth1,17,93,1@dth2,1@dth3 -26,Morse's Cave,3600,300,1@rev,26,181 -// 27,Temple of the Demon God,3600,300,1@eom,101,16 -28,Central Laboratory,3600,300,1@lab,120,30 -29,Last room,3600,300,1@uns,145,35 -// 30,Charleston in Distress,3600,300,1@mcd,127,282 -31,Ritual of Blessing,3600,300,2@mir,101,12 -32,Room of Consciousness,3600,300,1@mir,101,10 -// 33,Sky Fortress Invasion,3600,300,1@sthb,54,67,1@sthc,1@sthd diff --git a/db/re/instance_db.yml b/db/re/instance_db.yml new file mode 100644 index 0000000000..1bc5d59ef4 --- /dev/null +++ b/db/re/instance_db.yml @@ -0,0 +1,276 @@ +# This file is a part of rAthena. +# Copyright(C) 2019 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Instance Database +########################################################################### +# +# Instance Settings +# +########################################################################### +# - Id Instance ID. +# Name Instance Name. +# TimeLimit Total lifetime of instance in seconds. (Default: 3600) +# IdleTimeOut Time before an idle instance is destroyed in seconds. (Default: 300) +# Enter: Instance entrance coordinates. +# Map Map Name where players start. +# X X Coordinate where players start. +# Y Y Coordinate where players start. +# AdditionalMaps: List of maps that are part of an instance. (Optional) +########################################################################### + +Header: + Type: INSTANCE_DB + Version: 1 + +Body: + - Id: 1 + Name: Endless Tower + TimeLimit: 14400 + Enter: + Map: 1@tower + X: 50 + Y: 355 + AdditionalMaps: + 2@tower: true + 3@tower: true + 4@tower: true + 5@tower: true + 6@tower: true + - Id: 2 + Name: Sealed Catacomb + TimeLimit: 7200 + Enter: + Map: 1@cata + X: 100 + Y: 224 + AdditionalMaps: + 2@cata: true + - Id: 3 + Name: Orc's Memory + Enter: + Map: 1@orcs + X: 179 + Y: 15 + AdditionalMaps: + 2@orcs: true + - Id: 4 + Name: Nidhoggur's Nest + TimeLimit: 14400 + Enter: + Map: 1@nyd + X: 32 + Y: 36 + AdditionalMaps: + 2@nyd: true + - Id: 5 + Name: Mistwood Maze + TimeLimit: 7200 + Enter: + Map: 1@mist + X: 89 + Y: 29 + - Id: 6 + Name: Culvert + Enter: + Map: 1@pump + X: 63 + Y: 98 + AdditionalMaps: + 2@pump: true + - Id: 7 + Name: Octopus Cave + Enter: + Map: 1@cash + X: 199 + Y: 99 + - Id: 8 + Name: Bangungot Hospital 2F + Enter: + Map: 1@ma_h + X: 40 + Y: 157 + - Id: 9 + Name: Buwaya Cave + Enter: + Map: 1@ma_c + X: 35 + Y: 57 + - Id: 10 + Name: Bakonawa Lake + TimeLimit: 7200 + Enter: + Map: 1@ma_b + X: 64 + Y: 51 + - Id: 11 + Name: Wolfchev's Laboratory + TimeLimit: 14400 + Enter: + Map: 1@lhz + X: 45 + Y: 148 + - Id: 12 + Name: Old Glast Heim + Enter: + Map: 1@gl_k + X: 150 + Y: 20 + AdditionalMaps: + 2@gl_k: true + - Id: 13 + Name: Eclage Interior + TimeLimit: 1200 + Enter: + Map: 1@ecl + X: 60 + Y: 50 + - Id: 14 + Name: Sara's Memories + Enter: + Map: 1@sara + X: 250 + Y: 155 + - Id: 15 + Name: Geffen Magic Tournament + TimeLimit: 7200 + Enter: + Map: 1@gef + X: 119 + Y: 209 + AdditionalMaps: + 1@gef_in: true + 1@ge_st: true + - Id: 16 + Name: Horror Toy Factory + Enter: + Map: 1@xm_d + X: 111 + Y: 22 + - Id: 17 + Name: Faceworm's Nest + Enter: + Map: 1@face + X: 112 + Y: 370 + - Id: 18 + Name: Ghost Palace + Enter: + Map: 1@spa + X: 42 + Y: 196 + - Id: 19 + Name: Devil's Tower + Enter: + Map: 1@tnm1 + X: 50 + Y: 104 + AdditionalMaps: + 1@tnm2: true + 1@tnm3: true + - Id: 20 + Name: Assault on the Airship + Enter: + Map: 1@air1 + X: 244 + Y: 73 + AdditionalMaps: + 1@air2: true + - Id: 21 + Name: Fenrir and Sarah + Enter: + Map: 1@glast + X: 367 + Y: 304 +# - Id: 22 +# Name: Wave Mode - Forest +# Enter: +# Map: 1@def01 +# X: 50 +# Y: 21 +# - Id: 23 +# Name: Wave Mode - Sky +# Enter: +# Map: 1@def02 +# X: 29 +# Y: 35 + - Id: 24 + Name: Nightmarish Jitterbug + Enter: + Map: 1@jtb + X: 16 + Y: 17 + - Id: 25 + Name: Isle of Bios + Enter: + Map: 1@dth1 + X: 17 + Y: 93 + AdditionalMaps: + 1@dth2: true + 1@dth3: true + - Id: 26 + Name: Morse's Cave + Enter: + Map: 1@rev + X: 26 + Y: 181 +# - Id: 27 +# Name: Temple of the Demon God +# Enter: +# Map: 1@eom +# X: 101 +# Y: 16 + - Id: 28 + Name: Central Laboratory + Enter: + Map: 1@lab + X: 120 + Y: 30 + - Id: 29 + Name: Last room + Enter: + Map: 1@uns + X: 145 + Y: 35 +# - Id: 30 +# Name: Charleston in Distress +# Enter: +# Map: 1@mcd +# X: 127 +# Y: 282 + - Id: 31 + Name: Ritual of Blessing + Enter: + Map: 2@mir + X: 101 + Y: 12 + - Id: 32 + Name: Room of Consciousness + Enter: + Map: 1@mir + X: 101 + Y: 10 +# - Id: 33 +# Name: Sky Fortress Invasion +# Enter: +# Map: 1@sthb +# X: 54 +# Y: 67 +# AdditionalMaps: +# 1@sthc: true +# 1@sthd: true diff --git a/db/readme.md b/db/readme.md index eeddb1faed..094a296691 100644 --- a/db/readme.md +++ b/db/readme.md @@ -38,10 +38,18 @@ We want to add our own custom achievement that can be given to a player via an N --- We want to add our own customized Housing Instance. -#### /db/import/instance_db.txt +#### /db/import/instance_db.yml - // ID,Name,LimitTime,IdleTimeOut,EnterMap,EnterX,EnterY,Map2,Map3,...,Map255 - 35,Home,3600,900,1@home,24,6,2@home,3@home + - Id: 35 + Name: Home + IdleTimeOut: 900 + Enter: + Map: 1@home + X: 24 + Y: 6 + AdditionalMaps: + - Map: 2@home + - Map: 3@home ### Mob Alias diff --git a/doc/script_commands.txt b/doc/script_commands.txt index f4be22da15..d254890b9f 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -8938,7 +8938,7 @@ with the given character id. *instance_create(""{,{,}}); Creates an instance for the of . The instance name, along with -all other instance data, is read from 'db/(pre-)re/instance_db.txt'. Upon success, +all other instance data, is read from 'db/(pre-)re/instance_db.yml'. Upon success, the command generates a unique instance ID, duplicates all listed maps and NPCs, sets the alive time, and triggers the "OnInstanceInit" label in all NPCs inside the instance. @@ -8971,7 +8971,7 @@ This will also trigger the "OnInstanceDestroy" label in all NPCs inside the inst Warps the attached player to the specified . If no ID is specified, the IM_PARTY instance the invoking player is attached to is used. -The map and coordinates are located in 'db/(pre-)re/instance_db.txt'. +The map and coordinates are located in 'db/(pre-)re/instance_db.yml'. The command returns IE_OK upon success, and these values upon failure: IE_NOMEMBER: Party/Guild/Clan not found (for party/guild/clan modes). diff --git a/doc/yaml/db/instance_db.yml b/doc/yaml/db/instance_db.yml new file mode 100644 index 0000000000..b7c1cf8ffe --- /dev/null +++ b/doc/yaml/db/instance_db.yml @@ -0,0 +1,17 @@ +########################################################################### +# Instance Database +########################################################################### +# +# Instance Settings +# +########################################################################### +# - Id Instance ID. +# Name Instance Name. +# TimeLimit Total lifetime of instance in seconds. (Default: 3600) +# IdleTimeOut Time before an idle instance is destroyed in seconds. (Default: 300) +# Enter: Instance entrance coordinates. +# Map Map Name where players start. +# X X Coordinate where players start. +# Y Y Coordinate where players start. +# AdditionalMaps: List of maps that are part of an instance. (Optional) +########################################################################### diff --git a/src/common/utilities.hpp b/src/common/utilities.hpp index e00228a378..15ba32cef6 100644 --- a/src/common/utilities.hpp +++ b/src/common/utilities.hpp @@ -175,6 +175,23 @@ namespace rathena { vector.erase(vector.begin() + index); } + /** + * Determine if a value exists in the vector and then erase it + * @param vector: Vector to erase value from + * @param value: Value to remove + */ + template void vector_erase_if_exists(std::vector &vector, V value) { + auto it = std::find(vector.begin(), vector.end(), value); + + if (it != vector.end()) { + if (vector.size() == 1) { + vector.clear(); + vector.shrink_to_fit(); + } else + vector.erase(it); + } + } + bool safe_addition( int64 a, int64 b, int64& result ); bool safe_substraction( int64 a, int64 b, int64& result ); bool safe_multiplication( int64 a, int64 b, int64& result ); diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index e8a86d415a..b0f9312b18 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -4030,8 +4030,8 @@ ACMD_FUNC(reload) { if (quest_db.reload()) clif_displaymessage(fd, msg_txt(sd,1377)); // Quest database has been reloaded. } else if (strstr(command, "instancedb") || strncmp(message, "instancedb", 4) == 0) { - instance_reload(); - clif_displaymessage(fd, msg_txt(sd,516)); // Instance database has been reloaded. + if (instance_db.reload()) + clif_displaymessage(fd, msg_txt(sd,516)); // Instance database has been reloaded. } else if (strstr(command, "achievementdb") || strncmp(message, "achievementdb", 4) == 0) { achievement_db_reload(); clif_displaymessage(fd, msg_txt(sd,771)); // Achievement database has been reloaded. diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 8b767091cc..596b1fc482 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -17793,26 +17793,25 @@ void clif_font(struct map_session_data *sd) /// Required to start the instancing information window on Client /// This window re-appears each "refresh" of client automatically until the keep_limit reaches 0. /// S 0x2cb .61B .W -void clif_instance_create(unsigned short instance_id, int num) +void clif_instance_create(int instance_id, int num) { #if PACKETVER >= 20071128 - struct instance_db *db = NULL; struct map_session_data *sd = NULL; enum send_target target = PARTY; unsigned char buf[65]; - instance_getsd(instance_id, &sd, &target); + instance_getsd(instance_id, sd, &target); if (!sd) return; - db = instance_searchtype_db(instance_data[instance_id].type); + std::shared_ptr db = instance_db.find(util::umap_find(instances, instance_id)->id); if (!db) return; WBUFW(buf,0) = 0x2cb; - safestrncpy(WBUFCP(buf,2), StringBuf_Value(db->name), INSTANCE_NAME_LENGTH); + safestrncpy(WBUFCP(buf,2), db->name.c_str(), INSTANCE_NAME_LENGTH); WBUFW(buf,63) = num; clif_send(buf,packet_len(0x2cb),&sd->bl,target); #endif @@ -17822,14 +17821,14 @@ void clif_instance_create(unsigned short instance_id, int num) /// To announce Instancing queue creation if no maps available /// S 0x2cc .W -void clif_instance_changewait(unsigned short instance_id, int num) +void clif_instance_changewait(int instance_id, int num) { #if PACKETVER >= 20071128 struct map_session_data *sd = NULL; enum send_target target = PARTY; unsigned char buf[4]; - instance_getsd(instance_id, &sd, &target); + instance_getsd(instance_id, sd, &target); if (!sd) return; @@ -17844,26 +17843,25 @@ void clif_instance_changewait(unsigned short instance_id, int num) /// Notify the current status to members /// S 0x2cd .61B .L .L -void clif_instance_status(unsigned short instance_id, unsigned int limit1, unsigned int limit2) +void clif_instance_status(int instance_id, unsigned int limit1, unsigned int limit2) { #if PACKETVER >= 20071128 - struct instance_db *db = NULL; struct map_session_data *sd = NULL; enum send_target target = PARTY; unsigned char buf[71]; - instance_getsd(instance_id, &sd, &target); + instance_getsd(instance_id, sd, &target); if (!sd) return; - db = instance_searchtype_db(instance_data[instance_id].type); + std::shared_ptr db = instance_db.find(util::umap_find(instances, instance_id)->id); if (!db) return; WBUFW(buf,0) = 0x2cd; - safestrncpy(WBUFCP(buf,2), StringBuf_Value(db->name), INSTANCE_NAME_LENGTH); + safestrncpy(WBUFCP(buf,2), db->name.c_str(), INSTANCE_NAME_LENGTH); WBUFL(buf,63) = limit1; WBUFL(buf,67) = limit2; clif_send(buf,packet_len(0x2cd),&sd->bl,target); @@ -17879,14 +17877,14 @@ void clif_instance_status(unsigned short instance_id, unsigned int limit1, unsig /// 2 = The Memorial Dungeon's entry time limit expired; it has been destroyed /// 3 = The Memorial Dungeon has been removed. /// 4 = Create failure (removes the instance window) -void clif_instance_changestatus(unsigned int instance_id, int type, unsigned int limit) +void clif_instance_changestatus(int instance_id, e_instance_notify type, unsigned int limit) { #if PACKETVER >= 20071128 struct map_session_data *sd = NULL; enum send_target target = PARTY; unsigned char buf[10]; - instance_getsd(instance_id, &sd, &target); + instance_getsd(instance_id, sd, &target); if (!sd) return; diff --git a/src/map/clif.hpp b/src/map/clif.hpp index b52761d30b..6d8c3ed64d 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -43,6 +43,7 @@ struct achievement; struct guild_log_entry; enum e_guild_storage_log : uint16; enum e_bg_queue_apply_ack : uint16; +enum e_instance_notify : uint8; enum e_PacketDBVersion { // packet DB MIN_PACKET_DB = 0x064, @@ -835,10 +836,10 @@ void clif_bg_queue_lobby_notify(const char *name, struct map_session_data *sd); void clig_bg_queue_ack_lobby(bool result, const char *name, const char *lobbyname, struct map_session_data *sd); // Instancing -void clif_instance_create(unsigned short instance_id, int num); -void clif_instance_changewait(unsigned short instance_id, int num); -void clif_instance_status(unsigned short instance_id, unsigned int limit1, unsigned int limit2); -void clif_instance_changestatus(unsigned int instance_id, int type, unsigned int limit); +void clif_instance_create(int instance_id, int num); +void clif_instance_changewait(int instance_id, int num); +void clif_instance_status(int instance_id, unsigned int limit1, unsigned int limit2); +void clif_instance_changestatus(int instance_id, e_instance_notify type, unsigned int limit); // Custom Fonts void clif_font(struct map_session_data *sd); diff --git a/src/map/instance.cpp b/src/map/instance.cpp index a14392eac2..f56c768bc7 100644 --- a/src/map/instance.cpp +++ b/src/map/instance.cpp @@ -4,6 +4,7 @@ #include "instance.hpp" #include +#include #include "../common/cbasetypes.hpp" #include "../common/db.hpp" @@ -14,6 +15,7 @@ #include "../common/socket.hpp" #include "../common/strlib.hpp" #include "../common/timer.hpp" +#include "../common/utilities.hpp" #include "clan.hpp" #include "clif.hpp" @@ -23,283 +25,445 @@ #include "party.hpp" #include "pc.hpp" -#define INSTANCE_INTERVAL 60000 // Interval used to check when an instance is to be destroyed (ms) +using namespace rathena; -struct instance_data instance_data[MAX_INSTANCE_DATA]; -struct eri *instance_maps_ers = NULL; ///< Array of maps per instance - -int16 instance_start = 0; - -static DBMap *InstanceDB; /// Instance DB: struct instance_db, key: id -static DBMap *InstanceNameDB; /// instance id, key: name - -static struct { - int id[MAX_INSTANCE_DATA]; - int count; +/// Instance Idle Queue data +struct s_instance_wait { + std::deque id; int timer; } instance_wait; -/*========================================== - * Searches for an instance ID in the database - *------------------------------------------*/ -struct instance_db *instance_searchtype_db(unsigned short instance_id) { - return (struct instance_db *)uidb_get(InstanceDB,instance_id); +#define INSTANCE_INTERVAL 60000 // Interval used to check when an instance is to be destroyed (ms) + +int16 instance_start = 0; // Instance MapID start +int instance_count = 1; // Total created instances + +std::unordered_map> instances; + +const std::string InstanceDatabase::getDefaultLocation() { + return std::string(db_path) + "/instance_db.yml"; } -static uint16 instance_name2id(const char *instance_name) { - return (uint16)strdb_uiget(InstanceNameDB,instance_name); +/** + * Reads and parses an entry from the instance_db. + * @param node: YAML node containing the entry. + * @return count of successfully parsed rows + */ +uint64 InstanceDatabase::parseBodyNode(const YAML::Node &node) { + int32 instance_id = 0; + + if (!this->asInt32(node, "Id", instance_id)) + return 0; + + if (instance_id <= 0) { + this->invalidWarning(node, "Instance Id is invalid. Valid range 1~%d, skipping.\n", INT_MAX); + return 0; + } + + std::shared_ptr instance = this->find(instance_id); + bool exists = instance != nullptr; + + if (!exists) { + if (!this->nodesExist(node, { "Name", "Enter" })) + return 0; + + instance = std::make_shared(); + instance->id = instance_id; + } + + if (this->nodeExists(node, "Name")) { + std::string name; + + if (!this->asString(node, "Name", name)) + return 0; + + for (const auto &instance : instance_db) { + if (instance.second->name.compare(name) == 0) { + this->invalidWarning(node["Name"], "Instance name %s already exists, skipping.\n", name.c_str()); + return 0; + } + } + + instance->name = name; + } + + if (this->nodeExists(node, "TimeLimit")) { + uint32 limit; + + if (!this->asUInt32(node, "TimeLimit", limit)) + return 0; + + instance->limit = limit; + } else { + if (!exists) + instance->limit = 3600; + } + + if (this->nodeExists(node, "IdleTimeOut")) { + uint32 idle; + + if (!this->asUInt32(node, "IdleTimeOut", idle)) + return 0; + + instance->timeout = idle; + } else { + if (!exists) + instance->timeout = 300; + } + + /* + if (this->nodeExists(node, "Destroyable")) { + bool destroy; + + if (!this->asBool(node, "Destroyable", destroy)) + return 0; + + instance->destroyable = destroy; + } else { + if (!exists) + instance->destroyable = true; + } + */ + + if (this->nodeExists(node, "Enter")) { + const YAML::Node &enterNode = node["Enter"]; + + if (!this->nodesExist(enterNode, { "Map", "X", "Y" })) + return 0; + + if (this->nodeExists(enterNode, "Map")) { + std::string map; + + if (!this->asString(enterNode, "Map", map)) + return 0; + + int16 m = map_mapname2mapid(map.c_str()); + + if (m == -1) { + this->invalidWarning(enterNode["Map"], "Map %s is not a valid map, skipping.\n", map.c_str()); + return 0; + } + + instance->enter.map = m; + } + + if (this->nodeExists(enterNode, "X")) { + int16 x; + + if (!this->asInt16(enterNode, "X", x)) + return 0; + + instance->enter.x = x; + } + + if (this->nodeExists(enterNode, "Y")) { + int16 y; + + if (!this->asInt16(enterNode, "Y", y)) + return 0; + + instance->enter.y = y; + } + } + + if (this->nodeExists(node, "AdditionalMaps")) { + const YAML::Node &mapNode = node["AdditionalMaps"]; + + for (const auto &mapIt : mapNode) { + std::string map = mapIt.first.as(); + int16 m = map_mapname2mapid(map.c_str()); + + if (m == instance->enter.map) { + this->invalidWarning(mapNode, "Additional Map %s is already listed as the EnterMap.\n", map.c_str()); + continue; + } + + if (m == -1) { + this->invalidWarning(mapNode, "Additional Map %s is not a valid map, skipping.\n", map.c_str()); + return 0; + } + + bool active; + + if (!this->asBool(mapNode, map, active)) + return 0; + + if (active) + instance->maplist.push_back(m); + else + util::vector_erase_if_exists(instance->maplist, m); + } + } + + if (!exists) + this->put(instance_id, instance); + + return 1; } -/*========================================== +InstanceDatabase instance_db; + +/** * Searches for an instance name in the database - *------------------------------------------*/ -struct instance_db *instance_searchname_db(const char *instance_name) { - uint16 id = instance_name2id(instance_name); - if (id == 0) - return NULL; - return (struct instance_db *)uidb_get(InstanceDB,id); + * @param instance_name: Instance to search for + * @return shared_ptr of instance or nullptr on failure + */ +std::shared_ptr instance_search_db_name(const char *instance_name) +{ + for (const auto &it : instance_db) { + if (!strcmp(it.second->name.c_str(), instance_name)) + return it.second; + } + + return nullptr; } /** * Search for a sd of an Instance * @param instance_id: Instance ID - * @param sd: Player data to attach + * @param sd: Pointer to player data * @param target: Target display type */ -void instance_getsd(unsigned short instance_id, struct map_session_data **sd, enum send_target *target) { - switch(instance_data[instance_id].mode) { +void instance_getsd(int instance_id, struct map_session_data *&sd, enum send_target *target) { + std::shared_ptr idata = util::umap_find(instances, instance_id); + + if (!idata) { + sd = nullptr; + return; + } + + switch(idata->mode) { case IM_NONE: - (*sd) = NULL; + sd = nullptr; (*target) = SELF; break; case IM_GUILD: - (*sd) = guild_getavailablesd(guild_search(instance_data[instance_id].owner_id)); + sd = guild_getavailablesd(guild_search(idata->owner_id)); (*target) = GUILD; break; case IM_PARTY: - (*sd) = party_getavailablesd(party_search(instance_data[instance_id].owner_id)); + sd = party_getavailablesd(party_search(idata->owner_id)); (*target) = PARTY; break; case IM_CHAR: - (*sd) = map_charid2sd(instance_data[instance_id].owner_id); + sd = map_charid2sd(idata->owner_id); (*target) = SELF; break; case IM_CLAN: - (*sd) = clan_getavailablesd(clan_search(instance_data[instance_id].owner_id)); + sd = clan_getavailablesd(clan_search(idata->owner_id)); (*target) = CLAN; } return; } -/*========================================== +/** * Deletes an instance timer (Destroys instance) - *------------------------------------------*/ + */ static TIMER_FUNC(instance_delete_timer){ instance_destroy(id); return 0; } -/*========================================== +/** * Create subscription timer - *------------------------------------------*/ + */ static TIMER_FUNC(instance_subscription_timer){ - int i, ret; - unsigned short instance_id = instance_wait.id[0]; - struct map_session_data *sd = NULL; - struct party_data *pd = NULL; - struct guild *gd = NULL; - struct clan *cd = NULL; - enum instance_mode mode; + int instance_id = instance_wait.id[0]; - if(instance_wait.count == 0 || instance_id == 0) + if (instance_id <= 0 || instance_wait.id.empty()) return 0; - // Check that maps have been added - ret = instance_addmap(instance_id); - mode = instance_data[instance_id].mode; + std::shared_ptr idata = util::umap_find(instances, instance_id); + + if (!idata) + return 0; + + struct map_session_data *sd; + struct party_data *pd; + struct guild *gd; + struct clan *cd; + e_instance_mode mode = idata->mode; + int ret = instance_addmap(instance_id); // Check that maps have been added switch(mode) { case IM_NONE: break; case IM_CHAR: - if (ret == 0 && (sd = map_charid2sd(instance_data[instance_id].owner_id)) != NULL) // If no maps are created, tell player to wait + if (ret == 0 && (sd = map_charid2sd(idata->owner_id))) // If no maps are created, tell player to wait clif_instance_changewait(instance_id, 0xffff); break; case IM_PARTY: - if (ret == 0 && (pd = party_search(instance_data[instance_id].owner_id)) != NULL) // If no maps are created, tell party to wait + if (ret == 0 && (pd = party_search(idata->owner_id))) // If no maps are created, tell party to wait clif_instance_changewait(instance_id, 0xffff); break; case IM_GUILD: - if (ret == 0 && (gd = guild_search(instance_data[instance_id].owner_id)) != NULL) // If no maps are created, tell guild to wait + if (ret == 0 && (gd = guild_search(idata->owner_id))) // If no maps are created, tell guild to wait clif_instance_changewait(instance_id, 0xffff); break; case IM_CLAN: - if (ret == 0 && (cd = clan_search(instance_data[instance_id].owner_id)) != NULL) // If no maps are created, tell clan to wait + if (ret == 0 && (cd = clan_search(idata->owner_id))) // If no maps are created, tell clan to wait clif_instance_changewait(instance_id, 0xffff); break; default: return 0; } - instance_wait.count--; - memmove(&instance_wait.id[0],&instance_wait.id[1],sizeof(instance_wait.id[0])*instance_wait.count); - memset(&instance_wait.id[instance_wait.count], 0, sizeof(instance_wait.id[0])); + instance_wait.id.pop_front(); - for(i = 0; i < instance_wait.count; i++) { - if( instance_data[instance_wait.id[i]].state == INSTANCE_IDLE && - ((mode == IM_CHAR && sd != NULL) || (mode == IM_GUILD && gd != NULL) || (mode == IM_PARTY && pd != NULL) || (mode == IM_CLAN && cd != NULL)) - ){ + for (int i = 0; i < instance_wait.id.size(); i++) { + if (idata->state == INSTANCE_IDLE && ((mode == IM_CHAR && sd) || (mode == IM_GUILD && gd) || (mode == IM_PARTY && pd) || (mode == IM_CLAN && cd))) clif_instance_changewait(instance_id, i + 1); - } } - if(instance_wait.count) - instance_wait.timer = add_timer(gettick()+INSTANCE_INTERVAL, instance_subscription_timer, 0, 0); + if (!instance_wait.id.empty()) + instance_wait.timer = add_timer(gettick() + INSTANCE_INTERVAL, instance_subscription_timer, 0, 0); else instance_wait.timer = INVALID_TIMER; return 0; } -/*========================================== +/** * Adds timer back to members entering instance - *------------------------------------------*/ -static int instance_startkeeptimer(struct instance_data *im, unsigned short instance_id) + * @param idata: Instance data + * @param instance_id: Instance ID to notify + * @return True on success or false on failure + */ +bool instance_startkeeptimer(std::shared_ptr idata, int instance_id) { - struct instance_db *db; - - nullpo_retr(0, im); - // No timer - if(im->keep_timer != INVALID_TIMER) - return 1; + if (!idata || idata->keep_timer != INVALID_TIMER) + return false; - if((db = instance_searchtype_db(im->type)) == NULL) - return 1; + std::shared_ptr db = instance_db.find(idata->id); + + if (!db) + return false; // Add timer - im->keep_limit = (unsigned int)time(NULL) + db->limit; - im->keep_timer = add_timer(gettick()+db->limit*1000, instance_delete_timer, instance_id, 0); + idata->keep_limit = static_cast(time(nullptr)) + db->limit; + idata->keep_timer = add_timer(gettick() + db->limit * 1000, instance_delete_timer, instance_id, 0); - switch(im->mode) { + switch(idata->mode) { case IM_NONE: break; case IM_CHAR: - if (map_charid2sd(im->owner_id) != NULL) // Notify player of the added instance timer - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (map_charid2sd(idata->owner_id)) // Notify player of the added instance timer + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; case IM_PARTY: - if (party_search(im->owner_id) != NULL) // Notify party of the added instance timer - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (party_search(idata->owner_id)) // Notify party of the added instance timer + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; case IM_GUILD: - if (guild_search(im->owner_id) != NULL) // Notify guild of the added instance timer - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (guild_search(idata->owner_id)) // Notify guild of the added instance timer + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; case IM_CLAN: - if (clan_search(im->owner_id) != NULL) // Notify clan of the added instance timer - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (clan_search(idata->owner_id)) // Notify clan of the added instance timer + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; default: - return 1; + return false; } - return 0; + return true; } -/*========================================== - * Creates idle timer - * Default before instance destroy is 5 minutes - *------------------------------------------*/ -static int instance_startidletimer(struct instance_data *im, unsigned short instance_id) +/** + * Creates an idle timer for an instance, default is 5 minutes + * @param idata: Instance data + * @param instance_id: Instance ID to notify + * @param True on success or false on failure + */ +bool instance_startidletimer(std::shared_ptr idata, int instance_id) { - struct instance_db *db; - - nullpo_retr(1, im); - // No current timer - if(im->idle_timer != INVALID_TIMER) - return 1; + if (!idata || idata->idle_timer != INVALID_TIMER) + return false; - if ((db = instance_searchtype_db(im->type)) == NULL) - return 1; + std::shared_ptr db = instance_db.find(idata->id); + + if (!db) + return false; // Add the timer - im->idle_limit = (unsigned int)time(NULL) + db->timeout; - im->idle_timer = add_timer(gettick() + db->timeout * 1000, instance_delete_timer, instance_id, 0); + idata->idle_limit = static_cast(time(nullptr)) + db->timeout; + idata->idle_timer = add_timer(gettick() + db->timeout * 1000, instance_delete_timer, instance_id, 0); - switch(im->mode) { + switch(idata->mode) { case IM_NONE: break; case IM_CHAR: - if (map_charid2sd(im->owner_id) != NULL && instance_searchtype_db(im->type) != NULL) // Notify player of added instance timer - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (map_charid2sd(idata->owner_id)) // Notify player of added instance timer + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; case IM_PARTY: - if (party_search(im->owner_id) != NULL && instance_searchtype_db(im->type) != NULL) // Notify party of added instance timer - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (party_search(idata->owner_id)) // Notify party of added instance timer + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; case IM_GUILD: - if (guild_search(im->owner_id) != NULL && instance_searchtype_db(im->type) != NULL) // Notify guild of added instance timer - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (guild_search(idata->owner_id)) // Notify guild of added instance timer + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; case IM_CLAN: - if (clan_search(im->owner_id) != NULL && instance_searchtype_db(im->type) != NULL) // Notify clan of added instance timer - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (clan_search(idata->owner_id)) // Notify clan of added instance timer + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; default: - return 1; + return false; } - return 0; + return true; } -/*========================================== - * Delete the idle timer - *------------------------------------------*/ -static int instance_stopidletimer(struct instance_data *im, unsigned short instance_id) +/** + * Remove the idle timer from an instance + * @param idata: Instace data + * @param instance_id: Instance ID to notify + * @return True on success or false on failure + */ +bool instance_stopidletimer(std::shared_ptr idata, int instance_id) { - nullpo_retr(0, im); - // No timer - if(im->idle_timer == INVALID_TIMER) - return 1; + if (!idata || idata->idle_timer == INVALID_TIMER) + return false; // Delete the timer - Party has returned or instance is destroyed - im->idle_limit = 0; - delete_timer(im->idle_timer, instance_delete_timer); - im->idle_timer = INVALID_TIMER; + idata->idle_limit = 0; + delete_timer(idata->idle_timer, instance_delete_timer); + idata->idle_timer = INVALID_TIMER; - switch(im->mode) { + switch(idata->mode) { case IM_NONE: break; case IM_CHAR: - if (map_charid2sd(im->owner_id) != NULL) // Notify the player - clif_instance_changestatus(instance_id, 0, im->idle_limit); + if (map_charid2sd(idata->owner_id)) // Notify the player + clif_instance_changestatus(instance_id, IN_NOTIFY, idata->idle_limit); break; case IM_PARTY: - if (party_search(im->owner_id) != NULL) // Notify the party - clif_instance_changestatus(instance_id, 0, im->idle_limit); + if (party_search(idata->owner_id)) // Notify the party + clif_instance_changestatus(instance_id, IN_NOTIFY, idata->idle_limit); break; case IM_GUILD: - if (guild_search(im->owner_id) != NULL) // Notify the guild - clif_instance_changestatus(instance_id, 0, im->idle_limit); + if (guild_search(idata->owner_id)) // Notify the guild + clif_instance_changestatus(instance_id, IN_NOTIFY, idata->idle_limit); break; case IM_CLAN: - if (clan_search(im->owner_id) != NULL) // Notify the clan - clif_instance_changestatus(instance_id, 0, im->idle_limit); + if (clan_search(idata->owner_id)) // Notify the clan + clif_instance_changestatus(instance_id, IN_NOTIFY, idata->idle_limit); break; default: - return 1; + return false; } - return 0; + return true; } -/*========================================== +/** * Run the OnInstanceInit events for duplicated NPCs - *------------------------------------------*/ + */ static int instance_npcinit(struct block_list *bl, va_list ap) { struct npc_data* nd; @@ -311,9 +475,9 @@ static int instance_npcinit(struct block_list *bl, va_list ap) return npc_instanceinit(nd); } -/*========================================== +/** * Run the OnInstanceDestroy events for duplicated NPCs - *------------------------------------------*/ + */ static int instance_npcdestroy(struct block_list *bl, va_list ap) { struct npc_data* nd; @@ -325,9 +489,9 @@ static int instance_npcdestroy(struct block_list *bl, va_list ap) return npc_instancedestroy(nd); } -/*========================================== - * Add an NPC to an instance - *------------------------------------------*/ +/** + * Update instance with new NPC + */ static int instance_addnpc_sub(struct block_list *bl, va_list ap) { struct npc_data* nd; @@ -339,352 +503,324 @@ static int instance_addnpc_sub(struct block_list *bl, va_list ap) return npc_duplicate4instance(nd, va_arg(ap, int)); } -// Separate function used for reloading -void instance_addnpc(struct instance_data *im) +/** + * Add an NPC to an instance + * @param idata: Instance data + */ +void instance_addnpc(std::shared_ptr idata) { - int i; - // First add the NPCs - for (i = 0; i < im->cnt_map; i++) { - struct map_data *mapdata = map_getmapdata(im->map[i]->src_m); + for (const auto &it : idata->map) { + struct map_data *mapdata = map_getmapdata(it.m); - map_foreachinallarea(instance_addnpc_sub, im->map[i]->src_m, 0, 0, mapdata->xs, mapdata->ys, BL_NPC, im->map[i]->m); + map_foreachinallarea(instance_addnpc_sub, it.src_m, 0, 0, mapdata->xs, mapdata->ys, BL_NPC, it.m); } // Now run their OnInstanceInit - for (i = 0; i < im->cnt_map; i++) { - struct map_data *mapdata = map_getmapdata(im->map[i]->m); - - map_foreachinallarea(instance_npcinit, im->map[i]->m, 0, 0, mapdata->xs, mapdata->ys, BL_NPC, im->map[i]->m); - } + for (const auto &it : idata->map) { + struct map_data *mapdata = map_getmapdata(it.m); + map_foreachinallarea(instance_npcinit, it.m, 0, 0, mapdata->xs, mapdata->ys, BL_NPC, it.m); + } } -/*-------------------------------------- - * name : instance name - * Return value could be - * -4 = no free instances | -3 = already exists | -2 = character/party/guild not found | -1 = invalid type - * On success return instance_id - *--------------------------------------*/ -int instance_create(int owner_id, const char *name, enum instance_mode mode) { - struct instance_db *db = instance_searchname_db(name); - struct map_session_data *sd = NULL; - struct party_data *pd = NULL; - struct guild *gd = NULL; - struct clan* cd = NULL; - unsigned short i; +/** + * Create an instance + * @param owner_id: Owner block ID + * @param name: Instance name + * @param mode: Instance mode + * @return -4 = no free instances | -3 = already exists | -2 = character/party/guild not found | -1 = invalid type | On success return instance_id + */ +int instance_create(int owner_id, const char *name, e_instance_mode mode) { + std::shared_ptr db = instance_search_db_name(name); - nullpo_retr(-1, db); + if (!db) { + ShowError("instance_create: Unknown instance %s creation was attempted.\n", name); + return -1; + } + + struct map_session_data *sd; + struct party_data *pd; + struct guild *gd; + struct clan* cd; switch(mode) { case IM_NONE: break; case IM_CHAR: - if ((sd = map_charid2sd(owner_id)) == NULL) { - ShowError("instance_create: character %d not found for instance '%s'.\n", owner_id, name); + if (!(sd = map_charid2sd(owner_id))) { + ShowError("instance_create: Character %d not found for instance '%s'.\n", owner_id, name); return -2; } - if (sd->instance_id) + if (sd->instance_id > 0) return -3; // Player already instancing break; case IM_PARTY: - if ((pd = party_search(owner_id)) == NULL) { - ShowError("instance_create: party %d not found for instance '%s'.\n", owner_id, name); + if (!(pd = party_search(owner_id))) { + ShowError("instance_create: Party %d not found for instance '%s'.\n", owner_id, name); return -2; } - if (pd->instance_id) + if (pd->instance_id > 0) return -3; // Party already instancing break; case IM_GUILD: - if ((gd = guild_search(owner_id)) == NULL) { - ShowError("instance_create: guild %d not found for instance '%s'.\n", owner_id, name); + if (!(gd = guild_search(owner_id))) { + ShowError("instance_create: Guild %d not found for instance '%s'.\n", owner_id, name); return -2; } - if (gd->instance_id) + if (gd->instance_id > 0) return -3; // Guild already instancing break; case IM_CLAN: - if ((cd = clan_search(owner_id)) == NULL) { - ShowError("instance_create: clan %d not found for instance '%s'.\n", owner_id, name); + if (!(cd = clan_search(owner_id))) { + ShowError("instance_create: Clan %d not found for instance '%s'.\n", owner_id, name); return -2; } - if (cd->instance_id) + if (cd->instance_id > 0) return -3; // Clan already instancing break; default: - ShowError("instance_create: unknown mode %u for owner_id %d and name %s.\n", mode, owner_id, name); + ShowError("instance_create: Unknown mode %u for owner_id %d and name %s.\n", mode, owner_id, name); return -2; } - // Searching a Free Instance - // 0 is ignored as this means "no instance" on maps - ARR_FIND(1, MAX_INSTANCE_DATA, i, instance_data[i].state == INSTANCE_FREE); - if( i >= MAX_INSTANCE_DATA ) + if (instance_count <= 0) return -4; - instance_data[i].type = db->id; - instance_data[i].state = INSTANCE_IDLE; - instance_data[i].owner_id = owner_id; - instance_data[i].mode = mode; - instance_data[i].keep_limit = 0; - instance_data[i].keep_timer = INVALID_TIMER; - instance_data[i].idle_limit = 0; - instance_data[i].idle_timer = INVALID_TIMER; - instance_data[i].regs.vars = i64db_alloc(DB_OPT_RELEASE_DATA); - instance_data[i].regs.arrays = NULL; - instance_data[i].cnt_map = 0; + int instance_id = instance_count++; + std::shared_ptr entry = std::make_shared(); + + entry->id = db->id; + entry->owner_id = owner_id; + entry->mode = mode; + entry->regs.vars = i64db_alloc(DB_OPT_RELEASE_DATA); + entry->regs.arrays = nullptr; + instances.insert({ instance_id, entry }); switch(mode) { case IM_CHAR: - sd->instance_id = i; + sd->instance_id = instance_id; break; case IM_PARTY: - pd->instance_id = i; + pd->instance_id = instance_id; break; case IM_GUILD: - gd->instance_id = i; + gd->instance_id = instance_id; break; case IM_CLAN: - cd->instance_id = i; + cd->instance_id = instance_id; break; } - instance_wait.id[instance_wait.count++] = i; - - clif_instance_create(i, instance_wait.count); - + instance_wait.id.push_back(instance_id); + clif_instance_create(instance_id, instance_wait.id.size()); instance_subscription_timer(0,0,0,0); - ShowInfo("[Instance] Created: %s (%hu).\n", name, i); + ShowInfo("[Instance] Created: %s (%d).\n", name, instance_id); // Start the instance timer on instance creation - instance_startkeeptimer(&instance_data[i], i); + instance_startkeeptimer(entry, instance_id); - return i; + return instance_id; } -/*-------------------------------------- +/** * Adds maps to the instance - *--------------------------------------*/ -int instance_addmap(unsigned short instance_id) { - int i, m; - struct instance_data *im; - struct instance_db *db; - struct s_instance_map *entry; - - if (instance_id == 0) + * @param instance_id: Instance ID to add map to + * @return 0 on failure or map count on success + */ +int instance_addmap(int instance_id) { + if (instance_id <= 0) return 0; - im = &instance_data[instance_id]; + std::shared_ptr idata = util::umap_find(instances, instance_id); // If the instance isn't idle, we can't do anything - if (im->state != INSTANCE_IDLE) + if (idata->state != INSTANCE_IDLE) return 0; - if ((db = instance_searchtype_db(im->type)) == NULL) + std::shared_ptr db = instance_db.find(idata->id); + + if (!db) return 0; // Set to busy, update timers - im->state = INSTANCE_BUSY; - im->idle_limit = (unsigned int)time(NULL) + db->timeout; - im->idle_timer = add_timer(gettick() + db->timeout * 1000, instance_delete_timer, instance_id, 0); + idata->state = INSTANCE_BUSY; + idata->idle_limit = static_cast(time(nullptr)) + db->timeout; + idata->idle_timer = add_timer(gettick() + db->timeout * 1000, instance_delete_timer, instance_id, 0); - // Add the maps - if (db->maplist_count > MAX_MAP_PER_INSTANCE) { - ShowError("instance_addmap: Too many maps (%d) created for a single instance '%s' (%hu).\n", db->maplist_count, StringBuf_Value(db->name), instance_id); - return 0; - } + int16 m; // Add initial map - if ((m = map_addinstancemap(StringBuf_Value(db->enter.mapname), instance_id)) < 0) { - ShowError("instance_addmap: Failed to create initial map for instance '%s' (%hu).\n", StringBuf_Value(db->name), instance_id); + if ((m = map_addinstancemap(db->enter.map, instance_id)) < 0) { + ShowError("instance_addmap: Failed to create initial map for instance '%s' (%d).\n", db->name.c_str(), instance_id); return 0; } - entry = ers_alloc(instance_maps_ers, struct s_instance_map); - entry->m = m; - entry->src_m = map_mapname2mapid(StringBuf_Value(db->enter.mapname)); - RECREATE(im->map, struct s_instance_map *, im->cnt_map + 1); - im->map[im->cnt_map++] = entry; + + struct s_instance_map entry; + + entry.m = m; + entry.src_m = db->enter.map; + idata->map.push_back(entry); // Add extra maps (if any) - for(i = 0; i < db->maplist_count; i++) { - if(strlen(StringBuf_Value(db->maplist[i])) < 1) - continue; - else if( (m = map_addinstancemap(StringBuf_Value(db->maplist[i]), instance_id)) < 0) { - // An error occured adding a map - ShowError("instance_addmap: No maps added to instance '%s' (%hu).\n", StringBuf_Value(db->name), instance_id); + for (const auto &it : db->maplist) { + if ((m = map_addinstancemap(it, instance_id)) < 0) { // An error occured adding a map + ShowError("instance_addmap: No maps added to instance '%s' (%d).\n", db->name.c_str(), instance_id); return 0; } else { - entry = ers_alloc(instance_maps_ers, struct s_instance_map); - entry->m = m; - entry->src_m = map_mapname2mapid(StringBuf_Value(db->maplist[i])); - RECREATE(im->map, struct s_instance_map *, im->cnt_map + 1); - im->map[im->cnt_map++] = entry; + entry.m = m; + entry.src_m = it; + idata->map.push_back(entry); } } // Create NPCs on all maps - instance_addnpc(im); + instance_addnpc(idata); - switch(im->mode) { + switch(idata->mode) { case IM_NONE: break; case IM_CHAR: - if (map_charid2sd(im->owner_id) != NULL) // Inform player of the created instance - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (map_charid2sd(idata->owner_id)) // Inform player of the created instance + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; case IM_PARTY: - if (party_search(im->owner_id) != NULL) // Inform party members of the created instance - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (party_search(idata->owner_id)) // Inform party members of the created instance + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; case IM_GUILD: - if (guild_search(im->owner_id) != NULL) // Inform guild members of the created instance - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (guild_search(idata->owner_id)) // Inform guild members of the created instance + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; case IM_CLAN: - if (clan_search(im->owner_id) != NULL) // Inform clan members of the created instance - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + if (clan_search(idata->owner_id)) // Inform clan members of the created instance + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); break; default: return 0; } - return im->cnt_map; + return idata->map.size(); } - -/*========================================== - * Returns an instance map ID using a map name - * name : source map - * instance_id : where to search - * result : mapid of map "name" in this instance - *------------------------------------------*/ -int16 instance_mapname2mapid(const char *name, unsigned short instance_id) +/** + * Returns an instance map ID + * @param m: Source map ID + * @param instance_id: Instance to search + * @return Map ID in this instance + */ +int16 instance_mapid(int16 m, int instance_id) { - struct instance_data *im; - int16 m = map_mapname2mapid(name); - char iname[MAP_NAME_LENGTH]; - int i; - if(m < 0) { - ShowError("instance_mapname2mapid: map name %s does not exist.\n",name); - return m; + ShowError("instance_mapid: Map ID %d does not exist.\n", m); + return -1; } - strcpy(iname,name); + std::shared_ptr idata = util::umap_find(instances, instance_id); - if(instance_id == 0 || instance_id > MAX_INSTANCE_DATA) - return m; + if(!idata || idata->state != INSTANCE_BUSY) + return -1; - im = &instance_data[instance_id]; - if(im->state != INSTANCE_BUSY) - return m; + const char *iname = map_mapid2mapname(m); - for(i = 0; i < im->cnt_map; i++) - if(im->map[i]->src_m == m) { + for (const auto &it : idata->map) { + if (it.src_m == m) { char alt_name[MAP_NAME_LENGTH]; - if((strchr(iname,'@') == NULL) && strlen(iname) > 8) { - memmove(iname, iname+(strlen(iname)-9), strlen(iname)); - snprintf(alt_name, sizeof(alt_name),"%hu#%s", instance_id, iname); - } else - snprintf(alt_name, sizeof(alt_name),"%.3hu%s", instance_id, iname); + + if (!(strchr(iname, '@')) && strlen(iname) > 8) { + memmove((void*)iname, iname + (strlen(iname) - 9), strlen(iname)); + snprintf(alt_name, sizeof(alt_name), "%d#%s", instance_id, iname); + } + else + snprintf(alt_name, sizeof(alt_name), "%.3d%s", instance_id, iname); return map_mapname2mapid(alt_name); } + } return m; } -/*========================================== - * Removes a instance, all its maps and npcs. - *------------------------------------------*/ -int instance_destroy(unsigned short instance_id) +/** + * Removes an instance, all its maps, and NPCs. + * @param instance_id: Instance to remove + * @return True on sucess or false on failure + */ +bool instance_destroy(int instance_id) { - struct instance_data *im; - struct map_session_data *sd = NULL; - struct party_data *pd = NULL; - struct guild *gd = NULL; - struct clan *cd = NULL; - int i, type = 0; - unsigned int now = (unsigned int)time(NULL); - enum instance_mode mode; + std::shared_ptr idata = util::umap_find(instances, instance_id); - if(instance_id == 0 || instance_id > MAX_INSTANCE_DATA) - return 1; + if (!idata) + return false; - im = &instance_data[instance_id]; + struct map_session_data *sd; + struct party_data *pd; + struct guild *gd; + struct clan *cd; + e_instance_mode mode = idata->mode; + e_instance_notify type = IN_NOTIFY; - if(im->state == INSTANCE_FREE) - return 1; - - mode = im->mode; switch(mode) { case IM_NONE: break; case IM_CHAR: - sd = map_charid2sd(im->owner_id); + sd = map_charid2sd(idata->owner_id); break; case IM_PARTY: - pd = party_search(im->owner_id); + pd = party_search(idata->owner_id); break; case IM_GUILD: - gd = guild_search(im->owner_id); + gd = guild_search(idata->owner_id); break; case IM_CLAN: - cd = clan_search(im->owner_id); + cd = clan_search(idata->owner_id); break; } - if(im->state == INSTANCE_IDLE) { - for(i = 0; i < instance_wait.count; i++) { - if(instance_wait.id[i] == instance_id) { - instance_wait.count--; - memmove(&instance_wait.id[i],&instance_wait.id[i+1],sizeof(instance_wait.id[0])*(instance_wait.count-i)); - memset(&instance_wait.id[instance_wait.count], 0, sizeof(instance_wait.id[0])); + if(idata->state == INSTANCE_IDLE) { + for (auto instance_it = instance_wait.id.begin(); instance_it != instance_wait.id.end(); ++instance_it) { + if (*instance_it == instance_id) { + instance_wait.id.erase(instance_it); - for(i = 0; i < instance_wait.count; i++) - if(instance_data[instance_wait.id[i]].state == INSTANCE_IDLE) + for (int i = 0; i < instance_wait.id.size(); i++) { + if (util::umap_find(instances, instance_wait.id[i])->state == INSTANCE_IDLE) if ((mode == IM_CHAR && sd) || (mode == IM_PARTY && pd) || (mode == IM_GUILD && gd) || (mode == IM_CLAN && cd)) clif_instance_changewait(instance_id, i + 1); + } - if(instance_wait.count) - instance_wait.timer = add_timer(gettick()+INSTANCE_INTERVAL, instance_subscription_timer, 0, 0); + if (!instance_wait.id.empty()) + instance_wait.timer = add_timer(gettick() + INSTANCE_INTERVAL, instance_subscription_timer, 0, 0); else instance_wait.timer = INVALID_TIMER; - type = 0; break; } } } else { - if(im->keep_limit && im->keep_limit <= now) - type = 1; - else if(im->idle_limit && im->idle_limit <= now) - type = 2; + unsigned int now = static_cast(time(nullptr)); + + if(idata->keep_limit && idata->keep_limit <= now) + type = IN_DESTROY_LIVE_TIMEOUT; + else if(idata->idle_limit && idata->idle_limit <= now) + type = IN_DESTROY_ENTER_TIMEOUT; else - type = 3; + type = IN_DESTROY_USER_REQUEST; // Run OnInstanceDestroy on all NPCs in the instance - for(i = 0; i < im->cnt_map; i++){ - struct map_data *mapdata = map_getmapdata(im->map[i]->m); + for (const auto &it : idata->map) { + struct map_data *mapdata = map_getmapdata(it.m); - map_foreachinallarea(instance_npcdestroy, im->map[i]->m, 0, 0, mapdata->xs, mapdata->ys, BL_NPC, im->map[i]->m); + map_foreachinallarea(instance_npcdestroy, it.m, 0, 0, mapdata->xs, mapdata->ys, BL_NPC, it.m); + map_delinstancemap(it.m); } - - for(i = 0; i < im->cnt_map; i++) { - map_delinstancemap(im->map[i]->m); - ers_free(instance_maps_ers, im->map[i]); - } - im->cnt_map = 0; - aFree(im->map); - im->map = NULL; } - if(im->keep_timer != INVALID_TIMER) { - delete_timer(im->keep_timer, instance_delete_timer); - im->keep_timer = INVALID_TIMER; + if(idata->keep_timer != INVALID_TIMER) { + delete_timer(idata->keep_timer, instance_delete_timer); + idata->keep_timer = INVALID_TIMER; } - if(im->idle_timer != INVALID_TIMER) { - delete_timer(im->idle_timer, instance_delete_timer); - im->idle_timer = INVALID_TIMER; + if(idata->idle_timer != INVALID_TIMER) { + delete_timer(idata->idle_timer, instance_delete_timer); + idata->idle_timer = INVALID_TIMER; } if (mode == IM_CHAR && sd) @@ -697,60 +833,64 @@ int instance_destroy(unsigned short instance_id) cd->instance_id = 0; if (mode != IM_NONE) { - if(type) + if(type != IN_NOTIFY) clif_instance_changestatus(instance_id, type, 0); else clif_instance_changewait(instance_id, 0xffff); } - if( im->regs.vars ) { - db_destroy(im->regs.vars); - im->regs.vars = NULL; + if( idata->regs.vars ) { + db_destroy(idata->regs.vars); + idata->regs.vars = NULL; } - if( im->regs.arrays ) - instance_data[instance_id].regs.arrays->destroy(instance_data[instance_id].regs.arrays, script_free_array_db); + if( idata->regs.arrays ) + idata->regs.arrays->destroy(idata->regs.arrays, script_free_array_db); - ShowInfo("[Instance] Destroyed %hu.\n", instance_id); + ShowInfo("[Instance] Destroyed %d.\n", instance_id); - memset(&instance_data[instance_id], 0, sizeof(instance_data[instance_id])); + instances.erase(instance_id); - return 0; + return true; } -/*========================================== - * Warp a user into instance - *------------------------------------------*/ -enum e_instance_enter instance_enter(struct map_session_data *sd, unsigned short instance_id, const char *name, short x, short y) +/** + * Warp a user into an instance + * @param sd: Player to warp + * @param instance_id: Instance to warp to + * @param name: Map name + * @param x: X coordinate + * @param y: Y coordinate + * @return e_instance_enter value + */ +e_instance_enter instance_enter(struct map_session_data *sd, int instance_id, const char *name, short x, short y) { - struct instance_data *im = NULL; - struct instance_db *db = NULL; - struct party_data *pd = NULL; - struct guild *gd = NULL; - struct clan *cd = NULL; - enum instance_mode mode; - int16 m; - nullpo_retr(IE_OTHER, sd); - if( (db = instance_searchname_db(name)) == NULL ){ - ShowError( "instance_enter: Unknown instance \"%s\".\n", name ); + std::shared_ptr db = instance_search_db_name(name); + + if (!db) { + ShowError("instance_enter: Unknown instance \"%s\".\n", name); return IE_OTHER; } - + // If one of the two coordinates was not given or is below zero, we use the entry point from the database - if( x < 0 || y < 0 ){ + if (x < 0 || y < 0) { x = db->enter.x; y = db->enter.y; } - - // Check if it is a valid instance - if( instance_id == 0 ){ - // im will stay NULL and by default party checks will be used + + std::shared_ptr idata = nullptr; + struct party_data *pd; + struct guild *gd; + struct clan *cd; + e_instance_mode mode; + + if (instance_id <= 0) // Default party checks will be used mode = IM_PARTY; - }else{ - im = &instance_data[instance_id]; - mode = im->mode; + else { + idata = util::umap_find(instances, instance_id); + mode = idata->mode; } switch(mode) { @@ -759,48 +899,50 @@ enum e_instance_enter instance_enter(struct map_session_data *sd, unsigned short case IM_CHAR: if (sd->instance_id == 0) // Player must have an instance return IE_NOINSTANCE; - if (im->owner_id != sd->status.char_id) + if (idata->owner_id != sd->status.char_id) return IE_OTHER; break; case IM_PARTY: if (sd->status.party_id == 0) // Character must be in instance party return IE_NOMEMBER; - if ((pd = party_search(sd->status.party_id)) == NULL) + if (!(pd = party_search(sd->status.party_id))) return IE_NOMEMBER; - if (pd->instance_id == 0 || im == NULL) // Party must have an instance + if (pd->instance_id == 0 || idata == nullptr) // Party must have an instance return IE_NOINSTANCE; - if (im->owner_id != pd->party.party_id) + if (idata->owner_id != pd->party.party_id) return IE_OTHER; break; case IM_GUILD: if (sd->status.guild_id == 0) // Character must be in instance guild return IE_NOMEMBER; - if ((gd = guild_search(sd->status.guild_id)) == NULL) + if (!(gd = guild_search(sd->status.guild_id))) return IE_NOMEMBER; if (gd->instance_id == 0) // Guild must have an instance return IE_NOINSTANCE; - if (im->owner_id != gd->guild_id) + if (idata->owner_id != gd->guild_id) return IE_OTHER; break; case IM_CLAN: if (sd->status.clan_id == 0) // Character must be in instance clan return IE_NOMEMBER; - if ((cd = clan_search(sd->status.clan_id)) == NULL) + if (!(cd = clan_search(sd->status.clan_id))) return IE_NOMEMBER; if (cd->instance_id == 0) // Clan must have an instance return IE_NOINSTANCE; - if (im->owner_id != cd->id) + if (idata->owner_id != cd->id) return IE_OTHER; break; } - if (im->state != INSTANCE_BUSY) + if (idata->state != INSTANCE_BUSY) return IE_OTHER; - if (im->type != db->id) + if (idata->id != db->id) return IE_OTHER; + int16 m; + // Does the instance match? - if ((m = instance_mapname2mapid(StringBuf_Value(db->enter.mapname), instance_id)) < 0) + if ((m = instance_mapid(db->enter.map, instance_id)) < 0) return IE_OTHER; if (pc_setpos(sd, map_id2index(m), x, y, CLR_OUTSIGHT)) @@ -809,293 +951,120 @@ enum e_instance_enter instance_enter(struct map_session_data *sd, unsigned short return IE_OK; } -/*========================================== +/** * Request some info about the instance - *------------------------------------------*/ -int instance_reqinfo(struct map_session_data *sd, unsigned short instance_id) + * @param sd: Player to display info to + * @param instance_id: Instance to request + * @return True on success or false on failure + */ +bool instance_reqinfo(struct map_session_data *sd, int instance_id) { - struct instance_data *im; + nullpo_retr(false, sd); - nullpo_retr(1, sd); + std::shared_ptr idata = util::umap_find(instances, instance_id); - if(instance_id == 0 || instance_id > MAX_INSTANCE_DATA) - return 1; - - im = &instance_data[instance_id]; - - if(instance_searchtype_db(im->type) == NULL) - return 1; + if (!idata || !instance_db.find(idata->id)) + return false; // Say it's created if instance is not busy - if(im->state == INSTANCE_IDLE) { - int i; - - for(i = 0; i < instance_wait.count; i++) { - if(instance_wait.id[i] == instance_id) { + if(idata->state == INSTANCE_IDLE) { + for (int i = 0; i < instance_wait.id.size(); i++) { + if (instance_wait.id[i] == instance_id) { clif_instance_create(instance_id, i + 1); break; } } - } else if(im->state == INSTANCE_BUSY) // Give info on the instance if busy - clif_instance_status(instance_id, im->keep_limit, im->idle_limit); + } else if(idata->state == INSTANCE_BUSY) // Give info on the instance if busy + clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit); - return 0; -} - -/*========================================== - * Add players to the instance (for timers) - *------------------------------------------*/ -int instance_addusers(unsigned short instance_id) -{ - struct instance_data *im; - - if(instance_id == 0 || instance_id > MAX_INSTANCE_DATA) - return 1; - - im = &instance_data[instance_id]; - if(im->state != INSTANCE_BUSY) - return 1; - - // Stop the idle timer if we had one - instance_stopidletimer(im, instance_id); - - // Start the instance keep timer - instance_startkeeptimer(im, instance_id); - - return 0; -} - -/*========================================== - * Delete players from the instance (for timers) - *------------------------------------------*/ -int instance_delusers(unsigned short instance_id) -{ - struct instance_data *im; - int i, users = 0; - - if(instance_id == 0 || instance_id > MAX_INSTANCE_DATA) - return 1; - - im = &instance_data[instance_id]; - if(im->state != INSTANCE_BUSY) - return 1; - - // If no one is in the instance, start the idle timer - for(i = 0; i < im->cnt_map && im->map[i]->m; i++) - users += max(map_getmapdata(im->map[i]->m)->users,0); - - // We check the actual map.users before being updated, hence the 1 - // The instance should be empty if users are now <= 1 - if(users <= 1) - instance_startidletimer(im, instance_id); - - return 0; -} - -static bool instance_db_free_sub(struct instance_db *db); - -/*========================================== - * Read the instance_db.txt file - *------------------------------------------*/ -static bool instance_readdb_sub(char* str[], int columns, int current) -{ - uint8 i,j; - char *ptr; - int id = strtol(str[0], &ptr, 10); - struct instance_db *db; - bool isNew = false; - - if (!id || id > USHRT_MAX || *ptr) { - ShowError("instance_readdb_sub: Cannot add instance with ID '%d'. Valid IDs are 1 ~ %d, skipping...\n", id, USHRT_MAX); - return false; - } - - if (mapindex_name2id(str[4]) == 0) { - ShowError("instance_readdb_sub: Invalid map '%s' as entrance map, skipping...\n", str[4]); - return false; - } - - if (!(db = (struct instance_db *)uidb_get(InstanceDB, id))) { - CREATE(db, struct instance_db, 1); - db->id = id; - db->name = StringBuf_Malloc(); - db->enter.mapname = StringBuf_Malloc(); - isNew = true; - } else { - StringBuf_Clear(db->name); - StringBuf_Clear(db->enter.mapname); - if (db->maplist_count) { - for (i = 0; i < db->maplist_count; i++) - StringBuf_Free(db->maplist[i]); - aFree(db->maplist); - db->maplist = NULL; - } - db->maplist_count = 0; - } - - StringBuf_AppendStr(db->name, str[1]); - - db->limit = strtol(str[2], &ptr, 10); - if (*ptr) { - ShowError("instance_readdb_sub: TimeLimit must be an integer value for instance '%d', skipping...\n", id); - instance_db_free_sub(db); - return false; - } - - db->timeout = strtol(str[3], &ptr, 10); - if (*ptr) { - ShowError("instance_readdb_sub: IdleTimeOut must be an integer value for instance '%d', skipping...\n", id); - instance_db_free_sub(db); - return false; - } - - StringBuf_AppendStr(db->enter.mapname, str[4]); - - db->enter.x = (short)strtol(str[5], &ptr, 10); - if (*ptr) { - ShowError("instance_readdb_sub: EnterX must be an integer value for instance '%d', skipping...\n", id); - instance_db_free_sub(db); - return false; - } - - db->enter.y = (short)strtol(str[6], &ptr, 10); - if (*ptr) { - ShowError("instance_readdb_sub: EnterY must be an integer value for instance '%d', skipping...\n", id); - instance_db_free_sub(db); - return false; - } - - //Instance maps - for (i = 7; i < columns; i++) { - if (strlen(str[i])) { - if (mapindex_name2id(str[i]) == 0) { - ShowWarning("instance_readdb_sub: Invalid map '%s' in maplist, skipping...\n", str[i]); - continue; - } - - if (strcmpi(str[4], str[i]) == 0) { - ShowWarning("instance_readdb_sub: '%s'(Map%d) must not be equal to EnterMap for instance id '%d', skipping...\n", str[i], i - 5, id); - continue; - } - - // Check if the map is in the list already - for (j = 7; j < i; j++) { - // Skip empty columns - if (!strlen(str[j])) { - continue; - } - - if (strcmpi(str[j], str[i]) == 0) { - break; - } - } - - // If it was already in the list - if (j < i) { - ShowWarning("instance_readdb_sub: '%s'(Map%d) was already added for instance id '%d', skipping...\n", str[i], i - 5, id); - continue; // Skip it - } - - RECREATE(db->maplist, StringBuf *, db->maplist_count+1); - db->maplist[db->maplist_count] = StringBuf_Malloc(); - StringBuf_AppendStr(db->maplist[db->maplist_count], str[i]); - db->maplist_count++; - } - } - - if (isNew) { - uidb_put(InstanceDB, id, db); - strdb_uiput(InstanceNameDB, StringBuf_Value(db->name), id); - } return true; } /** - * Free InstanceDB single entry - * @param db Instance Db entry - **/ -static bool instance_db_free_sub(struct instance_db *db) { - if (!db) - return 1; - StringBuf_Free(db->name); - StringBuf_Free(db->enter.mapname); - if (db->maplist_count) { - uint8 i; - for (i = 0; i < db->maplist_count; i++) - StringBuf_Free(db->maplist[i]); - aFree(db->maplist); - } - aFree(db); - return 0; + * Add players to the instance (for timers) -- Unused? + * @param instance_id: Instance to add + * @return True on success or false on failure + */ +bool instance_addusers(int instance_id) +{ + std::shared_ptr idata = util::umap_find(instances, instance_id); + + if(!idata || idata->state != INSTANCE_BUSY) + return false; + + // Stop the idle timer if we had one + instance_stopidletimer(idata, instance_id); + + // Start the instance keep timer + instance_startkeeptimer(idata, instance_id); + + return true; } /** - * Free InstanceDB entries - **/ -static int instance_db_free(DBKey key, DBData *data, va_list ap) { - struct instance_db *db = (struct instance_db *)db_data2ptr(data); - return instance_db_free_sub(db); + * Delete players from the instance (for timers) + * @param instance_id: Instance to remove + * @return True on success or false on failure + */ +bool instance_delusers(int instance_id) +{ + std::shared_ptr idata = util::umap_find(instances, instance_id); + + if(!idata || idata->state != INSTANCE_BUSY) + return false; + + int users = 0; + + // If no one is in the instance, start the idle timer + for (const auto &it : idata->map) + users += max(map_getmapdata(it.m)->users,0); + + // We check the actual map.users before being updated, hence the 1 + // The instance should be empty if users are now <= 1 + if(users <= 1) + instance_startidletimer(idata, instance_id); + + return true; } /** - * Read instance_db.txt files - **/ -void instance_readdb(void) { - const char* filename[] = { DBPATH"instance_db.txt", "import/instance_db.txt"}; - int f; - - for (f = 0; f 0); - } -} - -/** - * Reload Instance DB - **/ -void instance_reload(void) { - InstanceDB->clear(InstanceDB, instance_db_free); - db_clear(InstanceNameDB); - instance_readdb(); -} - -/*========================================== * Reloads the instance in runtime (reloadscript) - *------------------------------------------*/ + */ void do_reload_instance(void) { - struct instance_data *im; - struct instance_db *db = NULL; - struct s_mapiterator* iter; - struct map_session_data *sd; - unsigned short i; + for (const auto &it : instances) { + std::shared_ptr idata = it.second; - for( i = 1; i < MAX_INSTANCE_DATA; i++ ) { - im = &instance_data[i]; - if(!im->cnt_map) + if (!idata || idata->map.empty()) continue; else { // First we load the NPCs again - instance_addnpc(im); + instance_addnpc(idata); // Create new keep timer - if((db = instance_searchtype_db(im->type)) != NULL) - im->keep_limit = (unsigned int)time(NULL) + db->limit; + std::shared_ptr db = instance_db.find(idata->id); + + if (db) + idata->keep_limit = static_cast(time(nullptr)) + db->limit; } } // Reset player to instance beginning - iter = mapit_getallusers(); - for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) ) { + struct s_mapiterator *iter = mapit_getallusers(); + struct map_session_data *sd; + + for (sd = (TBL_PC *)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC *)mapit_next(iter)) { struct map_data *mapdata = map_getmapdata(sd->bl.m); - if(sd && mapdata->instance_id) { - struct party_data *pd = NULL; - struct guild *gd = NULL; - struct clan *cd = NULL; - unsigned short instance_id; + if (sd && mapdata->instance_id > 0) { + struct party_data *pd; + struct guild *gd; + struct clan *cd; + int instance_id; + std::shared_ptr idata = util::umap_find(instances, map[sd->bl.m].instance_id); + std::shared_ptr db = instance_db.find(idata->id); - im = &instance_data[mapdata->instance_id]; - switch (im->mode) { + switch (idata->mode) { case IM_NONE: continue; case IM_CHAR: @@ -1119,42 +1088,35 @@ void do_reload_instance(void) instance_id = cd->instance_id; break; default: - ShowError("do_reload_instance: Unexpected instance mode for instance %s (id=%u, mode=%u).\n", (db) ? StringBuf_Value(db->name) : "Unknown", mapdata->instance_id, (unsigned short)im->mode); + ShowError("do_reload_instance: Unexpected instance mode for instance %s (id=%d, mode=%u).\n", (db) ? db->name.c_str() : "Unknown", mapdata->instance_id, (uint8)idata->mode); continue; } - if((db = instance_searchtype_db(im->type)) != NULL && !instance_enter(sd, instance_id, StringBuf_Value(db->name), -1, -1)) { // All good - clif_displaymessage(sd->fd, msg_txt(sd,515)); // Instance has been reloaded - instance_reqinfo(sd,instance_id); + if (db && instance_enter(sd, instance_id, db->name.c_str(), -1, -1) == IE_OK) { // All good + clif_displaymessage(sd->fd, msg_txt(sd, 515)); // Instance has been reloaded + instance_reqinfo(sd, instance_id); } else // Something went wrong - ShowError("do_reload_instance: Error setting character at instance start: character_id=%d instance=%s.\n",sd->status.char_id,StringBuf_Value(db->name)); + ShowError("do_reload_instance: Error setting character at instance start: character_id=%d instance=%s.\n", sd->status.char_id, db->name.c_str()); } } mapit_free(iter); } +/** + * Initializes the instance database + */ void do_init_instance(void) { - InstanceDB = uidb_alloc(DB_OPT_BASE); - InstanceNameDB = strdb_alloc((DBOptions)(DB_OPT_DUP_KEY|DB_OPT_RELEASE_DATA),0); - instance_start = map_num; - instance_readdb(); - memset(instance_data, 0, sizeof(instance_data)); - memset(&instance_wait, 0, sizeof(instance_wait)); - instance_wait.timer = -1; - - instance_maps_ers = ers_new(sizeof(struct s_instance_map),"instance.cpp::instance_maps_ers", ERS_OPT_NONE); + instance_db.load(); + instance_wait.timer = INVALID_TIMER; add_timer_func_list(instance_delete_timer,"instance_delete_timer"); add_timer_func_list(instance_subscription_timer,"instance_subscription_timer"); } +/** + * Finalizes the instances and instance database + */ void do_final_instance(void) { - int i; - - for( i = 1; i < MAX_INSTANCE_DATA; i++ ) - instance_destroy(i); - - InstanceDB->destroy(InstanceDB, instance_db_free); - db_destroy(InstanceNameDB); - ers_destroy(instance_maps_ers); + for (const auto &it : instances) + instance_destroy(it.first); } diff --git a/src/map/instance.hpp b/src/map/instance.hpp index 59ac747616..54edbe2da9 100644 --- a/src/map/instance.hpp +++ b/src/map/instance.hpp @@ -4,29 +4,32 @@ #ifndef INSTANCE_HPP #define INSTANCE_HPP -#include "../common/cbasetypes.hpp" -#include "../common/mmo.hpp" // struct point -#include "../common/strlib.hpp" +#include +#include +#include +#include +#include -#include "script.hpp" // struct reg_db +#include "../common/cbasetypes.hpp" +#include "../common/database.hpp" +#include "../common/mmo.hpp" + +#include "script.hpp" enum send_target : uint8; struct block_list; extern int16 instance_start; - -#define MAX_INSTANCE_DATA 300 // Essentially how many instances we can create, but instance creation is primarily decided by MAX_MAP_PER_SERVER -#define MAX_MAP_PER_INSTANCE 255 // Max number of maps per instance (Enter map is counted as one) - Supports up to 255 maps +extern int instance_count; #define INSTANCE_NAME_LENGTH (60+1) -enum instance_state { - INSTANCE_FREE, +enum e_instance_state : uint8 { INSTANCE_IDLE, INSTANCE_BUSY }; -enum instance_mode { +enum e_instance_mode : uint8 { IM_NONE, IM_CHAR, IM_PARTY, @@ -35,69 +38,92 @@ enum instance_mode { IM_MAX, }; -enum e_instance_enter { - IE_OK = 0, +enum e_instance_enter : uint8 { + IE_OK, IE_NOMEMBER, IE_NOINSTANCE, IE_OTHER }; +enum e_instance_notify : uint8 { + IN_NOTIFY = 0, + IN_DESTROY_LIVE_TIMEOUT, + IN_DESTROY_ENTER_TIMEOUT, + IN_DESTROY_USER_REQUEST, + IN_CREATE_FAIL, +}; + struct s_instance_map { int16 m, src_m; }; -struct instance_data { - unsigned short type; ///< Instance DB ID - enum instance_state state; ///< State of instance - enum instance_mode mode; ///< Mode of instance +/// Instance data +struct s_instance_data { + int id; ///< Instance DB ID + e_instance_state state; ///< State of instance + e_instance_mode mode; ///< Mode of instance int owner_id; ///< Owner ID of instance unsigned int keep_limit; ///< Life time of instance - int keep_timer; ///< Remaining life time of instance + int keep_timer; ///< Life time ID unsigned int idle_limit; ///< Idle time of instance - int idle_timer; ///< Remaining idle time of instance + int idle_timer; ///< Idle timer ID struct reg_db regs; ///< Instance variables for scripts - struct s_instance_map **map; ///< Dynamic array of maps in instance - uint8 cnt_map; ///< Number of maps in an instance + std::vector map; ///< Array of maps in instance + + s_instance_data() : + id(0), + state(INSTANCE_IDLE), + mode(IM_PARTY), + owner_id(0), + keep_limit(0), + keep_timer(INVALID_TIMER), + idle_limit(0), + idle_timer(INVALID_TIMER), + regs(), + map() { } }; -/// Instance DB entry struct -struct instance_db { - unsigned short id; ///< Instance ID - StringBuf *name; ///< Instance name - unsigned int limit, ///< Duration limit +/// Instance DB entry +struct s_instance_db { + int id; ///< Instance DB ID + std::string name; ///< Instance name + uint32 limit, ///< Duration limit timeout; ///< Timeout limit - struct s_MapInfo { - StringBuf *mapname; ///< Mapname, the limit should be MAP_NAME_LENGTH_EXT - short x, y; ///< Map coordinates - } enter; - StringBuf **maplist; ///< Used maps in instance, the limit should be MAP_NAME_LENGTH_EXT - uint8 maplist_count; ///< Number of used maps + //bool destroyable; ///< Destroyable flag + struct point enter; ///< Instance entry point + std::vector maplist; ///< Maps in instance }; -extern struct instance_data instance_data[MAX_INSTANCE_DATA]; +class InstanceDatabase : public TypesafeYamlDatabase { +public: + InstanceDatabase() : TypesafeYamlDatabase("INSTANCE_DB", 1) { -struct instance_db *instance_searchtype_db(unsigned short instance_id); -struct instance_db *instance_searchname_db(const char* name); -void instance_getsd(unsigned short instance_id, struct map_session_data **sd, enum send_target *target); + } -int instance_create(int owner_id, const char *name, enum instance_mode mode); -int instance_destroy(unsigned short instance_id); -enum e_instance_enter instance_enter(struct map_session_data *sd, unsigned short instance_id, const char *name, short x, short y); -int instance_reqinfo(struct map_session_data *sd, unsigned short instance_id); -int instance_addusers(unsigned short instance_id); -int instance_delusers(unsigned short instance_id); -int16 instance_mapname2mapid(const char *name, unsigned short instance_id); -int instance_addmap(unsigned short instance_id); + const std::string getDefaultLocation(); + uint64 parseBodyNode(const YAML::Node &node); +}; + +extern InstanceDatabase instance_db; + +extern std::unordered_map> instances; + +std::shared_ptr instance_search_db_name(const char* name); +void instance_getsd(int instance_id, struct map_session_data *&sd, enum send_target *target); + +int instance_create(int owner_id, const char *name, e_instance_mode mode); +bool instance_destroy(int instance_id); +e_instance_enter instance_enter(struct map_session_data *sd, int instance_id, const char *name, short x, short y); +bool instance_reqinfo(struct map_session_data *sd, int instance_id); +bool instance_addusers(int instance_id); +bool instance_delusers(int instance_id); +int16 instance_mapid(int16 m, int instance_id); +int instance_addmap(int instance_id); + +void instance_addnpc(std::shared_ptr idata); -void instance_addnpc(struct instance_data *im); -void instance_readdb(void); -void instance_reload(void); void do_reload_instance(void); void do_init_instance(void); void do_final_instance(void); -#if MAX_MAP_PER_INSTANCE > 255 - #error Too many maps per instance defined! Please adjust MAX_MAP_PER_INSTANCE to a lower value. -#endif - #endif /* INSTANCE_HPP */ diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj index 721e354c7a..b4955a18a7 100644 --- a/src/map/map-server.vcxproj +++ b/src/map/map-server.vcxproj @@ -308,7 +308,7 @@ - + diff --git a/src/map/map.cpp b/src/map/map.cpp index 30747e0b45..5aab4518b8 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -2171,12 +2171,12 @@ int map_quit(struct map_session_data *sd) { struct map_data *mapdata = map_getmapdata(sd->bl.m); - if( mapdata->instance_id ) + if( mapdata->instance_id > 0 ) instance_delusers(mapdata->instance_id); unit_remove_map_pc(sd,CLR_RESPAWN); - if( mapdata->instance_id ) { // Avoid map conflicts and warnings on next login + if( mapdata->instance_id > 0 ) { // Avoid map conflicts and warnings on next login int16 m; struct point *pt; if( mapdata->save.map ) @@ -2694,18 +2694,16 @@ bool map_addnpc(int16 m,struct npc_data *nd) /*========================================== * Add an instance map *------------------------------------------*/ -int map_addinstancemap(const char *name, unsigned short instance_id) +int map_addinstancemap(int src_m, int instance_id) { - int16 src_m = map_mapname2mapid(name); - char iname[MAP_NAME_LENGTH]; - size_t num_cell, size; - if(src_m < 0) return -1; + const char *name = map_mapid2mapname(src_m); + if(strlen(name) > 20) { // against buffer overflow - ShowError("map_addisntancemap: can't add long map name \"%s\"\n", name); + ShowError("map_addinstancemap: can't add long map name \"%s\"\n", name); return -2; } @@ -2727,18 +2725,19 @@ int map_addinstancemap(const char *name, unsigned short instance_id) struct map_data *src_map = map_getmapdata(src_m); struct map_data *dst_map = map_getmapdata(dst_m); + char iname[MAP_NAME_LENGTH]; strcpy(iname, name); // Alter the name // Due to this being custom we only worry about preserving as many characters as necessary for accurate map distinguishing // This also allows us to maintain complete independence with main map functions - if((strchr(iname,'@') == NULL) && strlen(iname) > 8) { - memmove(iname, iname+(strlen(iname)-9), strlen(iname)); - snprintf(dst_map->name, sizeof(dst_map->name),"%hu#%s", instance_id, iname); + if ((strchr(iname, '@') == NULL) && strlen(iname) > 8) { + memmove(iname, iname + (strlen(iname) - 9), strlen(iname)); + snprintf(dst_map->name, sizeof(dst_map->name), "%d#%s", (instance_id % 1000), iname); } else - snprintf(dst_map->name, sizeof(dst_map->name),"%.3hu%s", instance_id, iname); - dst_map->name[MAP_NAME_LENGTH-1] = '\0'; + snprintf(dst_map->name, sizeof(dst_map->name), "%.3d%s", (instance_id % 1000), iname); + dst_map->name[MAP_NAME_LENGTH - 1] = '\0'; dst_map->m = dst_m; dst_map->instance_id = instance_id; @@ -2756,11 +2755,13 @@ int map_addinstancemap(const char *name, unsigned short instance_id) dst_map->npc_num_warp = 0; // Reallocate cells - num_cell = dst_map->xs * dst_map->ys; + size_t num_cell = dst_map->xs * dst_map->ys; + CREATE( dst_map->cell, struct mapcell, num_cell ); memcpy( dst_map->cell, src_map->cell, num_cell * sizeof(struct mapcell) ); - size = dst_map->bxs * dst_map->bys * sizeof(struct block_list*); + size_t size = dst_map->bxs * dst_map->bys * sizeof(struct block_list*); + dst_map->block = (struct block_list **)aCalloc(1,size); dst_map->block_mob = (struct block_list **)aCalloc(1,size); @@ -2829,7 +2830,7 @@ int map_delinstancemap(int m) { struct map_data *mapdata = map_getmapdata(m); - if(m < 0 || !mapdata->instance_id) + if(m < 0 || mapdata->instance_id <= 0) return 0; // Kick everyone out @@ -2972,7 +2973,7 @@ void map_removemobs(int16 m) return; //Mobs are already scheduled for removal // Don't remove mobs on instance map - if (mapdata->instance_id) + if (mapdata->instance_id > 0) return; mapdata->mob_delete_timer = add_timer(gettick()+battle_config.mob_remove_delay, map_removemobs_timer, m, 0); @@ -2991,17 +2992,15 @@ const char* map_mapid2mapname(int m) if (!mapdata) return ""; - if (mapdata->instance_id) { // Instance map check - struct instance_data *im = &instance_data[mapdata->instance_id]; + if (mapdata->instance_id > 0) { // Instance map check + std::shared_ptr idata = util::umap_find(instances, map[m].instance_id); - if (!im) // This shouldn't happen but if it does give them the map we intended to give + if (!idata) // This shouldn't happen but if it does give them the map we intended to give return mapdata->name; else { - uint8 i; - - for (i = 0; i < im->cnt_map; i++) { // Loop to find the src map we want - if (im->map[i]->m == m) - return map[im->map[i]->src_m].name; + for (const auto &it : idata->map) { // Loop to find the src map we want + if (it.m == m) + return map_getmapdata(it.src_m)->name; } } } diff --git a/src/map/map.hpp b/src/map/map.hpp index fc9bb7ee0c..7fa4a8b598 100644 --- a/src/map/map.hpp +++ b/src/map/map.hpp @@ -748,7 +748,7 @@ struct map_data { int mob_delete_timer; // Timer ID for map_removemobs_timer [Skotlex] // Instance Variables - unsigned short instance_id; + int instance_id; int instance_src_map; /* rAthena Local Chat */ @@ -1035,7 +1035,7 @@ void map_clearflooritem(struct block_list* bl); int map_addflooritem(struct item *item, int amount, int16 m, int16 x, int16 y, int first_charid, int second_charid, int third_charid, int flags, unsigned short mob_id, bool canShowEffect = false); // instances -int map_addinstancemap(const char *name, unsigned short instance_id); +int map_addinstancemap(int src_m, int instance_id); int map_delinstancemap(int m); void map_data_copyall(void); void map_data_copy(struct map_data *dst_map, struct map_data *src_map); diff --git a/src/map/npc.cpp b/src/map/npc.cpp index 39981bb254..d12e24df3a 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -16,6 +16,7 @@ #include "../common/showmsg.hpp" #include "../common/strlib.hpp" #include "../common/timer.hpp" +#include "../common/utilities.hpp" #include "../common/utils.hpp" #include "battle.hpp" @@ -33,6 +34,8 @@ #include "pet.hpp" #include "script.hpp" // script_config +using namespace rathena; + struct npc_data* fake_nd; // linked list of npc source files @@ -3489,7 +3492,7 @@ int npc_duplicate4instance(struct npc_data *snd, int16 m) { char newname[NPC_NAME_LENGTH+1]; struct map_data *mapdata = map_getmapdata(m); - if( mapdata->instance_id == 0 ) + if( mapdata->instance_id <= 0 ) return 1; snprintf(newname, ARRAYLENGTH(newname), "dup_%d_%d", mapdata->instance_id, snd->bl.id); @@ -3500,15 +3503,17 @@ int npc_duplicate4instance(struct npc_data *snd, int16 m) { if( snd->subtype == NPCTYPE_WARP ) { // Adjust destination, if instanced struct npc_data *wnd = NULL; // New NPC - struct instance_data *im = &instance_data[mapdata->instance_id]; - int dm = map_mapindex2mapid(snd->u.warp.mapindex), imap = 0, i; + std::shared_ptr idata = util::umap_find(instances, mapdata->instance_id); + int dm = map_mapindex2mapid(snd->u.warp.mapindex), imap = 0; + if( dm < 0 ) return 1; - for(i = 0; i < im->cnt_map; i++) - if(im->map[i]->m && map_mapname2mapid(map_getmapdata(im->map[i]->src_m)->name) == dm) { - imap = map_mapname2mapid(map_getmapdata(im->map[i]->m)->name); + for (const auto &it : idata->map) { + if (it.m && map_mapname2mapid(map_getmapdata(it.src_m)->name) == dm) { + imap = map_mapname2mapid(map_getmapdata(it.m)->name); break; // Instance map matches destination, update to instance map } + } if(!imap) imap = map_mapname2mapid(map_getmapdata(dm)->name); diff --git a/src/map/script.cpp b/src/map/script.cpp index e9e10a6437..087ba7246d 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -385,7 +385,7 @@ static struct linkdb_node *sleep_db; // int oid -> struct script_state * *------------------------------------------*/ const char* parse_subexpr(const char* p,int limit); int run_func(struct script_state *st); -unsigned short script_instancegetid(struct script_state *st, enum instance_mode mode = IM_NONE); +int script_instancegetid(struct script_state *st, e_instance_mode mode = IM_NONE); const char* script_op2name(int op) { @@ -2759,9 +2759,10 @@ struct script_data *get_val_(struct script_state* st, struct script_data* data, if (data->ref) n = data->ref->vars; else { - unsigned short instance_id = script_instancegetid(st); - if (instance_id != 0) - n = instance_data[instance_id].regs.vars; + std::shared_ptr idata = util::umap_find(instances, script_instancegetid(st)); + + if (idata) + n = idata->regs.vars; } if (n) data->u.str = (char*)i64db_get(n,reference_getuid(data)); @@ -2824,9 +2825,10 @@ struct script_data *get_val_(struct script_state* st, struct script_data* data, if (data->ref) n = data->ref->vars; else { - unsigned short instance_id = script_instancegetid(st); - if (instance_id != 0) - n = instance_data[instance_id].regs.vars; + std::shared_ptr idata = util::umap_find(instances, script_instancegetid(st)); + + if (idata) + n = idata->regs.vars; } if (n) data->u.num = i64db_i64get(n,reference_getuid(data)); @@ -3071,10 +3073,10 @@ struct reg_db *script_array_src(struct script_state *st, struct map_session_data if (ref) src = ref; else { - unsigned short instance_id = script_instancegetid(st); + std::shared_ptr idata = util::umap_find(instances, script_instancegetid(st)); - if (instance_id != 0) - src = &instance_data[instance_id].regs; + if (idata) + src = &idata->regs; } break; } @@ -3198,11 +3200,10 @@ bool set_reg_str( struct script_state* st, struct map_session_data* sd, int64 nu if( ref ){ src = ref; }else{ - unsigned short instance_id = script_instancegetid( st ); + std::shared_ptr idata = util::umap_find(instances, script_instancegetid(st)); - if( instance_id != 0 ){ - src = &instance_data[instance_id].regs; - } + if (idata) + src = &idata->regs; } if( src ){ @@ -3293,11 +3294,10 @@ bool set_reg_num( struct script_state* st, struct map_session_data* sd, int64 nu if( ref ){ src = ref; }else{ - unsigned short instance_id = script_instancegetid( st ); + std::shared_ptr idata = util::umap_find(instances, script_instancegetid(st)); - if( instance_id != 0 ){ - src = &instance_data[instance_id].regs; - } + if (idata) + src = &idata->regs; } if( src ){ @@ -20091,9 +20091,9 @@ BUILDIN_FUNC(bg_info) * @param mode: Instance mode * @return instance ID on success or 0 otherwise */ -unsigned short script_instancegetid(struct script_state* st, enum instance_mode mode) +int script_instancegetid(struct script_state* st, e_instance_mode mode) { - unsigned short instance_id = 0; + int instance_id = 0; if (mode == IM_NONE) { struct npc_data *nd = map_id2nd(st->oid); @@ -20106,27 +20106,27 @@ unsigned short script_instancegetid(struct script_state* st, enum instance_mode if (sd) { switch (mode) { case IM_CHAR: - if (sd->instance_id) + if (sd->instance_id > 0) instance_id = sd->instance_id; break; case IM_PARTY: { struct party_data *pd = party_search(sd->status.party_id); - if (pd && pd->instance_id) + if (pd && pd->instance_id > 0) instance_id = pd->instance_id; } break; case IM_GUILD: { struct guild *gd = guild_search(sd->status.guild_id); - if (gd && gd->instance_id) + if (gd && gd->instance_id > 0) instance_id = gd->instance_id; } break; case IM_CLAN: { struct clan *cd = clan_search(sd->status.clan_id); - if (cd && cd->instance_id) + if (cd && cd->instance_id > 0) instance_id = cd->instance_id; } break; @@ -20145,11 +20145,11 @@ unsigned short script_instancegetid(struct script_state* st, enum instance_mode *------------------------------------------*/ BUILDIN_FUNC(instance_create) { - enum instance_mode mode = IM_PARTY; + e_instance_mode mode = IM_PARTY; int owner_id = 0; if (script_hasdata(st, 3)) { - mode = static_cast(script_getnum(st, 3)); + mode = static_cast(script_getnum(st, 3)); if (mode < IM_NONE || mode >= IM_MAX) { ShowError("buildin_instance_create: Unknown instance mode %d for '%s'\n", mode, script_getstr(st, 2)); @@ -20200,7 +20200,7 @@ BUILDIN_FUNC(instance_create) *------------------------------------------*/ BUILDIN_FUNC(instance_destroy) { - unsigned short instance_id; + int instance_id; if( script_hasdata(st,2) ) instance_id = script_getnum(st,2); @@ -20208,7 +20208,7 @@ BUILDIN_FUNC(instance_destroy) instance_id = script_instancegetid(st); if( instance_id == 0 ) { - ShowError("buildin_instance_destroy: Trying to destroy invalid instance %hu.\n", instance_id); + ShowError("buildin_instance_destroy: Trying to destroy invalid instance %d.\n", instance_id); return SCRIPT_CMD_FAILURE; } @@ -20229,7 +20229,7 @@ BUILDIN_FUNC(instance_enter) struct map_session_data *sd = NULL; int x = script_hasdata(st,3) ? script_getnum(st, 3) : -1; int y = script_hasdata(st,4) ? script_getnum(st, 4) : -1; - unsigned short instance_id; + int instance_id; if (script_hasdata(st, 6)) instance_id = script_getnum(st, 6); @@ -20253,7 +20253,7 @@ BUILDIN_FUNC(instance_enter) BUILDIN_FUNC(instance_npcname) { const char *str; - unsigned short instance_id = 0; + int instance_id; struct npc_data *nd; str = script_getstr(st,2); @@ -20262,12 +20262,12 @@ BUILDIN_FUNC(instance_npcname) else instance_id = script_instancegetid(st); - if( instance_id && (nd = npc_name2id(str)) != NULL ) { + if( instance_id > 0 && (nd = npc_name2id(str)) != NULL ) { static char npcname[NAME_LENGTH]; - snprintf(npcname, sizeof(npcname), "dup_%hu_%d", instance_id, nd->bl.id); + snprintf(npcname, sizeof(npcname), "dup_%d_%d", instance_id, nd->bl.id); script_pushconststr(st,npcname); } else { - ShowError("buildin_instance_npcname: Invalid instance NPC (instance_id: %hu, NPC name: \"%s\".)\n", instance_id, str); + ShowError("buildin_instance_npcname: Invalid instance NPC (instance_id: %d, NPC name: \"%s\".)\n", instance_id, str); st->state = END; return SCRIPT_CMD_FAILURE; } @@ -20284,7 +20284,7 @@ BUILDIN_FUNC(instance_mapname) { const char *str; int16 m; - unsigned short instance_id = 0; + int instance_id; str = script_getstr(st,2); @@ -20294,7 +20294,7 @@ BUILDIN_FUNC(instance_mapname) instance_id = script_instancegetid(st); // Check that instance mapname is a valid map - if(!instance_id || (m = instance_mapname2mapid(str,instance_id)) < 0) + if(instance_id <= 0 || (m = instance_mapid(map_mapname2mapid(str), instance_id)) < 0) script_pushconststr(st, ""); else script_pushconststr(st, map_getmapdata(m)->name); @@ -20319,7 +20319,7 @@ BUILDIN_FUNC(instance_id) } } - script_pushint(st, script_instancegetid(st, static_cast(mode))); + script_pushint(st, script_instancegetid(st, static_cast(mode))); return SCRIPT_CMD_SUCCESS; } @@ -20333,9 +20333,8 @@ static int buildin_instance_warpall_sub(struct block_list *bl, va_list ap) unsigned int m = va_arg(ap,unsigned int); int x = va_arg(ap,int); int y = va_arg(ap,int); - unsigned short instance_id = va_arg(ap,unsigned int); - struct map_session_data *sd = NULL; - int owner_id = 0; + int instance_id = va_arg(ap, int); + struct map_session_data *sd; nullpo_retr(0, bl); @@ -20343,8 +20342,15 @@ static int buildin_instance_warpall_sub(struct block_list *bl, va_list ap) return 0; sd = (TBL_PC *)bl; - owner_id = instance_data[instance_id].owner_id; - switch(instance_data[instance_id].mode) { + + std::shared_ptr idata = util::umap_find(instances, instance_id); + + if (!idata) + return 0; + + int owner_id = idata->owner_id; + + switch(idata->mode) { case IM_NONE: break; case IM_CHAR: @@ -20370,8 +20376,8 @@ static int buildin_instance_warpall_sub(struct block_list *bl, va_list ap) BUILDIN_FUNC(instance_warpall) { - int16 m, i; - unsigned short instance_id; + int16 m; + int instance_id; const char *mapn; int x, y; @@ -20383,11 +20389,18 @@ BUILDIN_FUNC(instance_warpall) else instance_id = script_instancegetid(st, IM_PARTY); - if( !instance_id || (m = map_mapname2mapid(mapn)) < 0 || (m = instance_mapname2mapid(map_getmapdata(m)->name,instance_id)) < 0) + if( instance_id <= 0 || (m = map_mapname2mapid(mapn)) < 0 || (m = instance_mapid(m, instance_id)) < 0) return SCRIPT_CMD_FAILURE; - for(i = 0; i < instance_data[instance_id].cnt_map; i++) - map_foreachinmap(buildin_instance_warpall_sub, instance_data[instance_id].map[i]->m, BL_PC, map_id2index(m), x, y, instance_id); + std::shared_ptr idata = util::umap_find(instances, instance_id); + + if (!idata) { + ShowError("buildin_instance_warpall: Instance is not found.\n"); + return SCRIPT_CMD_FAILURE; + } + + for(const auto &it : idata->map) + map_foreachinmap(buildin_instance_warpall_sub, it.m, BL_PC, map_id2index(m), x, y, instance_id); return SCRIPT_CMD_SUCCESS; } @@ -20399,7 +20412,7 @@ BUILDIN_FUNC(instance_warpall) * Using 0 for will auto-detect the id. *------------------------------------------*/ BUILDIN_FUNC(instance_announce) { - unsigned short instance_id = script_getnum(st,2); + int instance_id = script_getnum(st,2); const char *mes = script_getstr(st,3); int flag = script_getnum(st,4); const char *fontColor = script_hasdata(st,5) ? script_getstr(st,5) : NULL; @@ -20407,20 +20420,19 @@ BUILDIN_FUNC(instance_announce) { int fontSize = script_hasdata(st,7) ? script_getnum(st,7) : 12; // default fontSize int fontAlign = script_hasdata(st,8) ? script_getnum(st,8) : 0; // default fontAlign int fontY = script_hasdata(st,9) ? script_getnum(st,9) : 0; // default fontY - int i; - if( instance_id == 0 ) { + if (instance_id <= 0) instance_id = script_instancegetid(st); - } - if( !instance_id && &instance_data[instance_id] != NULL) { - ShowError("buildin_instance_announce: Intance is not found.\n"); + std::shared_ptr idata = util::umap_find(instances, instance_id); + + if (instance_id <= 0 || !idata) { + ShowError("buildin_instance_announce: Instance not found.\n"); return SCRIPT_CMD_FAILURE; } - for( i = 0; i < instance_data[instance_id].cnt_map; i++ ) - map_foreachinmap(buildin_announce_sub, instance_data[instance_id].map[i]->m, BL_PC, - mes, strlen(mes)+1, flag&BC_COLOR_MASK, fontColor, fontType, fontSize, fontAlign, fontY); + for (const auto &it : idata->map) + map_foreachinmap(buildin_announce_sub, it.m, BL_PC, mes, strlen(mes)+1, flag&BC_COLOR_MASK, fontColor, fontType, fontSize, fontAlign, fontY); return SCRIPT_CMD_SUCCESS; } @@ -20438,7 +20450,7 @@ BUILDIN_FUNC(instance_announce) { BUILDIN_FUNC(instance_check_party) { int amount, min, max, i, party_id, c = 0; - struct party_data *p = NULL; + struct party_data *p; amount = script_hasdata(st,3) ? script_getnum(st,3) : 1; // Amount of needed Partymembers for the Instance. min = script_hasdata(st,4) ? script_getnum(st,4) : 1; // Minimum Level needed to join the Instance. @@ -20620,9 +20632,9 @@ BUILDIN_FUNC(instance_info) const char* name = script_getstr(st, 2); int type = script_getnum(st, 3); int index = 0; - struct instance_db *db = instance_searchname_db(name); + std::shared_ptr db = instance_search_db_name(name); - if( !db ){ + if (!db) { ShowError( "buildin_instance_info: Unknown instance name \"%s\".\n", name ); script_pushint(st, -1); return SCRIPT_CMD_FAILURE; @@ -20639,7 +20651,7 @@ BUILDIN_FUNC(instance_info) script_pushint(st, db->timeout); break; case IIT_ENTER_MAP: - script_pushstrcopy(st, StringBuf_Value(db->enter.mapname)); + script_pushstrcopy(st, map_mapid2mapname(db->enter.map)); break; case IIT_ENTER_X: script_pushint(st, db->enter.x); @@ -20648,7 +20660,7 @@ BUILDIN_FUNC(instance_info) script_pushint(st, db->enter.y); break; case IIT_MAPCOUNT: - script_pushint(st, db->maplist_count); + script_pushint(st, db->maplist.size()); break; case IIT_MAP: if( !script_hasdata(st, 4) || script_isstring(st, 4) ){ @@ -20671,7 +20683,7 @@ BUILDIN_FUNC(instance_info) return SCRIPT_CMD_FAILURE; } - script_pushstrcopy(st, StringBuf_Value(db->maplist[index])); + script_pushstrcopy(st, map_mapid2mapname(db->maplist[index])); break; default: @@ -20705,14 +20717,14 @@ BUILDIN_FUNC(instance_live_info) else id = script_getnum(st, 3); - struct instance_db *db = nullptr; - struct instance_data *im = nullptr; + std::shared_ptr db = nullptr; + std::shared_ptr im = nullptr; - if (id > 0 && id < MAX_INSTANCE_DATA) { - im = &instance_data[id]; + if (id > 0 && id < INT_MAX) { + im = util::umap_find(instances, id); if (im) - db = instance_searchtype_db(im->type); + db = instance_db.find(im->id); } if (!im || !db) { @@ -20725,7 +20737,7 @@ BUILDIN_FUNC(instance_live_info) switch( type ) { case ILI_NAME: - script_pushstrcopy(st, StringBuf_Value(db->name)); + script_pushstrcopy(st, db->name.c_str()); break; case ILI_MODE: script_pushint(st, im->mode); @@ -24533,16 +24545,16 @@ BUILDIN_FUNC(getvariableofinstance) return SCRIPT_CMD_FAILURE; } - unsigned short instance_id = script_getnum(st, 3); + int instance_id = script_getnum(st, 3); - if (instance_id == 0 || instance_id > MAX_INSTANCE_DATA) { + if (instance_id <= 0) { ShowError("buildin_getvariableofinstance: Invalid instance ID %d.\n", instance_id); script_pushnil(st); st->state = END; return SCRIPT_CMD_FAILURE; } - struct instance_data *im = &instance_data[instance_id]; + std::shared_ptr im = util::umap_find(instances, instance_id); if (im->state != INSTANCE_BUSY) { ShowError("buildin_getvariableofinstance: Unknown instance ID %d.\n", instance_id); diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index 2ed9d6c44e..1c621f5af3 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -51,6 +51,8 @@ using namespace rathena; +#define MAX_MAP_PER_INSTANCE 255 + #ifndef WIN32 int getch( void ){ struct termios oldattr, newattr; @@ -100,6 +102,7 @@ static bool skill_parse_row_copyabledb(char* split[], int columns, int current); static bool skill_parse_row_nonearnpcrangedb(char* split[], int columns, int current); static bool skill_parse_row_skilldb(char* split[], int columns, int current); static bool quest_read_db(char *split[], int columns, int current); +static bool instance_readdb_sub(char* str[], int columns, int current); // Constants for conversion std::unordered_map aegis_itemnames; @@ -360,6 +363,12 @@ int do_init( int argc, char** argv ){ return 0; } + if (process("INSTANCE_DB", 1, root_paths, "instance_db", [](const std::string& path, const std::string& name_ext) -> bool { + return sv_readdb(path.c_str(), name_ext.c_str(), ',', 7, 7 + MAX_MAP_PER_INSTANCE, -1, &instance_readdb_sub, false); + })) { + return 0; + } + // TODO: add implementations ;-) return 0; @@ -2537,3 +2546,43 @@ static bool quest_read_db(char *split[], int columns, int current) { return true; } + +// Copied and adjusted from instance.cpp +static bool instance_readdb_sub(char* str[], int columns, int current) { + body << YAML::BeginMap; + body << YAML::Key << "Id" << YAML::Value << atoi(str[0]); + body << YAML::Key << "Name" << YAML::Value << str[1]; + if (atoi(str[2]) != 3600) + body << YAML::Key << "TimeLimit" << YAML::Value << atoi(str[2]); + if (atoi(str[3]) != 300) + body << YAML::Key << "IdleTimeOut" << YAML::Value << atoi(str[3]); + body << YAML::Key << "Enter"; + body << YAML::BeginMap; + body << YAML::Key << "Map" << YAML::Value << str[4]; + body << YAML::Key << "X" << YAML::Value << atoi(str[5]); + body << YAML::Key << "Y" << YAML::Value << atoi(str[6]); + body << YAML::EndMap; + + if (columns > 7) { + body << YAML::Key << "AdditionalMaps"; + body << YAML::BeginSeq; + + for (int i = 7; i < columns; i++) { + if (!strlen(str[i])) + continue; + + if (strcmpi(str[4], str[i]) == 0) + continue; + + body << YAML::BeginMap; + body << YAML::Key << str[i] << YAML::Value << "true"; + body << YAML::EndMap; + } + + body << YAML::EndSeq; + } + + body << YAML::EndMap; + + return true; +} From 00943a2c5f6532e9413d0d95d0d9175f54926360 Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 8 Apr 2020 13:27:12 -0400 Subject: [PATCH 028/212] Corrects Star Emperor stances (#4753) * Fixes #4744. * Adds missing stance skill requirements. * Adds Stance values to csv2yaml for skill_db conversions. Thanks to @iubantot and @attackjom! --- db/re/skill_db.yml | 16 ++++++++++++++++ doc/skill_db.txt | 4 ++++ src/map/script_constants.hpp | 4 ++++ src/tool/csv2yaml.cpp | 4 ++++ 4 files changed, 28 insertions(+) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index b3fd6bd0d6..7921741a30 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -29274,6 +29274,7 @@ Body: Time: 60000 Requires: SpCost: 40 + State: Moonstance - Id: 2575 Name: SJ_LUNARSTANCE Description: Lunar Stance @@ -29317,6 +29318,7 @@ Body: Amount: 55 - Level: 7 Amount: 60 + State: Moonstance - Id: 2577 Name: SJ_LIGHTOFSTAR Description: Light of Star @@ -29340,6 +29342,7 @@ Body: Time: 60000 Requires: SpCost: 40 + State: Starstance - Id: 2578 Name: SJ_STARSTANCE Description: Star Stance @@ -29384,6 +29387,7 @@ Body: Amount: 45 - Level: 7 Amount: 50 + State: Moonstance - Id: 2580 Name: SJ_FLASHKICK Description: Flash Kick @@ -29426,6 +29430,7 @@ Body: Amount: 20 - Level: 7 Amount: 15 + State: Starstance - Id: 2581 Name: SJ_STAREMPEROR Description: Star Emperor Advent @@ -29455,6 +29460,7 @@ Body: Amount: 85 - Level: 5 Amount: 90 + State: Universestance - Id: 2582 Name: SJ_NOVAEXPLOSING Description: Nova Explosion @@ -29486,6 +29492,7 @@ Body: Amount: 75 - Level: 5 Amount: 80 + State: Universestance - Id: 2583 Name: SJ_UNIVERSESTANCE Description: Universe Stance @@ -29542,6 +29549,7 @@ Body: Amount: 65 - Level: 7 Amount: 70 + State: Starstance - Id: 2585 Name: SJ_GRAVITYCONTROL Description: Gravity Control @@ -29559,6 +29567,7 @@ Body: Cooldown: 20000 Requires: SpCost: 80 + State: Universestance - Id: 2586 Name: SJ_BOOKOFDIMENSION Description: Book of Dimension @@ -29584,6 +29593,7 @@ Body: Time: 30000 Requires: SpCost: 40 + State: Universestance - Id: 2587 Name: SJ_BOOKOFCREATINGSTAR Description: Book of Creating Star @@ -29622,6 +29632,7 @@ Body: Amount: 65 - Level: 5 Amount: 70 + State: Universestance Unit: Id: Creatingstar Layout: 2 @@ -29671,6 +29682,7 @@ Body: Time: 60000 Requires: SpCost: 40 + State: Sunstance - Id: 2591 Name: SJ_SUNSTANCE Description: Sun Stance @@ -29713,6 +29725,7 @@ Body: Amount: 49 - Level: 7 Amount: 52 + State: Sunstance - Id: 2593 Name: SJ_PROMINENCEKICK Description: Prominence Kick @@ -29732,6 +29745,7 @@ Body: IgnoreStatus: true Requires: SpCost: 20 + State: Sunstance - Id: 2594 Name: SJ_FALLINGSTAR_ATK Description: Falling Star Attack @@ -29749,6 +29763,7 @@ Body: CastCancel: true Requires: SpCost: 1 + State: Starstance - Id: 2595 Name: SJ_FALLINGSTAR_ATK2 Description: Falling Star Attack 2 @@ -29767,6 +29782,7 @@ Body: CastCancel: true Requires: SpCost: 1 + State: Starstance - Id: 2596 Name: SP_SOULGOLEM Description: Golem's Soul diff --git a/doc/skill_db.txt b/doc/skill_db.txt index 5e665d963a..05a36d1904 100644 --- a/doc/skill_db.txt +++ b/doc/skill_db.txt @@ -693,6 +693,10 @@ Mado - Requires OPTION_MADOGEAR. ElementalSpirit - Requires an Elemental Spirit to be summoned. ElementalSpirit2 - Requires an Elemental Spirit to be summoned and will be removed after. Peco - Requires OPTION_RIDING. +Sunstance - Requires Sun/Universe Stance status be active. +Moonstance - Requires Moon/Universe Stance status be active. +Starstance - Requires Star/Universe Stance status be active. +Universestance - Requires Universe Stance status be active. ------------------ diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 16e405d0e8..980aaaa239 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -7554,6 +7554,10 @@ export_constant(ST_ELEMENTALSPIRIT); export_constant(ST_ELEMENTALSPIRIT2); export_constant(ST_PECO); + export_constant(ST_SUNSTANCE); + export_constant(ST_MOONSTANCE); + export_constant(ST_STARSTANCE); + export_constant(ST_UNIVERSESTANCE); /* skill unit flags */ export_constant(UF_NOENEMY); diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index 1c621f5af3..f4b9d9f96e 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -1270,6 +1270,10 @@ static bool skill_parse_row_requiredb(char* split[], int columns, int current) else if (strcmpi(split[10], "elementalspirit") == 0) entry.state = ST_ELEMENTALSPIRIT; else if (strcmpi(split[10], "elementalspirit2") == 0) entry.state = ST_ELEMENTALSPIRIT2; else if (strcmpi(split[10], "peco") == 0) entry.state = ST_PECO; + else if (strcmpi(split[10], "sunstance") == 0) entry.state = ST_SUNSTANCE; + else if (strcmpi(split[10], "moonstance") == 0) entry.state = ST_MOONSTANCE; + else if (strcmpi(split[10], "starstance") == 0) entry.state = ST_STARSTANCE; + else if (strcmpi(split[10], "universestance") == 0) entry.state = ST_UNIVERSESTANCE; else entry.state = ST_NONE; // Unknown or no state trim(split[11]); From 03fa1af7a802565a1f5e12401ff7f98d2ca8031f Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 8 Apr 2020 13:46:43 -0400 Subject: [PATCH 029/212] Fixes Soul Unity being removed on map change (#4754) * Fixes #4733. * Soul Unity should not be removed on map change. Thanks to @Balferian! --- src/map/unit.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/map/unit.cpp b/src/map/unit.cpp index 4c34eebe36..787fd23e41 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -2914,7 +2914,6 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, status_change_end(bl, SC_TINDER_BREAKER, INVALID_TIMER); status_change_end(bl, SC_TINDER_BREAKER2, INVALID_TIMER); status_change_end(bl, SC_FLASHKICK, INVALID_TIMER); - status_change_end(bl, SC_SOULUNITY, INVALID_TIMER); status_change_end(bl, SC_HIDING, INVALID_TIMER); // Ensure the bl is a PC; if so, we'll handle the removal of cloaking and cloaking exceed later if ( bl->type != BL_PC ) { From 6fe0ed5819b34d713b4a948362f1af26476e3178 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Thu, 9 Apr 2020 17:03:37 +0200 Subject: [PATCH 030/212] Fixed a problem with walking NPCs (#4782) Walking NPCs are not supported on official servers. Therefore we have to respawn the NPC units as player units before they start walking. After they stop walking we respawn them as NPC units again so that they show the bubbles for talking to them again. Since player sprites have a small aura during spawning hardcoded in the client, this aura will be shown each time they begin walking now. Fixes #4505 Thanks to @RagnaWay and @aleos89 --- src/map/clif.cpp | 21 ++++++++++++--------- src/map/clif.hpp | 2 +- src/map/unit.cpp | 19 +++++++++++++++++-- src/map/unit.hpp | 2 +- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 596b1fc482..a3d5f2759a 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -279,7 +279,7 @@ uint16 clif_getport(void) } #if PACKETVER >= 20071106 -static inline unsigned char clif_bl_type(struct block_list *bl) { +static inline unsigned char clif_bl_type(struct block_list *bl, bool walking) { switch (bl->type) { case BL_PC: return (disguised(bl) && !pcdb_checkid(status_get_viewdata(bl)->class_))? 0x1:0x0; //PC_TYPE case BL_ITEM: return 0x2; //ITEM_TYPE @@ -287,10 +287,13 @@ static inline unsigned char clif_bl_type(struct block_list *bl) { case BL_CHAT: return 0x4; //UNKNOWN_TYPE case BL_MOB: return pcdb_checkid(status_get_viewdata(bl)->class_)?0x0:0x5; //NPC_MOB_TYPE case BL_NPC: +// From 2017-07-26 on NPC type units can also use player sprites. +// There is one exception and this is if they are walking. +// Since walking NPCs are not supported on official servers, the client does not know how to handle it. #if PACKETVER >= 20170726 - return 0x6; //NPC_EVT_TYPE + return ( pcdb_checkid(status_get_viewdata(bl)->class_) && walking ) ? 0x0 : 0x6; //NPC_EVT_TYPE #else - return (pcdb_checkid(status_get_viewdata(bl)->class_) ? 0x0 : 0x6); + return pcdb_checkid(status_get_viewdata(bl)->class_) ? 0x0 : 0x6; //NPC_EVT_TYPE #endif case BL_PET: return pcdb_checkid(status_get_viewdata(bl)->class_)?0x0:0x7; //NPC_PET_TYPE case BL_HOM: return 0x8; //NPC_HOM_TYPE @@ -980,7 +983,7 @@ static int clif_setlevel(struct block_list* bl) { /*========================================== * Prepares 'unit standing/spawning' packet *------------------------------------------*/ -static int clif_set_unit_idle(struct block_list* bl, unsigned char* buffer, bool spawn, bool option, unsigned int option_val) +static int clif_set_unit_idle(struct block_list* bl, unsigned char* buffer, bool spawn, bool option, bool walking, unsigned int option_val) { struct map_session_data* sd; struct status_change* sc = status_get_sc(bl); @@ -1035,7 +1038,7 @@ static int clif_set_unit_idle(struct block_list* bl, unsigned char* buffer, bool #else WBUFW(buf,2) = (uint16)((spawn ? 79 : 80)+strlen(name)); #endif - WBUFB(buf,4) = clif_bl_type(bl); + WBUFB(buf,4) = clif_bl_type(bl,walking); offset+=3; buf = WBUFP(buffer,offset); #elif PACKETVER >= 20071106 @@ -1236,7 +1239,7 @@ static int clif_set_unit_walking(struct block_list* bl, struct unit_data* ud, un buf = WBUFP(buffer,offset); #endif #if PACKETVER >= 20071106 - WBUFB(buf, 2) = clif_bl_type(bl); + WBUFB(buf, 2) = clif_bl_type(bl,true); offset++; buf = WBUFP(buffer,offset); #endif @@ -1465,7 +1468,7 @@ void clif_weather(int16 m) /** * Main function to spawn a unit on the client (player/mob/pet/etc) **/ -int clif_spawn(struct block_list *bl) +int clif_spawn(struct block_list *bl, bool walking) { unsigned char buf[128]; struct view_data *vd; @@ -1481,7 +1484,7 @@ int clif_spawn(struct block_list *bl) if(bl->type == BL_NPC && !((TBL_NPC*)bl)->chat_id && (((TBL_NPC*)bl)->sc.option&OPTION_INVISIBLE)) return 0; - len = clif_set_unit_idle(bl, buf, (bl->type == BL_NPC && vd->dead_sit ? false : true), false, 0); + len = clif_set_unit_idle(bl, buf, (bl->type == BL_NPC && vd->dead_sit ? false : true), false, walking, 0); clif_send(buf, len, bl, AREA_WOS); if (disguised(bl)) clif_setdisguise(bl, buf, len); @@ -4732,7 +4735,7 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) if (std::find(sd->cloaked_npc.begin(), sd->cloaked_npc.end(), nd->bl.id) != sd->cloaked_npc.end()) option_val ^= OPTION_CLOAK; } - len = ( ud && ud->walktimer != INVALID_TIMER ) ? clif_set_unit_walking(bl,ud,buf) : clif_set_unit_idle(bl,buf,false,option,option_val); + len = ( ud && ud->walktimer != INVALID_TIMER ) ? clif_set_unit_walking(bl,ud,buf) : clif_set_unit_idle(bl,buf,false,option,false,option_val); clif_send(buf,len,&sd->bl,SELF); if (vd->cloth_color) diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 6d8c3ed64d..a2bfdbdb5c 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -589,7 +589,7 @@ void clif_clearflooritem(struct flooritem_data *fitem, int fd); void clif_clearunit_single(int id, clr_type type, int fd); void clif_clearunit_area(struct block_list* bl, clr_type type); void clif_clearunit_delayed(struct block_list* bl, clr_type type, t_tick tick); -int clif_spawn(struct block_list *bl); //area +int clif_spawn(struct block_list *bl, bool walking = false); //area void clif_walkok(struct map_session_data *sd); // self void clif_move(struct unit_data *ud); //area void clif_changemap(struct map_session_data *sd, short m, int x, int y); //self diff --git a/src/map/unit.cpp b/src/map/unit.cpp index 787fd23e41..1cb7cbf673 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -121,6 +121,13 @@ int unit_walktoxy_sub(struct block_list *bl) ((TBL_PC *)bl)->head_dir = 0; clif_walkok((TBL_PC*)bl); } +#if PACKETVER >= 20170726 + // If this is a walking NPC and it will use a player sprite + else if( bl->type == BL_NPC && pcdb_checkid( status_get_viewdata( bl )->class_ ) ){ + // Respawn the NPC as player unit + unit_refresh( bl, true ); +#endif + } clif_move(ud); if(ud->walkpath.path_pos>=ud->walkpath.path_len) @@ -410,6 +417,14 @@ static TIMER_FUNC(unit_walktoxy_timer){ ud->walktimer = INVALID_TIMER; if (bl->x == ud->to_x && bl->y == ud->to_y) { +#if PACKETVER >= 20170726 + // If this was a walking NPC and it used a player sprite + if( bl->type == BL_NPC && pcdb_checkid( status_get_viewdata( bl )->class_ ) ){ + // Respawn the NPC as NPC unit + unit_refresh( bl, false ); + } +#endif + if (ud->walk_done_event[0]){ char walk_done_event[EVENT_NAME_LENGTH]; @@ -3158,7 +3173,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, * Refresh the area with a change in display of a unit. * @bl: Object to update */ -void unit_refresh(struct block_list *bl) { +void unit_refresh(struct block_list *bl, bool walking) { nullpo_retv(bl); if (bl->m < 0) @@ -3170,7 +3185,7 @@ void unit_refresh(struct block_list *bl) { // Probably need to use another flag or other way to refresh it if (mapdata->users) { clif_clearunit_area(bl, CLR_TRICKDEAD); // Fade out - clif_spawn(bl); // Fade in + clif_spawn(bl,walking); // Fade in } } diff --git a/src/map/unit.hpp b/src/map/unit.hpp index fa559de7ab..3c1cf17d42 100644 --- a/src/map/unit.hpp +++ b/src/map/unit.hpp @@ -161,7 +161,7 @@ void unit_dataset(struct block_list *bl); // Remove unit struct unit_data* unit_bl2ud(struct block_list *bl); void unit_remove_map_pc(struct map_session_data *sd, clr_type clrtype); -void unit_refresh(struct block_list *bl); +void unit_refresh(struct block_list *bl, bool walking = false); void unit_free_pc(struct map_session_data *sd); #define unit_remove_map(bl,clrtype) unit_remove_map_(bl,clrtype,__FILE__,__LINE__,__func__) int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, int line, const char* func); From a7415403667e043499dbefbe82f3bcee7dcd0d39 Mon Sep 17 00:00:00 2001 From: Kakaroto Date: Thu, 9 Apr 2020 12:07:57 -0300 Subject: [PATCH 031/212] Hateffect Update (#4780) Minor Hateffect update. --- src/map/script.hpp | 7 +++++++ src/map/script_constants.hpp | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/map/script.hpp b/src/map/script.hpp index 78cc3fb928..f1ce096414 100644 --- a/src/map/script.hpp +++ b/src/map/script.hpp @@ -1967,6 +1967,13 @@ enum e_hat_effects { HAT_EF_2019RTC2ST_TW, HAT_EF_2019RTC3ST_TW, HAT_EF_CONS_OF_WIND, + HAT_EF_MAPLE_FALLS, + HAT_EF_BJ_HEADSETB, + HAT_EF_VIP_HAIR, + HAT_EF_C_MAGIC_HEIR_TW, + HAT_EF_C_SUDDEN_WEALTH_TW, + HAT_EF_C_ROMANCE_ROSE_TW, + HAT_EF_C_DISAPEAR_TIME_TW, HAT_EF_MAX }; diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 980aaaa239..dd9a4f077e 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -7317,6 +7317,13 @@ export_constant(HAT_EF_2019RTC2ST_TW); export_constant(HAT_EF_2019RTC3ST_TW); export_constant(HAT_EF_CONS_OF_WIND); + export_constant(HAT_EF_MAPLE_FALLS); + export_constant(HAT_EF_BJ_HEADSETB); + export_constant(HAT_EF_VIP_HAIR); + export_constant(HAT_EF_C_MAGIC_HEIR_TW); + export_constant(HAT_EF_C_SUDDEN_WEALTH_TW); + export_constant(HAT_EF_C_ROMANCE_ROSE_TW); + export_constant(HAT_EF_C_DISAPEAR_TIME_TW); /* pet catch */ export_constant(PET_CATCH_UNIVERSAL); From cd7df72c6354c76f9b1877692a733dd3caf43c79 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Thu, 9 Apr 2020 17:08:51 +0200 Subject: [PATCH 032/212] Added missing pet eggs (#4783) Item DB entries only Fixes #4654 Thanks to @RagnaWay --- db/re/item_db.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 38a3cdc879..ed5f579d68 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -6079,6 +6079,9 @@ 9119,Alicel_Egg,Alicel Egg,7,20,,0,,,,,,,,,,,,,{},{},{} 9120,Aliza_Egg,Aliza Egg,7,20,,0,,,,,,,,,,,,,{},{},{} 9121,Orc_Hero_Egg_,Orc Hero Egg,7,20,,0,,,,,,,,,,,,,{},{},{} +9122,Gloom_Under_Egg,Gloom Under Night Egg,7,20,,0,,,,,,,,,,,,,{},{},{} +9123,Ep_17_2_C_Admin1_Egg,Child Admin Beta Egg,7,20,,0,,,,,,,,,,,,,{},{},{} +9124,Ep_17_2_C_Admin2_Egg,Child Admin Alpha Egg,7,20,,0,,,,,,,,,,,,,{},{},{} //=================================================================== // Pet Accessories //=================================================================== From c99545dbcc705120b2ad80b9d3614c8943b8113e Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Thu, 9 Apr 2020 17:08:58 +0200 Subject: [PATCH 033/212] SQL synchronization --- sql-files/item_db_re.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 6ae79e0581..ff0f66ec60 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -6111,6 +6111,9 @@ REPLACE INTO `item_db_re` VALUES (9118,'Aliot_Egg','Aliot Egg',7,20,NULL,0,NULL, REPLACE INTO `item_db_re` VALUES (9119,'Alicel_Egg','Alicel Egg',7,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (9120,'Aliza_Egg','Aliza Egg',7,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (9121,'Orc_Hero_Egg_','Orc Hero Egg',7,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (9122,'Gloom_Under_Egg','Gloom Under Night Egg',7,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (9123,'Ep_17_2_C_Admin1_Egg','Child Admin Beta Egg',7,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (9124,'Ep_17_2_C_Admin2_Egg','Child Admin Alpha Egg',7,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); #=================================================================== # Pet Accessories #=================================================================== From d421225c4fa844f7226326ff33ff7ba0c2d67ee0 Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 9 Apr 2020 11:45:52 -0400 Subject: [PATCH 034/212] Fixes Acid Demonstration for pre-renewal (#4775) * Fixes #4770. * Adds back missing case for pre-renewal damage calculation. * Adds back long ranged check for Neutral Barrier in pre-renewal. Thanks to @danieljorge17! --- src/map/battle.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index bb2e10d5bd..709d86acf0 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1046,7 +1046,11 @@ bool battle_check_sc(struct block_list *src, struct block_list *target, struct s status_change_end(target, SC_SAFETYWALL, INVALID_TIMER); } - if (sc->data[SC_NEUTRALBARRIER] && (d->flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { + if (sc->data[SC_NEUTRALBARRIER] && ((d->flag&(BF_LONG|BF_MAGIC)) == BF_LONG +#ifndef RENEWAL + || skill_id == CR_ACIDDEMONSTRATION +#endif + )) { d->dmg_lv = ATK_MISS; return false; } @@ -6878,7 +6882,9 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * // AD benefits from endow/element but damage is forced back to neutral md.damage = battle_attr_fix(src, target, md.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); } + // Fall through #else + case CR_ACIDDEMONSTRATION: if(tstatus->vit+sstatus->int_) //crash fix md.damage = (int)((int64)7*tstatus->vit*sstatus->int_*sstatus->int_ / (10*(tstatus->vit+sstatus->int_))); else From af8c4ff6d7cdca04765c30a8a7fef2d3b05faed4 Mon Sep 17 00:00:00 2001 From: ~Neutral~ <33843418+NeutralDev@users.noreply.github.com> Date: Thu, 9 Apr 2020 11:00:11 -0500 Subject: [PATCH 035/212] Fixed flags of 2 skills in prere (#4520) Fixes #4498 --- db/pre-re/skill_db.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index d6a5e0d6cb..1af3fa6869 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -9764,9 +9764,6 @@ Body: NoDamage: true IgnoreDefense: true IgnoreFlee: true - Flags: - IgnoreAutoGuard: true - IgnoreCicada: true Hit: Single HitCount: 1 CastCancel: true @@ -12988,6 +12985,9 @@ Body: Flags: AllowOnMado: true Range: -2 + Flags: + IgnoreAutoGuard: true + IgnoreCicada: true Hit: Single HitCount: 1 Element: Weapon From 42f695fe8e814c0aa5668926468479ac7108e12b Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Thu, 9 Apr 2020 18:03:18 +0200 Subject: [PATCH 036/212] Fixed autotraders counting for instance requirements (#4779) --- src/map/script.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/script.cpp b/src/map/script.cpp index 087ba7246d..2f524f2b66 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -20476,7 +20476,7 @@ BUILDIN_FUNC(instance_check_party) for( i = 0; i < MAX_PARTY; i++ ) { struct map_session_data *pl_sd; if( (pl_sd = p->data[i].sd) ) - if(map_id2bl(pl_sd->bl.id)) { + if(map_id2bl(pl_sd->bl.id) && !pl_sd->state.autotrade) { if(pl_sd->status.base_level < min) { script_pushint(st, 0); return SCRIPT_CMD_SUCCESS; @@ -20537,7 +20537,7 @@ BUILDIN_FUNC(instance_check_guild) struct map_session_data *pl_sd; if ((pl_sd = g->member[i].sd)) { - if (map_id2bl(pl_sd->bl.id)) { + if (map_id2bl(pl_sd->bl.id) && !pl_sd->state.autotrade) { if (pl_sd->status.base_level < min) { script_pushint(st, 0); return SCRIPT_CMD_SUCCESS; @@ -20599,7 +20599,7 @@ BUILDIN_FUNC(instance_check_clan) struct map_session_data *pl_sd; if ((pl_sd = cd->members[i])) { - if (map_id2bl(pl_sd->bl.id)) { + if (map_id2bl(pl_sd->bl.id) && !pl_sd->state.autotrade) { if (pl_sd->status.base_level < min) { script_pushint(st, 0); return SCRIPT_CMD_SUCCESS; From c8fd2a52a90bf1d0ce88cd2256a5eaa512e1b093 Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 9 Apr 2020 13:29:27 -0400 Subject: [PATCH 037/212] Adds missing AoE for Xeno Slasher (#4774) * Fixes #4768. * Updates ranges for levels 1-5. * Adds missing AoE for levels 6-10. Thanks to @teededung! --- db/re/skill_db.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 7921741a30..c7bd9fd13a 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -34273,25 +34273,25 @@ Body: Id: Dummyskill Range: - Level: 1 - Size: 2 + Size: 1 - Level: 2 - Size: 2 + Size: 1 - Level: 3 - Size: 3 + Size: 1 - Level: 4 - Size: 3 + Size: 2 - Level: 5 - Size: 4 + Size: 2 - Level: 6 - Size: 0 + Size: 2 - Level: 7 - Size: 0 + Size: 3 - Level: 8 - Size: 0 + Size: 3 - Level: 9 - Size: 0 + Size: 3 - Level: 10 - Size: 0 + Size: 4 Interval: 1000 Target: Enemy Flag: From 8716121b4c533c0d5d4bd821f39c29c1917d3559 Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 9 Apr 2020 14:18:50 -0400 Subject: [PATCH 038/212] Fixes to Battleground script commands (#4764) * Fixes #4763. * Cleans up script commands bg_getareausers and bg_get_data. Thanks to @voyfmyuh and @Lemongrass3110! --- src/map/script.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/map/script.cpp b/src/map/script.cpp index 2f524f2b66..4f44fdc136 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -19933,8 +19933,7 @@ BUILDIN_FUNC(bg_getareausers) { const char *str = script_getstr(st, 3); int16 m, x0, y0, x1, y1; - int bg_id = script_getnum(st, 2); - int i = 0, c = 0; + int bg_id = script_getnum(st, 2), c = 0; std::shared_ptr bg = util::umap_find(bg_team_db, bg_id); if (!bg || (m = map_mapname2mapid(str)) < 0) { @@ -19947,12 +19946,8 @@ BUILDIN_FUNC(bg_getareausers) x1 = script_getnum(st,6); y1 = script_getnum(st,7); - for( i = 0; i < bg->members.size(); i++ ) - { - struct map_session_data *sd; - if( (sd = bg->members[i].sd) == NULL ) - continue; - if( sd->bl.m != m || sd->bl.x < x0 || sd->bl.y < y0 || sd->bl.x > x1 || sd->bl.y > y1 ) + for (const auto &member : bg->members) { + if( member.sd->bl.m != m || member.sd->bl.x < x0 || member.sd->bl.y < y0 || member.sd->bl.x > x1 || member.sd->bl.y > y1 ) continue; c++; } @@ -19981,7 +19976,7 @@ BUILDIN_FUNC(bg_updatescore) BUILDIN_FUNC(bg_get_data) { - int bg_id = script_getnum(st,2), type = script_getnum(st,3), i; + int bg_id = script_getnum(st,2), type = script_getnum(st,3), i = 0; std::shared_ptr bg = util::umap_find(bg_team_db, bg_id); if (bg) { @@ -19990,8 +19985,8 @@ BUILDIN_FUNC(bg_get_data) script_pushint(st, bg->members.size()); break; case 1: - for (i = 0; bg->members[i].sd != NULL; i++) - mapreg_setreg(reference_uid(add_str("$@arenamembers"), i), bg->members[i].sd->bl.id); + for (const auto &member : bg->members) + mapreg_setreg(reference_uid(add_str("$@arenamembers"), i++), member.sd->bl.id); mapreg_setreg(add_str("$@arenamemberscount"), i); script_pushint(st, i); break; From 1f63265a3bc76b4aac4d9e325f1f31efd8b0af56 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Thu, 9 Apr 2020 21:51:33 +0200 Subject: [PATCH 039/212] Follow up to 6fe0ed5 Thanks to @Daegaladh --- src/map/unit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/unit.cpp b/src/map/unit.cpp index 1cb7cbf673..cb6a209a4c 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -126,8 +126,8 @@ int unit_walktoxy_sub(struct block_list *bl) else if( bl->type == BL_NPC && pcdb_checkid( status_get_viewdata( bl )->class_ ) ){ // Respawn the NPC as player unit unit_refresh( bl, true ); -#endif } +#endif clif_move(ud); if(ud->walkpath.path_pos>=ud->walkpath.path_len) From 9db44eca7d78c57b8073af6b4d72832b85299c60 Mon Sep 17 00:00:00 2001 From: aleos Date: Thu, 9 Apr 2020 16:13:17 -0400 Subject: [PATCH 040/212] Fixes Instance database converter * Fixes the output of AdditionalMaps to not print as a sequence. Thanks to @Atemo! --- src/tool/csv2yaml.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index f4b9d9f96e..93036d99f4 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -2569,7 +2569,7 @@ static bool instance_readdb_sub(char* str[], int columns, int current) { if (columns > 7) { body << YAML::Key << "AdditionalMaps"; - body << YAML::BeginSeq; + body << YAML::BeginMap; for (int i = 7; i < columns; i++) { if (!strlen(str[i])) @@ -2578,12 +2578,10 @@ static bool instance_readdb_sub(char* str[], int columns, int current) { if (strcmpi(str[4], str[i]) == 0) continue; - body << YAML::BeginMap; body << YAML::Key << str[i] << YAML::Value << "true"; - body << YAML::EndMap; } - body << YAML::EndSeq; + body << YAML::EndMap; } body << YAML::EndMap; From 629313784199ce4a0d6fce39d8369a74c5be396e Mon Sep 17 00:00:00 2001 From: Atemo Date: Sun, 12 Apr 2020 16:44:04 +0200 Subject: [PATCH 041/212] Updated Morse's Cave instance to match official script (#4674) (to resume the change IG are some additionnals effects and defined warp points) --- db/re/mob_db.txt | 2 +- npc/other/gm_npcs.txt | 1 + npc/re/instances/MorseCave.txt | 1928 ++++++++++++++++++-------------- 3 files changed, 1083 insertions(+), 848 deletions(-) diff --git a/db/re/mob_db.txt b/db/re/mob_db.txt index 0f381dc5a0..81e932aba8 100644 --- a/db/re/mob_db.txt +++ b/db/re/mob_db.txt @@ -2157,7 +2157,7 @@ 2997,G_XM_CELINE_KIMI,Kimi's Phantom,Kimi's Phantom,160,66666666,1,0,0,2,6666,6666,479,444,144,166,44,444,166,166,10,12,2,1,28,0x6203695,100,768,1056,480,0,0,0,0,0,0,0,6683,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2998,EP14_MORS_EVENT,Weakened Morocc,Weakened Morocc,158,1771440,1,12390,16104,1,1872,900,113,45,87,51,45,88,106,50,12,12,2,6,60,0x6200085,200,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2999,EP14_MORS_BOSSA,Morocc Necromancer,Morocc Necromancer,158,4000000,1,2106000,1336500,1,700,0,215,555,165,190,142,146,299,93,12,12,1,7,60,0x6280085,100,300,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,0,0,0,0,0,0,522,200,0,0,0,0,0,0 -3000,EP14_MORS_BOSSB,Morocc Necromancer,Morocc Necromancer,101,80000000,1,2310750,1465200,12,700,1,1,1,1,1,1,180,1,1,12,12,1,7,82,0x6280085,2000,2700,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,22537,10000,22537,10000,0,0,522,200,0,0,0,0,0,0 +3000,EP14_MORS_BOSSB,Morocc Necromancer,Morocc Necromancer,101,80000000,1,2310750,1465200,12,700,1,1,1,1,1,1,180,1,1,12,12,1,7,82,0x6280084,2000,2700,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,22537,10000,22537,10000,0,0,522,200,0,0,0,0,0,0 3001,EP14_MORS_MOB1,Morocc's Ghoul,Morocc's Ghoul,158,295240,1,1239,1610,1,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,1000,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3002,EP14_MORS_MOB2,Morocc's Osiris,Morocc's Osiris,158,442860,1,1239,1610,1,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,200,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3003,EP14_MORS_MOB3,Morocc's Archer Skeleton,Morocc's Archer Skeleton,158,295240,1,1239,1610,7,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,200,300,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/npc/other/gm_npcs.txt b/npc/other/gm_npcs.txt index 5dc4bdb14a..ece20f6aaf 100644 --- a/npc/other/gm_npcs.txt +++ b/npc/other/gm_npcs.txt @@ -91,6 +91,7 @@ List of GM Management NPCs (incomplete) - Horror Toy Factory (RE) - Faceworm's Nest (RE) - Central Laboratory (RE) +- Morse's Cave (RE) [ Job-related ] ----- 3rd Class (RE) ----- diff --git a/npc/re/instances/MorseCave.txt b/npc/re/instances/MorseCave.txt index 1ff95d7924..41f2fe2b00 100644 --- a/npc/re/instances/MorseCave.txt +++ b/npc/re/instances/MorseCave.txt @@ -1,10 +1,11 @@ //===== rAthena Script ======================================= //= Morse Cave //===== Description: ========================================= -//= [Walkthrough Conversion] +//= [Official Conversion] //= Morse Cave Instance //===== Changelogs: ========================================== //= 1.0 First version. [Capuche] +//= 1.1 Updated to match official script. [Capuche] //============================================================ moro_cav,61,69,3 script Senior Tracker#a1 4_M_JOB_ASSASSIN,{ @@ -17,6 +18,16 @@ moro_cav,61,69,3 script Senior Tracker#a1 4_M_JOB_ASSASSIN,{ mes "to Morocc's lair."; close; } + if (checkweight(2104,2) == 0) { + mes "Your backpack is too full"; + mes "I can't talk to you!"; + close; + } + if (BaseLevel < 160) { + mes "You need to reach level 160 first"; + mes "to enter the Red Flower!"; + close; + } switch( checkquest(9319,PLAYTIME) ) { case -1: break; @@ -31,10 +42,49 @@ moro_cav,61,69,3 script Senior Tracker#a1 4_M_JOB_ASSASSIN,{ mes "Could you come back tomorrow?"; close; case 2: - break; + mes "[Senior Tracker]"; + mes "I knew you'd return."; + mes "You look well-rested."; + next; + mes "[Senior Tracker]"; + mes "According to my intel,"; + mes "Morocc is hiding out in this place,"; + mes "recovering his strength."; + next; + mes "[Senior Tracker]"; + mes "Fighting Morocc"; + mes "takes more than a few warriors, no matter how strong they are."; + mes "I recommend you join forces with"; + mes "as many comrades as you can find."; + mes "Are you ready to enter the Red Flower"; + mes "where Morocc is believed to be hiding?"; + if (getcharid(1) < 1 || is_party_leader() == false) + close; + next; + if (select( "No.", "Yes." ) == 1) { + mes "[Senior Tracker]"; + mes "Come back"; + mes "if you change your mind."; + close; + } + if (instance_create("Morse's Cave") < 1) { + mes "[Senior Tracker]"; + mes "The entrance to the Red Flower"; + mes "is not open yet."; + mes "Please come back later"; + mes "and try again."; + close; + } + mes "[Senior Tracker]"; + mes "The entrance to the Red Flower"; + mes "has opened."; + mes "It will only stay open for a while."; + mes "You'd better use it"; + mes "while you can."; + close; } - switch( isbegin_quest(9318) ) { - case 0: + .@hunting_9318 = checkquest(9318,HUNTING); + if (.@hunting_9318 == -1) { mes "[Senior Tracker]"; mes "This is our advance base"; mes "to stop Morocc."; @@ -84,8 +134,35 @@ moro_cav,61,69,3 script Senior Tracker#a1 4_M_JOB_ASSASSIN,{ } mes "[Senior Tracker]"; mes "Morocc may not have recovered his full strength, but fighting him still"; - break; - case 1: + mes "takes more than a few warriors, no matter how strong they are."; + mes "I recommend you join forces with"; + mes "as many comrades as you can find."; + mes "Are you ready to enter the Red Flower"; + mes "where Morocc is believed to be hiding?"; + next; + if (select( "No.", "Yes." ) == 1) { + mes "[Senior Tracker]"; + mes "Come back"; + mes "if you change your mind."; + close; + } + if (instance_create("Morse's Cave") < 1) { + mes "[Senior Tracker]"; + mes "The entrance to the Red Flower"; + mes "is not open yet."; + mes "Please come back later"; + mes "and try again."; + close; + } + mes "[Senior Tracker]"; + mes "The entrance to the Red Flower"; + mes "has opened."; + mes "It will only stay open for a while."; + mes "You'd better use it"; + mes "while you can."; + close; + } + else { mes "[Senior Tracker]"; mes "Finally you're back!"; mes "What happened in there?"; @@ -114,45 +191,11 @@ moro_cav,61,69,3 script Senior Tracker#a1 4_M_JOB_ASSASSIN,{ mes "I'll be waiting here."; if (checkquest(9318,HUNTING) == 2) getitem 6684,1; // TokenOfHero - completequest 9318;// Pursuing Hiding Morocc + erasequest 9318;// Pursuing Hiding Morocc setquest 9319;// Pursuing Hiding Morocc Continues + ep14_3_mors01 = 1; close; - case 2: - mes "[Senior Tracker]"; - mes "I knew you'd return."; - mes "You look well-rested."; - next; - mes "[Senior Tracker]"; - mes "According to my intel,"; - mes "Morocc is hiding out in this place,"; - mes "recovering his strength."; - next; - mes "[Senior Tracker]"; - mes "Fighting Morocc"; - break; } - mes "takes more than a few warriors, no matter how strong they are."; - mes "I recommend you join forces with"; - mes "as many comrades as you can find."; - mes "Are you ready to enter the Red Flower"; - mes "where Morocc is believed to be hiding?"; - if (getcharid(1) > 0 && is_party_leader() == true) { - next; - if (select( "No.", "Yes." ) == 1) { - mes "[Senior Tracker]"; - mes "Come back"; - mes "if you change your mind."; - close; - } - mes "[Senior Tracker]"; - mes "The entrance to the Red Flower"; - mes "has opened."; - mes "It will only stay open for a while."; - mes "You'd better use it"; - mes "while you can."; - instance_create("Morse's Cave"); - } - close; } moro_cav,57,69,3 script Red Flower#a1 CLEAR_NPC,{ @@ -165,7 +208,12 @@ moro_cav,57,69,3 script Red Flower#a1 CLEAR_NPC,{ mes "to Morocc's lair."; close; } - if (isbegin_quest(9318) == 1) { + if (BaseLevel < 160) { + mes "You need to reach level 160 first"; + mes "to enter the Red Flower!"; + close; + } + if (isbegin_quest(9318) > 0) { mes "- The Red Flower is closed."; mes "You cannot enter it yet. -"; close; @@ -209,40 +257,170 @@ moro_cav,57,69,3 script Red Flower#a1 CLEAR_NPC,{ end; OnInit: - while(true) { - sleep 15000; - specialeffect 239; - } + initnpctimer; + end; +OnTimer3000: + specialeffect EF_BOTTOM_VO; + end; +OnTimer15000: + initnpctimer; end; } -// Entrance +1@rev,33,117,0 script #Pause Effect RZ1 HIDDEN_WARP_NPC,1,1,{ + end; +OnTouch: + if (getnpctimer(0) > 0) + end; + initnpctimer; + //disablenpc instance_npcname( strnpcinfo(0) ); + hideonnpc instance_npcname( strnpcinfo(0) ); + specialeffect EF_ICEWALL; + end; +OnTimer30000: + specialeffect EF_ICEWALL; + end; +OnTimer60000: + specialeffect EF_ICEWALL; + initnpctimer; + end; +} +1@rev,36,118,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ2 HIDDEN_WARP_NPC,1,1 +1@rev,36,121,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ3 HIDDEN_WARP_NPC,1,1 +1@rev,34,122,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ4 HIDDEN_WARP_NPC,1,1 +1@rev,31,121,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ5 HIDDEN_WARP_NPC,1,1 +1@rev,31,118,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ6 HIDDEN_WARP_NPC,1,1 +1@rev,112,116,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ7 HIDDEN_WARP_NPC,1,1 +1@rev,114,117,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ8 HIDDEN_WARP_NPC,1,1 +1@rev,114,120,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ9 HIDDEN_WARP_NPC,1,1 +1@rev,111,121,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ10 HIDDEN_WARP_NPC,1,1 +1@rev,109,120,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ11 HIDDEN_WARP_NPC,1,1 +1@rev,109,117,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ12 HIDDEN_WARP_NPC,1,1 + +1@rev,31,50,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ1_ HIDDEN_WARP_NPC,1,1 +1@rev,36,49,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ2_ HIDDEN_WARP_NPC,1,1 +1@rev,37,45,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ3_ HIDDEN_WARP_NPC,1,1 +1@rev,30,45,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ4_ HIDDEN_WARP_NPC,1,1 +1@rev,29,47,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ5_ HIDDEN_WARP_NPC,1,1 +1@rev,33,51,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ6_ HIDDEN_WARP_NPC,1,1 +1@rev,38,49,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ7_ HIDDEN_WARP_NPC,1,1 +1@rev,34,44,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ8_ HIDDEN_WARP_NPC,1,1 +1@rev,32,44,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ9_ HIDDEN_WARP_NPC,1,1 +1@rev,29,49,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ10_ HIDDEN_WARP_NPC,1,1 +1@rev,35,51,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ11_ HIDDEN_WARP_NPC,1,1 +1@rev,37,47,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ12_ HIDDEN_WARP_NPC,1,1 + + +// Event A 1@rev,27,181,0 script #RZ Memorial Start HIDDEN_WARP_NPC,4,4,{ end; OnTouch: - // note : party member can also trigger this event disablenpc instance_npcname("#RZ Memorial Start"); - 'party_id = getcharid(1); - 'soul_name$ = strcharinfo(0); // name displayed on soul is defined at entrance - setpcblock PCBLOCK_NPC, true; - sleep2 500; - mapannounce 'map_rev$, "Morocc: Who dares to disrupt my sleep?!", bc_map,0xEBFF; - unittalk getcharid(3), "" + strcharinfo(0) + " : We came to the right place!"; - sleep2 3000; - unittalk getcharid(3), "" + strcharinfo(0) + " : Wait! There's something ahead of us!"; - sleep2 3000; - specialeffect2 EF_LOCKON; - unittalk getcharid(3), "" + strcharinfo(0) + " : Are these hideous monsters Morocc's lackeys?"; - donpcevent instance_npcname("#RZ Event_1") + "::OnStart"; - setpcblock PCBLOCK_NPC, false; + enablenpc instance_npcname("#RZ Event_1"); + .@mob_name$ = "" + strcharinfo(0) + "'s Soul"; + .@label$ = instance_npcname("#RZ Memorial Start") + "::OnSoulDead"; + monster 'map_rev$, 34,120, .@mob_name$, 3007,1, .@label$; // EP14_MORS_DUMMY + monster 'map_rev$,112,118, .@mob_name$, 3007,1, .@label$; + monster 'map_rev$, 34, 48, .@mob_name$, 3007,1, .@label$; + monster 'map_rev$,112, 48, .@mob_name$, 3007,1, .@label$; + end; +OnSoulDead: + end; + +OnInstanceInit: + 'map_rev$ = instance_mapname("1@rev"); + 'event_right = false; + 'event_ended = false; + 'boss_id = 0; + 'monster_id[4] = 0; + 'monster_id[5] = 0; + 'monster_id[6] = 0; + 'monster_id[7] = 0; + + disablenpc instance_npcname("#RZ Event_1"); + disablenpc instance_npcname("#RZ Event_3"); + + disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_2"); + disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_3"); + disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_4"); + disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_5"); + disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_6"); + + disablenpc instance_npcname("#RZ Debuff Recovery_1"); + disablenpc instance_npcname("#RZ Debuff Recovery_2"); + disablenpc instance_npcname("#RZ Debuff Recovery_3"); + disablenpc instance_npcname("#RZ Debuff Recovery_4"); + + for ( .@i = 5; .@i < 18; ++.@i ) + disablenpc instance_npcname("#RZ Move_" + .@i + "a"); + for ( .@i = 1; .@i < 13; ++.@i ) + disablenpc instance_npcname("#RZ Debuff_" + .@i); + + for ( .@i = 1; .@i < 17; ++.@i ) + disablenpc instance_npcname("#RZ Move_" + .@i); + disablenpc instance_npcname("#RZ Move_30"); + disablenpc instance_npcname("#RZ Move_31"); + disablenpc instance_npcname("#RZ Move_32"); + + disablenpc instance_npcname("#Battle_1RZ1"); + disablenpc instance_npcname("#Battle_1RZ2"); + disablenpc instance_npcname("#Battle_2RZ1"); + disablenpc instance_npcname("#Battle_3RZ2"); + disablenpc instance_npcname("#Battle_3RZ3"); + disablenpc instance_npcname("#Battle_3RZ4"); + disablenpc instance_npcname("#Battle_3RZ5"); + disablenpc instance_npcname("#Battle_3RZ6"); + disablenpc instance_npcname("#Battle_3RZ7"); + + disablenpc instance_npcname("Weakened Morocc#RZ1"); + disablenpc instance_npcname("Morocc Necromancer#RZ1"); end; } -// 1@rev,31,181,0 script #RZ Event_1 HIDDEN_WARP_NPC,5,5,{ -1@rev,1,1,0 script #RZ Event_1 HIDDEN_WARP_NPC,{ +1@rev,34,120,0 script #RZ Memorial Effect 1 HIDDEN_WARP_NPC,4,4,{ end; -OnStart: - enablenpc instance_npcname("#RZ Event_1"); +OnInstanceInit: + //disablenpc instance_npcname( strnpcinfo(0) ); + hideonnpc instance_npcname( strnpcinfo(0) ); + initnpctimer; + end; +OnTimer1000: + specialeffect EF_CURSEATTACK; + end; +OnTimer2000: + initnpctimer; + end; +} +1@rev,112,118,0 duplicate(#RZ Memorial Effect 1) #RZ Memorial Effect 2 HIDDEN_WARP_NPC,4,4 +1@rev,34,48,0 duplicate(#RZ Memorial Effect 1) #RZ Memorial Effect 3 HIDDEN_WARP_NPC,4,4 + +1@rev,31,181,0 script #RZ Event_1 HIDDEN_WARP_NPC,5,5,{ + end; +OnTouch: + disablenpc instance_npcname("#RZ Event_1"); + // specialeffect EF_HIT2, AREA, ""; // npc target undefined + mapannounce 'map_rev$, "Morocc: Who dares to disrupt my sleep?!", bc_map,00EBFF; + .@account_id = getcharid(3); + .@name$ = strcharinfo(0); + unittalk .@account_id, "" + .@name$ + " : We came to the right place!"; + setpcblock PCBLOCK_NPC, true; + sleep2 3000; + unittalk .@account_id, "" + .@name$ + " : Wait! There's something ahead of us!"; + sleep2 3000; + setpcblock PCBLOCK_NPC, false; + + // debug in case of reload script + getpartymember getcharid(1), 1, .@char_id; + getpartymember getcharid(1), 2, .@account_id; + + for ( .@i = 0; .@i < $@partymembercount; .@i++ ) { + if (isloggedin(.@account_id[.@i],.@char_id[.@i]) == false) + continue; + if (strcharinfo(3,.@char_id[.@i]) == 'map_rev$) + setpcblock PCBLOCK_MOVE, false, .@account_id[.@i]; + } + + specialeffect2 EF_LOCKON; .@label$ = instance_npcname("#RZ Event_1") + "::OnMobDead"; monster 'map_rev$,38,180,"Morocc's Ghoul",3001,1, .@label$; // EP14_MORS_MOB1 monster 'map_rev$,38,181,"Morocc's Ghoul",3001,1, .@label$; @@ -253,12 +431,19 @@ OnStart: monster 'map_rev$,70,180,"Morocc's Ghoul",3001,1, .@label$; monster 'map_rev$,70,181,"Morocc's Ghoul",3001,1, .@label$; monster 'map_rev$,70,182,"Morocc's Ghoul",3001,1, .@label$; + unittalk .@account_id, "" + .@name$ + " : Are these hideous monsters Morocc's lackeys?"; + initnpctimer; + end; +OnTimer2000: + if (mobcount( 'map_rev$, instance_npcname("#RZ Event_1") + "::OnMobDead" ) < 1) { + stopnpctimer; + donpcevent instance_npcname("Grim Reaper Ankou#RZ Event_2") + "::OnStart"; + } + end; +OnTimer4000: + initnpctimer; end; OnMobDead: - if (mobcount( 'map_rev$, instance_npcname("#RZ Event_1") + "::OnMobDead" ) < 1) { - donpcevent instance_npcname("Grim Reaper Ankou#RZ Event_2") + "::OnStart"; - disablenpc instance_npcname("#RZ Event_1"); - } end; } @@ -266,6 +451,7 @@ OnMobDead: end; OnStart: enablenpc instance_npcname("Grim Reaper Ankou#RZ Event_2"); + enablenpc instance_npcname("#RZ Event_3"); npctalk "Grim Reaper Ankou: *Chuckle* We meet again!"; sleep 3000; npctalk "Grim Reaper Ankou: You shouldn't have come. You're interrupting Lord Morocc from recovering his strength."; @@ -277,33 +463,86 @@ OnStart: npctalk "Grim Reaper Ankou: Lord Morocc is expecting you. Let me take you to him. *Chuckle*"; sleep 3000; disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_2"); - enablenpc instance_npcname("#RZ Event_3"); sleep 3000; - /* Officials scripts enablenpc instance_npcname("#RZ Move_30"); enablenpc instance_npcname("#RZ Move_31"); enablenpc instance_npcname("#RZ Move_32"); - */ - mapwarp 'map_rev$,'map_rev$,103,177; // note: officially players are warped when the next event start - player entering can't access to the current event end; } -// Weakened Morocc Room +// Fail, warp out +1@rev,34,126,4 script Grim Reaper Ankou#RZ Event_3 3029,{ + end; +OnEnd: + .@ankou_3$ = instance_npcname("Grim Reaper Ankou#RZ Event_3"); + .@ankou_4$ = instance_npcname("Grim Reaper Ankou#RZ Event_4"); + enablenpc .@ankou_3$; + enablenpc .@ankou_4$; + npctalk "Grim Reaper Ankou: You're pathetic.", .@ankou_3$; + npctalk "Grim Reaper Ankou: You're pathetic.", .@ankou_4$; + sleep 3000; + npctalk "Grim Reaper Ankou: Weaklings like you aren't enough food for Lord Morocc", .@ankou_3$; + npctalk "Grim Reaper Ankou: Weaklings like you aren't enough food for Lord Morocc", .@ankou_4$; + sleep 3000; + npctalk "Grim Reaper Ankou: to get the energy he needs for a full recovery.", .@ankou_3$; + npctalk "Grim Reaper Ankou: to get the energy he needs for a full recovery.", .@ankou_4; + sleep 3000; + npctalk "Grim Reaper Ankou: I'll give you one chance to leave. NOW!", .@ankou_3$; + npctalk "Grim Reaper Ankou: I'll give you one chance to leave. NOW!", .@ankou_4$; + sleep 3000; + disablenpc .@ankou_3$; + disablenpc .@ankou_4$; + sleep 5000; + enablenpc instance_npcname("#RZ Move_5a"); + enablenpc instance_npcname("#RZ Move_6a"); + enablenpc instance_npcname("#RZ Move_7a"); + enablenpc instance_npcname("#RZ Move_8a"); + enablenpc instance_npcname("#RZ Move_9a"); + enablenpc instance_npcname("#RZ Move_10a"); + enablenpc instance_npcname("#RZ Move_11a"); + enablenpc instance_npcname("#RZ Move_12a"); + end; +} +1@rev,112,126,4 script Grim Reaper Ankou#RZ Event_4 3029,{ end; } + +1@rev,34,55,4 script Grim Reaper Ankou#RZ Event_5 3029,{ + end; +OnEnd: + enablenpc instance_npcname("Grim Reaper Ankou#RZ Event_5"); + npctalk "Grim Reaper Ankou: You're pathetic."; + sleep 3000; + npctalk "Grim Reaper Ankou: Weaklings like you aren't enough food for Lord Morocc"; + sleep 3000; + npctalk "Grim Reaper Ankou: to get the energy he needs for a full recovery."; + sleep 3000; + npctalk "Grim Reaper Ankou: I'll give you one chance to leave. NOW!!"; + sleep 3000; + disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_5"); + sleep 5000; + enablenpc instance_npcname("#RZ Move_13a"); + enablenpc instance_npcname("#RZ Move_14a"); + enablenpc instance_npcname("#RZ Move_15a"); + enablenpc instance_npcname("#RZ Move_16a"); + end; +} + + +// Event B 1@rev,104,176,0 script #RZ Event_3 HIDDEN_WARP_NPC,4,4,{ end; -OnTouch: // note : party member can also trigger this event - setpcblock PCBLOCK_NPC, true; +OnTouch: disablenpc instance_npcname("#RZ Event_3"); enablenpc instance_npcname("Weakened Morocc#RZ1"); unittalk getcharid(3), "" + strcharinfo(0) + " : Finally, here we are, Morocc."; + setpcblock PCBLOCK_NPC, true; sleep2 3000; unittalk getcharid(3), "" + strcharinfo(0) + " : It's been almost too easy to find you,"; sleep2 3000; unittalk getcharid(3), "" + strcharinfo(0) + " : but it doesn't matter; you'll die today!"; sleep2 3000; + setpcblock PCBLOCK_NPC, false; specialeffect2 EF_LOCKON; donpcevent instance_npcname("Weakened Morocc#RZ1") + "::OnTalk1"; - setpcblock PCBLOCK_NPC, false; end; } @@ -325,10 +564,10 @@ OnTalk1: specialeffect EF_VOLCANO; sleep 3000; disablenpc instance_npcname("Weakened Morocc#RZ1"); - donpcevent instance_npcname("Weakened Morocc#control") + "::OnStart"; + initnpctimer; + monster 'map_rev$,111,178,"Weakened Morocc",2998,1, instance_npcname("Weakened Morocc#RZ1") + "::OnMobDead"; // EP14_MORS_EVENT end; OnTalk2: - enablenpc instance_npcname("Weakened Morocc#RZ1"); npctalk "Weakened Morocc: I'm sorry, but I haven't recovered my full strength."; sleep 3000; npctalk "Weakened Morocc: I'll have to leave you to my soldiers for now."; @@ -341,604 +580,353 @@ OnTalk2: sleep 3000; disablenpc instance_npcname("Weakened Morocc#RZ1"); sleep 3000; - /* Officials scripts use WARPNPC enablenpc instance_npcname("#RZ Move_1"); enablenpc instance_npcname("#RZ Move_2"); enablenpc instance_npcname("#RZ Move_3"); enablenpc instance_npcname("#RZ Move_4"); - */ enablenpc instance_npcname("#Battle_1RZ1"); enablenpc instance_npcname("#Battle_1RZ2"); - for ( .@i = 1; .@i <= 12; .@i++ ) - enablenpc instance_npcname( "#Pause Effect RZ" + .@i ); - for ( .@i = 1; .@i <= 8; .@i++ ) - enablenpc instance_npcname( "#RZ Debuff_" + .@i ); - - getpartymember 'party_id, 1, .@char_id; - getpartymember 'party_id, 2, .@account_id; - for ( .@i = 0; .@i < $@partymembercount; .@i++ ) { - if (isloggedin(.@account_id[.@i],.@char_id[.@i]) == false) - continue; - if (strcharinfo(3,.@char_id[.@i]) == 'map_rev$) { - if ((.@count % 2) == 0) // Right - warp 'map_rev$, rand(33,36), rand(117,118), .@char_id[.@i]; - else // Left - warp 'map_rev$, rand(112,114), rand(116,118), .@char_id[.@i]; - .@count++; - } + end; +OnTimer2000: + if (mobcount( 'map_rev$, instance_npcname("Weakened Morocc#RZ1") + "::OnMobDead" ) < 1) { + stopnpctimer; + enablenpc instance_npcname("Weakened Morocc#RZ1"); + donpcevent instance_npcname("Weakened Morocc#RZ1") + "::OnTalk2"; } end; -} - -1@rev,1,1,0 script Weakened Morocc#control HIDDEN_WARP_NPC,{ - end; -OnStart: - enablenpc instance_npcname("Weakened Morocc#control"); - monster 'map_rev$,111,178,"Weakened Morocc",2998,1, instance_npcname("Weakened Morocc#control") + "::OnMobDead"; // EP14_MORS_EVENT +OnTimer4000: + initnpctimer; end; OnMobDead: - donpcevent instance_npcname("Weakened Morocc#RZ1") + "::OnTalk2"; - disablenpc instance_npcname("Weakened Morocc#control"); end; } -1@rev,34,126,4 script Grim Reaper Ankou#RZ Event_3 3029,{ end; } -1@rev,112,126,4 duplicate(Grim Reaper Ankou#RZ Event_3) Grim Reaper Ankou#RZ Event_4 3029 -1@rev,34,55,4 duplicate(Grim Reaper Ankou#RZ Event_3) Grim Reaper Ankou#RZ Event_5 3029 -1@rev,112,48,4 duplicate(Grim Reaper Ankou#RZ Event_3) Grim Reaper Ankou#RZ Event_6 3029 - - -// Battle 1 - waves, event A - left side -// 1@rev,35,119,0 script #Battle_1RZ1 HIDDEN_WARP_NPC,10,10,{ -1@rev,35,119,0 script #Battle_1RZ1 HIDDEN_WARP_NPC,2,2,{ +// Event C1 - left side +1@rev,35,119,0 script #Battle_1RZ1 HIDDEN_WARP_NPC,10,10,{ end; OnTouch: - if ('status_battle[0] != 0) - setpcblock PCBLOCK_MOVE, true; - else { - 'status_battle[0] = 1; - donpcevent instance_npcname("#RZ Memorial Effect 1") + "::OnStart"; - setpcblock PCBLOCK_NPC, true; - mapannounce 'map_rev$, "Morocc: How do you like to be separated from each other and have your bodies and minds bound?", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: You're trespassing! Riff-raff like you have no business in here!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: Your bodies are mine to control!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: Your souls are food for my resurrection!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: My soldiers, tear their bodies asunder and bring their souls to me!", bc_map,0xEBFF; - donpcevent instance_npcname("#morse_cave_wave_1") + "::OnStart"; - setpcblock (PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_COMMANDS|PCBLOCK_NPCCLICK), false; - } - end; -} - -// Event B - right side -// 1@rev,112,126,0 script #Battle_1RZ2 HIDDEN_WARP_NPC,10,10 -1@rev,112,116,0 script #Battle_1RZ2 HIDDEN_WARP_NPC,2,2,{ - end; -OnTouch: - setpcblock PCBLOCK_MOVE, true; - if ('status_battle[1] == 0) { - 'status_battle[1] = 1; - donpcevent instance_npcname("#RZ Memorial Effect 2") + "::OnStart"; - } - end; -} - -1@rev,1,1,0 script #morse_cave_wave_1 HIDDEN_WARP_NPC,{ - end; -OnStart: - enablenpc instance_npcname("#morse_cave_wave_1"); - sleep 5000; - callsub( S_Spawn,0 ); - sleep 20000; - callsub( S_Spawn,0 ); - sleep 20000; - callsub( S_Spawn,0 ); - mapannounce 'map_rev$, "Morocc: My soldiers, make them suffer! Feast on their bodies and souls!", bc_map,0xEBFF; - sleep 20000; - callsub( S_Spawn,0 ); - sleep 20000; - callsub( S_Spawn,0 ); - mapannounce 'map_rev$, "Morocc: Not enough. Make them feel terror!", bc_map,0xEBFF; - sleep 20000; - callsub( S_Spawn,0 ); - sleep 20000; - callsub( S_Spawn,0 ); - mapannounce 'map_rev$, "Morocc: Resist me! Fight to the death!", bc_map,0xEBFF; - sleep 20000; - callsub( S_Spawn,0 ); - sleep 15000; - callsub( S_Spawn,1 ); - mapannounce 'map_rev$, "Morocc: Mwa hah hah, I can feel my power returning!", bc_map,0xEBFF; - sleep 10000; - callsub( S_Spawn,2 ); - sleep 12000; - .@count[0] = mobcount( 'map_rev$, instance_npcname("#morse_cave_wave_1") + "::OnMobDead" ); - .@count[1] = mobcount( 'map_rev$, instance_npcname("#morse_cave_wave_1") + "::OnMobDead2" ); - killmonster 'map_rev$, instance_npcname("#morse_cave_wave_1") + "::OnMobDead"; - killmonster 'map_rev$, instance_npcname("#morse_cave_wave_1") + "::OnMobDead2"; disablenpc instance_npcname("#Battle_1RZ1"); - disablenpc instance_npcname("#Battle_1RZ2"); - for ( .@i = 1; .@i <= 12; .@i++ ) - donpcevent instance_npcname( "#Pause Effect RZ" + .@i ) + "::OnStop"; - sleep 3000; - if (.@count[0] > 19 || .@count[1] > 19) { - .@reaper$[0] = instance_npcname("Grim Reaper Ankou#RZ Event_3"); - .@reaper$[1] = instance_npcname("Grim Reaper Ankou#RZ Event_4"); - enablenpc .@reaper$[0]; - enablenpc .@reaper$[1]; - npctalk "You're pathetic.", .@reaper$[0]; - npctalk "You're pathetic.", .@reaper$[1]; - sleep 3000; - npctalk "Weaklings like you aren't enough food for Lord Morocc", .@reaper$[0]; - npctalk "Weaklings like you aren't enough food for Lord Morocc", .@reaper$[1]; - sleep 3000; - npctalk "to get the energy he needs for a full recovery.", .@reaper$[0]; - npctalk "to get the energy he needs for a full recovery.", .@reaper$[1]; - sleep 3000; - npctalk "I'll give you one chance to leave. NOW!", .@reaper$[0]; - npctalk "I'll give you one chance to leave. NOW!", .@reaper$[1]; - sleep 3000; - disablenpc .@reaper$[0]; - disablenpc .@reaper$[1]; - sleep 5000; - /* Officials scripts - enablenpc instance_npcname("#RZ Move_5a");// warp to prontera,97,167 - enablenpc instance_npcname("#RZ Move_6a"); - enablenpc instance_npcname("#RZ Move_7a"); - enablenpc instance_npcname("#RZ Move_8a"); - enablenpc instance_npcname("#RZ Move_9a"); - enablenpc instance_npcname("#RZ Move_10a"); - enablenpc instance_npcname("#RZ Move_11a"); - enablenpc instance_npcname("#RZ Move_12a"); - */ - getpartymember 'party_id, 1, .@char_id; - getpartymember 'party_id, 2, .@account_id; - for ( .@i = 0; .@i < $@partymembercount; .@i++ ) { - if (isloggedin(.@account_id[.@i],.@char_id[.@i]) == false) - continue; - if (strcharinfo(3,.@char_id[.@i]) == 'map_rev$) - setpcblock PCBLOCK_MOVE, false, .@account_id[.@i]; - } - mapwarp 'map_rev$,"prontera",97,167; + disablenpc instance_npcname("#RZ Move_30"); + disablenpc instance_npcname("#RZ Move_31"); + disablenpc instance_npcname("#RZ Move_32"); + specialeffect EF_STORMGUST, AREA, instance_npcname("#RZ Memorial Effect 1"); + mapannounce 'map_rev$, "Morocc: How do you like to be separated from each other and have your bodies and minds bound?", bc_map,0x00EBFF; + setpcblock PCBLOCK_MOVE, true; + sleep2 3000; + mapannounce 'map_rev$, "Morocc: You're trespassing! Riff-raff like you have no business in here!", bc_map,0x00EBFF; + sleep2 3000; + mapannounce 'map_rev$, "Morocc: Your bodies are mine to control!", bc_map,0x00EBFF; + sleep2 3000; + mapannounce 'map_rev$, "Morocc: Your souls are food for my resurrection!", bc_map,0x00EBFF; + sleep2 3000; + setpcblock (PCBLOCK_NPC ^ PCBLOCK_MOVE), false; + mapannounce 'map_rev$, "Morocc: My soldiers, tear their bodies asunder and bring their souls to me!", bc_map,0x00EBFF; + initnpctimer; + end; + +OnTimer4000: + callsub( S_Spawn ); +OnTimer25000: + callsub( S_Spawn ); +OnTimer45000: + if ('event_right == false) + mapannounce 'map_rev$, "Morocc: My soldiers, make them suffer! Feast on their bodies and souls!", bc_map,0x00EBFF; + callsub( S_Spawn ); +OnTimer65000: + callsub( S_Spawn ); +OnTimer85000: + if ('event_right == false) + mapannounce 'map_rev$, "Morocc: Not enough. Make them feel terror!", bc_map,0x00EBFF; + callsub( S_Spawn ); +OnTimer105000: + callsub( S_Spawn ); +OnTimer125000: + if ('event_right == false) + mapannounce 'map_rev$, "Morocc: Resist me! Fight to the death!", bc_map,0x00EBFF; + callsub( S_Spawn ); +OnTimer145000: + callsub( S_Spawn ); +OnTimer160000: + if ('event_right == false) + mapannounce 'map_rev$, "Morocc: Mwa hah hah, I can feel my power returning!", bc_map,0x00EBFF; + monster 'map_rev$,33,111,"Morocc's Archer Skeleton",3003,1, instance_npcname("#Battle_1RZ1") + "::OnMobDead";// EP14_MORS_MOB3 + callsub( S_Spawn ); +OnTimer170000: + monster 'map_rev$,32,128,"Morocc's Archer Skeleton",3003,1, instance_npcname("#Battle_1RZ1") + "::OnMobDead"; + callsub( S_Spawn ); +OnTimer180000: + if (mobcount( 'map_rev$, instance_npcname("#Battle_1RZ1") + "::OnMobDead") > 19) { + stopnpctimer; + stopnpctimer instance_npcname("#Battle_1RZ2"); + donpcevent instance_npcname("Grim Reaper Ankou#RZ Event_3") + "::OnEnd"; } - else { - mapannounce 'map_rev$, "Morocc: You're more resilient than I thought.", bc_map,0xEBFF; - sleep 2000; - mapannounce 'map_rev$, "Morocc: But enough is enough.", bc_map,0xEBFF; - sleep 5000; - /* Officials scripts - enablenpc instance_npcname("#RZ Move_5");// warp to 1@rev,31,50 - enablenpc instance_npcname("#RZ Move_6"); - enablenpc instance_npcname("#RZ Move_7"); - enablenpc instance_npcname("#RZ Move_8"); - enablenpc instance_npcname("#RZ Move_9"); - enablenpc instance_npcname("#RZ Move_10"); - enablenpc instance_npcname("#RZ Move_11"); - enablenpc instance_npcname("#RZ Move_12"); - */ - for ( .@i = 9; .@i <= 15; .@i++ ) - enablenpc instance_npcname( "#RZ Debuff_" + .@i ); - enablenpc instance_npcname("#Battle_2RZ1"); - for ( .@i = 1; .@i <= 12; .@i++ ) - enablenpc instance_npcname( "#Pause Effecto RZ" + .@i ); - warpparty 'map_rev$,31,50, 'party_id, 'map_rev$,1,1; - } - for ( .@i = 1; .@i <= 8; .@i++ ) - disablenpc instance_npcname( "#RZ Debuff_" + .@i ); - disablenpc instance_npcname("#morse_cave_wave_1"); - donpcevent instance_npcname("#RZ Memorial Effect 1") + "::OnStop"; - donpcevent instance_npcname("#RZ Memorial Effect 2") + "::OnStop"; + end; +OnTimer186000: + killmonster 'map_rev$, instance_npcname("#Battle_1RZ1") + "::OnMobDead"; + end; +OnTimer187000: + enablenpc instance_npcname("#Battle_2RZ1"); + mapannounce 'map_rev$, "Morocc: You're more resilient than I thought.", bc_map,0x00EBFF; + sleep 2000; + mapannounce 'map_rev$, "Morocc: But enough is enough.", bc_map,0x00EBFF; + end; +OnTimer193000: + enablenpc instance_npcname("#RZ Move_5"); + enablenpc instance_npcname("#RZ Move_6"); + enablenpc instance_npcname("#RZ Move_7"); + enablenpc instance_npcname("#RZ Move_8"); + enablenpc instance_npcname("#RZ Move_9"); + enablenpc instance_npcname("#RZ Move_10"); + enablenpc instance_npcname("#RZ Move_11"); + enablenpc instance_npcname("#RZ Move_12"); + stopnpctimer; + end; +OnMobDead: end; S_Spawn: - .@additionnal_monster = getarg(0); - .@label$ = instance_npcname("#morse_cave_wave_1") + "::OnMobDead"; + .@label$ = instance_npcname("#Battle_1RZ1") + "::OnMobDead"; monster 'map_rev$,33,128,"Morocc's Ghoul",3001,1, .@label$;// EP14_MORS_MOB1 monster 'map_rev$,42,120,"Morocc's Ghoul",3001,1, .@label$; monster 'map_rev$,34,111,"Morocc's Ghoul",3001,1, .@label$; monster 'map_rev$,25,119,"Morocc's Ghoul",3001,1, .@label$; - if (.@additionnal_monster == 1) - monster 'map_rev$,33,111,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - else if (.@additionnal_monster == 2) - monster 'map_rev$,32,128,"Morocc's Archer Skeleton",3003,1, .@label$; - - if ('status_battle[1] == true) { - .@label$ = instance_npcname("#morse_cave_wave_1") + "::OnMobDead2"; - monster 'map_rev$,112,126,"Morocc's Ghoul",3001,1, .@label$;// EP14_MORS_MOB1 - monster 'map_rev$,120,118,"Morocc's Ghoul",3001,1, .@label$; - monster 'map_rev$,112,109,"Morocc's Ghoul",3001,1, .@label$; - monster 'map_rev$,103,117,"Morocc's Ghoul",3001,1, .@label$; - if (.@additionnal_monster == 1) - monster 'map_rev$,103,118,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - else if (.@additionnal_monster == 2) - monster 'map_rev$,120,117,"Morocc's Archer Skeleton",3003,1, .@label$; - } - return; - -OnMobDead: -OnMobDead2: end; } -// display icewall every 30s -1@rev,33,117,0 script #Pause Effect RZ1 HIDDEN_WARP_NPC,1,1,{ +// Event C2 - right side +1@rev,112,126,0 script #Battle_1RZ2 HIDDEN_WARP_NPC,10,10,{ end; OnTouch: - if (countstr( strnpcinfo(0), "Effecto" ) == 0) - .@num = atoi( replacestr( strnpcinfo(2), "Pause Effect RZ", "" ) ); - else - .@num = atoi( replacestr( strnpcinfo(2), "Pause Effecto RZ", "" ) ) + 20; - if ('pause_effect[.@num] == 0) { - 'pause_effect[.@num] = 1; - specialeffect EF_ICEWALL; - initnpctimer; - } - setpcblock PCBLOCK_MOVE, true; - if (.@num < 7 && 'status_battle[0] == 0) { - setpcblock PCBLOCK_NPC, true; - 'status_battle[0] = 1; - donpcevent instance_npcname("#RZ Memorial Effect 1") + "::OnStart"; - mapannounce 'map_rev$, "Morocc: How do you like to be separated from each other and have your bodies and minds bound?", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: You're trespassing! Riff-raff like you have no business in here!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: Your bodies are mine to control!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: Your souls are food for my resurrection!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: My soldiers, tear their bodies asunder and bring their souls to me!", bc_map,0xEBFF; - donpcevent instance_npcname("#morse_cave_wave_1") + "::OnStart"; - setpcblock (PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_COMMANDS|PCBLOCK_NPCCLICK), false; - } - else if (.@num >= 7 && .@num < 13 && 'status_battle[1] == 0) { - 'status_battle[1] = 1; - donpcevent instance_npcname("#RZ Memorial Effect 2") + "::OnStart"; - } - else if (.@num >= 21 && .@num < 33 && 'status_battle[2] == 0) { - setpcblock PCBLOCK_NPC, true; - 'status_battle[2] = 1; - donpcevent instance_npcname("#RZ Memorial Effect 3") + "::OnStart"; - mapannounce 'map_rev$, "Morocc: This world of mine is evolving.", bc_map,0xEBFF; - sleep2 2000; - mapannounce 'map_rev$, "Morocc: My power is returning!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: Your bodies and souls are under my command!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: My soldiers, tear their bodies asunder and bring their souls to me!", bc_map,0xEBFF; - donpcevent instance_npcname("#morse_cave_wave_2") + "::OnStart"; - setpcblock (PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_COMMANDS|PCBLOCK_NPCCLICK), false; + disablenpc instance_npcname("#RZ Move_30"); + disablenpc instance_npcname("#RZ Move_31"); + disablenpc instance_npcname("#RZ Move_32"); + disablenpc instance_npcname("#Battle_1RZ2"); + specialeffect EF_STORMGUST, AREA, instance_npcname("#RZ Memorial Effect 2"); + setpcblock PCBLOCK_NPC, true; + sleep2 6000; + 'event_right = true; + setpcblock (PCBLOCK_NPC ^ PCBLOCK_MOVE), false; + initnpctimer; + end; +OnTimer4000: + callsub( S_Spawn ); +OnTimer25000: + mapannounce 'map_rev$, "Morocc: My soldiers, make them suffer! Feast on their bodies and souls!", bc_map,0x00EBFF; + callsub( S_Spawn ); +OnTimer45000: + callsub( S_Spawn ); +OnTimer65000: + mapannounce 'map_rev$, "Morocc: Not enough. Make them feel terror!", bc_map,0x00EBFF; + callsub( S_Spawn ); +OnTimer85000: + callsub( S_Spawn ); +OnTimer105000: + mapannounce 'map_rev$, "Morocc: Resist me! Fight to the death!", bc_map,0x00EBFF; + callsub( S_Spawn ); +OnTimer125000: + callsub( S_Spawn ); +OnTimer145000: + mapannounce 'map_rev$, "Morocc: Mwa hah hah, I can feel my power returning!", bc_map,0x00EBFF; + callsub( S_Spawn ); +OnTimer160000: + monster 'map_rev$,103,118, "Morocc's Archer Skeleton", 3003,1, instance_npcname("#Battle_1RZ2") + "::OnMobDead"; // EP14_MORS_MOB3 + callsub( S_Spawn ); +OnTimer170000: + monster 'map_rev$,120,117, "Morocc's Archer Skeleton", 3003,1, instance_npcname("#Battle_1RZ2") + "::OnMobDead"; + callsub( S_Spawn ); +OnTimer182000: + //if (mobcount( 'map_rev$, instance_npcname("#Battle_1RZ1") + "::OnMobDead") > 19) { // Official script check Battle_1RZ1 + if (mobcount( 'map_rev$, instance_npcname("#Battle_1RZ2") + "::OnMobDead") > 19) { + stopnpctimer; + stopnpctimer instance_npcname("#Battle_1RZ1"); + donpcevent instance_npcname("Grim Reaper Ankou#RZ Event_3") + "::OnEnd"; } end; +OnTimer186000: + enablenpc instance_npcname("#Battle_2RZ1"); + killmonster 'map_rev$, instance_npcname("#Battle_1RZ2") + "::OnMobDead"; + end; +OnTimer194000: + enablenpc instance_npcname("#RZ Move_5"); + enablenpc instance_npcname("#RZ Move_6"); + enablenpc instance_npcname("#RZ Move_7"); + enablenpc instance_npcname("#RZ Move_8"); + enablenpc instance_npcname("#RZ Move_9"); + enablenpc instance_npcname("#RZ Move_10"); + enablenpc instance_npcname("#RZ Move_11"); + enablenpc instance_npcname("#RZ Move_12"); + stopnpctimer; + end; +OnMobDead: + end; + +S_Spawn: + .@label$ = instance_npcname("#Battle_1RZ2") + "::OnMobDead"; + monster 'map_rev$,112,126, "Morocc's Ghoul", 3001,1, .@label$; // EP14_MORS_MOB1 + monster 'map_rev$,120,118, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,112,109, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,103,117, "Morocc's Ghoul", 3001,1, .@label$; + end; +} + +// Event D +1@rev,34,47,0 script #Battle_2RZ1 HIDDEN_WARP_NPC,10,10,{ + end; +OnTouch: + disablenpc instance_npcname("#Battle_2RZ1"); + specialeffect EF_STORMGUST, AREA, instance_npcname("#RZ Memorial Effect 3"); + mapannounce 'map_rev$, "Morocc: This world of mine is evolving.", bc_map,0x00EBFF; + setpcblock PCBLOCK_NPC, true; + sleep2 3000; + mapannounce 'map_rev$, "Morocc: My power is returning!", bc_map,0x00EBFF; + sleep2 3000; + mapannounce 'map_rev$, "Morocc: Your bodies and souls are under my command!", bc_map,0x00EBFF; + sleep2 3000; + setpcblock (PCBLOCK_NPC ^ PCBLOCK_MOVE), false; + mapannounce 'map_rev$, "Morocc: My soldiers, tear their bodies asunder and bring their souls to me!", bc_map,0x00EBFF; + initnpctimer; + end; +OnTimer4000: + .@label$ = callsub(S_Spawn); + monster 'map_rev$,27,53, "Morocc's Archer Skeleton", 3003,1, .@label$; // EP14_MORS_MOB3 + monster 'map_rev$,27,41, "Morocc's Archer Skeleton", 3003,1, .@label$; + mapannounce 'map_rev$, "Morocc: This power! It feels great! Mwah hah hah!", bc_map,0x00EBFF; + end; OnTimer30000: - specialeffect EF_ICEWALL; - initnpctimer; + .@label$ = callsub(S_Spawn); + monster 'map_rev$,40,41, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,40,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + mapannounce 'map_rev$, "Morocc: How do you like losing control of your own body? *Chuckle*", bc_map,0x00EBFF; end; -OnStop: +OnTimer55000: + .@label$ = callsub(S_Spawn); + monster 'map_rev$,40,41, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,40,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,27,53, "Morocc's Verit", 3005,1, .@label$; // EP14_MORS_MOB5 + end; +OnTimer80000: + .@label$ = callsub(S_Spawn); + monster 'map_rev$,40,41, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,40,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,27,53, "Morocc's Verit", 3005,1, .@label$; + mapannounce 'map_rev$, "Morocc: More! I need more energy!", bc_map,0x00EBFF; + end; +OnTimer105000: + .@label$ = callsub(S_Spawn); + monster 'map_rev$,40,41, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,40,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,27,53, "Morocc's Verit", 3005,1, .@label$; + mapannounce 'map_rev$, "Morocc: Mwah hah hah! Fear my army! Struggle harder!", bc_map,0x00EBFF; + end; +OnTimer130000: + .@label$ = callsub(S_Spawn); + monster 'map_rev$,40,41, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,40,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,27,53, "Morocc's Verit", 3005,1, .@label$; + end; +OnTimer155000: + .@label$ = callsub(S_Spawn); + monster 'map_rev$,27,53, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,27,41, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,40,41, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,40,54, "Morocc's Verit", 3005,1, .@label$; + mapannounce 'map_rev$, "Morocc: You're pathetic, struggling to survive!", bc_map,0x00EBFF; + end; +OnTimer170000: + .@label$ = callsub(S_Spawn); + monster 'map_rev$,40,41, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,40,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,27,53, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,27,41, "Morocc's Verit", 3005,1, .@label$; + end; +OnTimer180000: + if (mobcount( 'map_rev$, instance_npcname("#Battle_2RZ1") + "::OnMobDead" ) > 19) { + stopnpctimer; + donpcevent instance_npcname("Grim Reaper Ankou#RZ Event_5") + "::OnEnd"; + } + end; +OnTimer185000: + killmonster 'map_rev$, instance_npcname("#Battle_2RZ1") + "::OnMobDead"; + disablenpc instance_npcname("#RZ Debuff_9"); + disablenpc instance_npcname("#RZ Debuff_10"); + disablenpc instance_npcname("#RZ Debuff_11"); + disablenpc instance_npcname("#RZ Debuff_12"); + end; +OnTimer186000: + mapannounce 'map_rev$, "Morocc: I'm surprised you've lasted this long. Thank you for helping me recover most of my strength.", bc_map,0x00EBFF; + end; +OnTimer190000: + mapannounce 'map_rev$, "Morocc: Good, I feel rejuvenated.", bc_map,0x00EBFF; + end; +OnTimer192500: + enablenpc instance_npcname("#RZ Debuff Recovery_1"); + enablenpc instance_npcname("#RZ Debuff Recovery_2"); + enablenpc instance_npcname("#RZ Debuff Recovery_3"); + enablenpc instance_npcname("#RZ Debuff Recovery_4"); + end; +OnTimer193000: + enablenpc instance_npcname("#RZ Move_13"); + enablenpc instance_npcname("#RZ Move_14"); + enablenpc instance_npcname("#RZ Move_15"); + enablenpc instance_npcname("#RZ Move_16"); stopnpctimer; - disablenpc instance_npcname( strnpcinfo(0) ); - end; -} -1@rev,36,118,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ2 HIDDEN_WARP_NPC,1,1 -1@rev,36,121,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ3 HIDDEN_WARP_NPC,1,1 -1@rev,34,122,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ4 HIDDEN_WARP_NPC,1,1 -1@rev,31,121,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ5 HIDDEN_WARP_NPC,1,1 -1@rev,31,118,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ6 HIDDEN_WARP_NPC,1,1 - -// Event B - right side -1@rev,112,116,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ7 HIDDEN_WARP_NPC,1,1 -1@rev,114,117,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ8 HIDDEN_WARP_NPC,1,1 -1@rev,114,120,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ9 HIDDEN_WARP_NPC,1,1 -1@rev,111,121,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ10 HIDDEN_WARP_NPC,1,1 -1@rev,109,120,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ11 HIDDEN_WARP_NPC,1,1 -1@rev,109,117,0 duplicate(#Pause Effect RZ1) #Pause Effect RZ12 HIDDEN_WARP_NPC,1,1 - -// Battle 2 - waves -1@rev,31,50,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ1 HIDDEN_WARP_NPC,1,1 -1@rev,36,49,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ2 HIDDEN_WARP_NPC,1,1 -1@rev,37,45,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ3 HIDDEN_WARP_NPC,1,1 -1@rev,30,45,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ4 HIDDEN_WARP_NPC,1,1 -1@rev,29,47,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ5 HIDDEN_WARP_NPC,1,1 -1@rev,33,51,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ6 HIDDEN_WARP_NPC,1,1 -1@rev,38,49,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ7 HIDDEN_WARP_NPC,1,1 -1@rev,34,44,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ8 HIDDEN_WARP_NPC,1,1 -1@rev,32,44,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ9 HIDDEN_WARP_NPC,1,1 -1@rev,29,49,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ10 HIDDEN_WARP_NPC,1,1 -1@rev,35,51,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ11 HIDDEN_WARP_NPC,1,1 -1@rev,37,47,0 duplicate(#Pause Effect RZ1) #Pause Effecto RZ12 HIDDEN_WARP_NPC,1,1 - -// Event A - left side - debuff -1@rev,33,111,0 script #RZ Debuff_1 HIDDEN_WARP_NPC,12,4,{ - end; -OnTouch: - .@num = atoi( replacestr( strnpcinfo(2), "RZ Debuff_", "" ) ); - setpcblock PCBLOCK_MOVE, true; - if (.@num < 5 && 'status_battle[0] == 0) { - setpcblock PCBLOCK_NPC, true; - 'status_battle[0] = 1; - donpcevent instance_npcname("#RZ Memorial Effect 1") + "::OnStart"; - mapannounce 'map_rev$, "Morocc: How do you like to be separated from each other and have your bodies and minds bound?", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: You're trespassing! Riff-raff like you have no business in here!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: Your bodies are mine to control!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: Your souls are food for my resurrection!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: My soldiers, tear their bodies asunder and bring their souls to me!", bc_map,0xEBFF; - donpcevent instance_npcname("#morse_cave_wave_1") + "::OnStart"; - setpcblock (PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_COMMANDS|PCBLOCK_NPCCLICK), false; - } - else if (.@num >= 5 && .@num < 9 && 'status_battle[1] == 0) { - 'status_battle[1] = 1; - donpcevent instance_npcname("#RZ Memorial Effect 2") + "::OnStart"; - } - else if (.@num >= 9 && .@num < 16 && 'status_battle[2] == 0) { - setpcblock PCBLOCK_NPC, true; - 'status_battle[2] = 1; - donpcevent instance_npcname("#RZ Memorial Effect 3") + "::OnStart"; - mapannounce 'map_rev$, "Morocc: This world of mine is evolving.", bc_map,0xEBFF; - sleep2 2000; - mapannounce 'map_rev$, "Morocc: My power is returning!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: Your bodies and souls are under my command!", bc_map,0xEBFF; - sleep2 3000; - mapannounce 'map_rev$, "Morocc: My soldiers, tear their bodies asunder and bring their souls to me!", bc_map,0xEBFF; - donpcevent instance_npcname("#morse_cave_wave_2") + "::OnStart"; - setpcblock (PCBLOCK_SKILL|PCBLOCK_USEITEM|PCBLOCK_COMMANDS|PCBLOCK_NPCCLICK), false; - } - end; -} -1@rev,42,124,0 duplicate(#RZ Debuff_1) #RZ Debuff_2 HIDDEN_WARP_NPC,4,8 -1@rev,25,124,0 duplicate(#RZ Debuff_1) #RZ Debuff_3 HIDDEN_WARP_NPC,4,8 -1@rev,33,128,0 duplicate(#RZ Debuff_1) #RZ Debuff_4 HIDDEN_WARP_NPC,4,4 - -// Event B - right side - debuff -1@rev,112,110,0 duplicate(#RZ Debuff_1) #RZ Debuff_5 HIDDEN_WARP_NPC,12,4 -1@rev,103,122,0 duplicate(#RZ Debuff_1) #RZ Debuff_6 HIDDEN_WARP_NPC,4,7 -1@rev,120,122,0 duplicate(#RZ Debuff_1) #RZ Debuff_7 HIDDEN_WARP_NPC,4,7 -1@rev,112,126,0 duplicate(#RZ Debuff_1) #RZ Debuff_8 HIDDEN_WARP_NPC,4,3 - -// Battle 2 - waves - debuff -1@rev,32,47,0 duplicate(#RZ Debuff_1) #RZ Debuff_9 HIDDEN_WARP_NPC,1,1 -1@rev,24,48,0 duplicate(#RZ Debuff_1) #RZ Debuff_10 HIDDEN_WARP_NPC,3,5 -1@rev,27,56,0 duplicate(#RZ Debuff_1) #RZ Debuff_11 HIDDEN_WARP_NPC,4,4 -1@rev,43,47,0 duplicate(#RZ Debuff_1) #RZ Debuff_12 HIDDEN_WARP_NPC,3,4 -1@rev,41,56,0 duplicate(#RZ Debuff_1) #RZ Debuff_13 HIDDEN_WARP_NPC,4,4 -1@rev,34,56,0 duplicate(#RZ Debuff_1) #RZ Debuff_14 HIDDEN_WARP_NPC,2,3 -1@rev,34,39,0 duplicate(#RZ Debuff_1) #RZ Debuff_15 HIDDEN_WARP_NPC,12,3 - -// official npcs to block the player from moving -// Event A - left side -// 1@rev,28,125,0 script #RZ Debuff_1 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,28,114,0 script #RZ Debuff_2 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,39,114,0 script #RZ Debuff_3 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,39,125,0 script #RZ Debuff_4 HIDDEN_WARP_NPC,10,10,{ - -// Event B - right side -// 1@rev,106,123,0 script #RZ Debuff_5 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,106,112,0 script #RZ Debuff_6 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,117,112,0 script #RZ Debuff_7 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,117,123,0 script #RZ Debuff_8 HIDDEN_WARP_NPC,10,10,{ - -// Battle 2 - waves -// 1@rev,28,53,0 script #RZ Debuff_9 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,28,42,0 script #RZ Debuff_10 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,39,42,0 script #RZ Debuff_11 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,39,53,0 script #RZ Debuff_12 HIDDEN_WARP_NPC,10,10,{ - -// 1@rev,28,53,0 script #RZ Debuff Recovery_1 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,28,42,0 script #RZ Debuff Recovery_2 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,39,42,0 script #RZ Debuff Recovery_3 HIDDEN_WARP_NPC,10,10,{ -// 1@rev,39,53,0 script #RZ Debuff Recovery_4 HIDDEN_WARP_NPC,10,10,{ - -// Battle 2 - waves -// 1@rev,34,47,0 script #Battle_2RZ1 HIDDEN_WARP_NPC,10,10,{ -1@rev,34,47,0 script #Battle_2RZ1 HIDDEN_WARP_NPC,3,3,{ - end; -OnTouch: - setpcblock PCBLOCK_MOVE, true; - if ('status_battle[2] == 0) { - 'status_battle[2] = 1; - donpcevent instance_npcname("#RZ Memorial Effect 3") + "::OnStart"; - mapannounce 'map_rev$, "Morocc: This world of mine is evolving.", bc_map,0xEBFF; - sleep 2000; - mapannounce 'map_rev$, "Morocc: My power is returning!", bc_map,0xEBFF; - sleep 3000; - mapannounce 'map_rev$, "Morocc: Your bodies and souls are under my command!", bc_map,0xEBFF; - sleep 3000; - mapannounce 'map_rev$, "Morocc: My soldiers, tear their bodies asunder and bring their souls to me!", bc_map,0xEBFF; - donpcevent instance_npcname("#morse_cave_wave_2") + "::OnStart"; - } - end; -} - -1@rev,1,1,0 script #morse_cave_wave_2 HIDDEN_WARP_NPC,{ - end; -OnStart: - enablenpc instance_npcname("#morse_cave_wave_2"); - .@label$ = instance_npcname("#morse_cave_wave_2") + "::OnMobDead"; - sleep 5000; - callsub( S_Spawn ); - monster 'map_rev$,27,53,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - monster 'map_rev$,27,41,"Morocc's Archer Skeleton",3003,1, .@label$; - mapannounce 'map_rev$, "Morocc: This power! It feels great! Mwah hah hah!", bc_map,0xEBFF; - sleep 25000; - callsub( S_Spawn ); - monster 'map_rev$,40,41,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - monster 'map_rev$,40,54,"Morocc's Archer Skeleton",3003,1, .@label$; - mapannounce 'map_rev$, "Morocc: How do you like losing control of your own body? *Chuckle*", bc_map,0xEBFF; - sleep 25000; - callsub( S_Spawn ); - monster 'map_rev$,40,41,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - monster 'map_rev$,40,54,"Morocc's Archer Skeleton",3003,1, .@label$; - monster 'map_rev$,27,53,"Morocc's Verit",3005,1, .@label$;// EP14_MORS_MOB5 - sleep 25000; - callsub( S_Spawn ); - monster 'map_rev$,40,41,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - monster 'map_rev$,40,54,"Morocc's Archer Skeleton",3003,1, .@label$; - monster 'map_rev$,27,53,"Morocc's Verit",3005,1, .@label$;// EP14_MORS_MOB5 - mapannounce 'map_rev$, "Morocc: More! I need more energy!", bc_map,0xEBFF; - sleep 25000; - callsub( S_Spawn ); - monster 'map_rev$,40,41,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - monster 'map_rev$,40,54,"Morocc's Archer Skeleton",3003,1, .@label$; - monster 'map_rev$,27,53,"Morocc's Verit",3005,1, .@label$;// EP14_MORS_MOB5 - mapannounce 'map_rev$, "Morocc: Mwah hah hah! Fear my army! Struggle harder!", bc_map,0xEBFF; - sleep 25000; - monster 'map_rev$,34,57,"Morocc's Ghoul",3001,1, .@label$;// EP14_MORS_MOB1 - monster 'map_rev$,43,48,"Morocc's Ghoul",3001,1, .@label$; - monster 'map_rev$,33,38,"Morocc's Ghoul",3001,1, .@label$; - monster 'map_rev$,40,41,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - monster 'map_rev$,40,54,"Morocc's Archer Skeleton",3003,1, .@label$; - monster 'map_rev$,27,53,"Morocc's Verit",3005,1, .@label$;// EP14_MORS_MOB5 - sleep 25000; - callsub( S_Spawn ); - monster 'map_rev$,27,53,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - monster 'map_rev$,27,41,"Morocc's Archer Skeleton",3003,1, .@label$; - monster 'map_rev$,40,41,"Morocc's Verit",3005,1, .@label$;// EP14_MORS_MOB5 - monster 'map_rev$,40,54,"Morocc's Verit",3005,1, .@label$; - mapannounce 'map_rev$, "Morocc: You're pathetic, struggling to survive!", bc_map,0xEBFF; - sleep 15000; - callsub( S_Spawn ); - monster 'map_rev$,40,41,"Morocc's Archer Skeleton",3003,1, .@label$;// EP14_MORS_MOB3 - monster 'map_rev$,40,54,"Morocc's Archer Skeleton",3003,1, .@label$; - monster 'map_rev$,27,53,"Morocc's Verit",3005,1, .@label$;// EP14_MORS_MOB5 - monster 'map_rev$,27,41,"Morocc's Verit",3005,1, .@label$; - sleep 12000; - .@count = mobcount( 'map_rev$, instance_npcname("#morse_cave_wave_2") + "::OnMobDead" ); - killmonster 'map_rev$, instance_npcname("#morse_cave_wave_2") + "::OnMobDead"; - disablenpc instance_npcname("#Battle_2RZ1"); - for ( .@i = 1; .@i <= 12; .@i++ ) - donpcevent instance_npcname( "#Pause Effecto RZ" + .@i ) + "::OnStop"; - sleep 3000; - if (.@count > 19) { - .@reaper$ = instance_npcname("Grim Reaper Ankou#RZ Event_5"); - enablenpc .@reaper$; - npctalk "You're pathetic.", .@reaper$; - sleep 3000; - npctalk "Weaklings like you aren't enough food for Lord Morocc", .@reaper$; - sleep 3000; - npctalk "to get the energy he needs for a full recovery.", .@reaper$; - sleep 3000; - npctalk "I'll give you one chance to leave. NOW!", .@reaper$; - sleep 3000; - disablenpc .@reaper$; - sleep 5000; - /* Officials scripts - enablenpc instance_npcname("#Move_13a");// warp to prontera,97,167 - enablenpc instance_npcname("#Move_14a"); - enablenpc instance_npcname("#Move_15a"); - enablenpc instance_npcname("#Move_16a"); - */ - getpartymember 'party_id, 1, .@char_id; - getpartymember 'party_id, 2, .@account_id; - for ( .@i = 0; .@i < $@partymembercount; .@i++ ) { - if (isloggedin(.@account_id[.@i],.@char_id[.@i]) == false) - continue; - if (strcharinfo(3,.@char_id[.@i]) == 'map_rev$) - setpcblock PCBLOCK_MOVE, false, .@account_id[.@i]; - } - mapwarp 'map_rev$,"prontera",97,167; - } - else { - mapannounce 'map_rev$, "Morocc: I'm surprised you've lasted this long. Thank you for helping me recover most of my strength.", bc_map,0xEBFF; - sleep 4000; - mapannounce 'map_rev$, "Morocc: Good, I feel rejuvenated.", bc_map,0xEBFF; - sleep 3000; - for ( .@i = 9; .@i <= 15; .@i++ ) - disablenpc instance_npcname( "#RZ Debuff_" + .@i ); - getpartymember 'party_id, 1, .@char_id; - getpartymember 'party_id, 2, .@account_id; - for ( .@i = 0; .@i < $@partymembercount; .@i++ ) { - if (isloggedin(.@account_id[.@i],.@char_id[.@i]) == false) - continue; - if (strcharinfo(3,.@char_id[.@i]) == 'map_rev$) - setpcblock PCBLOCK_MOVE, false, .@account_id[.@i]; - } - // enablenpc instance_npcname("#RZ Debuff Recovery_1"); - // enablenpc instance_npcname("#RZ Debuff Recovery_2"); - // enablenpc instance_npcname("#RZ Debuff Recovery_3"); - // enablenpc instance_npcname("#RZ Debuff Recovery_4"); - sleep 1000; - // enablenpc instance_npcname("#RZ Move_13");// warp to 1@rev,104,48 - // enablenpc instance_npcname("#RZ Move_14"); - // enablenpc instance_npcname("#RZ Move_15"); - // enablenpc instance_npcname("#RZ Move_16"); - enablenpc instance_npcname("#Battle_3RZ1"); - mapwarp 'map_rev$,'map_rev$,104,48; - } - disablenpc instance_npcname("#morse_cave_wave_2"); - donpcevent instance_npcname("#RZ Memorial Effect 3") + "::OnStop"; end; S_Spawn: - .@label$ = instance_npcname("#morse_cave_wave_2") + "::OnMobDead"; - monster 'map_rev$,34,57,"Morocc's Ghoul",3001,1, .@label$;// EP14_MORS_MOB1 - monster 'map_rev$,43,48,"Morocc's Ghoul",3001,1, .@label$; - monster 'map_rev$,33,38,"Morocc's Ghoul",3001,1, .@label$; - monster 'map_rev$,24,48,"Morocc's Ghoul",3001,1, .@label$; - return; + .@label$ = instance_npcname("#Battle_2RZ1") + "::OnMobDead"; + monster 'map_rev$,34,57, "Morocc's Ghoul", 3001,1, .@label$; // EP14_MORS_MOB1 + monster 'map_rev$,43,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,33,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,24,48, "Morocc's Ghoul", 3001,1, .@label$; + return .@label$; OnMobDead: end; } - -// Display EF_CURSEATTACK effect overhead 'Soul' monster -// Event A - left side -1@rev,34,120,0 script #RZ Memorial Effect 1 HIDDEN_WARP_NPC,{ +// Event E - final +1@rev,112,48,4 script Morocc Necromancer#RZ1 4_GHOST_STAND,{ end; -OnStart: - .@npc_name$ = instance_npcname( strnpcinfo(0) ); - enablenpc .@npc_name$; - getmapxy .@map$,.@x,.@y, BL_NPC; - monster 'map_rev$,.@x,.@y,('soul_name$ + "'s Soul"),3007,1, .@npc_name$ + "::OnStop"; // EP14_MORS_DUMMY - initnpctimer; - specialeffect EF_STORMGUST; - specialeffect EF_CURSEATTACK; - end; -OnTimer2000: - specialeffect EF_CURSEATTACK; - initnpctimer; - end; -OnStop: - stopnpctimer; - killmonster 'map_rev$, instance_npcname( strnpcinfo(0) ) + "::OnStop"; - disablenpc instance_npcname( strnpcinfo(0) ); +OnFinal: + .@ankou$ = instance_npcname("Grim Reaper Ankou#RZ Event_6"); + 'event_ended = true; + sleep 3000; + enablenpc .@ankou$; + npctalk "Grim Reaper Ankou: Sigh, Necromancer, why did you have to die so quickly?", .@ankou$; + sleep 3000; + npctalk "Grim Reaper Ankou: Don't be so happy!", .@ankou$; + sleep 3000; + npctalk "Grim Reaper Ankou: Now that Lord Morocc has fully recovered his strength, you're as good as dead!", .@ankou$; + sleep 3000; + npctalk "Grim Reaper Ankou: We'll meet again. *Chuckle*", .@ankou$; + sleep 3000; + disablenpc .@ankou$; + enablenpc instance_npcname("#RZ Move_17a"); + specialeffect EF_THUNDERSTORM, AREA, instance_npcname("#morocc_necromancer_dummy"); + sleep 1000; + specialeffect EF_LORD, AREA, instance_npcname("#morocc_necromancer_dummy"); end; } -// Event B - right side -1@rev,112,118,0 duplicate(#RZ Memorial Effect 1) #RZ Memorial Effect 2 HIDDEN_WARP_NPC +1@rev,112,48,4 script Grim Reaper Ankou#RZ Event_6 3029,{ end; } -// Battle 2 - waves -1@rev,34,48,0 duplicate(#RZ Memorial Effect 1) #RZ Memorial Effect 3 HIDDEN_WARP_NPC +// additionnal npc to display the effect on Morocc Necromancer#RZ1 coordinates without bothered the player +1@rev,112,48,4 script #morocc_necromancer_dummy HIDDEN_WARP_NPC,{ end; } -// official range -// 1@rev,34,120,0 script #RZ Memorial Effect 1 HIDDEN_WARP_NPC,4,4,{ -// 1@rev,112,118,0 duplicate(#RZ Memorial Effect 1) #RZ Memorial Effect 2 HIDDEN_WARP_NPC,4,4 -// 1@rev,34,48,0 duplicate(#RZ Memorial Effect 1) #RZ Memorial Effect 3 HIDDEN_WARP_NPC,4,4 - -// Battle 3 -1@rev,112,48,4 script Morocc Necromancer#RZ1 4_GHOST_STAND,{ end; } 1@rev,104,47,0 script #Battle_3RZ1 HIDDEN_WARP_NPC,5,5,{ end; OnTouch: disablenpc instance_npcname("#Battle_3RZ1"); - setpcblock PCBLOCK_NPC, true; - mapannounce 'map_rev$, "Morocc: I can't let you go unscathed!", bc_map,0xEBFF; + mapannounce 'map_rev$, "Morocc: I can't let you go unscathed!", bc_map,0x00EBFF; sleep2 3000; - mapannounce 'map_rev$, "Morocc: Hah hah, my Necromancer. I'll leave them to you.", bc_map,0xEBFF; + mapannounce 'map_rev$, "Morocc: Hah hah, my Necromancer. I'll leave them to you.", bc_map,0x00EBFF; sleep2 3000; - mapannounce 'map_rev$, "Morocc: My loyal soldier, I'll trust you with their deaths!", bc_map,0xEBFF; + mapannounce 'map_rev$, "Morocc: My loyal soldier, I'll trust you with their deaths!", bc_map,0x00EBFF; sleep2 3000; + killmonster 'map_rev$, instance_npcname("#RZ Memorial Start") + "::OnSoulDead"; .@necromancer$ = instance_npcname("Morocc Necromancer#RZ1"); enablenpc .@necromancer$; sleep2 3000; - specialeffect EF_TWOHANDQUICKEN,AREA, .@necromancer$; + specialeffect EF_TWOHANDQUICKEN, AREA, .@necromancer$; npctalk "Morocc Necromancer: As you wish, My Lord!", .@necromancer$; sleep2 3000; npctalk "Morocc Necromancer: *Chuckle* You still have no idea, do you?", .@necromancer$; @@ -948,21 +936,29 @@ OnTouch: npctalk "Morocc Necromancer: has been converted to healing energy for Lord Morocc the moment you entered this world of his!", .@necromancer$; sleep2 3000; npctalk "Morocc Necromancer: *Chuckle* Your stupidity was a blessing for us. We don't need you anymore. DIE!", .@necromancer$; - specialeffect EF_BEGINSPELL2,AREA, .@necromancer$; + specialeffect EF_BEGINSPELL2, AREA, .@necromancer$; sleep2 3000; disablenpc .@necromancer$; - donpcevent instance_npcname("#morse_cave_3") + "::OnStart"; - setpcblock PCBLOCK_NPC, false; + monster 'map_rev$,112,48, "Morocc Necromancer", 2999,1, instance_npcname("#Battle_3RZ1") + "::OnMobDead"; // EP14_MORS_BOSSA + 'boss_id = $@mobid[0]; + initnpctimer; + end; +OnTimer2000: + if (unitexists('boss_id) == false || mobcount( 'map_rev$, instance_npcname("#Battle_3RZ1") + "::OnMobDead" ) < 1) { + stopnpctimer; + donpcevent instance_npcname("#Battle_3RZ2") + "::OnStart"; + } + end; +OnTimer4000: + initnpctimer; + end; +OnMobDead: end; } -1@rev,1,1,0 script #morse_cave_3 HIDDEN_WARP_NPC,{ +1@rev,106,57,0 script #Battle_3RZ2 HIDDEN_WARP_NPC,{ end; OnStart: - enablenpc instance_npcname("#morse_cave_3"); - monster 'map_rev$,112,48,"Morocc Necromancer",2999,1, instance_npcname("#morse_cave_3") + "::OnMobDead";// EP14_MORS_BOSSA - end; -OnMobDead: .@necromancer$ = instance_npcname("Morocc Necromancer#RZ1"); enablenpc .@necromancer$; sleep 3000; @@ -975,250 +971,488 @@ OnMobDead: npctalk "Morocc Necromancer: *Giggle*", .@necromancer$; sleep 3000; disablenpc .@necromancer$; - monster 'map_rev$,112,48,"Morocc Necromancer",3000,1, instance_npcname("#morse_cave_3") + "::OnMobDead2";// EP14_MORS_BOSSB + monster 'map_rev$,112,48, "Morocc Necromancer", 3000,1, instance_npcname("#Battle_3RZ2") + "::OnMobDead"; // EP14_MORS_BOSSB 'boss_id = $@mobid[0]; - donpcevent instance_npcname("#morse_cave_wave_3") + "::OnStart"; - donpcevent instance_npcname("#morse_cave_boss_talk") + "::OnStart"; - end; -OnMobDead2: - donpcevent instance_npcname("#morse_cave_wave_3") + "::OnStop"; - donpcevent instance_npcname("#morse_cave_boss_talk") + "::OnStop"; - donpcevent instance_npcname("#morse_cave_wave_3_mobs") + "::OnStop"; - sleep 3000; - .@reaper$ = instance_npcname("Grim Reaper Ankou#RZ Event_6"); - enablenpc .@reaper$; - sleep 1000; - npctalk "Grim Reaper Ankou: Sigh, Necromancer, why did you have to die so quickly?", .@reaper$; - sleep 3000; - npctalk "Grim Reaper Ankou: Don't be so happy!", .@reaper$; - sleep 3000; - npctalk "Grim Reaper Ankou: Now that Lord Morocc has fully recovered his strength, you're as good as dead!", .@reaper$; - sleep 3000; - npctalk "Grim Reaper Ankou: We'll meet again. *Chuckle*", .@reaper$; - sleep 2000; - hideonnpc .@reaper$; - enablenpc instance_npcname("#RZ Move_17a"); - specialeffect EF_THUNDERSTORM,AREA, .@reaper$; // officially Morocc Necromancer#RZ1 display the effects but they have the same coordinates - sleep 1000; - specialeffect EF_LORD,AREA, .@reaper$; - specialeffect EF_THUNDERSTORM,AREA, .@reaper$; - sleep 1000; - specialeffect EF_LORD,AREA, .@reaper$; - end; -} - -1@rev,1,1,0 script #morse_cave_wave_3 HIDDEN_WARP_NPC,{ - end; -OnStart: - enablenpc instance_npcname("#morse_cave_wave_3"); + initnpctimer instance_npcname("#Battle_3RZ3"); // init monsters spawn initnpctimer; end; -OnTimer7000: - stopnpctimer; - donpcevent instance_npcname("#morse_cave_wave_3_mobs") + "::OnStart"; - end; -OnStop: - disablenpc instance_npcname("#morse_cave_wave_3"); - stopnpctimer; - end; -} - -1@rev,1,1,0 script #morse_cave_boss_talk HIDDEN_WARP_NPC,{ - end; -OnStart: - initnpctimer; - end; -OnTimer8000: - .@r = rand(4); - if (.@r == 0) - unittalk 'boss_id, "Morocc Necromancer: We the soldiers of Morocc know no mercy!"; - else if (.@r == 1) - unittalk 'boss_id, "Morocc Necromancer: You're doing good so far. *Giggle*"; - else if (.@r == 2) - unittalk 'boss_id, "Morocc Necromancer: I see you're weakening, though."; - else - unittalk 'boss_id, "Morocc Necromancer: Feel the power of his army!"; - initnpctimer; - end; -OnTimer25000: - initnpctimer; - end; -OnStop: - disablenpc instance_npcname("#morse_cave_boss_talk"); - stopnpctimer; - end; -} - -1@rev,1,1,0 script #morse_cave_wave_3_mobs HIDDEN_WARP_NPC,{ - end; -OnStart: - enablenpc instance_npcname("#morse_cave_wave_3_mobs"); - initnpctimer; - - setarray 'coord[0], - 112,57, - 121,47, - 112,38, - 120,54, - 119,40, - 104,40, - 102,48; - 'num_coord = getarraysize('coord) / 2; - end; -OnTimer25000: - for ( .@i = 0; .@i < 'num_coord; .@i++ ) { - .@last = ( 'num_coord - .@i - 1 ) * 2; - .@r = rand( 'num_coord - .@i ) * 2; - setarray .@xy[0], 'coord[.@r], 'coord[.@r+1]; - setarray 'coord[.@r], 'coord[.@last], 'coord[.@last+1]; - setarray 'coord[.@last], .@xy[0], .@xy[1]; +OnTimer1000: + if (mobcount( 'map_rev$, instance_npcname("#Battle_3RZ2") + "::OnMobDead" ) < 1 || unitexists('boss_id) == false) { + donpcevent instance_npcname("#Battle_3RZ3") + "::OnStop"; + donpcevent instance_npcname("Morocc Necromancer#RZ1") + "::OnFinal"; + donpcevent instance_npcname("#Battle_3RZ4") + "::OnStop"; + donpcevent instance_npcname("#Battle_3RZ5") + "::OnStop"; + donpcevent instance_npcname("#Battle_3RZ6") + "::OnStop"; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStop"; + stopnpctimer; + end; } - .@label$ = instance_npcname("#morse_cave_wave_3_mobs") + "::OnMobDead"; - if (mobcount( 'map_rev$, .@label$ ) < 100) { // stop to 100 mobs for performance - monster 'map_rev$,'coord[0],'coord[1], "Morocc's Ghoul", 3001,1, .@label$; // EP14_MORS_MOB1 - monster 'map_rev$,'coord[2],'coord[3], "Morocc's Ghoul", 3001,1, .@label$; // EP14_MORS_MOB1 - monster 'map_rev$,'coord[4],'coord[5], "Morocc's Ghoul", 3001,1, .@label$; // EP14_MORS_MOB1 - monster 'map_rev$,'coord[6],'coord[7], "Morocc's Osiris", 3002,1, .@label$; // EP14_MORS_MOB2 - monster 'map_rev$,'coord[8],'coord[9], "Morocc's Archer Skeleton", 3003,1, .@label$; // EP14_MORS_MOB3 - monster 'map_rev$,'coord[10],'coord[11], "Morocc's Wraith", 3004,1, .@label$; // EP14_MORS_MOB4 - - if (rand(100) < 20) - monster 'map_rev$,'coord[12],'coord[12], "Morocc's Archer Skeleton", 3003,1, .@label$; // EP14_MORS_MOB3 - else - monster 'map_rev$,'coord[12],'coord[13], "Morocc's Verit", 3005,1, .@label$; // EP14_MORS_MOB5 - - // inaccurate - areamonster 'map_rev$,102,38,121,57, "#Poison", 3008,1, .@label$; // EP14_MORS_HIDDEN + 'timer++; + if ('timer == 30) { + getunitdata 'boss_id, .@data; + if (.@data[UMOB_HP] < 3000000 && .@data[UMOB_HP] > 1) { + .@necromancer$ = instance_npcname("#morocc_necromancer_dummy"); + setunitdata 'boss_id, UMOB_HP, 3000000; + specialeffect EF_HEAL, AREA, .@necromancer$; + specialeffect EF_HEAL2, AREA, .@necromancer$; + specialeffect EF_HEAL4, AREA, .@necromancer$; + specialeffect EF_HEAL3, AREA, .@necromancer$; + unittalk 'boss_id, "Morocc Necromancer: You can't kill me!"; + } + 'timer = 0; } initnpctimer; end; -OnStop: - stopnpctimer; - killmonster 'map_rev$, instance_npcname("#morse_cave_wave_3_mobs") + "::OnMobDead"; - disablenpc instance_npcname("#morse_cave_wave_3_mobs"); - end; OnMobDead: end; } -// 1@rev,106,57,0 script #Battle_3RZ2 HIDDEN_WARP_NPC,{ -// 1@rev,120,54,0 script #Battle_3RZ3 HIDDEN_WARP_NPC,{ -// 1@rev,120,55,0 script #Battle_3RZ4 HIDDEN_WARP_NPC,{ -// 1@rev,120,56,0 script #Battle_3RZ5 HIDDEN_WARP_NPC,{ -// 1@rev,120,57,0 script #Battle_3RZ6 HIDDEN_WARP_NPC,{ -// 1@rev,120,58,0 script #Battle_3RZ7 HIDDEN_WARP_NPC,{ - -1@rev,112,56,3 script #RZ Move_17a PORTAL,{ - mes "Do you want to exit through the portal?"; - next; - if (select( "No.", "Yes." ) == 2) { - mes "- Teleporting... -"; - close2; - warp "moro_cav",59,63; +1@rev,120,54,0 script #Battle_3RZ3 HIDDEN_WARP_NPC,{ + end; +OnStop: + stopnpctimer; + killmonster 'map_rev$, instance_npcname("#Battle_3RZ3") + "::OnMobDead"; + end; +OnTimer4500: + if ('event_ended == true) { + stopnpctimer; end; } end; - -OnInstanceInit: - 'map_rev$ = instance_mapname("1@rev"); - 'status_battle[0] = 0; - 'status_battle[1] = 0; - 'status_battle[2] = 0; - - // Entrance - disablenpc instance_npcname("#RZ Event_1"); - disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_2"); - - // Weakened Morocc - disablenpc instance_npcname("#RZ Event_3"); - disablenpc instance_npcname("Weakened Morocc#RZ1"); - disablenpc instance_npcname("Weakened Morocc#control"); - - // Battle 1 - disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_3"); - disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_4"); - disablenpc instance_npcname("#Battle_1RZ1"); - disablenpc instance_npcname("#Battle_1RZ2"); - disablenpc instance_npcname("#RZ Memorial Effect 1"); - disablenpc instance_npcname("#RZ Memorial Effect 2"); - disablenpc instance_npcname("#morse_cave_wave_1"); - for ( .@i = 1; .@i <= 12; .@i++ ) - disablenpc instance_npcname( "#Pause Effect RZ" + .@i ); - - // Battle 2 - disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_5"); - disablenpc instance_npcname("#RZ Memorial Effect 3"); - disablenpc instance_npcname("#morse_cave_wave_2"); - disablenpc instance_npcname("#Battle_2RZ1"); - for ( .@i = 1; .@i <= 12; .@i++ ) - disablenpc instance_npcname( "#Pause Effecto RZ" + .@i ); - - // Battle 3 - disablenpc instance_npcname("#morse_cave_3"); - disablenpc instance_npcname("#morse_cave_wave_3"); - disablenpc instance_npcname("Grim Reaper Ankou#RZ Event_6"); - disablenpc instance_npcname("#Battle_3RZ1"); - disablenpc instance_npcname("Morocc Necromancer#RZ1"); - disablenpc instance_npcname("#RZ Move_17a"); - - // Debuff - Battle 1 & 2 - for ( .@i = 1; .@i <= 15; .@i++ ) - disablenpc instance_npcname( "#RZ Debuff_" + .@i ); +OnTimer7000: + if ('event_ended == true) { + stopnpctimer; + end; + } + .@count = mobcount( 'map_rev$, instance_npcname("#Battle_3RZ3") + "::OnMobDead" ); + if (.@count > 39) { + if (unitexists('boss_id) == true) + unittalk 'boss_id, "Morocc Necromancer: You are surrounded by a lot! It's already in the middle of it! Can't escape! Hey!"; + end; + } + donpcevent instance_npcname("#Battle_3RZ4") + "::OnStop"; + donpcevent instance_npcname("#Battle_3RZ5") + "::OnStop"; + donpcevent instance_npcname("#Battle_3RZ6") + "::OnStop"; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStop"; + .@label$ = instance_npcname("#Battle_3RZ3") + "::OnMobDead"; + if (.@count < 10) { + .@wRand = rand(1,100); + if (.@wRand < 11) { + .@string$ = "Morocc Necromancer: We the soldiers of Morocc know no mercy!"; + monster 'map_rev$,121,47, "Morocc's Ghoul", 3001,1, .@label$; // EP14_MORS_MOB1 + monster 'map_rev$,112,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; // EP14_MORS_MOB3 + monster 'map_rev$,119,40, "Morocc's Verit", 3005,1, .@label$; // EP14_MORS_MOB5 + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; // EP14_MORS_MOB4 + donpcevent instance_npcname("#Battle_3RZ4") + "::OnStart"; + } + else if (.@wRand < 21) { + .@string$ = "Morocc Necromancer: You're doing good so far. *Giggle*"; + monster 'map_rev$,112,57, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,112,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ5") + "::OnStart"; + } + else if (.@wRand < 31) { + .@string$ = "Morocc Necromancer: I see you're weakening, though."; + monster 'map_rev$,112,57, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,121,47, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ6") + "::OnStart"; + } + else if (.@wRand < 41) { + .@string$ = "Morocc Necromancer: Feel the power of his army!"; + monster 'map_rev$,112,57, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,121,47, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,112,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStart"; + } + else if (.@wRand < 51) { + .@string$ = "Morocc Necromancer: Feel the power of his army!"; + monster 'map_rev$,121,47, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,112,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ4") + "::OnStart"; + } + else if (.@wRand < 61) { + .@string$ = "Morocc Necromancer: I see you're weakening, though."; + monster 'map_rev$,121,47, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,112,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Wraith", 3004,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Verit", 3005,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ4") + "::OnStart"; + } + else if (.@wRand < 71) { + .@string$ = "Morocc Necromancer: You're doing good so far. *Giggle*"; + monster 'map_rev$,112,57, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,112,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Wraith", 3004,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Verit", 3005,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ5") + "::OnStart"; + } + else if (.@wRand < 81) { + .@string$ = "Morocc Necromancer: We the soldiers of Morocc know no mercy!"; + monster 'map_rev$,112,57, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,121,47, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Wraith", 3004,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Verit", 3005,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ6") + "::OnStart"; + } + else if (.@wRand < 91) { + .@string$ = "Morocc Necromancer: Feel the power of his army!"; + monster 'map_rev$,112,57, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,121,47, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,112,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStart"; + } + else if (.@wRand < 101) { + .@string$ = "Morocc Necromancer: I see you're weakening, though."; + monster 'map_rev$,121,47, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,112,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ4") + "::OnStart"; + } + } + else if (.@count < 15) { + .@wRand = rand(1,60); + if (.@wRand < 11) { + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ4") + "::OnStart"; + donpcevent instance_npcname("#Battle_3RZ5") + "::OnStart"; + .@string$ = "Morocc Necromancer: Go to hell! Send them to hell!"; + } + else if (.@wRand < 21) { + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ4") + "::OnStart"; + donpcevent instance_npcname("#Battle_3RZ6") + "::OnStart"; + .@string$ = "Morocc Necromancer: Morocc's army is not afraid!"; + } + else if (.@wRand < 31) { + monster 'map_rev$,112,38, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Wraith", 3004,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Archer Skeleton", 3003,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ4") + "::OnStart"; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStart"; + .@string$ = "Morocc Necromancer: My loyal men are coming! Come over!"; + } + else if (.@wRand < 41) { + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ5") + "::OnStart"; + donpcevent instance_npcname("#Battle_3RZ6") + "::OnStart"; + .@string$ = "Morocc Necromancer: For Morocc!!"; + } + else if (.@wRand < 51) { + monster 'map_rev$,112,57, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Archer Skeleton", 3003,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ5") + "::OnStart"; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStart"; + .@string$ = "Morocc Necromancer: For Morocc!!"; + } + else { + monster 'map_rev$,121,47, "Morocc's Ghoul", 3001,1, .@label$; + monster 'map_rev$,120,54, "Morocc's Wraith", 3004,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Verit", 3005,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Archer Skeleton", 3003,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ6") + "::OnStart"; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStart"; + .@string$ = "Morocc Necromancer: My loyal men are coming! Come over!"; + } + } + else if (.@count < 20) { + .@wRand = rand(1,40); + monster 'map_rev$,102,48, "Morocc's Ghoul", 3001,1, .@label$; + if (.@wRand < 11) { + monster 'map_rev$,120,54, "Morroc's Pumpkin Soul", 3006,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ6") + "::OnStart"; + .@string$ = "Morocc Necromancer: You are alive and can't go back!"; + } + else if (.@wRand < 21) { + monster 'map_rev$,119,40, "Morroc's Pumpkin Soul", 3006,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStart"; + .@string$ = "Morocc Necromancer: You are alive and can't go back!"; + } + else if (.@wRand < 31) { + monster 'map_rev$,104,40, "Morroc's Pumpkin Soul", 3006,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStart"; + .@string$ = "Morocc Necromancer: You are gradually entering death!"; + } + else { + monster 'map_rev$,104,54, "Morroc's Pumpkin Soul", 3006,1, .@label$; + donpcevent instance_npcname("#Battle_3RZ7") + "::OnStart"; + .@string$ = "Morocc Necromancer: Let me pray for your impending death!"; + } + } + else { + .@wRand = rand(1,100); + if (.@wRand < 21) { + monster 'map_rev$,120,54, "Morocc's Wraith", 3004,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + if (.@wRand < 11) + .@string$ = "Morocc Necromancer: You are no different from the walking dead!"; + else + .@string$ = "Morocc Necromancer: Can hold you up now and you are lucky!"; + } + else if (.@wRand < 31) { + monster 'map_rev$,120,54, "Morocc's Wraith", 3004,1, .@label$; + monster 'map_rev$,119,40, "Morocc's Wraith", 3004,1, .@label$; + .@string$ = "Morocc Necromancer: The result is only this level!"; + } + else if (.@wRand < 51) { + monster 'map_rev$,119,40, "Morocc's Wraith", 3004,1, .@label$; + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + .@string$ = "Morocc Necromancer: Even I can't cope with it and dare to fight against Morocc!"; + } + else { + monster 'map_rev$,119,40, "Morroc's Pumpkin Soul", 3006,1, .@label$; // EP14_MORS_MOB6 + monster 'map_rev$,104,40, "Morocc's Wraith", 3004,1, .@label$; + monster 'map_rev$,104,54, "Morocc's Wraith", 3004,1, .@label$; + if (.@wRand < 61) + .@string$ = "Morocc Necromancer: The result is only this level!"; + else + .@string$ = "Morocc Necromancer: Can hold you up now and you are lucky!"; + } + } + if (unitexists('boss_id) == true) + unittalk 'boss_id, .@string$; + end; +OnTimer24000: +OnTimer24500: + if ('event_ended == true) + stopnpctimer; + end; +OnTimer25000: + if ('event_ended == true) { + stopnpctimer; + end; + } + initnpctimer; + end; +OnMobDead: end; } -/* -// Original warps +1@rev,120,55,0 script #Battle_3RZ4 HIDDEN_WARP_NPC,{ + end; +OnStart: + sscanf( strnpcinfo(2), "Battle_3RZ%d", .@num ); + if (.@num == 4) setarray .@xy[0],112,57; + else if (.@num == 5) setarray .@xy[0],121,47; + else if (.@num == 6) setarray .@xy[0],112,38; + else setarray .@xy[0],102,48; + monster 'map_rev$, .@xy[0], .@xy[1], "Morocc's Osiris", 3002,1, instance_npcname( strnpcinfo(0) ) + "::OnMobDead"; // EP14_MORS_MOB2 + 'monster_id[.@num] = $mobid[0]; + initnpctimer; + end; +OnStop: + stopnpctimer; + killmonster 'map_rev$, instance_npcname( strnpcinfo(0) ) + "::OnMobDead"; + end; +OnTimer4500: + callsub S_Spawn; + end; +OnTimer9000: + callsub S_Spawn; + initnpctimer; + end; +OnMobDead: + end; +S_Spawn: + if ('event_ended == true) { + donpcevent instance_npcname( strnpcinfo(0) ) + "::OnStop"; + end; + } + sscanf( strnpcinfo(2), "Battle_3RZ%d", .@num ); + if (unitexists('monster_id[.@num]) == true && mobcount( 'map_rev$, instance_npcname( strnpcinfo(0) ) + "::OnMobDead" ) > 0) { + getunitdata 'monster_id[.@num], .@data; + monster 'map_rev$, .@data[UMOB_X], .@data[UMOB_Y], "#Poison", 3008,1, instance_npcname( strnpcinfo(0) ) + "::OnMobDead"; // EP14_MORS_HIDDEN + } + return; +} +1@rev,120,56,0 duplicate(#Battle_3RZ4) #Battle_3RZ5 HIDDEN_WARP_NPC +1@rev,120,57,0 duplicate(#Battle_3RZ4) #Battle_3RZ6 HIDDEN_WARP_NPC +1@rev,120,58,0 duplicate(#Battle_3RZ4) #Battle_3RZ7 HIDDEN_WARP_NPC + + +// Warps // Entrance -> Weakened Morocc 1@rev,63,181,0 warp2 #RZ Move_30 10,10,1@rev,103,177 1@rev,47,181,0 warp2 #RZ Move_31 10,10,1@rev,103,177 1@rev,31,181,0 warp2 #RZ Move_32 10,10,1@rev,103,177 -// Weakened Morocc -> Battle Wave 1a -1@rev,106,172,0 warp2 #RZ Move_1 10,10,1@rev,33,117 -1@rev,106,172,0 warp2 #RZ Move_2 10,10,1@rev,33,117 -1@rev,117,172,0 warp2 #RZ Move_3 10,10,1@rev,33,117 -1@rev,117,183,0 warp2 #RZ Move_4 10,10,1@rev,33,117 +1@rev,106,183,0 script #RZ Move_1 WARPNPC,10,10,{ + end; +OnTouch: + if (is_party_leader() == false) + end; + sscanf( strnpcinfo(2), "RZ Move_%d", .@num ); -// Weakened Morocc -> Battle Wave 1b -1@rev,106,172,0 warp2 #RZ Move_1 10,10,1@rev,112,116 -1@rev,106,172,0 warp2 #RZ Move_2 10,10,1@rev,112,116 -1@rev,117,172,0 warp2 #RZ Move_3 10,10,1@rev,112,116 -1@rev,117,183,0 warp2 #RZ Move_4 10,10,1@rev,112,116 + if (.@num < 5) { + setarray .@x[0], 33, 112, 36, 114, 36, 114, 34, 111, 31, 109, 31, 109; + setarray .@y[0], 117, 116, 118, 117, 121, 120, 122, 121, 121, 120, 118, 117; + } + else if (.@num < 13) { + setarray .@x[0], 31, 36, 37, 30, 29, 33, 38, 34, 32, 29, 35, 37; + setarray .@y[0], 50, 49, 45, 45, 47, 51, 49, 44, 44, 49, 51, 47; + } + else { + setarray .@x[0], 104, 104, 104, 104, 103, 103, 103, 103, 102, 102, 102, 102; + setarray .@y[0], 48, 47, 46, 49, 49, 48, 47, 46, 46, 47, 48, 49; + } + .@size = getarraysize(.@x); -// Battle Wave 1a -> Battle Wave 2 -1@rev,28,125,0 warp2 #RZ Move_5 10,10,1@rev,31,50 -1@rev,28,114,0 warp2 #RZ Move_6 10,10,1@rev,31,50 -1@rev,39,114,0 warp2 #RZ Move_7 10,10,1@rev,31,50 -1@rev,39,125,0 warp2 #RZ Move_8 10,10,1@rev,31,50 + getpartymember getcharid(1), 1, .@char_id; + getpartymember getcharid(1), 2, .@account_id; -// Battle Wave 1a -> Prontera -1@rev,28,125,0 warp2 #RZ Move_5a 10,10,prontera,97,167 -1@rev,28,114,0 warp2 #RZ Move_6a 10,10,prontera,97,167 -1@rev,39,114,0 warp2 #RZ Move_7a 10,10,prontera,97,167 -1@rev,39,125,0 warp2 #RZ Move_8a 10,10,prontera,97,167 + for ( .@i = 0; .@i < $@partymembercount; .@i++ ) { + if (isloggedin(.@account_id[.@i],.@char_id[.@i]) == true) + continue; + if (strcharinfo(3,.@char_id[.@i]) == 'map_rev$) { + .@n = (.@index % .@size); + warp 'map_rev$, .@x[.@n], .@y[.@n], .@char_id[.@i]; + } + .@index++; + } + end; +} +1@rev,106,172,0 duplicate(#RZ Move_1) #RZ Move_2 WARPNPC,10,10 +1@rev,117,172,0 duplicate(#RZ Move_1) #RZ Move_3 WARPNPC,10,10 +1@rev,117,183,0 duplicate(#RZ Move_1) #RZ Move_4 WARPNPC,10,10 +1@rev,28,125,0 duplicate(#RZ Move_1) #RZ Move_5 WARPNPC,10,10 +1@rev,28,114,0 duplicate(#RZ Move_1) #RZ Move_6 WARPNPC,10,10 +1@rev,39,114,0 duplicate(#RZ Move_1) #RZ Move_7 WARPNPC,10,10 +1@rev,39,125,0 duplicate(#RZ Move_1) #RZ Move_8 WARPNPC,10,10 +1@rev,106,123,0 duplicate(#RZ Move_1) #RZ Move_9 WARPNPC,10,10 +1@rev,106,112,0 duplicate(#RZ Move_1) #RZ Move_10 WARPNPC,10,10 +1@rev,117,112,0 duplicate(#RZ Move_1) #RZ Move_11 WARPNPC,10,10 +1@rev,117,123,0 duplicate(#RZ Move_1) #RZ Move_12 WARPNPC,10,10 +1@rev,28,53,0 duplicate(#RZ Move_1) #RZ Move_13 WARPNPC,10,10 +1@rev,28,42,0 duplicate(#RZ Move_1) #RZ Move_14 WARPNPC,10,10 +1@rev,39,42,0 duplicate(#RZ Move_1) #RZ Move_15 WARPNPC,10,10 +1@rev,39,53,0 duplicate(#RZ Move_1) #RZ Move_16 WARPNPC,10,10 -// Battle Wave 1b -> Battle Wave 2 -1@rev,106,123,0 warp2 #RZ Move_9 10,10,1@rev,31,50 -1@rev,106,112,0 warp2 #RZ Move_10 10,10,1@rev,31,50 -1@rev,117,112,0 warp2 #RZ Move_11 10,10,1@rev,31,50 -1@rev,117,123,0 warp2 #RZ Move_12 10,10,1@rev,31,50 +1@rev,28,125,0 script #RZ Move_5a WARPNPC,10,10,{ + end; +OnTouch: + setpcblock PCBLOCK_MOVE, false; + warp "prontera",97,167; + end; +} +1@rev,28,114,0 duplicate(#RZ Move_5a) #RZ Move_6a WARPNPC,10,10 +1@rev,39,114,0 duplicate(#RZ Move_5a) #RZ Move_7a WARPNPC,10,10 +1@rev,39,125,0 duplicate(#RZ Move_5a) #RZ Move_8a WARPNPC,10,10 +1@rev,106,123,0 duplicate(#RZ Move_5a) #RZ Move_9a WARPNPC,10,10 +1@rev,106,112,0 duplicate(#RZ Move_5a) #RZ Move_10a WARPNPC,10,10 +1@rev,117,112,0 duplicate(#RZ Move_5a) #RZ Move_11a WARPNPC,10,10 +1@rev,117,123,0 duplicate(#RZ Move_5a) #RZ Move_12a WARPNPC,10,10 +1@rev,28,53,0 duplicate(#RZ Move_5a) #RZ Move_13a WARPNPC,10,10 +1@rev,28,42,0 duplicate(#RZ Move_5a) #RZ Move_14a WARPNPC,10,10 +1@rev,39,42,0 duplicate(#RZ Move_5a) #RZ Move_15a WARPNPC,10,10 +1@rev,39,53,0 duplicate(#RZ Move_5a) #RZ Move_16a WARPNPC,10,10 -// Battle Wave 1b -> Prontera -1@rev,106,123,0 warp2 #RZ Move_9a 10,10,prontera,97,167 -1@rev,106,112,0 warp2 #RZ Move_10a 10,10,prontera,97,167 -1@rev,117,112,0 warp2 #RZ Move_11a 10,10,prontera,97,167 -1@rev,117,123,0 warp2 #RZ Move_12a 10,10,prontera,97,167 +1@rev,112,56,3 script #RZ Move_17a PORTAL,{ + mes "Do you want to exit through the portal?"; + next; + if (select( "No.", "Yes." ) == 1) + close; + mes "- Teleporting... -"; + close2; + warp "moro_cav",59,63; + end; +} -// Battle Wave 2 -> Final Battle -1@rev,28,53,0 warp2 #RZ Move_13 10,10,1@rev,104,48 -1@rev,28,42,0 warp2 #RZ Move_14 10,10,1@rev,104,48 -1@rev,39,42,0 warp2 #RZ Move_15 10,10,1@rev,104,48 -1@rev,39,53,0 warp2 #RZ Move_16 10,10,1@rev,104,48 +// dummy npc +// 1@rev,10,10,0 script #RZ Move_18 WARPNPC,{ end; } -// Battle Wave 2 -> Prontera -1@rev,28,53,0 warp2 #RZ Move_13a 10,10,prontera,97,167 -1@rev,28,42,0 warp2 #RZ Move_14a 10,10,prontera,97,167 -1@rev,39,42,0 warp2 #RZ Move_15a 10,10,prontera,97,167 -1@rev,39,53,0 warp2 #RZ Move_16a 10,10,prontera,97,167 -*/ +1@rev,28,125,0 script #RZ Debuff_1 HIDDEN_WARP_NPC,10,10,{ + end; +OnTouch: + setpcblock PCBLOCK_MOVE, true; + end; +} +1@rev,28,114,0 duplicate(#RZ Debuff_1) #RZ Debuff_2 HIDDEN_WARP_NPC,10,10 +1@rev,39,114,0 duplicate(#RZ Debuff_1) #RZ Debuff_3 HIDDEN_WARP_NPC,10,10 +1@rev,39,125,0 duplicate(#RZ Debuff_1) #RZ Debuff_4 HIDDEN_WARP_NPC,10,10 +1@rev,106,123,0 duplicate(#RZ Debuff_1) #RZ Debuff_5 HIDDEN_WARP_NPC,10,10 +1@rev,106,112,0 duplicate(#RZ Debuff_1) #RZ Debuff_6 HIDDEN_WARP_NPC,10,10 +1@rev,117,112,0 duplicate(#RZ Debuff_1) #RZ Debuff_7 HIDDEN_WARP_NPC,10,10 +1@rev,117,123,0 duplicate(#RZ Debuff_1) #RZ Debuff_8 HIDDEN_WARP_NPC,10,10 +1@rev,28,53,0 duplicate(#RZ Debuff_1) #RZ Debuff_9 HIDDEN_WARP_NPC,10,10 +1@rev,28,42,0 duplicate(#RZ Debuff_1) #RZ Debuff_10 HIDDEN_WARP_NPC,10,10 +1@rev,39,42,0 duplicate(#RZ Debuff_1) #RZ Debuff_11 HIDDEN_WARP_NPC,10,10 +1@rev,39,53,0 duplicate(#RZ Debuff_1) #RZ Debuff_12 HIDDEN_WARP_NPC,10,10 + + +1@rev,28,53,0 script #RZ Debuff Recovery_1 HIDDEN_WARP_NPC,10,10,{ + end; +OnTouch: + setpcblock PCBLOCK_MOVE, false; + end; +} +1@rev,28,42,0 duplicate(#RZ Debuff Recovery_1) #RZ Debuff Recovery_2 HIDDEN_WARP_NPC,10,10 +1@rev,39,42,0 duplicate(#RZ Debuff Recovery_1) #RZ Debuff Recovery_3 HIDDEN_WARP_NPC,10,10 +1@rev,39,53,0 duplicate(#RZ Debuff Recovery_1) #RZ Debuff Recovery_4 HIDDEN_WARP_NPC,10,10 + +// GM NPC +sec_in02,20,20,6 script Death Cave#a2 4_M_KHKYEL,{ + if (callfunc("F_GM_NPC",1854,0,1,9999) < 1) + end; + switch( select( "Death Cave Reset", "Set Vars", "Cancel" ) ) { + case 1: + mes "[Death Cave]"; + mes "Yes. Reset."; + next; + if (isbegin_quest(9318) > 0) + erasequest 9318; + if (isbegin_quest(9319) > 0) + erasequest 9319; + mes "[Death Cave]"; + mes "Done!"; + close; + case 2: + ep14_3_bios01 = 1; + mes "[Death Cave]"; + mes "Thank You!"; + close; + case 3: + mes "[Death Cave]"; + mes "Thank You!"; + close; + } +} From eb823b2ab62b88bbbbbe5f188861a874be9661a2 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Sun, 12 Apr 2020 16:44:14 +0200 Subject: [PATCH 042/212] SQL synchronization --- sql-files/mob_db_re.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-files/mob_db_re.sql b/sql-files/mob_db_re.sql index 93c2340398..35a545f4d8 100644 --- a/sql-files/mob_db_re.sql +++ b/sql-files/mob_db_re.sql @@ -2224,7 +2224,7 @@ REPLACE INTO `mob_db_re` VALUES (2996,'XM_CELINE_KIMI','Celine Kimi','Celine Kim REPLACE INTO `mob_db_re` VALUES (2997,'G_XM_CELINE_KIMI','Kimi\'s Phantom','Kimi\'s Phantom',160,66666666,1,0,0,2,6666,6666,479,444,144,166,44,444,166,166,10,12,2,1,28,0x6203695,100,768,1056,480,0,0,0,0,0,0,0,6683,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (2998,'EP14_MORS_EVENT','Weakened Morocc','Weakened Morocc',158,1771440,1,12390,16104,1,1872,900,113,45,87,51,45,88,106,50,12,12,2,6,60,0x6200085,200,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (2999,'EP14_MORS_BOSSA','Morocc Necromancer','Morocc Necromancer',158,4000000,1,2106000,1336500,1,700,0,215,555,165,190,142,146,299,93,12,12,1,7,60,0x6280085,100,300,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,0,0,0,0,0,0,522,200,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3000,'EP14_MORS_BOSSB','Morocc Necromancer','Morocc Necromancer',101,80000000,1,2310750,1465200,12,700,1,1,1,1,1,1,180,1,1,12,12,1,7,82,0x6280085,2000,2700,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,22537,10000,22537,10000,0,0,522,200,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (3000,'EP14_MORS_BOSSB','Morocc Necromancer','Morocc Necromancer',101,80000000,1,2310750,1465200,12,700,1,1,1,1,1,1,180,1,1,12,12,1,7,82,0x6280084,2000,2700,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,22537,10000,22537,10000,0,0,522,200,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3001,'EP14_MORS_MOB1','Morocc\'s Ghoul','Morocc\'s Ghoul',158,295240,1,1239,1610,1,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,1000,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3002,'EP14_MORS_MOB2','Morocc\'s Osiris','Morocc\'s Osiris',158,442860,1,1239,1610,1,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,200,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3003,'EP14_MORS_MOB3','Morocc\'s Archer Skeleton','Morocc\'s Archer Skeleton',158,295240,1,1239,1610,7,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,200,300,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); From e08b5c4f13dce8c392e647fd83fa4605cfde58f3 Mon Sep 17 00:00:00 2001 From: Chaos92 Date: Mon, 13 Apr 2020 22:04:23 +0800 Subject: [PATCH 043/212] Add Star Emperor and Soul Reaper Class Restriction in WoE:TE (#4784) * Adds Star Emperor and Soul Reaper restriction in WoE:TE * Adds Rebellion, Summoner, Star Emperor, and Soul Reaper statuses to the status_disabled database. Thanks to @reunite-ro! --- db/re/job_noenter_map.txt | 7 +++++ db/status_disabled.txt | 56 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/db/re/job_noenter_map.txt b/db/re/job_noenter_map.txt index 11d98b6fa8..2b2a66b93e 100644 --- a/db/re/job_noenter_map.txt +++ b/db/re/job_noenter_map.txt @@ -98,3 +98,10 @@ JOB_BABY_REBELLION,4112,100 JOB_SUMMONER,4112,100 JOB_BABY_SUMMONER,4112,100 + +JOB_STAR_EMPEROR,4112,100 +JOB_SOUL_REAPER,4112,100 +JOB_BABY_STAR_EMPEROR,4112,100 +JOB_BABY_SOUL_REAPER,4112,100 +JOB_STAR_EMPEROR2,4112,100 +JOB_BABY_STAR_EMPEROR2,4112,100 \ No newline at end of file diff --git a/db/status_disabled.txt b/db/status_disabled.txt index 5196142b16..17058ef039 100644 --- a/db/status_disabled.txt +++ b/db/status_disabled.txt @@ -300,6 +300,62 @@ SC_ZANGETSU,16 SC_GENSOU,16 SC_AKAITSUKI,16 +//Summoner +SC_SUHIDE,16 +SC_SU_STOOP,16 +SC_SPRITEMABLE,16 +SC_CATNIPPOWDER,16 +SC_SV_ROOTTWIST,16 +SC_BITESCAR,16 +SC_ARCLOUSEDASH,16 +SC_TUNAPARTY,16 +SC_SHRIMP,16 +SC_FRESHSHRIMP,16 + +// Rebellion +SC_HEAT_BARREL,16 +SC_MAGICALBULLET,16 +SC_P_ALTER,16 +SC_E_CHAIN,16 +SC_C_MARKER,16 +SC_ANTI_M_BLAST,16 +SC_B_TRAP,16 +SC_H_MINE,16 +SC_QD_SHOT_READY,16 + +// Star Emperor +SC_LIGHTOFMOON,16 +SC_LIGHTOFSUN,16 +SC_LIGHTOFSTAR,16 +SC_LUNARSTANCE,16 +SC_UNIVERSESTANCE,16 +SC_SUNSTANCE,16 +SC_FLASHKICK,16 +SC_NEWMOON,16 +SC_STARSTANCE,16 +SC_DIMENSION,16 +SC_DIMENSION1,16 +SC_DIMENSION2,16 +SC_CREATINGSTAR,16 +SC_FALLINGSTAR,16 +SC_NOVAEXPLOSING,16 +SC_GRAVITYCONTROL,16 + +// Soul Reaper +SC_SOULCOLLECT,16 +SC_SOULREAPER,16 +SC_SOULUNITY,16 +SC_SOULSHADOW,16 +SC_SOULFAIRY,16 +SC_SOULFALCON,16 +SC_SOULGOLEM,16 +SC_SOULDIVISION,16 +SC_SOULENERGY,16 +SC_USE_SKILL_SP_SPA,16 +SC_USE_SKILL_SP_SHA,16 +SC_SP_SHA,16 +SC_SOULCURSE,16 + // Others SC_FEAR,16 SC_BURNING,16 From 85dc43c692d13bfe8b83fe716c4797cd8e961ccf Mon Sep 17 00:00:00 2001 From: Atemo Date: Mon, 13 Apr 2020 16:45:19 +0200 Subject: [PATCH 044/212] Fixed an issue in Umbala Domestic Dispute Quest (#4790) Closed #4729 --- npc/quests/quests_umbala.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npc/quests/quests_umbala.txt b/npc/quests/quests_umbala.txt index a7dd912efd..b1aab27988 100644 --- a/npc/quests/quests_umbala.txt +++ b/npc/quests/quests_umbala.txt @@ -1003,7 +1003,7 @@ um_in,139,48,5 script Phrenetan 783,{ close; } if (um_wind <= 3 && (MISC_QUEST & 32768) == 0) { - if (um_wind) set um_wind,1; + if (um_wind == 0) set um_wind,1; emotion ET_FRET; mes "[Phrenetan]"; mes "Umbaumbah wooga wooga"; From f79cac850943eeac31948f2ad33142bbf5cdbce0 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Mon, 13 Apr 2020 18:38:49 +0200 Subject: [PATCH 045/212] Fixed bodystyle for unsupported jobs (#4792) Adds missing checks for Super Novice Expanded, Star Emperor and Soul Reaper. Enables bodystyles saving by default, since all sprites have been released officially long enough. Adjusted the mismatching default value for max_body_style. Fixes #4787 Thanks to @reunite-ro --- conf/battle/client.conf | 4 +--- src/map/atcommand.cpp | 2 +- src/map/battle.cpp | 4 ++-- src/map/pc.cpp | 2 -- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/conf/battle/client.conf b/conf/battle/client.conf index d49b645edb..dfe0ede82a 100644 --- a/conf/battle/client.conf +++ b/conf/battle/client.conf @@ -71,9 +71,7 @@ wedding_modifydisplay: no save_clothcolor: yes // Save body styles. (Note 1) -// Note: Don't turn this on unless you know what you are doing. -// Sprites are not released officially. -save_body_style: no +save_body_style: yes // Do not display cloth colors for the wedding class? // Note: Both save_clothcolor and wedding_modifydisplay have to be enabled diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index b0f9312b18..fb48eabf99 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -1830,7 +1830,7 @@ ACMD_FUNC(bodystyle) memset(atcmd_output, '\0', sizeof(atcmd_output)); - if (!(sd->class_&JOBL_THIRD)) { + if (!(sd->class_ & JOBL_THIRD) || (sd->class_ & MAPID_THIRDMASK) == MAPID_SUPER_NOVICE_E || (sd->class_ & MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || (sd->class_ & MAPID_THIRDMASK) == MAPID_SOUL_REAPER) { clif_displaymessage(fd, msg_txt(sd,740)); // This job has no alternate body styles. return -1; } diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 709d86acf0..d5e149c0d7 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -8827,8 +8827,8 @@ static const struct _battle_data { { "feature.roulette", &battle_config.feature_roulette, 1, 0, 1, }, { "monster_hp_bars_info", &battle_config.monster_hp_bars_info, 1, 0, 1, }, { "min_body_style", &battle_config.min_body_style, 0, 0, SHRT_MAX, }, - { "max_body_style", &battle_config.max_body_style, 4, 0, SHRT_MAX, }, - { "save_body_style", &battle_config.save_body_style, 0, 0, 1, }, + { "max_body_style", &battle_config.max_body_style, 1, 0, SHRT_MAX, }, + { "save_body_style", &battle_config.save_body_style, 1, 0, 1, }, { "monster_eye_range_bonus", &battle_config.mob_eye_range_bonus, 0, 0, 10, }, { "monster_stuck_warning", &battle_config.mob_stuck_warning, 0, 0, 1, }, { "skill_eightpath_algorithm", &battle_config.skill_eightpath_algorithm, 1, 0, 1, }, diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 0f5f017470..9e7135d933 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -878,8 +878,6 @@ void pc_makesavestatus(struct map_session_data *sd) { if(!battle_config.save_clothcolor) sd->status.clothes_color = 0; - // Since this is currently not officially released, - // its best to have a forced option to not save body styles. if(!battle_config.save_body_style) sd->status.body = 0; From 55053e0fc0c214b28d4588147d92fe2689665576 Mon Sep 17 00:00:00 2001 From: atemo Date: Mon, 13 Apr 2020 20:28:08 +0200 Subject: [PATCH 046/212] Follow-up https://github.com/rathena/rathena/commit/629313784199ce4a0d6fce39d8369a74c5be396e Fixed a typo in MorseCave.txt --- npc/re/instances/MorseCave.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npc/re/instances/MorseCave.txt b/npc/re/instances/MorseCave.txt index 41f2fe2b00..cd43962497 100644 --- a/npc/re/instances/MorseCave.txt +++ b/npc/re/instances/MorseCave.txt @@ -1341,7 +1341,7 @@ OnTouch: getpartymember getcharid(1), 2, .@account_id; for ( .@i = 0; .@i < $@partymembercount; .@i++ ) { - if (isloggedin(.@account_id[.@i],.@char_id[.@i]) == true) + if (isloggedin(.@account_id[.@i],.@char_id[.@i]) == false) continue; if (strcharinfo(3,.@char_id[.@i]) == 'map_rev$) { .@n = (.@index % .@size); From 8323b0b275bec3921b420b5dd493c1c62c690e13 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Tue, 14 Apr 2020 14:18:11 +0200 Subject: [PATCH 047/212] Fixed soul costs for Espa (#4795) Fixes #4781 Thanks to @Angelic234 and @iubantot --- db/re/skill_db.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index c7bd9fd13a..b4204befb1 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -30028,6 +30028,8 @@ Body: Amount: 1 - Level: 9 Amount: 1 + - Level: 10 + Amount: 0 - Id: 2603 Name: SP_SHA Description: Esha From 6570489a84c554e2fba289de325d48a35d586996 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Tue, 14 Apr 2020 15:25:04 +0200 Subject: [PATCH 048/212] Fixed Soul Reaper's Soul Collect behavior Added missing status change cancel condition, when the player has reached the maximum amount of soul spheres. Fixed duration display on the client. Some cleanup of duplicate code. Thanks to @aleos89 --- src/map/skill.cpp | 14 ++++++-------- src/map/status.cpp | 9 +++++++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index bc2b2c63fe..f45d969cf9 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -7718,21 +7718,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SJ_STARSTANCE: case SJ_UNIVERSESTANCE: case SJ_SUNSTANCE: + case SP_SOULCOLLECT: if( tsce ) { clif_skill_nodamage(src,bl,skill_id,skill_lv,status_change_end(bl, type, INVALID_TIMER)); map_freeblock_unlock(); return 0; } - clif_skill_nodamage(src,bl,skill_id,skill_lv,sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); - break; - case SP_SOULCOLLECT: - if (tsce) { - clif_skill_nodamage(src, bl, skill_id, skill_lv, status_change_end(bl, type, INVALID_TIMER)); - map_freeblock_unlock(); - return 0; + + if( skill_id == SP_SOULCOLLECT ){ + clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, pc_checkskill(sd, SP_SOULENERGY), max(1000, skill_get_time(skill_id, skill_lv)))); + }else{ + clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); } - clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src, bl, type, 100, skill_lv, pc_checkskill(sd,SP_SOULENERGY), max(1000, skill_get_time(skill_id, skill_lv)))); break; case SL_KAITE: case SL_KAAHI: diff --git a/src/map/status.cpp b/src/map/status.cpp index 84b832e126..d883e9f726 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -11950,6 +11950,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_SOULCOLLECT: val2 = 5 + 3 * val2; // Max Soul Sphere's. val3 = tick > 0 ? tick : 60000; + tick_time = tick; + tick = INFINITE_TICK; break; case SC_SP_SHA: val2 = 50; // Move speed reduction @@ -14570,8 +14572,11 @@ TIMER_FUNC(status_change_timer){ break; case SC_SOULCOLLECT: pc_addsoulball(sd, skill_get_time2(SP_SOULCOLLECT, sce->val1), sce->val2); - sc_timer_next(sce->val3 + tick); - return 0; + if( sd->soulball < sce->val2 ){ + sc_timer_next(sce->val3 + tick); + return 0; + } + break; } // If status has an interval and there is at least 100ms remaining time, wait for next interval From 44b80448df07bec285b1a5056ceae519265bd19b Mon Sep 17 00:00:00 2001 From: aleos Date: Tue, 14 Apr 2020 12:16:53 -0400 Subject: [PATCH 049/212] Removes target SP consumption from Tiger Cannon * Removes target SP consumption based on damage dealt by Tiger Cannon. * This effect was removed in #4256 but accidentally merged back in through #3659. Thanks to @Badarosk0! --- src/map/skill.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index f45d969cf9..28a9a3f175 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -3791,9 +3791,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * } } break; - case SR_TIGERCANNON: - status_zap(bl, 0, damage * 10 / 100); - break; } if( sd ) skill_onskillusage(sd, bl, skill_id, tick); From ba768803648cefda3d0bb2505cf4fdf2bb32b7db Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Thu, 16 Apr 2020 16:20:52 +0200 Subject: [PATCH 050/212] Fixed vending and chatrooms checking for NPCs nearby (#4805) * Thanks to @cydh --- src/map/npc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/npc.cpp b/src/map/npc.cpp index d12e24df3a..acf962399f 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -160,9 +160,10 @@ int npc_isnear_sub(struct block_list* bl, va_list args) { if (skill->unit_nonearnpc_type&SKILL_NONEAR_TOMB && nd->subtype == NPCTYPE_TOMB) return 1; } + return 0; } - return 0; + return 1; } bool npc_isnear(struct block_list * bl) { From 058ad2c67e2662cee113af47caf4aff861d02e02 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Thu, 16 Apr 2020 16:21:25 +0200 Subject: [PATCH 051/212] Fixed duplicated skill status check when switching weapons (#4806) * Thanks to @aleos89 --- src/map/pc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 9e7135d933..d2921a2c3e 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -10551,7 +10551,8 @@ static void pc_unequipitem_sub(struct map_session_data *sd, int n, int flag) { sd->state.autobonus &= ~sd->inventory.u.items_inventory[n].equip; //Check for activated autobonus [Inkfish] sd->inventory.u.items_inventory[n].equip = 0; - pc_checkallowskill(sd); + if (!(flag & 4)) + pc_checkallowskill(sd); iflag = sd->npc_item_flag; /* check for combos (MUST be before status_calc_pc) */ From 8a4a5bfa25e46cb63278189749a6c02d5fc1a357 Mon Sep 17 00:00:00 2001 From: Aleos Date: Fri, 17 Apr 2020 09:24:05 -0400 Subject: [PATCH 052/212] Adds missing cast times for Arm Cannon (#4731) * Fixes #4730. * Adds missing levels 4 and 5 cast data for Arm Cannon. * Updates other level values to official. Thanks to @Surefirer, @flamefury! --- db/re/skill_db.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index b4204befb1..4dbb06cc2d 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -21257,19 +21257,31 @@ Body: Time: 1600 - Level: 3 Time: 1800 + - Level: 4 + Time: 2000 + - Level: 5 + Time: 2200 AfterCastActDelay: - Level: 1 - Time: 500 + Time: 1000 - Level: 2 Time: 1000 - Level: 3 - Time: 2000 + Time: 1000 + - Level: 4 + Time: 1000 + - Level: 5 + Time: 1000 FixedCastTime: - Level: 1 Time: 600 - Level: 2 Time: 400 - Level: 3 + Time: 400 + - Level: 4 + Time: 200 + - Level: 5 Time: 200 Requires: SpCost: From 775b079fd3329686f280e44fb813a944300485ac Mon Sep 17 00:00:00 2001 From: atemo Date: Fri, 17 Apr 2020 16:32:15 +0200 Subject: [PATCH 053/212] Follow-up https://github.com/rathena/rathena/commit/736a5a31f1d3de8a4533b51f88a7d514cb665657 Fixed a typo in Dimensional Travel Quest Thanks to @reunite-ro --- npc/re/quests/quests_14_3_bis.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npc/re/quests/quests_14_3_bis.txt b/npc/re/quests/quests_14_3_bis.txt index 4da12db6e6..4a433e0222 100644 --- a/npc/re/quests/quests_14_3_bis.txt +++ b/npc/re/quests/quests_14_3_bis.txt @@ -2186,7 +2186,7 @@ morocc,138,238,4 script Piled Rags#ep14bs 4_M_DIEMAN,{ mes "" + strcharinfo(0) + ", huh? That's a good name."; next; } - if (ep14_3_newerabs == 3) { + if (ep14_3_newerabs <= 3) { mes "[Tamarin]"; mes "Ah,"; mes "I'd better do something before people start asking if I'm homeless."; @@ -2202,7 +2202,7 @@ morocc,138,238,4 script Piled Rags#ep14bs 4_M_DIEMAN,{ close3; } } - if (ep14_3_newerabs == 4) { + if (ep14_3_newerabs <= 4) { mes "[Tamarin]"; mes "Ah,"; mes "do you mean the ^0000FFoasis near the northwestern sphinx^000000?"; From 8a0adc49022b2ef47efc3e1fba48bedc75845dd4 Mon Sep 17 00:00:00 2001 From: Kanin Temsrisuk Date: Sat, 18 Apr 2020 21:37:29 +0700 Subject: [PATCH 054/212] Minor correct up item_db and item_combo_db (#4811) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks to 🅺🅸🅽🅶🅰🆁🆃🅴🆁#4210 --- db/re/item_combo_db.txt | 2 +- db/re/item_db.txt | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/db/re/item_combo_db.txt b/db/re/item_combo_db.txt index 10ecf3fa29..dc9263de63 100644 --- a/db/re/item_combo_db.txt +++ b/db/re/item_combo_db.txt @@ -1192,7 +1192,7 @@ 27116:27117,{ bonus bCritical,2; bonus bCritAtkRate,2; } 27147:27148,{ bonus bDelayrate,-3; } 27163:27165,{ bonus bDelayrate,-3; bonus bVit,2; bonus bInt,2; bonus bAgi,2; bonus bDex,2; } -27166:27167,{ bonus2 bSubEle,Ele_Neutral,5; bonus2 bMagicAddSize,Size_All,10; } +27166:27167,{ bonus2 bSubEle,Ele_Neutral,5; bonus2 bMagicAddEle,Ele_Fire,10; } 27170:27171,{ bonus bStr,3; bonus2 bAddClass,Class_All,3; } 27170:27172,{ bonus2 bAddSize,Size_Small,15; bonus2 bMagicAddSize,Size_Small,15; } 27170:27173,{ bonus2 bSkillAtk,"GS_SPREADATTACK",50; } diff --git a/db/re/item_db.txt b/db/re/item_db.txt index ed5f579d68..0cc393c1ae 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -12202,7 +12202,7 @@ 27083,Resentful_Bongun_Card,Resentful Bongun Card,6,20,,10,,,,,,,,16,,,,,{ bonus bBaseAtk,20; bonus bMatk,20; },{},{} 27084,Resentful_Sohee_Card,Resentful Sohee Card,6,20,,10,,,,,,,,16,,,,,{ bonus bMatk,10; if (getrefine() >= 10) { bonus bMatkRate,2; } },{},{} 27085,Resentful_Munak_Card,Resentful Munak Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,15; bonus bMatk,15; },{},{} -27086,Resentful_Soldier_Card,Resentful Soldier Card,6,20,,10,,,,,,,,2,,,,,{ if (getiteminfo(getequipid(EQI_COMPOUND_ON),11) == W_BOW) { bonus3 bAutoSpell,"TF_DOUBLE",5,30; if (getrefine() >= 10) { bonus2 bWeaponDamageRate,W_BOW,20; } } },{},{} +27086,Resentful_Soldier_Card,Resentful Soldier Card,6,20,,10,,,,,,,,2,,,,,{ if (getiteminfo(getequipid(EQI_COMPOUND_ON),11) == W_BOW) { bonus3 bAutoSpell,"AC_DOUBLE",5,30; if (getrefine() >= 10) { bonus2 bWeaponDamageRate,W_BOW,20; } } },{},{} 27087,Truthful_Wizard_Card,Truthful Wizard Card,6,20,,10,,,,,,,,2,,,,,{ bonus bMatk,25; autobonus "{ bonus bNoCastCancel; }",5,5000,BF_MAGIC,"{ showscript \"This is the truth!\"; }"; },{},{} 27088,Fury_Hero_Card,Fury Hero Card,6,20,,10,,,,,,,,769,,,,,{ bonus2 bAddClass,Class_All,2; bonus5 bAutoSpell,"SM_ENDURE",1,5,BF_SHORT,0; },{},{} 27101,Sweet_Nightmare_Card,Sweet Nightmare Card,6,20,,10,,,,,,,,16,,,,,{ bonus bMatk,20; bonus bNoCastCancel; },{},{} @@ -12235,7 +12235,7 @@ 27148,Material_Chimera_Card,Material Chimera Card,6,20,,10,,,,,,,,136,,,,,{ bonus bFlee,(BaseLevel >= 90 ? 20 : 10); },{},{} 27149,Heart_Hunter_Card,Heart Hunter Card,6,20,,10,,,,,,,,2,,,,,{ .@type = getiteminfo(getequipid(EQI_COMPOUND_ON),11); .@r = getrefine(); if(.@type == 17 || .@type == 18 || .@type == 21){ bonus bLongAtkRate,5+.@r+(.@r >= 10 ? 5 : 0); } },{},{} 27150,Toxic_Enchanted_Chimera_Card,Toxic Enchanted Chimera Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxHP,1000; bonus bMaxSP,200; if(getrefine() >= 12){ bonus bMaxHPrate,15; bonus bMaxSPrate,15; } },{},{} -27151,Heart_Hunter_Evil_Card,Heart Hunter Evil Card,6,20,,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Freeze,1000 + (readparam(bInt) >= 110 ? 5 : 0); bonus bMdef,5; },{},{} +27151,Heart_Hunter_Evil_Card,Heart Hunter Evil Card,6,20,,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Freeze,3000 + (readparam(bInt) >= 110 ? 1000 : 0); bonus bMdef,5; },{},{} 27152,Cutie_Card,Cutie Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,10; .@r = getrefine()/2; bonus bAgi,.@r; bonus bAspdRate,.@r; },{},{} 27157,Wood_Goblin_Card,Wood Goblin Card,6,20,,10,,,,,,,,16,,,,,{ .@r = getrefine(); bonus2 bAddEle,Ele_Water,(.@r >= 9 ? 10 : 5); bonus2 bAddEle,Ele_Earth,(.@r >= 9 ? 10 : 5); bonus2 bSubDefEle,Ele_Water,-5; bonus2 bSubDefEle,Ele_Earth,-5; },{},{} 27158,Les_Card,Les Card,6,20,,10,,,,,,,,32,,,,,{ bonus2 bSubEle,Ele_Wind,30; },{},{} @@ -12246,7 +12246,7 @@ 27163,Faceworm_Card,Faceworm Card,6,20,,10,,,,,,,,136,,,,,{ bonus bAgi,-1; bonus bDex,-1; bonus bAspdRate,3; },{},{} 27164,Faceworm_Queen_Card,Faceworm Queen Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,-10; .@r = getrefine(); bonus bCritical,15 + .@r; bonus bCritAtkRate,.@r; },{},{} 27165,Dark_Faceworm_Card,Dark Faceworm Card,6,20,,10,,,,,,,,136,,,,,{ bonus bVit,-1; bonus bInt,-1; bonus bDelayrate,-3; },{},{} -27166,Faceworm_Egg_Card,Faceworm Egg Card,6,20,,10,,,,,,,,64,,,,,{ .@r = getrefine(); .@sub = 2+(.@r >= 9 ? 3 : .@r >= 7 ? 1 : 0); bonus bNearAtkDef,.@sub; bonus bMagicAtkDef,.@sub; },{},{} +27166,Faceworm_Egg_Card,Faceworm Egg Card,6,20,,10,,,,,,,,64,,,,,{ .@r = getrefine(); .@sub = 2+(.@r >= 9 ? 3 : .@r >= 7 ? 1 : 0); bonus2 bSubEle,Ele_Fire,.@sub; },{},{} 27167,Faceworm_Larva_Card,Faceworm Larva Card,6,20,,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Neutral,15; bonus2 bMagicAtkEle,Ele_Water,getrefine()*3; },{},{} 27168,Irene_High_Elder_Card,Irene High Elder Card,6,20,,10,,,,,,,,4,,,,,{ bonus bHit,10 + 5 * (getrefine()/3); },{},{} 27169,Payon_Soldier_Card,Payon Soldier Card,6,20,,10,,,,,,,,2,,,,,{ .@atk = 5; .@r = getrefine(); if(getiteminfo(getequipid(EQI_HAND_R),11) == W_SPEAR && .@r >= 10){ .@atk += 20; if(.@r >= 14){ .@atk += 20; } } bonus bAtk,.@atk; bonus bMatk,.@atk; },{},{} @@ -12263,7 +12263,7 @@ 27180,Mechaspider_Card,Mechaspider Card,6,20,,10,,,,,,,,128,,,,,{ bonus bBreakWeaponRate,500; bonus bBreakArmorRate,500; },{},{} 27181,Airship_Raid_Card,Airship Raid Card,6,20,,10,,,,,,,,2,,,,,{ .@r = getrefine(); bonus bLongAtkRate,1 + .@r/2; bonus bCritical,.@r/2; },{},{} 27182,Captain_Felock_Card,Captain Felock Card,6,20,,10,,,,,,,,2,,,,,{ bonus bAtk,30; .@r = getrefine(); bonus2 bSkillAtk,"RL_AM_BLAST",.@r >= 10 ? 60 : 30; bonus2 bSkillAtk,"RL_HAMMER_OF_GOD",.@r >= 10 ? 60 : 30; },{},{} -27183,Gigantes_Card,Gigantes Card,6,20,,10,,,,,,,,128,,,,,{ bonus bAtk,20; if(readparam(bStr) >= 120) { bonus bAtk,20; bonus bAspdRate,-3; } },{},{} +27183,Gigantes_Card,Gigantes Card,6,20,,10,,,,,,,,128,,,,,{ bonus bAtk,20; if(readparam(bStr) >= 120) { bonus bAtk,20; bonus bAspdRate,3; } },{},{} 27184,Knight_Sakray_Card,Knight Sakray Card,6,20,,10,,,,,,,,2,,,,,{ bonus bAtk,20; bonus2 bAddRace,RC_Demon,30; bonus2 bAddRace,RC_Undead,30; },{},{} 27196,Nihil_M_Heine_Card,Nihil M. Heine Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bMagicAddSize,Size_Small,15; },{},{} 27197,Agnes_Lugenburg_Card,Agnes Lugenburg Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bAddSize,Size_Small,15; },{},{} @@ -12761,7 +12761,7 @@ 31006,LoVA_Hades_Card,LoVA Hades Card,6,20,,10,,,,,,,,16,,,,,{ bonus2 bSubRace,RC_Undead,10; },{},{} 31007,LoVA_Realization_Hades_Card,LoVA Realization Hades Card,6,20,,10,,,,,,,,16,,,,,{ bonus bDefEle,Ele_Undead; bonus2 bSubRace,RC_Undead,10; },{},{} 31008,LoVA_Lulu_Card,LoVA Lulu Card,6,20,,10,,,,,,,,64,,,,,{ bonus2 bHPRegenRate,BaseLevel,10000; if(getrefine()>=7) { bonus bAtk,6*(readparam(bStr)/60); bonus bMaxHPrate,readparam(bStr)/60; } },{},{} -31009,LoVA_Realization_Lulu_Card,LoVA Realization Lulu Card,6,20,,10,,,,,,,,64,,,,,{ bonus2 bHPRegenRate,1+BaseLevel,10000; if(getrefine()>=7) { bonus bAtk,6*(readparam(bStr)/20); bonus bMaxHPrate,readparam(bStr)/20; } },{},{} +31009,LoVA_Realization_Lulu_Card,LoVA Realization Lulu Card,6,20,,10,,,,,,,,64,,,,,{ bonus2 bHPRegenRate,BaseLevel,10000; if(getrefine()>=7) { bonus bAtk,6*(readparam(bStr)/20); bonus bMaxHPrate,readparam(bStr)/20; } },{},{} 31010,LoVA_Kima_Card,LoVA Kima Card,6,20,,10,,,,,,,,64,,,,,{ bonus2 bSPRegenRate,BaseLevel/6,10000; if(getrefine()>=7) { bonus bMatk,6*(readparam(bInt)/30); bonus bMaxSPrate,readparam(bInt)/30; } },{},{} 31011,LoVA_Realization_Kima_Card,LoVA Realization Kima Card,6,20,,10,,,,,,,,64,,,,,{ bonus2 bSPRegenRate,BaseLevel/2,10000; if(getrefine()>=7) { bonus bMatk,6*(readparam(bInt)/10); bonus bMaxSPrate,readparam(bInt)/10; } },{},{} 31012,LoVA_Bahamut_Card,LoVA Bahamut Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bSkillAtk,"RK_DRAGONBREATH",5; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",5; if(getrefine()>=7) { bonus bDelayrate,-1; } },{},{} @@ -12770,12 +12770,12 @@ 31015,LoVA_Realization_Ragnarok_Card,LoVA Realization Ragnarok Card,6,20,,10,,,,,,,,4,,,,,{ bonus bMdef,10; bonus bMaxHPrate,10; if(getrefine()>=7) { bonus2 bSkillAtk,"HW_GRAVITATION",769; } },{},{} 31016,Decorated_Evil_Tree_Card,Decorated Evil Tree Card,6,20,,10,,,,,,,,16,,,,,{ bonus bMaxHP,1000; bonus bMaxSP,150; bonus bFlee,-25; },{},{} 31017,Vicious_Cookie_Card,Vicious Cookie Card,6,20,,10,,,,,,,,64,,,,,{ .@r = getrefine(); bonus2 bAddClass,Class_All,1+.@r; bonus bMatkRate,1+.@r; bonus bMaxHPrate,-(2+(.@r*2)); },{},{} -31018,Evil_Dwelling_Box_Card,Evil Dwelling Box Card,6,20,,10,,,,,,,,2,,,,,{ bonus bMaxHP,-1225; bonus3 bAddEff,Eff_Curse,300,ATF_MAGIC; /* unofficial chance [Secret] */ },{},{} -31019,Creepy_Demon_Card,Creepy Demon Card,6,20,,10,,,,,,,,16,,,,,{ bonus bMaxHPrate,-13; bonus3 bAddEffWhenHit,Eff_Curse,300,ATF_MAGIC; /* unofficial chance [Secret] */ },{},{} -31020,Malicious_Baby_Ghost_Card,Malicious Baby Ghost Card,6,20,,10,,,,,,,,16,,,,,{ bonus bMaxHPrate,-13; bonus3 bAddEffWhenHit,Eff_Curse,300,ATF_WEAPON; /* unofficial chance [Secret] */ },{},{} +31018,Evil_Dwelling_Box_Card,Evil Dwelling Box Card,6,20,,10,,,,,,,,2,,,,,{ bonus bMaxHP,-1225; bonus3 bAddEff,Eff_Curse,5000,ATF_MAGIC; },{},{} +31019,Creepy_Demon_Card,Creepy Demon Card,6,20,,10,,,,,,,,136,,,,,{ bonus bMaxHPrate,-13; bonus3 bAddEffWhenHit,Eff_Curse,4000,ATF_MAGIC; },{},{} +31020,Malicious_Baby_Ghost_Card,Malicious Baby Ghost Card,6,20,,10,,,,,,,,136,,,,,{ bonus bMaxHPrate,-13; bonus3 bAddEffWhenHit,Eff_Curse,4000,ATF_WEAPON; },{},{} 31021,Dancing_Marionette_Card,Dancing Marionette Card,6,20,,10,,,,,,,,2,,,,,{ bonus bAspdRate,10; bonus2 bAddClass,Class_All,-3; },{},{} -31022,Abandoned_Teddy_Bear_Card,Abandoned Teddy Bear Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxSPRate,20; bonus2 bAddEff2,Eff_Curse,100; /* unofficial chance [Secret] */ },{},{} -31023,Celine_Kimi_Card,Celine Kimi Card,6,20,,10,,,,,,,,2,,,,,{ bonus bMatkRate,10; bonus5 bAutoSpell,"NPC_CRITICALWOUND",3,200+(50*getrefine()),BF_MAGIC,1; },{},{} +31022,Abandoned_Teddy_Bear_Card,Abandoned Teddy Bear Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxSPRate,20; bonus2 bAddEff2,Eff_Curse,20; },{},{} +31023,Celine_Kimi_Card,Celine Kimi Card,6,20,,10,,,,,,,,2,,,,,{ bonus bMatkRate,10; bonus5 bAutoSpell,"NPC_CRITICALWOUND",3,5+(10*(getrefine()/3)),BF_MAGIC,1; },{},{} //=================================================================== // More Costumes //=================================================================== From dd9b6d30e2785fd9d6f665e89af8c614a8364fe5 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Sat, 18 Apr 2020 16:37:37 +0200 Subject: [PATCH 055/212] SQL synchronization --- sql-files/item_db_re.sql | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index ff0f66ec60..d725cb0a9a 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -12234,7 +12234,7 @@ REPLACE INTO `item_db_re` VALUES (27082,'Angry_Nine_Tail_Card','Angry Nine Tail REPLACE INTO `item_db_re` VALUES (27083,'Resentful_Bongun_Card','Resentful Bongun Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bBaseAtk,20; bonus bMatk,20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27084,'Resentful_Sohee_Card','Resentful Sohee Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bMatk,10; if (getrefine() >= 10) { bonus bMatkRate,2; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27085,'Resentful_Munak_Card','Resentful Munak Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,15; bonus bMatk,15;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (27086,'Resentful_Soldier_Card','Resentful Soldier Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'if (getiteminfo(getequipid(EQI_COMPOUND_ON),11) == W_BOW) { bonus3 bAutoSpell,"TF_DOUBLE",5,30; if (getrefine() >= 10) { bonus2 bWeaponDamageRate,W_BOW,20; } }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (27086,'Resentful_Soldier_Card','Resentful Soldier Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'if (getiteminfo(getequipid(EQI_COMPOUND_ON),11) == W_BOW) { bonus3 bAutoSpell,"AC_DOUBLE",5,30; if (getrefine() >= 10) { bonus2 bWeaponDamageRate,W_BOW,20; } }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27087,'Truthful_Wizard_Card','Truthful Wizard Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bMatk,25; autobonus "{ bonus bNoCastCancel; }",5,5000,BF_MAGIC,"{ showscript \\\"This is the truth!\\\"; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27088,'Fury_Hero_Card','Fury Hero Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus2 bAddClass,Class_All,2; bonus5 bAutoSpell,"SM_ENDURE",1,5,BF_SHORT,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27101,'Sweet_Nightmare_Card','Sweet Nightmare Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bMatk,20; bonus bNoCastCancel;',NULL,NULL); @@ -12267,7 +12267,7 @@ REPLACE INTO `item_db_re` VALUES (27147,'Humanoid_Chimera_Card','Humanoid Chimer REPLACE INTO `item_db_re` VALUES (27148,'Material_Chimera_Card','Material Chimera Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus bFlee,(BaseLevel >= 90 ? 20 : 10);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27149,'Heart_Hunter_Card','Heart Hunter Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'.@type = getiteminfo(getequipid(EQI_COMPOUND_ON),11); .@r = getrefine(); if(.@type == 17 || .@type == 18 || .@type == 21){ bonus bLongAtkRate,5+.@r+(.@r >= 10 ? 5 : 0); }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27150,'Toxic_Enchanted_Chimera_Card','Toxic Enchanted Chimera Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus bMaxHP,1000; bonus bMaxSP,200; if(getrefine() >= 12){ bonus bMaxHPrate,15; bonus bMaxSPrate,15; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (27151,'Heart_Hunter_Evil_Card','Heart Hunter Evil Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus2 bAddEffWhenHit,Eff_Freeze,1000 + (readparam(bInt) >= 110 ? 5 : 0); bonus bMdef,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (27151,'Heart_Hunter_Evil_Card','Heart Hunter Evil Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus2 bAddEffWhenHit,Eff_Freeze,3000 + (readparam(bInt) >= 110 ? 1000 : 0); bonus bMdef,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27152,'Cutie_Card','Cutie Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,10; .@r = getrefine()/2; bonus bAgi,.@r; bonus bAspdRate,.@r;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27157,'Wood_Goblin_Card','Wood Goblin Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'.@r = getrefine(); bonus2 bAddEle,Ele_Water,(.@r >= 9 ? 10 : 5); bonus2 bAddEle,Ele_Earth,(.@r >= 9 ? 10 : 5); bonus2 bSubDefEle,Ele_Water,-5; bonus2 bSubDefEle,Ele_Earth,-5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27158,'Les_Card','Les Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,32,NULL,NULL,NULL,NULL,'bonus2 bSubEle,Ele_Wind,30;',NULL,NULL); @@ -12278,7 +12278,7 @@ REPLACE INTO `item_db_re` VALUES (27162,'Gopinich_Card','Gopinich Card',6,20,NUL REPLACE INTO `item_db_re` VALUES (27163,'Faceworm_Card','Faceworm Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus bAgi,-1; bonus bDex,-1; bonus bAspdRate,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27164,'Faceworm_Queen_Card','Faceworm Queen Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,-10; .@r = getrefine(); bonus bCritical,15 + .@r; bonus bCritAtkRate,.@r;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27165,'Dark_Faceworm_Card','Dark Faceworm Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus bVit,-1; bonus bInt,-1; bonus bDelayrate,-3;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (27166,'Faceworm_Egg_Card','Faceworm Egg Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'.@r = getrefine(); .@sub = 2+(.@r >= 9 ? 3 : .@r >= 7 ? 1 : 0); bonus bNearAtkDef,.@sub; bonus bMagicAtkDef,.@sub;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (27166,'Faceworm_Egg_Card','Faceworm Egg Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'.@r = getrefine(); .@sub = 2+(.@r >= 9 ? 3 : .@r >= 7 ? 1 : 0); bonus2 bSubEle,Ele_Fire,.@sub;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27167,'Faceworm_Larva_Card','Faceworm Larva Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus2 bSubEle,Ele_Neutral,15; bonus2 bMagicAtkEle,Ele_Water,getrefine()*3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27168,'Irene_High_Elder_Card','Irene High Elder Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bHit,10 + 5 * (getrefine()/3);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27169,'Payon_Soldier_Card','Payon Soldier Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'.@atk = 5; .@r = getrefine(); if(getiteminfo(getequipid(EQI_HAND_R),11) == W_SPEAR && .@r >= 10){ .@atk += 20; if(.@r >= 14){ .@atk += 20; } } bonus bAtk,.@atk; bonus bMatk,.@atk;',NULL,NULL); @@ -12295,7 +12295,7 @@ REPLACE INTO `item_db_re` VALUES (27179,'Coyote_Card','Coyote Card',6,20,NULL,10 REPLACE INTO `item_db_re` VALUES (27180,'Mechaspider_Card','Mechaspider Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,128,NULL,NULL,NULL,NULL,'bonus bBreakWeaponRate,500; bonus bBreakArmorRate,500;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27181,'Airship_Raid_Card','Airship Raid Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'.@r = getrefine(); bonus bLongAtkRate,1 + .@r/2; bonus bCritical,.@r/2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27182,'Captain_Felock_Card','Captain Felock Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bAtk,30; .@r = getrefine(); bonus2 bSkillAtk,"RL_AM_BLAST",.@r >= 10 ? 60 : 30; bonus2 bSkillAtk,"RL_HAMMER_OF_GOD",.@r >= 10 ? 60 : 30;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (27183,'Gigantes_Card','Gigantes Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,128,NULL,NULL,NULL,NULL,'bonus bAtk,20; if(readparam(bStr) >= 120) { bonus bAtk,20; bonus bAspdRate,-3; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (27183,'Gigantes_Card','Gigantes Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,128,NULL,NULL,NULL,NULL,'bonus bAtk,20; if(readparam(bStr) >= 120) { bonus bAtk,20; bonus bAspdRate,3; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27184,'Knight_Sakray_Card','Knight Sakray Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bAtk,20; bonus2 bAddRace,RC_Demon,30; bonus2 bAddRace,RC_Undead,30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27196,'Nihil_M_Heine_Card','Nihil M. Heine Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus2 bMagicAddSize,Size_Small,15;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27197,'Agnes_Lugenburg_Card','Agnes Lugenburg Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus2 bAddSize,Size_Small,15;',NULL,NULL); @@ -12793,7 +12793,7 @@ REPLACE INTO `item_db_re` VALUES (29607,'Alphoccio_Memory','Alphoccio\'s Memory' REPLACE INTO `item_db_re` VALUES (31006,'LoVA_Hades_Card','LoVA Hades Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus2 bSubRace,RC_Undead,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (31007,'LoVA_Realization_Hades_Card','LoVA Realization Hades Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bDefEle,Ele_Undead; bonus2 bSubRace,RC_Undead,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (31008,'LoVA_Lulu_Card','LoVA Lulu Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus2 bHPRegenRate,BaseLevel,10000; if(getrefine()>=7) { bonus bAtk,6*(readparam(bStr)/60); bonus bMaxHPrate,readparam(bStr)/60; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (31009,'LoVA_Realization_Lulu_Card','LoVA Realization Lulu Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus2 bHPRegenRate,1+BaseLevel,10000; if(getrefine()>=7) { bonus bAtk,6*(readparam(bStr)/20); bonus bMaxHPrate,readparam(bStr)/20; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (31009,'LoVA_Realization_Lulu_Card','LoVA Realization Lulu Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus2 bHPRegenRate,BaseLevel,10000; if(getrefine()>=7) { bonus bAtk,6*(readparam(bStr)/20); bonus bMaxHPrate,readparam(bStr)/20; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (31010,'LoVA_Kima_Card','LoVA Kima Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus2 bSPRegenRate,BaseLevel/6,10000; if(getrefine()>=7) { bonus bMatk,6*(readparam(bInt)/30); bonus bMaxSPrate,readparam(bInt)/30; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (31011,'LoVA_Realization_Kima_Card','LoVA Realization Kima Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus2 bSPRegenRate,BaseLevel/2,10000; if(getrefine()>=7) { bonus bMatk,6*(readparam(bInt)/10); bonus bMaxSPrate,readparam(bInt)/10; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (31012,'LoVA_Bahamut_Card','LoVA Bahamut Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus2 bSkillAtk,"RK_DRAGONBREATH",5; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",5; if(getrefine()>=7) { bonus bDelayrate,-1; }',NULL,NULL); @@ -12802,12 +12802,12 @@ REPLACE INTO `item_db_re` VALUES (31014,'LoVA_Ragnarok_Card','LoVA Ragnarok Card REPLACE INTO `item_db_re` VALUES (31015,'LoVA_Realization_Ragnarok_Card','LoVA Realization Ragnarok Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bMdef,10; bonus bMaxHPrate,10; if(getrefine()>=7) { bonus2 bSkillAtk,"HW_GRAVITATION",769; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (31016,'Decorated_Evil_Tree_Card','Decorated Evil Tree Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bMaxHP,1000; bonus bMaxSP,150; bonus bFlee,-25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (31017,'Vicious_Cookie_Card','Vicious Cookie Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'.@r = getrefine(); bonus2 bAddClass,Class_All,1+.@r; bonus bMatkRate,1+.@r; bonus bMaxHPrate,-(2+(.@r*2));',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (31018,'Evil_Dwelling_Box_Card','Evil Dwelling Box Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bMaxHP,-1225; bonus3 bAddEff,Eff_Curse,300,ATF_MAGIC; /* unofficial chance [Secret] */',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (31019,'Creepy_Demon_Card','Creepy Demon Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,-13; bonus3 bAddEffWhenHit,Eff_Curse,300,ATF_MAGIC; /* unofficial chance [Secret] */',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (31020,'Malicious_Baby_Ghost_Card','Malicious Baby Ghost Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,-13; bonus3 bAddEffWhenHit,Eff_Curse,300,ATF_WEAPON; /* unofficial chance [Secret] */',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (31018,'Evil_Dwelling_Box_Card','Evil Dwelling Box Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bMaxHP,-1225; bonus3 bAddEff,Eff_Curse,5000,ATF_MAGIC;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (31019,'Creepy_Demon_Card','Creepy Demon Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,-13; bonus3 bAddEffWhenHit,Eff_Curse,4000,ATF_MAGIC;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (31020,'Malicious_Baby_Ghost_Card','Malicious Baby Ghost Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,-13; bonus3 bAddEffWhenHit,Eff_Curse,4000,ATF_WEAPON;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (31021,'Dancing_Marionette_Card','Dancing Marionette Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bAspdRate,10; bonus2 bAddClass,Class_All,-3;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (31022,'Abandoned_Teddy_Bear_Card','Abandoned Teddy Bear Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus bMaxSPRate,20; bonus2 bAddEff2,Eff_Curse,100; /* unofficial chance [Secret] */',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (31023,'Celine_Kimi_Card','Celine Kimi Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bMatkRate,10; bonus5 bAutoSpell,"NPC_CRITICALWOUND",3,200+(50*getrefine()),BF_MAGIC,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (31022,'Abandoned_Teddy_Bear_Card','Abandoned Teddy Bear Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus bMaxSPRate,20; bonus2 bAddEff2,Eff_Curse,20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (31023,'Celine_Kimi_Card','Celine Kimi Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bMatkRate,10; bonus5 bAutoSpell,"NPC_CRITICALWOUND",3,5+(10*(getrefine()/3)),BF_MAGIC,1;',NULL,NULL); #=================================================================== # More Costumes #=================================================================== From 663d2eb3b4c8cc0d184ebc6e86e79a302422718b Mon Sep 17 00:00:00 2001 From: Aleos Date: Sun, 19 Apr 2020 14:07:01 -0400 Subject: [PATCH 056/212] Removes an invalid mob death event (#4821) * Fixes #4816. * Follow up to c6470ff. * Removes an event that was accidentally added during a macro cleanup. Thanks to @will21! --- npc/mobs/towns.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npc/mobs/towns.txt b/npc/mobs/towns.txt index 9341cda7a0..1b6f31deec 100644 --- a/npc/mobs/towns.txt +++ b/npc/mobs/towns.txt @@ -20,7 +20,7 @@ einbech,0,0 monster Tarou 1175,5,1800000,1500000 //================================================== // jawaii - Jawaii, the Honeymoon Island //================================================== -jawaii,207,290,10,10 monster Phen 1158,3,3600000,1800000,1234 +jawaii,207,290,10,10 monster Phen 1158,3,3600000,1800000 jawaii,221,220,30,30 monster Aster 1266,2,3600000,2400000 jawaii,276,163,20,20 monster Aster 1266,1,7200000,3600000 jawaii,221,220,30,30 monster Shellfish 1074,1,4800000,3000000 From 4a3dac6c93cb015bccee7bfe361fa4d7b5b6004c Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Mon, 20 Apr 2020 19:22:46 +0200 Subject: [PATCH 057/212] Fixed Dimensional Gorge pre-re spawns (#4823) --- npc/pre-re/mobs/fields/morocc.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/npc/pre-re/mobs/fields/morocc.txt b/npc/pre-re/mobs/fields/morocc.txt index f916c9789b..0ca0ec4274 100644 --- a/npc/pre-re/mobs/fields/morocc.txt +++ b/npc/pre-re/mobs/fields/morocc.txt @@ -299,10 +299,10 @@ moc_fild20,0,0 monster Drops 1113,30 moc_fild20,0,0 monster Scorpion 1001,70 moc_fild20,0,0 monster Picky 1050,50 moc_fild20,0,0 monster Picky 1049,50 -moc_fild20,0,0 monster Morocc's Shadow 1918,1,30000,0,0 -moc_fild20,0,0 monster Morocc's Shadow 1919,1,30000,0,0 -moc_fild20,0,0 monster Morocc's Shadow 1920,1,30000,0,0 -moc_fild20,0,0 monster Morocc's Shadow 1921,1,30000,0,0 +moc_fild20,0,0 monster Incarnation of Morocc 1918,1,30000,0,0 +moc_fild20,0,0 monster Incarnation of Morocc 1919,1,30000,0,0 +moc_fild20,0,0 monster Incarnation of Morocc 1920,1,30000,0,0 +moc_fild20,0,0 monster Incarnation of Morocc 1921,1,30000,0,0 //================================================== // moc_fild21 - Dimensional Gorge @@ -310,16 +310,16 @@ moc_fild20,0,0 monster Morocc's Shadow 1921,1,30000,0,0 moc_fild21,0,0 monster Golem 1040,61 moc_fild21,0,0 monster Stalactic Golem 1278,46 moc_fild21,0,0 monster Lava Golem 1366,46 -moc_fild21,0,0 monster Morocc's Shadow 1918,46,30000,0,0 -moc_fild21,0,0 monster Morocc's Shadow 1919,46,30000,0,0 -moc_fild21,0,0 monster Morocc's Shadow 1920,46,30000,0,0 -moc_fild21,0,0 monster Morocc's Shadow 1921,34,30000,0,0 +moc_fild21,0,0 monster Incarnation of Morocc 1918,46,30000,0,0 +moc_fild21,0,0 monster Incarnation of Morocc 1919,46,30000,0,0 +moc_fild21,0,0 monster Incarnation of Morocc 1920,46,30000,0,0 +moc_fild21,0,0 monster Incarnation of Morocc 1921,34,30000,0,0 //================================================== // moc_fild22 - Dimensional Gorge //================================================== -moc_fild22,0,0 monster Morocc's Shadow 1918,60,30000,0,0 -moc_fild22,0,0 monster Morocc's Shadow 1919,60,30000,0,0 -moc_fild22,0,0 monster Morocc's Shadow 1920,60,30000,0,0 -moc_fild22,0,0 monster Morocc's Shadow 1921,25,30000,0,0 -moc_fild22,0,0 monster Wounded Satan Morocc 1917,1,43200000,3600000 +moc_fild22,0,0 monster Incarnation of Morocc 1918,60,30000,0,0 +moc_fild22,0,0 monster Incarnation of Morocc 1919,60,30000,0,0 +moc_fild22,0,0 monster Incarnation of Morocc 1920,60,30000,0,0 +moc_fild22,0,0 monster Incarnation of Morocc 1921,25,10000,0,0 +moc_fild22,0,0 boss_monster Wounded Morocc 1917,1,43200000,3600000 From b65443d8f564175196d57ef9bc1d000a5661fbdc Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 23 Apr 2020 16:53:07 -0400 Subject: [PATCH 058/212] Removal of OnPCStatCalcEvent (#4831) * Fixes #4812. * This script event can be replaced with the other various player script events. * The trigger during equipment changing causes headache across other calculation events in source. --- doc/script_commands.txt | 7 ------ src/map/npc.cpp | 2 -- src/map/npc.hpp | 1 - src/map/pc.cpp | 25 ++++--------------- src/map/script.cpp | 55 +++++++++-------------------------------- src/map/script.hpp | 1 - src/map/status.cpp | 5 ---- src/map/status.hpp | 1 - 8 files changed, 17 insertions(+), 80 deletions(-) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index d254890b9f..c8e313893c 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -958,13 +958,6 @@ mapflag for it to work is because, otherwise, it'd be server-wide and trigger every time a player would change maps. Imagine the server load with 1,000 players (oh the pain...) -OnPCStatCalcEvent: - -This special label triggers when a player's stats are recalculated, such as when -changing stats, equipment, or maps, as well as when logging in, leveling up, and -mounting a job mount. This can be used to grant additional item bonuses to certain -player groups, for instance. - OnWhisperGlobal: This special label triggers when a player whispers the NPC, and will run with the diff --git a/src/map/npc.cpp b/src/map/npc.cpp index acf962399f..b5600a7d2e 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -4599,8 +4599,6 @@ const char *npc_get_script_event_name(int npce_index) return script_config.kill_pc_event_name; case NPCE_KILLNPC: return script_config.kill_mob_event_name; - case NPCE_STATCALC: - return script_config.stat_calc_event_name; default: ShowError("npc_get_script_event_name: npce_index is outside the array limits: %d (max: %d).\n", npce_index, NPCE_MAX); return NULL; diff --git a/src/map/npc.hpp b/src/map/npc.hpp index 999e7d129a..f16926a1db 100644 --- a/src/map/npc.hpp +++ b/src/map/npc.hpp @@ -1196,7 +1196,6 @@ enum npce_event : uint8 { NPCE_DIE, NPCE_KILLPC, NPCE_KILLNPC, - NPCE_STATCALC, NPCE_MAX }; struct view_data* npc_get_viewdata(int class_); diff --git a/src/map/pc.cpp b/src/map/pc.cpp index d2921a2c3e..ded9f0889e 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -3577,10 +3577,7 @@ void pc_bonus(struct map_session_data *sd,int type,int val) sd->special_state.no_walk_delay = 1; break; default: - if (running_npc_stat_calc_event) { - ShowWarning("pc_bonus: unknown bonus type %d %d in OnPCStatCalcEvent!\n", type, val); - } - else if (current_equip_combo_pos > 0) { + if (current_equip_combo_pos > 0) { ShowWarning("pc_bonus: unknown bonus type %d %d in a combo with item #%d\n", type, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid); } else if (current_equip_card_id > 0 || current_equip_item_index > 0) { @@ -4164,10 +4161,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val) sd->dropaddclass[type2] += val; break; default: - if (running_npc_stat_calc_event) { - ShowWarning("pc_bonus2: unknown bonus type %d %d %d in OnPCStatCalcEvent!\n", type, type2, val); - } - else if (current_equip_combo_pos > 0) { + if (current_equip_combo_pos > 0) { ShowWarning("pc_bonus2: unknown bonus type %d %d %d in a combo with item #%d\n", type, type2, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid); } else if (current_equip_card_id > 0 || current_equip_item_index > 0) { @@ -4301,10 +4295,7 @@ void pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) sd->norecover_state_race[type2].tick = val; break; default: - if (running_npc_stat_calc_event) { - ShowWarning("pc_bonus3: unknown bonus type %d %d %d %d in OnPCStatCalcEvent!\n", type, type2, type3, val); - } - else if (current_equip_combo_pos > 0) { + if (current_equip_combo_pos > 0) { ShowWarning("pc_bonus3: unknown bonus type %d %d %d %d in a combo with item #%d\n", type, type2, type3, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid); } else if (current_equip_card_id > 0 || current_equip_item_index > 0) { @@ -4387,10 +4378,7 @@ void pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type break; default: - if (running_npc_stat_calc_event) { - ShowWarning("pc_bonus4: unknown bonus type %d %d %d %d %d in OnPCStatCalcEvent!\n", type, type2, type3, type4, val); - } - else if (current_equip_combo_pos > 0) { + if (current_equip_combo_pos > 0) { ShowWarning("pc_bonus4: unknown bonus type %d %d %d %d %d in a combo with item #%d\n", type, type2, type3, type4, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid); } else if (current_equip_card_id > 0 || current_equip_item_index > 0) { @@ -4439,10 +4427,7 @@ void pc_bonus5(struct map_session_data *sd,int type,int type2,int type3,int type break; default: - if (running_npc_stat_calc_event) { - ShowWarning("pc_bonus5: unknown bonus type %d %d %d %d %d %d in OnPCStatCalcEvent!\n", type, type2, type3, type4, type5, val); - } - else if (current_equip_combo_pos > 0) { + if (current_equip_combo_pos > 0) { ShowWarning("pc_bonus5: unknown bonus type %d %d %d %d %d %d in a combo with item #%d\n", type, type2, type3, type4, type5, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid); } else if (current_equip_card_id > 0 || current_equip_item_index > 0) { diff --git a/src/map/script.cpp b/src/map/script.cpp index 4f44fdc136..6bd04b65d7 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -266,7 +266,6 @@ struct Script_Config script_config = { "OnPCLoadMapEvent", //loadmap_event_name "OnPCBaseLvUpEvent", //baselvup_event_name "OnPCJobLvUpEvent", //joblvup_event_name - "OnPCStatCalcEvent", //stat_calc_event_name // NPC related "OnTouch_", //ontouch_event_name (runs on first visible char to enter area, picks another char if the first char leaves) "OnTouch", //ontouch2_event_name (run whenever a char walks into the OnTouch area) @@ -23768,13 +23767,8 @@ BUILDIN_FUNC(achievementadd) { } if( !sd->state.pc_loaded ){ - if( !running_npc_stat_calc_event ){ - ShowError( "buildin_achievementadd: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id ); - return SCRIPT_CMD_FAILURE; - }else{ - // Simply ignore it on the first call, because the status will be recalculated after loading anyway - return SCRIPT_CMD_SUCCESS; - } + // Simply ignore it on the first call, because the status will be recalculated after loading anyway + return SCRIPT_CMD_SUCCESS; } if (achievement_add(sd, achievement_id)) @@ -23805,13 +23799,8 @@ BUILDIN_FUNC(achievementremove) { } if( !sd->state.pc_loaded ){ - if( !running_npc_stat_calc_event ){ - ShowError( "buildin_achievementremove: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id ); - return SCRIPT_CMD_FAILURE; - }else{ - // Simply ignore it on the first call, because the status will be recalculated after loading anyway - return SCRIPT_CMD_SUCCESS; - } + // Simply ignore it on the first call, because the status will be recalculated after loading anyway + return SCRIPT_CMD_SUCCESS; } if (achievement_remove(sd, achievement_id)) @@ -23842,13 +23831,8 @@ BUILDIN_FUNC(achievementinfo) { if( !sd->state.pc_loaded ){ script_pushint(st, false); - if( !running_npc_stat_calc_event ){ - ShowError( "buildin_achievementinfo: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id ); - return SCRIPT_CMD_FAILURE; - }else{ - // Simply ignore it on the first call, because the status will be recalculated after loading anyway - return SCRIPT_CMD_SUCCESS; - } + // Simply ignore it on the first call, because the status will be recalculated after loading anyway + return SCRIPT_CMD_SUCCESS; } script_pushint(st, achievement_check_progress(sd, achievement_id, script_getnum(st, 3))); @@ -23875,13 +23859,8 @@ BUILDIN_FUNC(achievementcomplete) { } if( !sd->state.pc_loaded ){ - if( !running_npc_stat_calc_event ){ - ShowError( "buildin_achievementcomplete: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id ); - return SCRIPT_CMD_FAILURE; - }else{ - // Simply ignore it on the first call, because the status will be recalculated after loading anyway - return SCRIPT_CMD_SUCCESS; - } + // Simply ignore it on the first call, because the status will be recalculated after loading anyway + return SCRIPT_CMD_SUCCESS; } ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id); @@ -23913,13 +23892,8 @@ BUILDIN_FUNC(achievementexists) { if( !sd->state.pc_loaded ){ script_pushint(st, false); - if( !running_npc_stat_calc_event ){ - ShowError( "buildin_achievementexists: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id ); - return SCRIPT_CMD_FAILURE; - }else{ - // Simply ignore it on the first call, because the status will be recalculated after loading anyway - return SCRIPT_CMD_SUCCESS; - } + // Simply ignore it on the first call, because the status will be recalculated after loading anyway + return SCRIPT_CMD_SUCCESS; } ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id && sd->achievement_data.achievements[i].completed > 0 ); @@ -23951,13 +23925,8 @@ BUILDIN_FUNC(achievementupdate) { } if( !sd->state.pc_loaded ){ - if( !running_npc_stat_calc_event ){ - ShowError( "buildin_achievementupdate: call was too early. Character %s(CID: '%u') was not loaded yet.\n", sd->status.name, sd->status.char_id ); - return SCRIPT_CMD_FAILURE; - }else{ - // Simply ignore it on the first call, because the status will be recalculated after loading anyway - return SCRIPT_CMD_SUCCESS; - } + // Simply ignore it on the first call, because the status will be recalculated after loading anyway + return SCRIPT_CMD_SUCCESS; } ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id); diff --git a/src/map/script.hpp b/src/map/script.hpp index f1ce096414..b52cebd440 100644 --- a/src/map/script.hpp +++ b/src/map/script.hpp @@ -160,7 +160,6 @@ struct Script_Config { const char *loadmap_event_name; const char *baselvup_event_name; const char *joblvup_event_name; - const char *stat_calc_event_name; // NPC related const char* ontouch_event_name; diff --git a/src/map/status.cpp b/src/map/status.cpp index d883e9f726..9e1209a5e8 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -62,7 +62,6 @@ static struct status_data dummy_status; short current_equip_item_index; /// Contains inventory index of an equipped item. To pass it into the EQUP_SCRIPT [Lupus] unsigned int current_equip_combo_pos; /// For combo items we need to save the position of all involved items here int current_equip_card_id; /// To prevent card-stacking (from jA) [Skotlex] -bool running_npc_stat_calc_event; /// Indicate if OnPCStatCalcEvent is running. // We need it for new cards 15 Feb 2005, to check if the combo cards are insrerted into the CURRENT weapon only to avoid cards exploits short current_equip_opt_index; /// Contains random option index of an equipped item. [Secret] @@ -3846,10 +3845,6 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) pc_delautobonus(sd, sd->autobonus2, true); pc_delautobonus(sd, sd->autobonus3, true); - running_npc_stat_calc_event = true; - npc_script_event(sd, NPCE_STATCALC); - running_npc_stat_calc_event = false; - // Parse equipment for (i = 0; i < EQI_MAX; i++) { current_equip_item_index = index = sd->equip_index[i]; // We pass INDEX to current_equip_item_index - for EQUIP_SCRIPT (new cards solution) [Lupus] diff --git a/src/map/status.hpp b/src/map/status.hpp index 134398596d..a44d5716af 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -2082,7 +2082,6 @@ enum e_joint_break : uint8 { extern short current_equip_item_index; extern unsigned int current_equip_combo_pos; extern int current_equip_card_id; -extern bool running_npc_stat_calc_event; extern short current_equip_opt_index; //Status change option definitions (options are what makes status changes visible to chars From e764fdd4b5a765e577846f72a826630832ce34f5 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Fri, 24 Apr 2020 11:30:19 +1000 Subject: [PATCH 059/212] Fix Heaven's Drive damage (#4835) * Fixes #4834. * Fixes Heaven's Drive damage in renewal mode. Thanks to @Latiosu! --- src/map/battle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index d5e149c0d7..91f492bed9 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -6233,7 +6233,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; #ifdef RENEWAL case WZ_HEAVENDRIVE: - skillratio += -100 + skill_lv * 100 + skill_lv * 25; + skillratio += 125; break; case WZ_METEOR: skillratio += 25; From d9ab23ae0f28905d71df43fc4047cb6bdaabbeab Mon Sep 17 00:00:00 2001 From: Cydh Ramdh Date: Fri, 24 Apr 2020 11:53:08 +0700 Subject: [PATCH 060/212] Fixed Max HP & SP rate bonus (#4828) * Fixed #4264 * Added new SCs for proper HP & SP Pill usages * Thanks to @Daegaladh --- db/pre-re/item_db.txt | 4 +- db/re/item_db.txt | 4 +- src/map/script_constants.hpp | 2 + src/map/status.cpp | 109 ++++++++++++++++++++++++++++------- src/map/status.hpp | 2 + 5 files changed, 97 insertions(+), 24 deletions(-) diff --git a/db/pre-re/item_db.txt b/db/pre-re/item_db.txt index 79001500a8..224c0874df 100644 --- a/db/pre-re/item_db.txt +++ b/db/pre-re/item_db.txt @@ -4839,8 +4839,8 @@ 12271,Mre_A,Military Ration A,0,2,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ percentheal 5,0; },{},{} 12272,Mre_B,Military Ration B,2,2,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INCHIT,600000,33; },{},{} 12273,Mre_C,Military Ration C,2,2,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INCFLEE,600000,33; },{},{} -12274,Gold_Pill_1,Daehwandan,0,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INCMHPRATE,3600000,5; percentheal 10,0; },{},{} -12275,Gold_Pill_2,Taecheongdan,0,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start SC_INCMSPRATE,3600000,5; percentheal 0,10; },{},{} +12274,Gold_Pill_1,Daehwandan,0,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start2 SC_INCREASE_MAXHP,3600000,5,10; percentheal 10,0; },{},{} +12275,Gold_Pill_2,Taecheongdan,0,0,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ sc_start2 SC_INCREASE_MAXSP,3600000,5,10; percentheal 0,10; },{},{} 12276,Mimic_Scroll,Mimic Scroll,2,2,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ mercenary_create 2058,1800000; },{},{} 12277,Disguise_Scroll,Disguise Scroll,2,2,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ mercenary_create 2059,1800000; },{},{} 12278,Alice_Scroll,Alice Scroll,2,2,,10,,,,,0xFFFFFFFF,7,2,,,,,,{ mercenary_create 2060,1800000; },{},{} diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 0cc393c1ae..815b48215c 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -6589,8 +6589,8 @@ 12271,Mre_A,Military Ration A,0,2,,70,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal 5,0; },{},{} 12272,Mre_B,Military Ration B,2,2,,70,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_HITFOOD,600000,33; },{},{} 12273,Mre_C,Military Ration C,2,2,,70,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_FLEEFOOD,600000,33; },{},{} -12274,Gold_Pill_1,Daehwandan,0,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ bonus_script "{ bonus bMaxHPrate,5; bonus bHPrecovRate,10; }",3600; percentheal 10,0; },{},{} -12275,Gold_Pill_2,Taecheongdan,0,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ bonus_script "{ bonus bMaxSPrate,5; bonus bSPrecovRate,10; }",3600; percentheal 0,10; },{},{} +12274,Gold_Pill_1,Daehwandan,0,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start2 SC_INCREASE_MAXHP,3600000,5,10; percentheal 10,0; },{},{} +12275,Gold_Pill_2,Taecheongdan,0,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start2 SC_INCREASE_MAXSP,3600000,5,10; percentheal 0,10; },{},{} 12276,Mimic_Scroll,Mimic Scroll,2,2,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ mercenary_create 2058,1800000; },{},{} 12277,Disguise_Scroll,Disguise Scroll,2,2,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ mercenary_create 2059,1800000; },{},{} 12278,Alice_Scroll,Alice Scroll,2,2,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ mercenary_create 2060,1800000; },{},{} diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index dd9a4f077e..6ea81c393a 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1576,6 +1576,8 @@ export_constant(SC_SP_SHA); export_constant(SC_SOULCURSE); export_constant(SC_HELLS_PLANT); + export_constant(SC_INCREASE_MAXHP); + export_constant(SC_INCREASE_MAXSP); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); #endif diff --git a/src/map/status.cpp b/src/map/status.cpp index 9e1209a5e8..d473bfeeea 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -1146,6 +1146,8 @@ void initChangeTables(void) StatusIconChangeTable[SC_SPL_MATK] = EFST_SPL_MATK; StatusIconChangeTable[SC_ATKPOTION] = EFST_PLUSATTACKPOWER; StatusIconChangeTable[SC_MATKPOTION] = EFST_PLUSMAGICPOWER; + StatusIconChangeTable[SC_INCREASE_MAXHP] = EFST_ATKER_ASPD; + StatusIconChangeTable[SC_INCREASE_MAXSP] = EFST_ATKER_MOVESPEED; /* Cash Items */ StatusIconChangeTable[SC_FOOD_STR_CASH] = EFST_FOOD_STR_CASH; @@ -1436,6 +1438,8 @@ void initChangeTables(void) StatusChangeFlagTable[SC_GEFFEN_MAGIC1] |= SCB_ALL; StatusChangeFlagTable[SC_GEFFEN_MAGIC2] |= SCB_ALL; StatusChangeFlagTable[SC_GEFFEN_MAGIC3] |= SCB_ALL; + StatusChangeFlagTable[SC_INCREASE_MAXHP] |= SCB_MAXHP|SCB_REGEN; + StatusChangeFlagTable[SC_INCREASE_MAXSP] |= SCB_MAXSP|SCB_REGEN; /* Cash Items */ StatusChangeFlagTable[SC_FOOD_STR_CASH] |= SCB_STR; @@ -3353,13 +3357,6 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { } else if (type == STATUS_BONUS_RATE) { struct status_change *sc = status_get_sc(bl); - //Only for BL_PC - if (bl->type == BL_PC) { - struct map_session_data *sd = map_id2sd(bl->id); - bonus += sd->hprate; - bonus -= 100; //Default hprate is 100, so it should be add 0% - } - //Bonus by SC if (sc) { //Increasing @@ -3385,8 +3382,6 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += (2 + sc->data[SC_RAISINGDRAGON]->val1); if(sc->data[SC_GT_REVITALIZE]) bonus += sc->data[SC_GT_REVITALIZE]->val2; - if(sc->data[SC_MUSTLE_M]) - bonus += sc->data[SC_MUSTLE_M]->val1; if(sc->data[SC_ANGRIFFS_MODUS]) bonus += (5 * sc->data[SC_ANGRIFFS_MODUS]->val1); if(sc->data[SC_PETROLOGY_OPTION]) @@ -3413,8 +3408,6 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus -= sc->data[SC_BEYONDOFWARCRY]->val4; if(sc->data[SC__WEAKNESS]) bonus -= sc->data[SC__WEAKNESS]->val2; - if(sc->data[SC_MYSTERIOUS_POWDER]) - bonus -= sc->data[SC_MYSTERIOUS_POWDER]->val1; if(sc->data[SC_EQC]) bonus -= sc->data[SC_EQC]->val3; } @@ -3425,6 +3418,40 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { return min(bonus,INT_MAX); } +/** +* HP bonus rate from equipment +*/ +static int status_get_hpbonus_equip(TBL_PC *sd) { + int bonus = 0; + + bonus += sd->hprate; + + return bonus -= 100; //Default hprate is 100, so it should be add 0% +} + +/** +* HP bonus rate from usable items +*/ +static int status_get_hpbonus_item(block_list *bl) { + int bonus = 0; + + struct status_change *sc = status_get_sc(bl); + + //Bonus by SC + if (sc) { + if (sc->data[SC_INCREASE_MAXHP]) + bonus += sc->data[SC_INCREASE_MAXHP]->val1; + if (sc->data[SC_MUSTLE_M]) + bonus += sc->data[SC_MUSTLE_M]->val1; + + if (sc->data[SC_MYSTERIOUS_POWDER]) + bonus -= sc->data[SC_MYSTERIOUS_POWDER]->val1; + } + + // Max rate reduce is -100% + return cap_value(bonus, -100, INT_MAX); +} + /** * Get SP bonus modifiers * @param bl: block_list that will be checked @@ -3487,9 +3514,6 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { struct map_session_data *sd = map_id2sd(bl->id); uint8 i; - bonus += sd->sprate; - bonus -= 100; //Default sprate is 100, so it should be add 0% - if((i = pc_checkskill(sd,HP_MEDITATIO)) > 0) bonus += i; if((i = pc_checkskill(sd,HW_SOULDRAIN)) > 0) @@ -3512,12 +3536,6 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { bonus += sc->data[SC_SERVICE4U]->val2; if(sc->data[SC_MERC_SPUP]) bonus += sc->data[SC_MERC_SPUP]->val2; - if(sc->data[SC_LIFE_FORCE_F]) - bonus += sc->data[SC_LIFE_FORCE_F]->val1; - if(sc->data[SC_VITATA_500]) - bonus += sc->data[SC_VITATA_500]->val2; - if (sc->data[SC_ENERGY_DRINK_RESERCH]) - bonus += sc->data[SC_ENERGY_DRINK_RESERCH]->val3; } // Max rate reduce is -100% bonus = cap_value(bonus,-100,INT_MAX); @@ -3526,6 +3544,41 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { return min(bonus,INT_MAX); } +/** +* SP bonus rate from equipment +*/ +static int status_get_spbonus_equip(TBL_PC *sd) { + int bonus = 0; + + bonus += sd->sprate; + + return bonus -= 100; //Default sprate is 100, so it should be add 0% +} + +/** +* SP bonus rate from usable items +*/ +static int status_get_spbonus_item(block_list *bl) { + int bonus = 0; + + struct status_change *sc = status_get_sc(bl); + + //Bonus by SC + if (sc) { + if (sc->data[SC_INCREASE_MAXSP]) + bonus += sc->data[SC_INCREASE_MAXSP]->val1; + if (sc->data[SC_LIFE_FORCE_F]) + bonus += sc->data[SC_LIFE_FORCE_F]->val1; + if (sc->data[SC_VITATA_500]) + bonus += sc->data[SC_VITATA_500]->val2; + if (sc->data[SC_ENERGY_DRINK_RESERCH]) + bonus += sc->data[SC_ENERGY_DRINK_RESERCH]->val3; + } + + // Max rate reduce is -100% + return cap_value(bonus, -100, INT_MAX); +} + /** * Get final MaxHP or MaxSP for player. References: http://irowiki.org/wiki/Max_HP and http://irowiki.org/wiki/Max_SP * The calculation needs base_level, base_status/battle_status (vit or int), additive modifier, and multiplicative modifier @@ -3545,13 +3598,21 @@ static unsigned int status_calc_maxhpsp_pc(struct map_session_data* sd, unsigned level = umax(sd->status.base_level,1); if (isHP) { //Calculates MaxHP + double equip_bonus = 0, item_bonus = 0; dmax = job_info[idx].base_hp[level-1] * (1 + (umax(stat,1) * 0.01)) * ((sd->class_&JOBL_UPPER)?1.25:(pc_is_taekwon_ranker(sd))?3:1); dmax += status_get_hpbonus(&sd->bl,STATUS_BONUS_FIX); + equip_bonus = (dmax * status_get_hpbonus_equip(sd) / 100); + item_bonus = (dmax * status_get_hpbonus_item(&sd->bl) / 100); + dmax += equip_bonus + item_bonus; dmax += (int64)(dmax * status_get_hpbonus(&sd->bl,STATUS_BONUS_RATE) / 100); //Aegis accuracy } else { //Calculates MaxSP + double equip_bonus = 0, item_bonus = 0; dmax = job_info[idx].base_sp[level-1] * (1 + (umax(stat,1) * 0.01)) * ((sd->class_&JOBL_UPPER)?1.25:(pc_is_taekwon_ranker(sd))?3:1); dmax += status_get_spbonus(&sd->bl,STATUS_BONUS_FIX); + equip_bonus = (dmax * status_get_spbonus_equip(sd) / 100); + item_bonus = (dmax * status_get_spbonus_item(&sd->bl) / 100); + dmax += equip_bonus + item_bonus; dmax += (int64)(dmax * status_get_spbonus(&sd->bl,STATUS_BONUS_RATE) / 100); //Aegis accuracy } @@ -4888,6 +4949,12 @@ void status_calc_regen(struct block_list *bl, struct status_data *status, struct val = 0; if( (skill=pc_checkskill(sd,SM_RECOVERY)) > 0 ) val += skill*5 + skill*status->max_hp/500; + + if (sc && sc->count) { + if (sc->data[SC_INCREASE_MAXHP]) + val += val * sc->data[SC_INCREASE_MAXHP]->val2 / 100; + } + sregen->hp = cap_value(val, 0, SHRT_MAX); val = 0; @@ -4903,6 +4970,8 @@ void status_calc_regen(struct block_list *bl, struct status_data *status, struct val *= 150 / 100; if (sc->data[SC_ANCILLA]) val += sc->data[SC_ANCILLA]->val2 / 100; + if (sc->data[SC_INCREASE_MAXSP]) + val += val * sc->data[SC_INCREASE_MAXSP]->val2 / 100; } sregen->sp = cap_value(val, 0, SHRT_MAX); diff --git a/src/map/status.hpp b/src/map/status.hpp index a44d5716af..95a01cb0db 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -921,6 +921,8 @@ enum sc_type : int16 { SC_SOULCURSE, SC_HELLS_PLANT, + SC_INCREASE_MAXHP, // EFST_ATKER_ASPD + SC_INCREASE_MAXSP, // EFST_ATKER_MOVESPEED #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled From 7cac782db0e863ee0f224494652da992f75beb0e Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Fri, 24 Apr 2020 06:53:17 +0200 Subject: [PATCH 061/212] SQL synchronization --- sql-files/item_db.sql | 4 ++-- sql-files/item_db_re.sql | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sql-files/item_db.sql b/sql-files/item_db.sql index f82d98b98d..e9f86ce163 100644 --- a/sql-files/item_db.sql +++ b/sql-files/item_db.sql @@ -4871,8 +4871,8 @@ REPLACE INTO `item_db` VALUES (12270,'Tasty_Major','Tasty White Ration',2,2,NULL REPLACE INTO `item_db` VALUES (12271,'Mre_A','Military Ration A',0,2,NULL,70,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'percentheal 5,0;',NULL,NULL); REPLACE INTO `item_db` VALUES (12272,'Mre_B','Military Ration B',2,2,NULL,70,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_INCHIT,600000,33;',NULL,NULL); REPLACE INTO `item_db` VALUES (12273,'Mre_C','Military Ration C',2,2,NULL,70,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_INCFLEE,600000,33;',NULL,NULL); -REPLACE INTO `item_db` VALUES (12274,'Gold_Pill_1','Daehwandan',0,0,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_INCMHPRATE,3600000,5; percentheal 10,0;',NULL,NULL); -REPLACE INTO `item_db` VALUES (12275,'Gold_Pill_2','Taecheongdan',0,0,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_INCMSPRATE,3600000,5; percentheal 0,10;',NULL,NULL); +REPLACE INTO `item_db` VALUES (12274,'Gold_Pill_1','Daehwandan',0,0,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'sc_start2 SC_INCREASE_MAXHP,3600000,5,10; percentheal 10,0;',NULL,NULL); +REPLACE INTO `item_db` VALUES (12275,'Gold_Pill_2','Taecheongdan',0,0,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'sc_start2 SC_INCREASE_MAXSP,3600000,5,10; percentheal 0,10;',NULL,NULL); REPLACE INTO `item_db` VALUES (12276,'Mimic_Scroll','Mimic Scroll',2,2,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'mercenary_create 2058,1800000;',NULL,NULL); REPLACE INTO `item_db` VALUES (12277,'Disguise_Scroll','Disguise Scroll',2,2,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'mercenary_create 2059,1800000;',NULL,NULL); REPLACE INTO `item_db` VALUES (12278,'Alice_Scroll','Alice Scroll',2,2,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,7,2,NULL,NULL,NULL,NULL,NULL,'mercenary_create 2060,1800000;',NULL,NULL); diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index d725cb0a9a..5e3144954d 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -6621,8 +6621,8 @@ REPLACE INTO `item_db_re` VALUES (12270,'Tasty_Major','Tasty White Ration',2,2,N REPLACE INTO `item_db_re` VALUES (12271,'Mre_A','Military Ration A',0,2,NULL,70,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'percentheal 5,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12272,'Mre_B','Military Ration B',2,2,NULL,70,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_HITFOOD,600000,33;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12273,'Mre_C','Military Ration C',2,2,NULL,70,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_FLEEFOOD,600000,33;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12274,'Gold_Pill_1','Daehwandan',0,0,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'bonus_script "{ bonus bMaxHPrate,5; bonus bHPrecovRate,10; }",3600; percentheal 10,0;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12275,'Gold_Pill_2','Taecheongdan',0,0,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'bonus_script "{ bonus bMaxSPrate,5; bonus bSPrecovRate,10; }",3600; percentheal 0,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12274,'Gold_Pill_1','Daehwandan',0,0,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start2 SC_INCREASE_MAXHP,3600000,5,10; percentheal 10,0;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12275,'Gold_Pill_2','Taecheongdan',0,0,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start2 SC_INCREASE_MAXSP,3600000,5,10; percentheal 0,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12276,'Mimic_Scroll','Mimic Scroll',2,2,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'mercenary_create 2058,1800000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12277,'Disguise_Scroll','Disguise Scroll',2,2,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'mercenary_create 2059,1800000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12278,'Alice_Scroll','Alice Scroll',2,2,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'mercenary_create 2060,1800000;',NULL,NULL); From 785cd766cddcba5c877ceaaacbc7e6104fb89fa3 Mon Sep 17 00:00:00 2001 From: Aleos Date: Fri, 24 Apr 2020 08:37:32 -0400 Subject: [PATCH 062/212] Fixes Brandish Spear hit count (#4830) * Fixes #4826. * Brandish Spear damage should be calculated separately for each hit. Thanks to @Masao87! --- db/re/skill_db.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 4dbb06cc2d..e993997057 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -2110,7 +2110,7 @@ Body: IncreaseGloomyDayDamage: true Range: -2 Hit: Multi_Hit - HitCount: 3 + HitCount: -3 Element: Weapon SplashArea: 2 ActiveInstance: 3 From 5756ae945e4ef114c036892e31c6274e5adc4c4b Mon Sep 17 00:00:00 2001 From: Kanin Temsrisuk Date: Fri, 24 Apr 2020 20:52:26 +0700 Subject: [PATCH 063/212] Minor item combo correct up. (#4837) Corrected the following combos * Shackles + Prisoner's Uniform * All of Vesper + Memory of Lovers * Sprint Glove + Sprint Mail + Sprint Shoes + Sprint Ring Thanks to Jumbo --- db/re/item_combo_db.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/db/re/item_combo_db.txt b/db/re/item_combo_db.txt index dc9263de63..74f5c4271b 100644 --- a/db/re/item_combo_db.txt +++ b/db/re/item_combo_db.txt @@ -200,7 +200,7 @@ 2399:2553,{ bonus bAgi,5; bonus bFlee,15; } 2399:2553:5467,{ bonus2 bSubRace,RC_Dragon,20; } 2408:2655,{ bonus bBaseAtk,50; bonus2 bAddDefMonster,1196,20; bonus2 bAddDefMonster,1197,20; } -2408:15040,{ .@r = getequiprefinerycnt(EQI_SHOES); if(.@r > 10) .@r = 10; bonus bMatkRate,5+.@r; } +2408:15040,{ .@r = getequiprefinerycnt(EQI_SHOES); bonus bBaseAtk,5+.@r; } 2424:2528,{ bonus bHPrecovRate,5; bonus bMaxHPrate,10; } 2425:2529,{ bonus bFlee,10; } 2425:2530,{ bonus bFlee,10; } @@ -310,9 +310,9 @@ 2626:2711,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; } 2626:2786,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; } 2659:18937,{ bonus bInt,8; bonus bMaxSPrate,5;} -2660:18937,{ bonus bInt,8; bonus bBaseAtk,20;} -2661:18937,{ bonus bInt,8; bonus bFlee,15;} -2662:18937,{ bonus bInt,8; bonus bHit,10;} +2660:18937,{ bonus bStr,7; bonus bBaseAtk,20;} +2661:18937,{ bonus bAgi,7; bonus bFlee,15;} +2662:18937,{ bonus bDex,7; bonus bHit,10;} 2677:28602,{ bonus2 bVariableCastrate,"PR_MAGNUS",-25; bonus bHealPower,10; bonus bAddItemHealRate,10; autobonus2 "{ bonus bIgnoreMDefRace,RC_All; }",getequiprefinerycnt(EQI_HAND_R)*20,2000,BF_SHORT|BF_NORMAL; /* Confirm: Success rate and duration */ } 2678:2679,{ bonus4 bAutoSpell,"MO_EXTREMITYFIST",1,3,1; bonus3 bAutoSpell,"PR_LEXAETERNA",1,20; bonus3 bAutoSpell,"AS_SONICBLOW",5,50; bonus3 bAutoSpell,"MO_INVESTIGATE",5,20; bonus3 bAutoSpell,"ASC_METEORASSAULT",2,50; } //2679:2792,{ bonus4 bAutoSpell,"MO_EXTREMITYFIST",1,3,1; bonus3 bAutoSpell,"PR_LEXAETERNA",1,20; bonus3 bAutoSpell,"AS_SONICBLOW",5,50; bonus3 bAutoSpell,"MO_INVESTIGATE",5,20; bonus3 bAutoSpell,"ASC_METEORASSAULT",2,50; } @@ -394,7 +394,7 @@ 2913:2408,{ bonus bBaseAtk,getequiprefinerycnt(EQI_SHOES); } 2913:5104,{ bonus bBaseAtk,10; } 2935:2387,{ bonus bMaxHPrate,3; if (getequiprefinerycnt(EQI_ARMOR)>=7) { bonus bMaxSPrate,2; } } -2935:2387:2440,{ bonus bVariableCastrate,-5; bonus bDelayRate,-5; } +2935:2387:2440:2744,{ bonus bVariableCastrate,-5; bonus bDelayRate,-5; } 2935:2440,{ bonus bMaxSPrate,3; if (getequiprefinerycnt(EQI_SHOES)>=7) { bonus bMaxHPrate,2; } } 2935:2744,{ bonus bVariableCastrate,-4; bonus bDelayRate,-4; } 2950:15067:20709:22012,{ bonus2 bExpAddRace,RC_All,30; } @@ -767,9 +767,9 @@ 18933:2268,{ bonus bDelayrate,-5; } 18933:4229,{ bonus bVariableCastrate,-10; } 18937:28302,{ bonus bInt,8; bonus bMaxSPrate,5;} -18937:28303,{ bonus bInt,8; bonus bBaseAtk,20;} -18937:28304,{ bonus bInt,8; bonus bFlee,15;} -18937:28305,{ bonus bInt,8; bonus bHit,10;} +18937:28303,{ bonus bStr,7; bonus bBaseAtk,20;} +18937:28304,{ bonus bAgi,7; bonus bFlee,15;} +18937:28305,{ bonus bDex,7; bonus bHit,10;} 18937:28352,{ bonus bMaxSPrate,5; if (BaseLevel>=20) { bonus bInt,(BaseLevel/20); } } 18937:28353,{ bonus bMaxHPrate,5; if (BaseLevel>=20) { bonus bStr,(BaseLevel/20); } } 18937:28357,{ bonus bAspdRate,5; if (BaseLevel>=20) { bonus bAgi,(BaseLevel/20); } } From 312df0f10cb79d118400edb40485d9bd0f2e7c4f Mon Sep 17 00:00:00 2001 From: Aleos Date: Fri, 24 Apr 2020 13:58:09 -0400 Subject: [PATCH 064/212] Job Improvement Project - Rebellion (#4428) * Fixes #4426. * kRO Changelog: http://ro.gnjoy.com/news/notice/View.asp?BBSMode=10001&seq=7081 Thanks to @Tokeiburu, @OptimusM, @admkakaroto,@cahya1992, @Tolimatoi, and @Badarosk0! --- db/re/item_db.txt | 6 +- db/re/skill_db.yml | 241 ++++++++++++++++++++++++++++--------------- db/re/skill_tree.txt | 20 ++-- src/map/battle.cpp | 34 ++++-- src/map/skill.cpp | 78 +++++--------- src/map/status.cpp | 1 - 6 files changed, 220 insertions(+), 160 deletions(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 815b48215c..00137dec3e 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -5645,9 +5645,9 @@ 7648,Snake_Bookmark,Snake Bookmark,3,20,,10,,,,,,,,,,,,,{},{},{} 7649,Big_Luk_Bookmark,Big Luk Bookmark,3,20,,10,,,,,,,,,,,,,{},{},{} 7651,Mystery_Egg,Mystery Egg,3,10,,10,,,,,,,,,,,,,{},{},{} -7663,Full_Metal_Jacket,Full Metal Jacket,10,200,,2,10,,,,0x41000000,63,2,32768,,1,,3,{},{},{} -7664,Mine_Projectile,Grenade Launcher,10,450,,3,10,,,,0x41000000,63,2,32768,,1,,5,{},{},{} -7665,Dragon_Tail_Missile,Dragon Tail Missile,10,1500,,100,10,,,,0x41000000,63,2,32768,,1,,5,{},{},{} +7663,Full_Metal_Jacket,Full Metal Jacket,3,200,,2,10,,,,,,,,,,,,{},{},{} +7664,Shooting_Mine,Grenade Launcher,3,450,,3,10,,,,,,,,,,,,{},{},{} +7665,Dragon_Tail_Missile,Dragon Tail Missile,3,1500,,100,10,,,,,,,,,,,,{},{},{} 7666,TimeTravel_Scroll,Time Travel Scroll,3,20,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 7667,Abandoned_Machine,Abandoned Machine,3,20,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 7668,Clean_Bandage,Clean Bandage,3,20,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index e993997057..0c028c6c31 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -28491,7 +28491,7 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - Range: -9 + Range: -15 Hit: Single HitCount: 1 Element: Weapon @@ -28523,7 +28523,7 @@ Body: - Id: 2554 Name: RL_BANISHING_BUSTER Description: Banishing Buster - MaxLevel: 5 + MaxLevel: 10 Type: Weapon TargetType: Attack Flags: @@ -28533,31 +28533,32 @@ Body: Hit: Single HitCount: 1 Element: Weapon - CastTime: - - Level: 1 - Time: 3000 - - Level: 2 - Time: 2500 - - Level: 3 - Time: 2000 - - Level: 4 - Time: 1500 - - Level: 5 - Time: 1000 - Cooldown: 2000 - FixedCastTime: 1000 + CastTime: 1000 + AfterCastActDelay: 400 + Cooldown: 1000 + FixedCastTime: 1600 Requires: SpCost: - Level: 1 Amount: 55 - Level: 2 - Amount: 60 + Amount: 57 - Level: 3 - Amount: 65 + Amount: 59 - Level: 4 - Amount: 70 + Amount: 61 - Level: 5 - Amount: 75 + Amount: 63 + - Level: 6 + Amount: 65 + - Level: 7 + Amount: 67 + - Level: 8 + Amount: 69 + - Level: 9 + Amount: 71 + - Level: 10 + Amount: 73 Weapon: Shotgun: true Ammo: @@ -28806,7 +28807,7 @@ Body: TargetType: Attack DamageFlags: NoDamage: true - Range: -9 + Range: -11 Hit: Single HitCount: 1 ActiveInstance: 3 @@ -28825,12 +28826,11 @@ Body: - Id: 2561 Name: RL_FIREDANCE Description: Fire Dance - MaxLevel: 5 + MaxLevel: 10 Type: Weapon TargetType: Self DamageFlags: Splash: true - Range: 5 Hit: Single HitCount: 1 Element: Weapon @@ -28840,27 +28840,47 @@ Body: Requires: SpCost: - Level: 1 - Amount: 12 + Amount: 13 - Level: 2 - Amount: 14 - - Level: 3 Amount: 16 + - Level: 3 + Amount: 19 - Level: 4 - Amount: 18 + Amount: 22 - Level: 5 - Amount: 20 + Amount: 25 + - Level: 6 + Amount: 28 + - Level: 7 + Amount: 31 + - Level: 8 + Amount: 34 + - Level: 9 + Amount: 37 + - Level: 10 + Amount: 40 Weapon: Revolver: true Ammo: Bullet: true - AmmoAmount: 5 + AmmoAmount: 10 - Id: 2562 Name: RL_H_MINE Description: Howling Mine MaxLevel: 5 Type: Weapon TargetType: Attack - Range: -9 + Range: + - Level: 1 + Size: -7 + - Level: 2 + Size: -8 + - Level: 3 + Size: -9 + - Level: 4 + Size: -10 + - Level: 5 + Size: -11 Hit: Single HitCount: 1 Element: Weapon @@ -28896,7 +28916,7 @@ Body: Weapon: Grenade: true ItemCost: - - Item: Mine_Projectile + - Item: Shooting_Mine Amount: 1 - Id: 2563 Name: RL_P_ALTER @@ -28960,12 +28980,11 @@ Body: - Id: 2565 Name: RL_R_TRIP Description: Round Trip - MaxLevel: 5 + MaxLevel: 10 Type: Weapon TargetType: Self DamageFlags: Splash: true - Range: 5 Hit: Single HitCount: 1 Element: Weapon @@ -28975,37 +28994,67 @@ Body: - Level: 2 Area: 3 - Level: 3 - Area: 4 + Area: 3 - Level: 4 - Area: 5 + Area: 4 - Level: 5 + Area: 4 + - Level: 6 + Area: 4 + - Level: 7 + Area: 5 + - Level: 8 + Area: 5 + - Level: 9 + Area: 5 + - Level: 10 Area: 6 Knockback: 3 AfterCastActDelay: 1000 Cooldown: - Level: 1 - Time: 3000 + Time: 2800 - Level: 2 - Time: 2500 + Time: 2600 - Level: 3 - Time: 2000 + Time: 2400 - Level: 4 - Time: 1500 + Time: 2200 - Level: 5 + Time: 2000 + - Level: 6 + Time: 1800 + - Level: 7 + Time: 1600 + - Level: 8 + Time: 1400 + - Level: 9 + Time: 1200 + - Level: 10 Time: 1000 FixedCastTime: -1 Requires: SpCost: - Level: 1 - Amount: 40 + Amount: 43 - Level: 2 - Amount: 45 + Amount: 46 - Level: 3 - Amount: 50 + Amount: 49 - Level: 4 - Amount: 55 + Amount: 52 - Level: 5 - Amount: 60 + Amount: 55 + - Level: 6 + Amount: 58 + - Level: 7 + Amount: 61 + - Level: 8 + Amount: 64 + - Level: 9 + Amount: 67 + - Level: 10 + Amount: 70 Weapon: Gatling: true Ammo: @@ -29014,16 +29063,16 @@ Body: - Id: 2566 Name: RL_D_TAIL Description: Dragon Tail - MaxLevel: 5 + MaxLevel: 10 Type: Weapon - TargetType: Self + TargetType: Attack DamageFlags: IgnoreElement: true IgnoreDefense: true - Range: 5 + Range: 11 Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 1 CastTime: - Level: 1 Time: 1200 @@ -29035,26 +29084,43 @@ Body: Time: 1800 - Level: 5 Time: 2000 - AfterCastActDelay: 2000 - Cooldown: 5000 + - Level: 6 + Time: 2200 + - Level: 7 + Time: 2400 + - Level: 8 + Time: 2600 + - Level: 9 + Time: 2800 + - Level: 10 + Time: 3000 + AfterCastActDelay: 1000 + Cooldown: 3500 FixedCastTime: -1 Requires: SpCost: - Level: 1 - Amount: 60 + Amount: 55 - Level: 2 - Amount: 70 + Amount: 60 - Level: 3 - Amount: 80 + Amount: 65 - Level: 4 - Amount: 90 + Amount: 70 - Level: 5 + Amount: 75 + - Level: 6 + Amount: 80 + - Level: 7 + Amount: 85 + - Level: 8 + Amount: 90 + - Level: 9 + Amount: 95 + - Level: 10 Amount: 100 Weapon: Grenade: true - Ammo: - Grenade: true - AmmoAmount: 1 ItemCost: - Item: Dragon_Tail_Missile Amount: 1 @@ -29066,7 +29132,7 @@ Body: TargetType: Ground DamageFlags: Splash: true - Range: 2 + Range: 3 Hit: Single HitCount: 1 Element: Weapon @@ -29124,7 +29190,7 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - Range: -9 + Range: -15 Hit: Single HitCount: 1 Element: Weapon @@ -29202,50 +29268,59 @@ Body: - Id: 2571 Name: RL_HAMMER_OF_GOD Description: Hammer of God - MaxLevel: 5 + MaxLevel: 10 Type: Weapon TargetType: Attack DamageFlags: Splash: true - Range: - - Level: 1 - Size: 7 - - Level: 2 - Size: 8 - - Level: 3 - Size: 9 - - Level: 4 - Size: 10 - - Level: 5 - Size: 11 + Range: 11 Hit: Single HitCount: 1 - SplashArea: 2 - AfterCastActDelay: 2000 - Duration2: + SplashArea: - Level: 1 - Time: 3000 + Area: 2 - Level: 2 - Time: 3000 + Area: 2 - Level: 3 - Time: 4000 + Area: 2 - Level: 4 - Time: 4000 + Area: 2 - Level: 5 - Time: 5000 - Cooldown: 30000 + Area: 2 + - Level: 6 + Area: 3 + - Level: 7 + Area: 3 + - Level: 8 + Area: 3 + - Level: 9 + Area: 3 + - Level: 10 + Area: 3 + AfterCastActDelay: 500 + Cooldown: 20000 FixedCastTime: -1 Requires: SpCost: - Level: 1 - Amount: 35 + Amount: 37 - Level: 2 - Amount: 40 + Amount: 39 - Level: 3 - Amount: 45 + Amount: 41 - Level: 4 - Amount: 50 + Amount: 43 - Level: 5 + Amount: 45 + - Level: 6 + Amount: 47 + - Level: 7 + Amount: 49 + - Level: 8 + Amount: 51 + - Level: 9 + Amount: 53 + - Level: 10 Amount: 55 Weapon: Rifle: true diff --git a/db/re/skill_tree.txt b/db/re/skill_tree.txt index a75eb1237d..f8aae0d36d 100644 --- a/db/re/skill_tree.txt +++ b/db/re/skill_tree.txt @@ -5692,24 +5692,24 @@ 4215,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# 4215,2552,1,500,5,0,0,0,0,0,0,0,0 //RL_RICHS_COIN#Rich's Coin# 4215,2553,5,514,1,0,0,0,0,0,0,0,0 //RL_MASS_SPIRAL#Mass Spiral# -4215,2554,5,2557,1,0,0,0,0,0,0,0,0 //RL_BANISHING_BUSTER#Banishing Buster# +4215,2554,10,2557,1,0,0,0,0,0,0,0,0 //RL_BANISHING_BUSTER#Banishing Buster# 4215,2555,5,2556,1,0,0,0,0,0,0,0,0 //RL_B_TRAP#Bind Trap# 4215,2556,1,500,1,0,0,0,0,0,0,0,0 //RL_FLICKER#Flicker# 4215,2557,5,513,1,518,1,0,0,0,0,0,0 //RL_S_STORM#Shatter Storm# 4215,2558,10,500,1,511,10,0,0,0,0,0,0 //RL_E_CHAIN#Eternal Chain# 4215,2559,1,511,1,0,0,0,0,0,0,0,0 //RL_QD_SHOT#Quick Draw Shot# 4215,2560,1,500,1,0,0,0,0,0,0,0,0 //RL_C_MARKER#Crimson Marker# -4215,2561,5,516,1,0,0,0,0,0,0,0,0 //RL_FIREDANCE#Fire Dance# +4215,2561,10,516,1,0,0,0,0,0,0,0,0 //RL_FIREDANCE#Fire Dance# 4215,2562,5,521,1,0,0,0,0,0,0,0,0 //RL_H_MINE#Howling Mine# 4215,2563,5,2552,1,0,0,0,0,0,0,0,0 //RL_P_ALTER#Platinum Alter# 4215,2564,1,516,10,0,0,0,0,0,0,0,0 //RL_FALLEN_ANGEL#Fallen Angel# -4215,2565,5,2567,1,0,0,0,0,0,0,0,0 //RL_R_TRIP#Round Trip# -4215,2566,5,2560,1,2562,3,0,0,0,0,0,0 //RL_D_TAIL#Dragon Tail# +4215,2565,10,2567,1,0,0,0,0,0,0,0,0 //RL_R_TRIP#Round Trip# +4215,2566,10,2560,1,2562,3,0,0,0,0,0,0 //RL_D_TAIL#Dragon Tail# 4215,2567,5,517,1,0,0,0,0,0,0,0,0 //RL_FIRE_RAIN#Fire Rain# 4215,2568,5,2552,1,0,0,0,0,0,0,0,0 //RL_HEAT_BARREL#Heat Barrel# 4215,2569,5,2553,1,0,0,0,0,0,0,0,0 //RL_AM_BLAST#Anti-Material Blast# 4215,2570,5,2554,3,0,0,0,0,0,0,0,0 //RL_SLUGSHOT#Slug Shot# -4215,2571,5,2552,1,2569,3,0,0,0,0,0,0 //RL_HAMMER_OF_GOD#Hammer of God# +4215,2571,10,2552,1,2569,3,0,0,0,0,0,0 //RL_HAMMER_OF_GOD#Hammer of God# //Summoner 4218,5018,1,0,0,0,0,0,0,0,0,0,0 //SU_BASIC_SKILL## 4218,5019,1,5018,1,0,0,0,0,0,0,0,0 //SU_BITE## @@ -6094,24 +6094,24 @@ 4229,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# 4229,2552,1,500,5,0,0,0,0,0,0,0,0 //RL_RICHS_COIN#Rich's Coin# 4229,2553,5,514,1,0,0,0,0,0,0,0,0 //RL_MASS_SPIRAL#Mass Spiral# -4229,2554,5,2557,1,0,0,0,0,0,0,0,0 //RL_BANISHING_BUSTER#Banishing Buster# +4229,2554,10,2557,1,0,0,0,0,0,0,0,0 //RL_BANISHING_BUSTER#Banishing Buster# 4229,2555,5,0,0,0,0,0,0,0,0,0,0 //RL_B_TRAP#Bind Trap# 4229,2556,1,501,1,0,0,0,0,0,0,0,0 //RL_FLICKER#Flicker# 4229,2557,5,513,1,518,1,0,0,0,0,0,0 //RL_S_STORM#Shatter Storm# 4229,2558,10,511,10,0,0,0,0,0,0,0,0 //RL_E_CHAIN#Eternal Chain# 4229,2559,1,2558,1,0,0,0,0,0,0,0,0 //RL_QD_SHOT#Quick Draw Shot# 4229,2560,1,506,1,0,0,0,0,0,0,0,0 //RL_C_MARKER#Crimson Marker# -4229,2561,5,2564,1,0,0,0,0,0,0,0,0 //RL_FIREDANCE#Fire Dance# +4229,2561,10,2564,1,0,0,0,0,0,0,0,0 //RL_FIREDANCE#Fire Dance# 4229,2562,5,520,1,0,0,0,0,0,0,0,0 //RL_H_MINE#Howling Mine# 4229,2563,5,0,0,0,0,0,0,0,0,0,0 //RL_P_ALTER#Platinum Alter# 4229,2564,5,516,10,0,0,0,0,0,0,0,0 //RL_FALLEN_ANGEL#Fallen Angel# -4229,2565,5,2567,1,0,0,0,0,0,0,0,0 //RL_R_TRIP#Round Trip# -4229,2566,5,2560,1,2562,3,0,0,0,0,0,0 //RL_D_TAIL#Dragon Tail# +4229,2565,10,2567,1,0,0,0,0,0,0,0,0 //RL_R_TRIP#Round Trip# +4229,2566,10,2560,1,2562,3,0,0,0,0,0,0 //RL_D_TAIL#Dragon Tail# 4229,2567,5,517,1,0,0,0,0,0,0,0,0 //RL_FIRE_RAIN#Fire Rain# 4229,2568,5,2561,2,0,0,0,0,0,0,0,0 //RL_HEAT_BARREL#Heat Barrel# 4229,2569,5,2553,1,0,0,0,0,0,0,0,0 //RL_AM_BLAST#Anti-Material Blast# 4229,2570,5,2554,3,0,0,0,0,0,0,0,0 //RL_SLUGSHOT#Slug Shot# -4229,2571,5,2569,3,0,0,0,0,0,0,0,0 //RL_HAMMER_OF_GOD#Hammer of God# +4229,2571,10,2569,3,0,0,0,0,0,0,0,0 //RL_HAMMER_OF_GOD#Hammer of God# 4229,5065,1,0,0,0,0,0,0,0,0,0,0 //WE_CHEERUP#Cheer Up# //Baby Star Gladiator (Union) 4238,1,9,0,0,0,0,0,0,0,0,0,0 //NV_BASIC#Basic Skill# diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 91f492bed9..7aec469987 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -4517,11 +4517,13 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + 200 * skill_lv; break; case RL_FIREDANCE: - skillratio += -100 + 200 * skill_lv; - skillratio += (sd ? pc_checkskill(sd, GS_DESPERADO) * 50 : 0); + skillratio += 100 + 100 * skill_lv; + skillratio += (sd ? pc_checkskill(sd, GS_DESPERADO) * 20 : 0); + RE_LVL_DMOD(100); break; case RL_BANISHING_BUSTER: - skillratio += -100 + 2000 + 300 * skill_lv; + skillratio += -100 + 1000 + 200 * skill_lv; + RE_LVL_DMOD(100); break; case RL_S_STORM: skillratio += -100 + 1700 + 200 * skill_lv; @@ -4534,10 +4536,14 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio *= 2 + tstatus->size; break; case RL_D_TAIL: - skillratio += -100 + 4000 + 1000 * skill_lv; + skillratio += -100 + 500 + 200 * skill_lv; + if (sd && (wd->miscflag & 8)) + skillratio *= 2; + RE_LVL_DMOD(100); break; case RL_R_TRIP: - skillratio += -100 + 1000 + 300 * skill_lv; + skillratio += -100 + 350 * skill_lv; + RE_LVL_DMOD(100); break; case RL_R_TRIP_PLUSATK: skillratio += -100 + 300 + 300 * skill_lv; @@ -4549,13 +4555,14 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + 200 + 200 * skill_lv; break; case RL_HAMMER_OF_GOD: - skillratio += -100 + 2800 + 1400 * skill_lv; + skillratio += -100 + 100 * skill_lv; if (sd) { - if (tsc && tsc->data[SC_C_MARKER]) - skillratio += 100 * sd->spiritball_old; - else if (sd->spiritball_old) - skillratio += 10 * sd->spiritball_old; + if (wd->miscflag & 8) + skillratio += 400 * sd->spiritball_old; + else + skillratio += 150 * sd->spiritball_old; } + RE_LVL_DMOD(100); break; case RL_FIRE_RAIN: case RL_AM_BLAST: @@ -7490,7 +7497,12 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } break; case W_GRENADE: - if (sd->inventory_data[index]->look != A_GRENADE) { + if (sd->inventory_data[index]->look != +#ifdef RENEWAL + A_BULLET) { +#else + A_GRENADE) { +#endif clif_skill_fail(sd,0,USESKILL_FAIL_NEED_MORE_BULLET,0); return ATK_NONE; } diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 28a9a3f175..de4943197a 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -1947,7 +1947,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if (status_isimmune(bl)) break; - if ((dstsd && (dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) || rnd()%100 >= 50 + 10 * skill_lv) { + if ((dstsd && (dstsd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER) || rnd()%100 >= 50 + 5 * skill_lv) { if (sd) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); break; @@ -2060,9 +2060,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case RL_AM_BLAST: sc_start(src,bl,SC_ANTI_M_BLAST,20 + 10 * skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv)); break; - case RL_HAMMER_OF_GOD: - sc_start(src,bl,SC_STUN,100,skill_lv,skill_get_time2(skill_id,skill_lv)); - break; case SU_SCRATCH: sc_start2(src, bl, SC_BLEEDING, skill_lv * 10 + 70, skill_lv, src->id, skill_get_time(skill_id, skill_lv)); break; @@ -4157,16 +4154,6 @@ int skill_area_sub_count (struct block_list *src, struct block_list *target, uin return 1; } } - case RL_D_TAIL: - if (src->type != BL_PC) - return 0; - { - struct status_change *tsc = status_get_sc(target); - // Only counts marked target with SC_C_MARKER - if (!tsc || !tsc->data[SC_C_MARKER]) - return 0; - } - break; } return 1; } @@ -5154,7 +5141,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case RL_FIREDANCE: case RL_S_STORM: case RL_R_TRIP: - case RL_HAMMER_OF_GOD: case MH_XENO_SLASHER: case NC_ARMSCANNON: case SU_SCRATCH: @@ -6222,11 +6208,31 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case RL_QD_SHOT: - case RL_D_TAIL: - if (!sd || (tsc && tsc->data[SC_C_MARKER])) { - if (skill_id == RL_QD_SHOT && skill_area_temp[1] == bl->id ) - break; + if (skill_area_temp[1] == bl->id) + break; + if (flag&1 && tsc && tsc->data[SC_C_MARKER]) skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|SD_ANIMATION); + break; + case RL_D_TAIL: + case RL_HAMMER_OF_GOD: + if (flag&1) + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|SD_ANIMATION); + else { + if (sd && tsc && tsc->data[SC_C_MARKER]) { + int i; + + ARR_FIND(0, MAX_SKILL_CRIMSON_MARKER, i, sd->c_marker[i] == bl->id); + + if (i < MAX_SKILL_CRIMSON_MARKER) + flag |= 8; + } + + if (skill_id == RL_HAMMER_OF_GOD) + clif_skill_poseffect(src, skill_id, 1, bl->x, bl->y, gettick()); + else + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + + map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); } break; @@ -11401,9 +11407,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); } break; - case RL_D_TAIL: - map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); - break; case RL_QD_SHOT: if (sd) { skill_area_temp[1] = bl->id; @@ -11709,20 +11712,6 @@ static int8 skill_castend_id_check(struct block_list *src, struct block_list *ta return USESKILL_FAIL_MAX; } break; - case RL_D_TAIL: - if (src) { - int count = 0; - - if (battle_config.skill_wall_check) - count = map_foreachinshootrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, gettick(), BCT_ENEMY, skill_area_sub_count); - else - count = map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, gettick(), BCT_ENEMY, skill_area_sub_count); - - if (!count) { - return USESKILL_FAIL_LEVEL; - } - } - break; } if (inf&INF_ATTACK_SKILL || @@ -11881,22 +11870,6 @@ TIMER_FUNC(skill_castend_id){ ud->skilly = target->y; ud->skilltimer = tid; return skill_castend_pos(tid,tick,id,data); - case RL_HAMMER_OF_GOD: - if ((sc = status_get_sc(target)) && sc->data[SC_C_MARKER]) { - ud->skillx = target->x; - ud->skilly = target->y; - } else { - int splash = skill_get_splash(ud->skill_id, ud->skill_lv); // !TODO: What's the random AoE size? - - ud->skillx = target->x + splash; - ud->skilly = target->y + splash; - if (!map_random_dir(target, &ud->skillx, &ud->skilly)) { - ud->skillx = target->x; - ud->skilly = target->y; - } - } - ud->skilltimer = tid; - return skill_castend_pos(tid,tick,id,data); } // Failing @@ -16658,6 +16631,7 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, #ifdef RENEWAL switch(skill_id) { // 2016-10-26 kRO update made these skills require an extra ammo to cast case WM_SEVERE_RAINSTORM: + case RL_FIREDANCE: case RL_R_TRIP: case RL_FIRE_RAIN: extra_ammo = 1; diff --git a/src/map/status.cpp b/src/map/status.cpp index d473bfeeea..b5b13e1d1f 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -1017,7 +1017,6 @@ void initChangeTables(void) /* Rebellion */ add_sc( RL_MASS_SPIRAL , SC_BLEEDING ); - add_sc( RL_HAMMER_OF_GOD , SC_STUN ); set_sc( RL_H_MINE , SC_H_MINE , EFST_H_MINE , SCB_NONE); set_sc( RL_B_TRAP , SC_B_TRAP , EFST_B_TRAP , SCB_SPEED ); set_sc( RL_E_CHAIN , SC_E_CHAIN , EFST_E_CHAIN , SCB_NONE ); From 05ebde0198380c100c92b7873c86ee93b811032d Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Fri, 24 Apr 2020 19:58:19 +0200 Subject: [PATCH 065/212] SQL synchronization --- sql-files/item_db_re.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 5e3144954d..783a465931 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -5677,9 +5677,9 @@ REPLACE INTO `item_db_re` VALUES (7647,'Taiwan_Luk_Coin','Taiwan Luk Coin',3,0,N REPLACE INTO `item_db_re` VALUES (7648,'Snake_Bookmark','Snake Bookmark',3,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (7649,'Big_Luk_Bookmark','Big Luk Bookmark',3,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (7651,'Mystery_Egg','Mystery Egg',3,10,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (7663,'Full_Metal_Jacket','Full Metal Jacket',10,200,NULL,2,'10',NULL,NULL,NULL,0x41000000,63,2,32768,NULL,'1',NULL,3,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (7664,'Mine_Projectile','Grenade Launcher',10,450,NULL,3,'10',NULL,NULL,NULL,0x41000000,63,2,32768,NULL,'1',NULL,5,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (7665,'Dragon_Tail_Missile','Dragon Tail Missile',10,1500,NULL,100,'10',NULL,NULL,NULL,0x41000000,63,2,32768,NULL,'1',NULL,5,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (7663,'Full_Metal_Jacket','Full Metal Jacket',3,200,NULL,2,'10',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (7664,'Shooting_Mine','Grenade Launcher',3,450,NULL,3,'10',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (7665,'Dragon_Tail_Missile','Dragon Tail Missile',3,1500,NULL,100,'10',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (7666,'TimeTravel_Scroll','Time Travel Scroll',3,20,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (7667,'Abandoned_Machine','Abandoned Machine',3,20,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (7668,'Clean_Bandage','Clean Bandage',3,20,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); From 935c08cc8ed7e991ba7bf4c16b110d28a1424300 Mon Sep 17 00:00:00 2001 From: Kanin Temsrisuk Date: Sun, 26 Apr 2020 21:52:10 +0700 Subject: [PATCH 066/212] Corrected up item_db (#4829) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Corrected up item_db and item_combo_db Thanks to 🅺🅸🅽🅶🅰🆁🆃🅴🆁 --- db/re/item_combo_db.txt | 5 ++- db/re/item_db.txt | 70 +++++++++++++++++++++-------------------- 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/db/re/item_combo_db.txt b/db/re/item_combo_db.txt index 74f5c4271b..0ef4d3a414 100644 --- a/db/re/item_combo_db.txt +++ b/db/re/item_combo_db.txt @@ -656,6 +656,8 @@ 5967:28321,{ bonus2 bSubSkill,"HT_BLITZBEAT",200; } 5918:19306,{ .@aspd = 1; .@crit_dmg = 2 + 2 * (readparam(bDex) / 10); .@sub_demi = 2; .@luk = readparam(bLuk); if (.@luk > 107) { .@aspd += 1; .@crit_dmg += 2; .@sub_demi += 2; } if (.@luk > 119) { .@aspd += 2; .@crit_dmg += 4; .@sub_demi += 4; bonus bSplashRange,1; } bonus bAspd,.@aspd; bonus bCritAtkRate,.@crit_dmg; bonus2 bSubRace,RC_DemiHuman,.@sub_demi; bonus2 bSubSkill,"NPC_CRITICALSLASH",100; } //9024:18832,{ bonus3 bAutoSpell,"BS_ADRENALINE",2,(GetPetRelationship >= 3)?15:10; } +1298:4317,{ bonus bCritAtkRate,5; } +1298:4521,{ bonus bCritAtkRate,5; } 13027:15044,{ .@r = max(getequiprefinerycnt(EQI_ARMOR),1); bonus3 bAddMonsterDropItem,929,RC_DemiHuman,70*.@r; bonus3 bAddMonsterDropItem,970,RC_DemiHuman,50*.@r; bonus3 bAddMonsterDropItem,929,RC_Brute,70*.@r; bonus3 bAddMonsterDropItem,970,RC_Brute,50*.@r; } 13034:13035,{ bonus bMaxSP,20; bonus bMaxHPRate,5; bonus bHit,10; bonus2 bAddSize,Size_Large,30; autobonus "{ bonus bAspdRate,100; }",1,7000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; } 13215:28224,{ bonus bLongAtkRate,30; } @@ -1266,4 +1268,5 @@ 32222:15093,{ .@r = getequiprefinerycnt(EQI_ARMOR); bonus5 bAutoSpell,"AL_HEAL",10,-(50+.@r),BF_SHORT,0; bonus5 bAutoSpell,"WZ_STORMGUST",10,-(50+.@r),BF_SHORT,1; bonus2 bSkillAtk,"RK_STORMBLAST",5*.@r; bonus2 bSkillAtk,"LG_BANISHINGPOINT",5*.@r; } 32222:15095,{ .@r = getequiprefinerycnt(EQI_ARMOR); bonus5 bAutoSpell,"PR_KYRIE",10,-(50+.@r),BF_SHORT,0; bonus2 bSkillAtk,"AB_JUDEX",5*.@r; bonus2 bSkillAtk,"AB_ADORAMUS",5*.@r; bonus2 bSkillAtk,"SR_DRAGONCOMBO",5*.@r; bonus2 bSkillAtk,"SR_SKYNETBLOW",5*.@r; bonus2 bSkillAtk,"SR_EARTHSHAKER",5*.@r; } 32222:15096,{ .@r = getequiprefinerycnt(EQI_ARMOR); bonus bAllStats,2*.@r; bonus3 bAddEff,Eff_Stun,.@r*50,ATF_SHORT; bonus3 bAddEff,Eff_Curse,.@r*50,ATF_SHORT; bonus3 bAddEff,Eff_Poison,.@r*50,ATF_SHORT; bonus3 bAddEff,Eff_Silence,.@r*50,ATF_SHORT; /* Unknow rates */ } -32238:32239,{ bonus bVariableCastrate,-10; bonus bMatkRate,10; } +32238:32239,{ bonus bVariableCastrate,-10; bonus bMatkRate,10; } +1336:15388:15389,{ .@r = getequiprefinerycnt(EQI_HAND_R) + getequiprefinerycnt(EQI_ARMOR) + getequiprefinerycnt(EQI_GARMENT); bonus bBaseAtk,30; autobonus "{ bonus bLongAtkRate,10; }",10,10000,BF_WEAPON; if(.@r >= 30){ bonus2 bAddRace,RC_Undead,20; bonus2 bAddRace,RC_Angel,20; } } diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 00137dec3e..52f1979baf 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -486,7 +486,7 @@ 1129,Flamberge,Flamberge,5,60000,,1500,150,,1,0,0x00004080,63,2,2,3,27,1,2,{},{},{} 1130,Nagan,Nagan,5,20,,500,120,,1,0,0x000654E2,63,2,2,4,40,1,2,{ skill "TF_DOUBLE",5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; bonus2 bAddRace,RC_Player,5; },{},{} 1131,Ice_Falchon,Ice Falchion,5,20,,600,100,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; bonus2 bAddEff2,Eff_Freeze,10; skill "MG_COLDBOLT",3; bonus3 bAutoSpell,"MG_COLDBOLT",3,100; },{},{} -1132,Edge,Edge,5,20,,700,115,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus2 bAddEff,Eff_Curse,30; bonus2 bComaClass,Class_Normal,10; },{},{} +1132,Edge,Edge,5,20,,700,115,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus2 bAddEff,Eff_Curse,30; bonus2 bComaClass,Class_All,10; },{},{} 1133,Fire_Brand,Fireblend,5,20,,500,100,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Fire; skill "MG_FIREBOLT",3; bonus3 bAutoSpell,"MG_FIREBOLT",3,100; },{},{} 1134,Scissores_Sword,Caesar's Sword,5,20,,700,140,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus2 bAddRace,RC_Plant,25; bonus bIgnoreDefRace,RC_Plant; },{},{} 1135,Cutlas,Cutlus,5,20,,900,150,,1,0,0x000654E2,63,2,2,4,40,1,2,{ skill "SM_BASH",5; bonus bStr,2; bonus bDef,1; },{},{} @@ -495,7 +495,7 @@ 1138,Mysteltainn_,Mysteltainn,5,20,,1000,170,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEle,Ele_Ghost,15; bonus3 bAutoSpell,"MG_STONECURSE",3,100; bonus2 bAddEff,Eff_Stone,10; bonus bDex,3; },{},{} 1139,Tale_Fing_,Tirfing,5,20,,1000,200,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Dark; bonus2 bHPLossRate,35,10000; },{},{} 1140,Byeorrun_Gum,Byeollungum,5,20,,900,150,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus2 bSubClass,Class_Normal,-10; bonus2 bAddClass,Class_Boss,50; bonus bAllStats,2; },{},{} -1141,Immaterial_Sword,Immaterial Sword,5,20,,900,140,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Ghost; bonus3 bSPVanishRate,30,30,BF_WEAPON|BF_MAGIC|BF_MISC; bonus bSPDrainValue,-1; bonus bUnbreakableWeapon; },{},{} +1141,Immaterial_Sword,Immaterial Sword,5,20,,900,140,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Ghost; bonus3 bSPVanishRate,3,30,BF_WEAPON; bonus bSPDrainValue,-1; bonus bUnbreakableWeapon; },{},{} 1142,Jewel_Sword,Jeweled Sword,5,20,,2200,104,,1,0,0x000654E2,63,2,2,3,68,1,2,{ bonus2 bAddMonsterDropItemGroup,IG_Jewel,100; },{},{} 1143,Gaia_Sword,Gaia Sword,5,20,,2500,140,,1,0,0x000654E2,63,2,2,3,74,1,2,{ bonus2 bAddMonsterDropItemGroup,IG_Ore,30; },{},{} 1144,Sasimi,Sashimi,5,20,,1400,75,,1,0,0x000654E2,63,2,2,3,48,1,2,{ bonus bAtkEle,Ele_Wind; bonus3 bAddMonsterDropItem,544,RC_Fish,4000; },{},{} @@ -517,11 +517,11 @@ 1158,Two_Hand_Sword_,Two-Handed Sword,5,60000,,2200,160,,1,2,0x00004082,63,2,34,3,33,1,3,{},{},{} 1159,Two_Hand_Sword__,Two-Handed Sword,5,60000,,2200,160,,1,0,0x00004082,63,2,34,3,33,1,3,{},{},{} 1160,Broad_Sword,Broad Sword,5,65000,,2000,140,,1,1,0x00004082,63,2,34,3,33,1,3,{ bonus bDef,5; bonus bUnbreakableWeapon; },{},{} -1161,Balmung,Balmung,5,20,,1000,250,,1,0,0xFFFFFFFF,63,2,34,4,48,1,3,{ bonus bUnbreakableWeapon; bonus bAtkEle,Ele_Holy; },{},{} +1161,Balmung,Balmung,5,20,,1000,250,,1,0,0xFFFFFFFF,63,2,34,4,48,1,3,{ bonus bInt,20; bonus bLuk,20; },{},{} 1162,Broad_Sword_,Broad Sword,5,65000,,2000,140,,1,2,0x00004082,63,2,34,3,33,1,3,{ bonus bDef,5; bonus bUnbreakableWeapon; },{},{} 1163,Claymore,Claymore,5,74000,,2500,180,,1,0,0x00004080,63,2,34,3,33,1,3,{},{},{} 1164,Muramasa,Muramasa,5,20,,1000,155,,1,0,0x00004082,63,2,34,4,48,1,3,{ bonus bCritical,30; bonus bAspdRate,8; bonus2 bAddEff2,Eff_Curse,10; },{},{} -1165,Masamune,Masamune,5,20,,1000,200,,1,0,0x00004082,63,2,34,4,48,1,3,{ bonus bFlee,30; bonus bStr,-5; bonus bAspd,2; bonus bDefRate,-67; bonus bDef2Rate,-67; },{},{} +1165,Masamune,Masamune,5,20,,1000,200,,1,0,0x00004082,63,2,34,4,48,1,3,{ bonus bFlee,30; bonus bStr,-5; bonus bAspd,2; bonus bDefRate,-66; bonus bDef2Rate,-66; },{},{} 1166,Dragon_Slayer,Dragon Slayer,5,20,,1300,150,,1,0,0x00004082,63,2,34,4,48,1,3,{ bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Dragon,15; },{},{} 1167,Schweizersabel,Schweizersabel,5,20,,1600,160,,1,0,0x00004082,63,2,34,4,48,1,3,{ bonus bAtkEle,Ele_Wind; bonus bDef,1; bonus3 bAutoSpell,"MG_LIGHTNINGBOLT",3,100; },{},{} 1168,Zweihander,Zweihander,5,20,,2200,200,,1,0,0x00004082,63,2,34,4,48,1,3,{ bonus bUnbreakableWeapon; },{},{} @@ -537,7 +537,7 @@ 1178,Schweizersabel_,Schweizersabel,5,20,,1600,160,,1,2,0x00004082,63,2,34,4,48,1,3,{ bonus bAtkEle,Ele_Wind; bonus bDef,1; bonus3 bAutoSpell,"MG_LIGHTNINGBOLT",3,100; },{},{} 1179,Executioner__,Executioner,5,20,,2200,155,,1,1,0x00004082,63,2,34,4,48,1,3,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus bIgnoreDefRace,RC_Player; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bAddRace,RC_Player,20; bonus2 bSubRace,RC_DemiHuman,-10; bonus2 bSubRace,RC_Player,-10; bonus bAtkEle,Ele_Dark; },{},{} 1180,Dragon_Slayer_,Dragon Slayer,5,20,,1300,150,,1,2,0x00004082,63,2,34,4,48,1,3,{ bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Dragon,15; },{},{} -1181,Tae_Goo_Lyeon,Tae Goo Lyeon,5,20,,2000,250,,1,2,0x00004082,18,2,34,4,90,1,3,{ bonus bFlee2,10; if(JobLevel>=70) autobonus "{ bonus bBaseAtk,50; }",10,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; if(getrefine()>8) { bonus bVariableCastrate,-20; bonus bDelayRate,-20; } },{},{} +1181,Tae_Goo_Lyeon,Tae Goo Lyeon,5,20,,2000,250,,1,2,0x00004082,18,2,34,4,90,1,3,{ bonus bFlee2,10; if(JobLevel>=70 || (eaclass()&EAJL_THIRD && JobLevel>=50)) autobonus "{ bonus bBaseAtk,50; }",10,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; if(getrefine()>8) { bonus bDelayRate,-20; bonus bUseSPrate,-20; } },{},{} 1182,Bloody_Eater,Bloody Eater,5,20,,1200,200,,1,2,0x00004082,18,2,34,4,50,1,3,{ bonus bAtkEle,Ele_Ghost; autobonus "{ bonus bCritical,100; bonus bBaseAtk,50; }",1,5000,0,"{ specialeffect2 EF_FIRESPLASHHIT; }"; bonus bHPGainValue,100; },{},{} 1183,BF_Two_Handed_Sword1,Brave Assaulter's Katzbalger,5,20,,0,200,,1,0,0x00004082,63,2,34,3,80,1,3,{ bonus bStr,2; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bAddRace,RC_Player,55; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon; },{},{} 1184,BF_Two_Handed_Sword2,Valorous Assaulter's Katzbalger,5,20,,0,200,,1,0,0x00004082,63,2,34,3,80,1,3,{ bonus bCritical,20; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bAddRace,RC_Player,55; bonus bCritAtkRate,20; bonus bUnbreakableWeapon; },{},{} @@ -547,14 +547,14 @@ 1188,Veteran_Sword,Veteran Sword,5,10000,,2000,180,,1,1,0x00004082,63,2,34,4,80,1,3,{ if(getskilllv("SM_BASH")==10) { bonus2 bSkillAtk,"SM_BASH",50; } if(getskilllv("KN_BOWLINGBASH")==10) { bonus2 bSkillAtk,"KN_BOWLINGBASH",50; } bonus bStr,1; bonus bDex,1; },{},{} 1189,Krasnaya,Krasnaya,5,20,,3800,200,,2,3,0x00004082,18,2,34,2,50,1,3,{ if(readparam(bStr)>=95) { bonus bBaseAtk,20; } },{},{} 1190,Claymore_C,Claymore,5,0,,0,220,,1,0,0x00004080,63,2,34,3,1,0,3,{ bonus2 bAddSize,Size_All,40; },{},{} -1191,Alca_Bringer,Alca Bringer,5,20,,3400,280,,2,0,0x00004082,63,2,34,3,100,1,3,{ bonus bAspd,(getrefine()/2); },{},{} +1191,Alca_Bringer,Alca Bringer,5,20,,3400,280,,2,0,0x00000080,56,2,34,3,100,1,3,{ bonus bAspd,(getrefine()/2); },{},{} 1192,P_Slayer1,Eden Slayer I,5,0,,0,162,,1,0,0x00004082,63,2,34,2,26,0,3,{},{},{} 1193,P_Slayer2,Eden Slayer II,5,0,,0,185,,1,0,0x00004082,63,2,34,2,40,0,3,{},{},{} -1194,F_Executioner_C,Executioner,5,2,,0,190,,1,0,0x00004082,63,2,34,4,0,0,3,{ bonus bAtkEle,Ele_Dark; },{},{} +1194,F_Executioner_C,Executioner,5,2,,0,190,,1,0,0x00004082,63,2,34,4,0,0,3,{ bonus bAtkEle,Ele_Dark; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bSubRace,RC_DemiHuman,-10; bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bAddRace,RC_Player,20; bonus2 bSubRace,RC_Player,-10; bonus bIgnoreDefRace,RC_Player; },{},{} 1195,E_Executioner_C,Executioner,5,2,,0,190,,1,0,0x00004082,63,2,34,4,0,0,3,{ bonus bAtkEle,Ele_Dark; },{},{} 1196,Chrome_Twohand_Sword,Chrome Two-Handed Sword,5,20,,400,280,,1,0,0x00004082,63,2,34,3,110,1,3,{ bonus bUnbreakableWeapon; bonus bAgi,3; bonus bMaxHPrate,-10; },{},{} 1197,P_Slayer3,Eden Slayer III,5,0,,0,200,,1,0,0x00004082,63,2,34,3,60,0,3,{},{},{} -1198,Hairtail,Cutlass,5,0,,0,220,,3,0,0x00004082,63,2,34,1,50,0,3,{ bonus bUnbreakableWeapon; bonus bCritical,20; bonus bCritAtkRate,50; if(BaseLevel>99) { bonus bBaseAtk,50; } },{},{} +1198,Hairtail,Cutlass,5,0,,0,220,,3,0,0x00004082,63,2,34,1,50,0,3,{ bonus bCritical,20; bonus bCritAtkRate,50; bonus2 bAddEff,Eff_Crystalize,30; if(BaseLevel>99) { bonus bBaseAtk,50; } },{},{} 1199,Ebony_Toe_Nail,Ebony Toe Nail,5,56000,,1000,250:150,,1,0,0x00004082,63,2,34,4,120,1,3,{},{},{} //=================================================================== // Daggers @@ -602,7 +602,7 @@ 1241,Cursed_Dagger,Cursed Dagger,5,80000,,400,55,,1,0,0x00810204,63,2,2,4,85,1,1,{ bonus2 bAddEff,Eff_Curse,5000; },{},{} 1242,Counter_Dagger,Dagger of Counter,5,120000,,550,140,,1,0,0x00810204,63,2,2,4,55,1,1,{ bonus bCritical,90; },{},{} 1243,Novice_Knife,Novice Main-Gauche,5,0,,1,45,,1,0,0x00000001,63,2,2,1,1,0,1,{},{},{} -1244,Holy_Dagger,Holy Dagger,5,20,,800,100,,1,0,0x02021040,63,2,2,4,55,1,1,{ bonus bAtkEle,Ele_Holy; bonus bDex,1; },{},{} +1244,Holy_Dagger,Holy Dagger,5,20,,800,100,,1,0,0x02021040,63,2,2,4,55,1,1,{ bonus bAtkEle,Ele_Holy; bonus2 bAddRace,RC_Demon,5; },{},{} 1245,Cinquedea,Cinquedea,5,40000,,700,110,,1,1,0x00000001,63,2,2,3,30,1,1,{},{},{} 1246,Cinquedea_,Cinquedea,5,40000,,700,110,,1,2,0x00000001,63,2,2,3,30,1,1,{},{},{} 1247,Kindling_Dagger,Kindle Dagger,5,10000,,600,39,,1,0,0x3E9F7EEF,63,2,2,1,1,1,1,{ bonus bAtkEle,Ele_Fire; },{},{} @@ -628,14 +628,14 @@ 1264,Various_Jur,Specialty Jur,5,20,,800,90,,1,4,0x00001000,63,2,34,1,1,1,16,{ bonus2 bAddEff2,Eff_Bleeding,10; },{},{} 1265,Bloody_Roar,Bloody Roar,5,20,,1000,120,,1,0,0x00001000,63,2,34,4,75,1,16,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus bIgnoreDefRace,RC_Player; bonus bFlee,-(readparam(bAgi)+BaseLevel); bonus bHPrecovRate,-100; bonus bSPrecovRate,-100; },{},{} 1266,Infiltrator_,Infiltrator,5,57000,,1500,140,,1,1,0x00001000,63,2,34,4,75,1,16,{ bonus2 bAddRace,RC_DemiHuman,50; bonus2 bAddRace,RC_Player,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; },{},{} -1267,Infiltrator_C,Infiltrator,5,1,,0,189,,1,0,0x00001000,63,2,34,4,1,0,16,{ bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; bonus bAspdRate,5; },{},{} +1267,Infiltrator_C,Infiltrator,5,1,,0,189,,1,0,0x00001000,63,2,34,4,1,0,16,{ bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; bonus bAspdRate,8; },{},{} 1268,Wild_Beast_Claw,Wild Beast Claw,5,20,,1450,160,,1,1,0x00001000,18,2,34,4,55,1,16,{ bonus3 bAutoSpell,"NPC_CRITICALWOUND",(getrefine()>=9?2:1),100; },{},{} 1269,Inverse_Scale,Inverse Scale,5,20,,1500,140,,1,0,0x00001000,18,2,34,4,55,1,16,{ bonus bAtkEle,Ele_Holy; bonus3 bAutoSpell,"NPC_DRAGONFEAR",1,30; },{},{} 1270,Drill_Katar,Drill Katar,5,20,,1400,110,,1,1,0x00001000,18,2,34,4,55,1,16,{ bonus bHit,30; bonus3 bAutoSpell,"ST_FULLSTRIP",1,150; },{},{} 1271,Blood_Tears,Blood Tears,5,20,,1700,120,,1,2,0x00001000,18,2,34,4,55,1,16,{ bonus3 bAutoSpell,"NPC_WIDEBLEEDING",(getrefine()>=9?2:1),30; },{},{} 1272,Scratcher,Scratcher,5,20,,0,120,,1,0,0x00001000,63,2,34,1,0,0,16,{ bonus2 bAddClass,Class_All,50; },{},{} 1273,Bloody_Roar_C,Refined Bloody Roar,5,1,,0,148,,1,0,0x00001000,63,2,34,4,0,0,16,{ bonus bIgnoreDefRace,RC_DemiHuman; bonus bIgnoreDefRace,RC_Player; bonus2 bHPRegenRate,3,5000; },{},{} -1274,Unholy_Touch_C,Refined Unholy Touch,5,1,,0,179,,1,0,0x00001000,63,2,34,4,0,0,16,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,5000; bonus bCritical,-1; bonus bUnbreakableWeapon; },{},{} +1274,Unholy_Touch_C,Refined Unholy Touch,5,1,,0,179,,1,0,0x00001000,63,2,34,4,0,0,16,{ bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,5000; bonus bUnbreakableWeapon; },{},{} 1275,Katar_Of_Cold_Icicle_,Katar of Frozen Icicle,5,45000,,1200,105,,1,3,0x00001000,63,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; },{},{} 1276,Katar_Of_Thornbush_,Katar of Quaking,5,45000,,1200,105,,1,3,0x00001000,63,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Earth; bonus2 bAddEff,Eff_Blind,500; },{},{} 1277,Katar_Of_Raging_Blaze_,Katar of Raging Blaze,5,45000,,1200,105,,1,3,0x00001000,63,2,34,3,55,1,16,{ bonus bAtkEle,Ele_Fire; bonus2 bAddEff,Eff_Silence,500; },{},{} @@ -643,9 +643,9 @@ 1279,BF_Katar1,Brave Carnage Katar,5,20,,0,130,,1,0,0x00001000,63,2,34,3,80,1,16,{ bonus bStr,1; bonus bDex,1; bonus bLuk,1; bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon; },{},{} 1280,BF_Katar2,Valorous Carnage Katar,5,20,,0,130,,1,0,0x00001000,63,2,34,3,80,1,16,{ bonus bStr,1; bonus bDex,1; bonus bLuk,1; bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus bCritAtkRate,20; bonus bAspdRate,5; bonus bUnbreakableWeapon; },{},{} 1281,Krieger_Katar1,Glorious Bloody Roar,5,20,,0,140,,1,0,0x00001000,63,2,34,4,80,1,16,{ bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-4,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-4,2); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; } if(.@r>8) autobonus "{ bonus bAspdRate,100; }",70,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; },{},{} -1282,Krieger_Katar2,Glorious Jamadhar,5,20,,0,140,,1,0,0x00001000,63,2,34,4,80,1,16,{ bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-4,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-4,2); bonus2 bCriticalAddRace,RC_DemiHuman,5; bonus2 bCriticalAddRace,RC_Player,5; } if(.@r>8) autobonus "{ bonus bAspdRate,100; }",70,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; },{},{} +1282,Krieger_Katar2,Glorious Jamadhar,5,20,,0,140,,1,0,0x00001000,63,2,34,4,80,1,16,{ bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus bCritAtkRate,20; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-4,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-4,2); bonus2 bCriticalAddRace,RC_DemiHuman,5; bonus2 bCriticalAddRace,RC_Player,5; } if(.@r>8) autobonus "{ bonus bAspdRate,100; }",70,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; },{},{} 1283,Katar_Of_Speed,Katar Of Speed,5,20,,0,175,,1,0,0x00001000,63,2,34,4,0,0,16,{ bonus2 bSkillAtk,"AS_SONICBLOW",25; bonus bAspdRate,3; },{},{} -1284,Krishna,Krishna,5,20,,1200,120,,1,2,0x00001000,18,2,34,3,50,1,16,{ bonus2 bSkillAtk,"AS_GRIMTOOTH",10; bonus3 bAutoSpell,"AS_SONICBLOW",max(getskilllv("AS_SONICBLOW"),1),5; },{},{} +1284,Krishna,Krishna,5,20,,1200,120,,1,2,0x00001000,18,2,34,3,50,1,16,{ bonus2 bSkillAtk,"AS_GRIMTOOTH",10; bonus3 bAutoSpell,"AS_SONICBLOW",max(getskilllv("AS_SONICBLOW"),1),100; },{},{} 1285,Cakram,Chakram,5,20,,1000,130,,1,2,0x00001000,18,2,34,3,50,1,16,{ if(getskilllv("AS_KATAR")==10) { bonus bHit,10; } bonus2 bSkillAtk,"ASC_METEORASSAULT",20; },{},{} 1286,Jamadhar_C,Jamadhar,5,0,,0,200,,1,0,0x00001000,63,2,34,3,1,0,16,{ bonus bUnbreakableWeapon; bonus2 bAddSize,Size_All,40; },{},{} 1287,Durga,Durga,5,20,,1200,190,,1,1,0x00001000,63,2,34,3,100,1,16,{},{},{} @@ -659,32 +659,33 @@ 1295,Blood_Tears_,Blood Tears,5,20,,1700,120,,1,3,0x00001000,18,2,34,4,55,1,16,{ bonus3 bAutoSpell,"NPC_WIDEBLEEDING",(getrefine()>=9?2:1),30; },{},{} 1296,Metal_Katar,Metal Katar,5,20,,0,75,,1,1,0x00001000,63,2,34,3,1,1,16,{ .@r = getrefine(); bonus bBaseAtk,(.@r*5); bonus bCritAtkRate,.@r; .@i = min(BaseLevel/10,12); if(.@i>2) bonus bBaseAtk,((.@i-2)*5); },{},{} 1297,Inverse_Scale_,Inverse Scale,5,20,,1500,140,,1,2,0x00001000,18,2,34,4,55,1,16,{ bonus bAtkEle,Ele_Holy; bonus3 bAutoSpell,"NPC_DRAGONFEAR",1,30; },{},{} -1298,Shiver_Katar,Katar Of Horror,5,60000,,2700,110,,1,2,0x00001000,63,2,34,4,105,1,16,{},{},{} -1299,TE_Woe_Katar,TE Woe Katar,5,0,,0,120,,1,0,0x00001000,63,2,34,3,40,1,16,{ bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Bleeding,3000; },{},{} +1298,Shiver_Katar,Katar Of Horror,5,60000,,2700,110,,1,2,0x00001000,63,2,34,4,105,1,16,{ bonus bCritical,getrefine(); },{},{} +1299,TE_Woe_Katar,TE Woe Katar,5,0,,0,120,,1,0,0x00001000,63,2,34,3,40,1,16,{ bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Bleeding,1000; },{},{} //=================================================================== // 1-Handed Axes //=================================================================== +1300,Cleaver_,Cleaver,5,20,,1200,140,,1,3,0x000444A2,63,2,2,4,44,1,6,{ bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5; bonus3 bAddMonsterDropItem,517,RC_Brute,3000; },{},{} 1301,Axe,Axe,5,500,,800,38,,1,3,0x000654E3,63,2,2,1,3,1,6,{},{},{} 1302,Axe_,Axe,5,500,,800,38,,1,4,0x000654E3,63,2,2,1,3,1,6,{},{},{} 1303,Axe__,Axe,5,500,,800,38,,1,0,0x000654E3,63,2,2,1,3,1,6,{},{},{} 1304,Orcish_Axe,Orcish Axe,5,20,,1500,75,,1,0,0x000654E3,63,2,2,3,3,1,6,{},{},{} 1305,Cleaver,Cleaver,5,20,,1200,140,,1,0,0x000444A2,63,2,2,4,44,1,6,{ bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5; bonus3 bAddMonsterDropItem,517,RC_Brute,3000; },{},{} -1306,War_Axe,War Axe,5,20,,4200,140,,1,1,0x00040400,63,2,2,3,76,1,6,{ bonus bDex,2; bonus bLuk,2; },{},{} -1307,Windhawk,Windhawk,5,18000,,1500,115,,1,0,0x000654E2,63,2,2,2,14,1,6,{ bonus bAtkEle,Ele_Wind; bonus bAspdRate,5; },{},{} +1306,War_Axe,War Axe,5,20,,4200,140,,1,1,0x00040400,63,2,2,3,76,1,6,{ bonus bDex,2; bonus bLuk,2; bonus bUnbreakableWeapon; },{},{} +1307,Windhawk,Windhawk,5,18000,,1500,115,,1,0,0x000654E2,63,2,2,2,14,1,6,{ bonus bAtkEle,Ele_Wind; bonus bAspdRate,5; bonus bUnbreakableWeapon; },{},{} 1308,Golden_Axe,Golden Axe,5,20,,3000,170,,1,0,0x00000001,63,2,2,4,45,1,6,{},{},{} 1309,Orcish_Axe_,Orcish Axe,5,20,,1500,75,,1,4,0x000654E3,63,2,2,3,3,1,6,{},{},{} 1310,Krieger_Onehand_Axe1,Glorious Cleaver,5,20,,0,130,,1,0,0x000444A2,63,2,2,4,80,1,6,{ bonus2 bAddRace,RC_DemiHuman,75; bonus2 bAddRace,RC_Player,75; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-4,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-4,2); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; bonus bAspdRate,5; } if(.@r>8) { bonus bAspdRate,5; bonus3 bAutoSpell,"NPC_CRITICALWOUND",1,50; bonus4 bAutoSpellOnSkill,"MC_MAMMONITE","NPC_CRITICALWOUND",2,200; } },{},{} 1311,Vecer_Axe,Vecer Axe,5,20,,1500,140,,1,2,0x000444A2,18,2,2,3,50,1,6,{ if(readparam(bLuk)>=90) { bonus bBaseAtk,20; } if(readparam(bDex)>=90) { bonus bCritical,5; } if(readparam(bDex)>=90&&readparam(bLuk)>=90) { bonus2 bSkillAtk,"MC_MAMMONITE",15; } },{},{} 1312,Orcish_Axe_C,Orcish Axe,5,0,,0,110,,1,0,0x000654E3,63,2,2,3,1,0,6,{ bonus2 bAddSize,Size_All,70; },{},{} 1313,Tourist_Axe,Tourist Axe,5,0,,500,77,,1,0,0x000654E3,63,2,2,1,1,0,6,{ bonus bStr,2; },{},{} -1314,F_Tomahawk_C,Tomahawk,5,2,,0,200,,1,0,0x000444A2,63,2,34,4,0,0,7,{ bonus bAtkEle,Ele_Wind; },{},{} -1315,F_Right_Epsilon_C,Light Epsilon,5,1,,0,229,,1,0,0x000444A2,63,2,34,4,1,0,7,{ bonus bAtkEle,Ele_Holy; bonus bStr,10; },{},{} +1314,F_Tomahawk_C,Tomahawk,5,2,,0,200,,1,0,0x000444A2,63,2,34,4,0,0,7,{ bonus bAtkEle,Ele_Wind; skill "ITM_TOMAHAWK",1; },{},{} +1315,F_Right_Epsilon_C,Light Epsilon,5,1,,0,229,,1,0,0x000444A2,63,2,34,4,1,0,7,{ bonus bAtkEle,Ele_Holy; bonus bStr,10; bonus2 bAddRace,RC_Demon,3; skill "AL_HEAL",3; },{},{} 1316,Adventure_Axe,Adventure Axe,5,0,,0,100,,1,0,0x00040420,63,2,2,1,1,0,6,{},{},{} 1317,Academy_Axe,Academy Axe,5,0,,1600,130,,1,1,0x00040420,63,2,2,1,30,1,6,{ bonus bUnbreakableWeapon; bonus bAspdRate,5-(BaseLevel/10); bonus bMaxHP,200-(40*(BaseLevel/10)); },{},{} -1318,Dofle_Axe,Deflation Axe,5,50000,,1800,180,,1,2,0x000654E2,63,2,2,4,105,1,6,{ bonus bUnbreakableWeapon; },{},{} -1319,TE_Woe_Axe,TE Woe Axe,5,0,,0,100,,1,0,0x000654E3,63,2,2,3,40,1,6,{ bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Freeze,3000; },{},{} -1321,Dofle_Axe_,Deflation Axe,5,50000,,1800,180,,1,3,0x000654E2,63,2,2,4,105,1,6,{ bonus bUnbreakableWeapon; },{},{} -1322,Ru_Blue_Axe,Blue Axe,5,10,,1800,180,,1,1,0xFFFFFFFF,63,2,2,1,1,1,6,{ bonus bStr,5; bonus bVit,5; },{},{} +1318,Dofle_Axe,Deflation Axe,5,50000,,1800,180,,1,2,0x000654E2,63,2,2,4,105,1,6,{ skill "ITM_TOMAHAWK",1; },{},{} +1319,TE_Woe_Axe,TE Woe Axe,5,0,,0,100,,1,0,0x000654E3,63,2,2,3,40,1,6,{ bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Freeze,1000; },{},{} +1321,Dofle_Axe_,Deflation Axe,5,50000,,1800,180,,1,3,0x000654E2,63,2,2,4,105,1,6,{ skill "ITM_TOMAHAWK",1; },{},{} +1322,Ru_Blue_Axe,Blue Axe,5,10,,1800,180,,1,1,0xFFFBFFFF,56,2,2,1,1,1,6,{ bonus bStr,5; bonus bVit,5; },{},{} 1323,Ru_Gold_Axe,Ru Gold Axe,5,0,,1800,180,,1,2,0x00040000,56,2,2,3,120,1,6,{ bonus bStr,8; bonus bInt,8; },{},{} 1324,War_Axe_,War Axe,5,20,,4200,140,,1,3,0x00040400,63,2,2,3,76,1,6,{ bonus bDex,2; bonus bLuk,2; },{},{} 1326,Illusion_War_Axe,Illusion War Axe,5,0,,4200,180,,1,2,0x00040420,63,2,2,4,120,1,6,{ bonus bStr,2; bonus bDex,2; bonus bLuk,2; .@r = getrefine(); if (.@r >= 9) { .@val = 40; } else if (.@r >= 7) { .@val = 20; } bonus2 bSkillAtk,"NC_AXETORNADO",(100+.@val); bonus2 bSkillAtk,"NC_AXEBOOMERANG",(100+.@val); bonus2 bSkillAtk,"GN_CART_TORNADO",(75+.@val); },{},{} @@ -692,6 +693,7 @@ // 2-Handed Axes //=================================================================== 1333,Golden_Wrench,Golden Wrench,5,,,5500,220,,1,2,0x00000400,56,2,2,4,170,1,6,{ .@r = getrefine(); bonus bUnbreakableWeapon; bonus2 bAddClass,Class_all,5; bonus bBaseAtk,4*.@r; if (.@r>=11) .@val = 35; else if (.@r>=9) .@val = 20; bonus2 bSkillAtk,"NC_AXEBOOMERANG",.@val; bonus2 bSkillAtk,"NC_POWERSWING",.@val; },{},{} +1336,Guardian_Knight_Axe,Guardian Knight Axe,5,0,,1500,210,,1,2,0xFFFFFBFF,56,2,2,4,170,1,6,{ bonus bUnbreakableWeapon; bonus2 bAddClass,Class_All,5; .@r = getrefine(); bonus bLongAtkRate,.@r; if(.@r >= 9){ bonus2 bSkillAtk,"NC_POWERSWING",20; } if(.@r >= 11){ bonus2 bAddRace,RC_Undead,20; bonus2 bAddRace,RC_Angel,20; } },{},{} 1351,Battle_Axe,Battle Axe,5,5400,,1500,80,,1,3,0x000444A2,63,2,34,1,3,1,7,{},{},{} 1352,Battle_Axe_,Battle Axe,5,5400,,1500,80,,1,4,0x000444A2,63,2,34,1,3,1,7,{},{},{} 1353,Battle_Axe__,Battle Axe,5,5400,,1500,80,,1,0,0x000444A2,63,2,34,1,3,1,7,{},{},{} @@ -719,28 +721,28 @@ 1375,Berdysz,Berdysz,5,20,,2500,200,,1,2,0x000444A2,18,2,34,3,70,1,7,{ bonus2 bSubSize,Size_Medium,13; bonus2 bSubSize,Size_Large,15; },{},{} 1376,Heart_Breaker,Heart Breaker,5,20,,2000,175,,1,1,0x000444A2,18,2,34,4,70,1,7,{ bonus bCritical,20+getrefine(); bonus bAspdRate,5; if((Class==Job_Whitesmith)||(Class==Job_Creator)||(Class==Job_Mechanic)||(Class==Job_Mechanic_T)||(Class==Job_Genetic)||(Class==Job_Genetic_T)) bonus3 bAutoSpell,"BS_HAMMERFALL",3,30; },{},{} 1377,Hurricane_Fury,Hurricane's Fury,5,20,,3500,332,,1,1,0x000444A2,18,2,34,4,80,1,7,{ .@r = getrefine(); bonus2 bSubSize,Size_Medium,10+.@r; bonus bAspdRate,.@r; bonus3 bAutoSpell,"NPC_PULSESTRIKE",5,20; },{},{} -1378,Great_Axe_C,Refined Great Axe,5,1,,0,215,,1,0,0x000444A2,63,2,34,4,0,0,7,{ bonus bStr,5; bonus bHit,20; bonus2 bAddSkillBlow,"MC_MAMMONITE",5; bonus2 bAddEff,Eff_Stun,2000; },{},{} +1378,Great_Axe_C,Refined Great Axe,5,1,,0,215,,1,0,0x000444A2,63,2,34,4,0,0,7,{ bonus bStr,5; bonus bHit,20; bonus2 bSkillAtk,"MC_MAMMONITE",20; bonus2 bAddEff,Eff_Stun,2000; },{},{} 1379,BF_Two_Handed_Axe1,Valorous Insane Battle Axe,5,20,,0,200,,1,0,0x000444A2,63,2,34,3,80,1,7,{ bonus bStr,3; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bAddRace,RC_Player,55; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon; },{},{} 1380,BF_Two_Handed_Axe2,Brave Insane Battle Axe,5,20,,0,200,,1,0,0x000444A2,63,2,34,3,80,1,7,{ bonus bStr,3; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bAddRace,RC_Player,55; autobonus "{ bonus bBreakArmorRate,10000; }",20,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; bonus bUnbreakableWeapon; },{},{} 1381,N_Battle_Axe,Novice Battle Axe,5,0,,0,100,,1,3,0x000444A2,63,2,34,1,3,0,7,{},{},{} 1382,Krieger_Twohand_Axe1,Glorious Two-Handed Axe,5,20,,0,220,,1,0,0x000444A2,63,2,34,4,80,1,7,{ bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-3,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-3,2); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; bonus3 bAutoSpell,"NPC_CRITICALWOUND",1,50; } if(.@r>8) { bonus3 bAutoSpell,"NPC_CRITICALWOUND",1,100; bonus4 bAutoSpellOnSkill,"MC_MAMMONITE","NPC_CRITICALWOUND",2,200; bonus4 bAutoSpellOnSkill,"WS_CARTTERMINATION","NPC_CRITICALWOUND",2,200; } },{},{} -1383,Holy_Celestial_Axe,Celestial Axe,5,20,,1500,200,,1,0,0x000444A2,63,2,34,4,60,1,7,{ bonus bAtkEle,Ele_Holy; bonus bVit,10; bonus2 bAddRace,RC_Undead,10; bonus3 bAutoSpell,"AL_BLESSING",5,30; },{},{} -1384,Veteran_Axe,Veteran Axe,5,10000,,3000,250,,1,2,0x000444A2,63,2,34,3,80,1,7,{ if(getskilllv("BS_DAGGER")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_SWORD")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_TWOHANDSWORD")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_KNUCKLE")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_SPEAR")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_AXE")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_MACE")==3) { bonus bBaseAtk,10; } bonus bVit,2; },{},{} -1385,Bradium_Stonehammer,Bradium Stone Hammer,5,20,,2700,210,,1,0,0x000444A2,18,2,34,4,75,1,7,{ bonus3 bAddEffOnSkill,"BS_HAMMERFALL",Eff_Stun,500+(200*getrefine()); },{},{} -1386,Doom_Slayer_I,Doom Slayer,5,0,,0,20,,1,0,0x000444A2,63,2,34,4,0,0,7,{ if(readparam(bStr)>=95){ bonus bBaseAtk,400; bonus2 bAddEff,Eff_Stun,3000; bonus bAspdRate,-25; bonus bUseSPrate,100; bonus bBreakArmorRate,500; } },{},{} -1387,Giant_Axe,Giant Axe,5,20,,4000,330,,1,1,0x000444A2,18,2,34,3,50,1,7,{ bonus2 bSkillAtk,"WS_CARTTERMINATION",15; if(readparam(bStr)>=95) { bonus bHit,10; bonus bAspdRate,3; } },{},{} +1383,Holy_Celestial_Axe,Celestial Axe,5,20,,1500,200,,1,0,0x00040420,63,2,34,4,60,1,7,{ bonus2 bAddRace,RC_Undead,10; bonus3 bAutoSpell,"AL_BLESSING",5,5; },{},{} +1384,Veteran_Axe,Veteran Axe,5,10000,,3000,250,,1,2,0x000444A2,63,2,34,3,80,1,7,{ if(getskilllv("BS_DAGGER")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_SWORD")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_TWOHANDSWORD")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_KNUCKLE")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_SPEAR")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_AXE")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_MACE")==3) { bonus bBaseAtk,10; } bonus bVit,2; bonus4 bAutoSpellOnSkill,"BS_HAMMERFALL",50,3,"SM_MAGNUM"; },{},{} +1385,Bradium_Stonehammer,Bradium Stone Hammer,5,20,,2700,210,,1,0,0x00000400,2,2,34,4,75,1,7,{ bonus3 bAddEffOnSkill,"BS_HAMMERFALL",Eff_Stun,500+(200*getrefine()); },{},{} +1386,Doom_Slayer_I,Doom Slayer,5,0,,0,20,,1,0,0x000444A2,63,2,34,4,0,0,7,{ bonus bAspdRate,-25; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,400; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; } },{},{} +1387,Giant_Axe,Giant Axe,5,20,,4000,330,,1,1,0x00044480,18,2,34,3,50,1,7,{ bonus2 bSkillAtk,"WS_CARTTERMINATION",15; if(readparam(bStr)>=95) { bonus bHit,10; bonus bAspdRate,3; } },{},{} 1388,Two_Handed_Axe_C,Two-Handed Axe,5,0,,0,220,,1,0,0x000444A2,63,2,34,3,1,0,7,{ bonus2 bAddSize,Size_All,40; },{},{} 1389,E_Tomahawk_C,Tomahawk,5,2,,0,200,,1,0,0x000444A2,63,2,34,4,0,0,7,{ bonus bAtkEle,Ele_Wind; },{},{} 1390,E_Right_Epsilon_C,Light Epsilon,5,1,,0,229,,1,0,0x000444A2,63,2,34,4,1,0,7,{ bonus bAtkEle,Ele_Holy; bonus bStr,10; },{},{} 1391,P_Two_Handed_Axe1,Eden Two-Handed Axe I,5,0,,0,195,,1,0,0x000444A2,63,2,34,3,60,0,7,{},{},{} -1392,Ygnus_Stale,Ignus Steel,5,56000,,1900,250,,1,1,0x000444A2,63,2,34,4,95,1,7,{ bonus bAtkEle,Ele_Fire; bonus bUnbreakableWeapon; bonus2 bAddEff,Eff_Burning,300; bonus2 bAddEff2,Eff_Burning,300; },{},{} -1393,End_Sektura,End Sectora,5,56000,,1900,250,,1,1,0x000444A2,63,2,34,4,95,1,7,{ bonus bAtkEle,Ele_Water; bonus bUnbreakableWeapon; bonus2 bAddEff,Eff_Crystalize,300; bonus2 bAddEff2,Eff_Crystalize,300; },{},{} -1394,Upg_Two_Handed_Axe,Upg Two Handed Axe,5,20,,2000,110,,1,1,0x000444A2,63,2,34,3,1,1,7,{ bonus bBaseAtk,(getrefine()*14); if(BaseLevel>70) bonus bBaseAtk,(((BaseLevel-70)/10)*10); },{},{} +1392,Ygnus_Stale,Ignus Steel,5,56000,,1900,250,,1,1,0x00044480,58,2,34,4,95,1,7,{ bonus bAtkEle,Ele_Fire; bonus bUnbreakableWeapon; bonus2 bAddEff,Eff_Burning,200; bonus2 bAddEff2,Eff_Burning,100; },{},{} +1393,End_Sektura,End Sectora,5,56000,,1900,250,,1,1,0x00044480,58,2,34,4,95,1,7,{ bonus bAtkEle,Ele_Water; bonus bUnbreakableWeapon; bonus2 bAddEff,Eff_Freeze,300; bonus2 bAddEff2,Eff_Freeze,300; },{},{} +1394,Upg_Two_Handed_Axe,Upg Two Handed Axe,5,20,,2000,110,,1,1,0x000444A2,63,2,34,3,1,1,7,{ bonus bBaseAtk,(getrefine()*14); if(BaseLevel>70) bonus bBaseAtk,(((BaseLevel-70)/10)*10); bonus bUnbreakableWeapon; },{},{} 1395,Velum_Buster,Vellum Buster,5,20,,2500,50,,1,0,0x000444A2,63,2,34,4,95,1,7,{ bonus bUnbreakableWeapon; bonus3 bSPVanishRaceRate,RC_Player,1000,10; },{},{} 1396,Velum_Guillotine,Vellum Guillotine,5,20,,5500,300,,1,0,0x000444A2,63,2,34,4,95,1,7,{ bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bIgnoreDefRaceRate,RC_Player,30; .@r = getrefine(); if(.@r>=6) { bonus2 bSkillAtk,"NC_AXEBOOMERANG",80; bonus2 bSkillAtk,"NC_POWERSWING",80; } if(.@r>=9) { bonus2 bAddRace,RC_Player,60; } },{},{} -1397,Bradium_Stonehammer_,Bradium Stonehammer,5,20,,2700,210,,1,2,0x000444A2,63,2,34,4,75,1,7,{ bonus bUnbreakableWeapon; },{},{} +1397,Bradium_Stonehammer_,Bradium Stone Hammer,5,20,,2700,210,,1,2,0x00000400,2,2,34,4,75,1,7,{ bonus3 bAddEffOnSkill,"BS_HAMMERFALL",Eff_Stun,500+(200*getrefine()); },{},{} 1398,Metal_Two_Handed_Axe,Metal Two Handed Axe,5,20,,0,105,,1,1,0x000444A2,63,2,34,3,1,1,7,{ bonus bUnbreakableWeapon; bonus bBaseAtk,(getrefine()*7); .@i = min(BaseLevel/10,12); if(.@i>2) bonus bBaseAtk,((.@i-2)*5); },{},{} -1399,TE_Woe_Two_Handed_Axe,TE Woe Two Handed Axe,5,0,,0,150,,1,0,0x000444A2,63,2,34,3,40,1,7,{ bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Stun,3000; },{},{} +1399,TE_Woe_Two_Handed_Axe,TE Woe Two Handed Axe,5,0,,0,150,,1,0,0x000444A2,63,2,34,3,40,1,7,{ bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Stun,1000; },{},{} //=================================================================== // 1-Handed Spears //=================================================================== From 286645d850e06e3f2357a675f4104d9ffce609ce Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Sun, 26 Apr 2020 16:52:18 +0200 Subject: [PATCH 067/212] SQL synchronization --- sql-files/item_db_re.sql | 70 +++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 783a465931..7857ca54b8 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -518,7 +518,7 @@ REPLACE INTO `item_db_re` VALUES (1128,'Hae_Dong_Gum_','Haedonggum',5,50000,NULL REPLACE INTO `item_db_re` VALUES (1129,'Flamberge','Flamberge',5,60000,NULL,1500,'150',NULL,1,0,0x00004080,63,2,2,3,'27',1,2,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1130,'Nagan','Nagan',5,20,NULL,500,'120',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'skill "TF_DOUBLE",5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; bonus2 bAddRace,RC_Player,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1131,'Ice_Falchon','Ice Falchion',5,20,NULL,600,'100',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; bonus2 bAddEff2,Eff_Freeze,10; skill "MG_COLDBOLT",3; bonus3 bAutoSpell,"MG_COLDBOLT",3,100;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1132,'Edge','Edge',5,20,NULL,700,'115',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus2 bAddEff,Eff_Curse,30; bonus2 bComaClass,Class_Normal,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1132,'Edge','Edge',5,20,NULL,700,'115',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus2 bAddEff,Eff_Curse,30; bonus2 bComaClass,Class_All,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1133,'Fire_Brand','Fireblend',5,20,NULL,500,'100',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus bAtkEle,Ele_Fire; skill "MG_FIREBOLT",3; bonus3 bAutoSpell,"MG_FIREBOLT",3,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1134,'Scissores_Sword','Caesar\'s Sword',5,20,NULL,700,'140',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus2 bAddRace,RC_Plant,25; bonus bIgnoreDefRace,RC_Plant;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1135,'Cutlas','Cutlus',5,20,NULL,900,'150',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'skill "SM_BASH",5; bonus bStr,2; bonus bDef,1;',NULL,NULL); @@ -527,7 +527,7 @@ REPLACE INTO `item_db_re` VALUES (1137,'Excalibur','Excalibur',5,20,NULL,1200,'1 REPLACE INTO `item_db_re` VALUES (1138,'Mysteltainn_','Mysteltainn',5,20,NULL,1000,'170',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus bAtkEle,Ele_Dark; bonus2 bAddEle,Ele_Ghost,15; bonus3 bAutoSpell,"MG_STONECURSE",3,100; bonus2 bAddEff,Eff_Stone,10; bonus bDex,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1139,'Tale_Fing_','Tirfing',5,20,NULL,1000,'200',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus bAtkEle,Ele_Dark; bonus2 bHPLossRate,35,10000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1140,'Byeorrun_Gum','Byeollungum',5,20,NULL,900,'150',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus2 bSubClass,Class_Normal,-10; bonus2 bAddClass,Class_Boss,50; bonus bAllStats,2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1141,'Immaterial_Sword','Immaterial Sword',5,20,NULL,900,'140',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus bAtkEle,Ele_Ghost; bonus3 bSPVanishRate,30,30,BF_WEAPON|BF_MAGIC|BF_MISC; bonus bSPDrainValue,-1; bonus bUnbreakableWeapon;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1141,'Immaterial_Sword','Immaterial Sword',5,20,NULL,900,'140',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus bAtkEle,Ele_Ghost; bonus3 bSPVanishRate,3,30,BF_WEAPON; bonus bSPDrainValue,-1; bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1142,'Jewel_Sword','Jeweled Sword',5,20,NULL,2200,'104',NULL,1,0,0x000654E2,63,2,2,3,'68',1,2,'bonus2 bAddMonsterDropItemGroup,IG_Jewel,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1143,'Gaia_Sword','Gaia Sword',5,20,NULL,2500,'140',NULL,1,0,0x000654E2,63,2,2,3,'74',1,2,'bonus2 bAddMonsterDropItemGroup,IG_Ore,30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1144,'Sasimi','Sashimi',5,20,NULL,1400,'75',NULL,1,0,0x000654E2,63,2,2,3,'48',1,2,'bonus bAtkEle,Ele_Wind; bonus3 bAddMonsterDropItem,544,RC_Fish,4000;',NULL,NULL); @@ -549,11 +549,11 @@ REPLACE INTO `item_db_re` VALUES (1157,'Two_Hand_Sword','Two-Handed Sword',5,600 REPLACE INTO `item_db_re` VALUES (1158,'Two_Hand_Sword_','Two-Handed Sword',5,60000,NULL,2200,'160',NULL,1,2,0x00004082,63,2,34,3,'33',1,3,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1159,'Two_Hand_Sword__','Two-Handed Sword',5,60000,NULL,2200,'160',NULL,1,0,0x00004082,63,2,34,3,'33',1,3,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1160,'Broad_Sword','Broad Sword',5,65000,NULL,2000,'140',NULL,1,1,0x00004082,63,2,34,3,'33',1,3,'bonus bDef,5; bonus bUnbreakableWeapon;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1161,'Balmung','Balmung',5,20,NULL,1000,'250',NULL,1,0,0xFFFFFFFF,63,2,34,4,'48',1,3,'bonus bUnbreakableWeapon; bonus bAtkEle,Ele_Holy;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1161,'Balmung','Balmung',5,20,NULL,1000,'250',NULL,1,0,0xFFFFFFFF,63,2,34,4,'48',1,3,'bonus bInt,20; bonus bLuk,20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1162,'Broad_Sword_','Broad Sword',5,65000,NULL,2000,'140',NULL,1,2,0x00004082,63,2,34,3,'33',1,3,'bonus bDef,5; bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1163,'Claymore','Claymore',5,74000,NULL,2500,'180',NULL,1,0,0x00004080,63,2,34,3,'33',1,3,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1164,'Muramasa','Muramasa',5,20,NULL,1000,'155',NULL,1,0,0x00004082,63,2,34,4,'48',1,3,'bonus bCritical,30; bonus bAspdRate,8; bonus2 bAddEff2,Eff_Curse,10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1165,'Masamune','Masamune',5,20,NULL,1000,'200',NULL,1,0,0x00004082,63,2,34,4,'48',1,3,'bonus bFlee,30; bonus bStr,-5; bonus bAspd,2; bonus bDefRate,-67; bonus bDef2Rate,-67;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1165,'Masamune','Masamune',5,20,NULL,1000,'200',NULL,1,0,0x00004082,63,2,34,4,'48',1,3,'bonus bFlee,30; bonus bStr,-5; bonus bAspd,2; bonus bDefRate,-66; bonus bDef2Rate,-66;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1166,'Dragon_Slayer','Dragon Slayer',5,20,NULL,1300,'150',NULL,1,0,0x00004082,63,2,34,4,'48',1,3,'bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Dragon,15;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1167,'Schweizersabel','Schweizersabel',5,20,NULL,1600,'160',NULL,1,0,0x00004082,63,2,34,4,'48',1,3,'bonus bAtkEle,Ele_Wind; bonus bDef,1; bonus3 bAutoSpell,"MG_LIGHTNINGBOLT",3,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1168,'Zweihander','Zweihander',5,20,NULL,2200,'200',NULL,1,0,0x00004082,63,2,34,4,'48',1,3,'bonus bUnbreakableWeapon;',NULL,NULL); @@ -569,7 +569,7 @@ REPLACE INTO `item_db_re` VALUES (1177,'Muramash','Muramash',5,20,NULL,0,'120',N REPLACE INTO `item_db_re` VALUES (1178,'Schweizersabel_','Schweizersabel',5,20,NULL,1600,'160',NULL,1,2,0x00004082,63,2,34,4,'48',1,3,'bonus bAtkEle,Ele_Wind; bonus bDef,1; bonus3 bAutoSpell,"MG_LIGHTNINGBOLT",3,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1179,'Executioner__','Executioner',5,20,NULL,2200,'155',NULL,1,1,0x00004082,63,2,34,4,'48',1,3,'bonus bIgnoreDefRace,RC_DemiHuman; bonus bIgnoreDefRace,RC_Player; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bAddRace,RC_Player,20; bonus2 bSubRace,RC_DemiHuman,-10; bonus2 bSubRace,RC_Player,-10; bonus bAtkEle,Ele_Dark;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1180,'Dragon_Slayer_','Dragon Slayer',5,20,NULL,1300,'150',NULL,1,2,0x00004082,63,2,34,4,'48',1,3,'bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Dragon,15;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1181,'Tae_Goo_Lyeon','Tae Goo Lyeon',5,20,NULL,2000,'250',NULL,1,2,0x00004082,18,2,34,4,'90',1,3,'bonus bFlee2,10; if(JobLevel>=70) autobonus "{ bonus bBaseAtk,50; }",10,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; if(getrefine()>8) { bonus bVariableCastrate,-20; bonus bDelayRate,-20; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1181,'Tae_Goo_Lyeon','Tae Goo Lyeon',5,20,NULL,2000,'250',NULL,1,2,0x00004082,18,2,34,4,'90',1,3,'bonus bFlee2,10; if(JobLevel>=70 || (eaclass()&EAJL_THIRD && JobLevel>=50)) autobonus "{ bonus bBaseAtk,50; }",10,10000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; if(getrefine()>8) { bonus bDelayRate,-20; bonus bUseSPrate,-20; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1182,'Bloody_Eater','Bloody Eater',5,20,NULL,1200,'200',NULL,1,2,0x00004082,18,2,34,4,'50',1,3,'bonus bAtkEle,Ele_Ghost; autobonus "{ bonus bCritical,100; bonus bBaseAtk,50; }",1,5000,0,"{ specialeffect2 EF_FIRESPLASHHIT; }"; bonus bHPGainValue,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1183,'BF_Two_Handed_Sword1','Brave Assaulter\'s Katzbalger',5,20,NULL,0,'200',NULL,1,0,0x00004082,63,2,34,3,'80',1,3,'bonus bStr,2; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bAddRace,RC_Player,55; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1184,'BF_Two_Handed_Sword2','Valorous Assaulter\'s Katzbalger',5,20,NULL,0,'200',NULL,1,0,0x00004082,63,2,34,3,'80',1,3,'bonus bCritical,20; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bAddRace,RC_Player,55; bonus bCritAtkRate,20; bonus bUnbreakableWeapon;',NULL,NULL); @@ -579,14 +579,14 @@ REPLACE INTO `item_db_re` VALUES (1187,'Krieger_Twohand_Sword1','Glorious Claymo REPLACE INTO `item_db_re` VALUES (1188,'Veteran_Sword','Veteran Sword',5,10000,NULL,2000,'180',NULL,1,1,0x00004082,63,2,34,4,'80',1,3,'if(getskilllv("SM_BASH")==10) { bonus2 bSkillAtk,"SM_BASH",50; } if(getskilllv("KN_BOWLINGBASH")==10) { bonus2 bSkillAtk,"KN_BOWLINGBASH",50; } bonus bStr,1; bonus bDex,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1189,'Krasnaya','Krasnaya',5,20,NULL,3800,'200',NULL,2,3,0x00004082,18,2,34,2,'50',1,3,'if(readparam(bStr)>=95) { bonus bBaseAtk,20; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1190,'Claymore_C','Claymore',5,0,NULL,0,'220',NULL,1,0,0x00004080,63,2,34,3,'1',0,3,'bonus2 bAddSize,Size_All,40;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1191,'Alca_Bringer','Alca Bringer',5,20,NULL,3400,'280',NULL,2,0,0x00004082,63,2,34,3,'100',1,3,'bonus bAspd,(getrefine()/2);',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1191,'Alca_Bringer','Alca Bringer',5,20,NULL,3400,'280',NULL,2,0,0x00000080,56,2,34,3,'100',1,3,'bonus bAspd,(getrefine()/2);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1192,'P_Slayer1','Eden Slayer I',5,0,NULL,0,'162',NULL,1,0,0x00004082,63,2,34,2,'26',0,3,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1193,'P_Slayer2','Eden Slayer II',5,0,NULL,0,'185',NULL,1,0,0x00004082,63,2,34,2,'40',0,3,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1194,'F_Executioner_C','Executioner',5,2,NULL,0,'190',NULL,1,0,0x00004082,63,2,34,4,'0',0,3,'bonus bAtkEle,Ele_Dark;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1194,'F_Executioner_C','Executioner',5,2,NULL,0,'190',NULL,1,0,0x00004082,63,2,34,4,'0',0,3,'bonus bAtkEle,Ele_Dark; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bSubRace,RC_DemiHuman,-10; bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bAddRace,RC_Player,20; bonus2 bSubRace,RC_Player,-10; bonus bIgnoreDefRace,RC_Player;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1195,'E_Executioner_C','Executioner',5,2,NULL,0,'190',NULL,1,0,0x00004082,63,2,34,4,'0',0,3,'bonus bAtkEle,Ele_Dark;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1196,'Chrome_Twohand_Sword','Chrome Two-Handed Sword',5,20,NULL,400,'280',NULL,1,0,0x00004082,63,2,34,3,'110',1,3,'bonus bUnbreakableWeapon; bonus bAgi,3; bonus bMaxHPrate,-10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1197,'P_Slayer3','Eden Slayer III',5,0,NULL,0,'200',NULL,1,0,0x00004082,63,2,34,3,'60',0,3,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1198,'Hairtail','Cutlass',5,0,NULL,0,'220',NULL,3,0,0x00004082,63,2,34,1,'50',0,3,'bonus bUnbreakableWeapon; bonus bCritical,20; bonus bCritAtkRate,50; if(BaseLevel>99) { bonus bBaseAtk,50; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1198,'Hairtail','Cutlass',5,0,NULL,0,'220',NULL,3,0,0x00004082,63,2,34,1,'50',0,3,'bonus bCritical,20; bonus bCritAtkRate,50; bonus2 bAddEff,Eff_Crystalize,30; if(BaseLevel>99) { bonus bBaseAtk,50; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1199,'Ebony_Toe_Nail','Ebony Toe Nail',5,56000,NULL,1000,'250:150',NULL,1,0,0x00004082,63,2,34,4,'120',1,3,NULL,NULL,NULL); #=================================================================== # Daggers @@ -634,7 +634,7 @@ REPLACE INTO `item_db_re` VALUES (1240,'Princess_Knife','Princess Knife',5,20,NU REPLACE INTO `item_db_re` VALUES (1241,'Cursed_Dagger','Cursed Dagger',5,80000,NULL,400,'55',NULL,1,0,0x00810204,63,2,2,4,'85',1,1,'bonus2 bAddEff,Eff_Curse,5000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1242,'Counter_Dagger','Dagger of Counter',5,120000,NULL,550,'140',NULL,1,0,0x00810204,63,2,2,4,'55',1,1,'bonus bCritical,90;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1243,'Novice_Knife','Novice Main-Gauche',5,0,NULL,1,'45',NULL,1,0,0x00000001,63,2,2,1,'1',0,1,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1244,'Holy_Dagger','Holy Dagger',5,20,NULL,800,'100',NULL,1,0,0x02021040,63,2,2,4,'55',1,1,'bonus bAtkEle,Ele_Holy; bonus bDex,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1244,'Holy_Dagger','Holy Dagger',5,20,NULL,800,'100',NULL,1,0,0x02021040,63,2,2,4,'55',1,1,'bonus bAtkEle,Ele_Holy; bonus2 bAddRace,RC_Demon,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1245,'Cinquedea','Cinquedea',5,40000,NULL,700,'110',NULL,1,1,0x00000001,63,2,2,3,'30',1,1,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1246,'Cinquedea_','Cinquedea',5,40000,NULL,700,'110',NULL,1,2,0x00000001,63,2,2,3,'30',1,1,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1247,'Kindling_Dagger','Kindle Dagger',5,10000,NULL,600,'39',NULL,1,0,0x3E9F7EEF,63,2,2,1,'1',1,1,'bonus bAtkEle,Ele_Fire;',NULL,NULL); @@ -660,14 +660,14 @@ REPLACE INTO `item_db_re` VALUES (1263,'Unholy_Touch','Unholy Touch',5,20,NULL,1 REPLACE INTO `item_db_re` VALUES (1264,'Various_Jur','Specialty Jur',5,20,NULL,800,'90',NULL,1,4,0x00001000,63,2,34,1,'1',1,16,'bonus2 bAddEff2,Eff_Bleeding,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1265,'Bloody_Roar','Bloody Roar',5,20,NULL,1000,'120',NULL,1,0,0x00001000,63,2,34,4,'75',1,16,'bonus bIgnoreDefRace,RC_DemiHuman; bonus bIgnoreDefRace,RC_Player; bonus bFlee,-(readparam(bAgi)+BaseLevel); bonus bHPrecovRate,-100; bonus bSPrecovRate,-100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1266,'Infiltrator_','Infiltrator',5,57000,NULL,1500,'140',NULL,1,1,0x00001000,63,2,34,4,'75',1,16,'bonus2 bAddRace,RC_DemiHuman,50; bonus2 bAddRace,RC_Player,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1267,'Infiltrator_C','Infiltrator',5,1,NULL,0,'189',NULL,1,0,0x00001000,63,2,34,4,'1',0,16,'bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; bonus bAspdRate,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1267,'Infiltrator_C','Infiltrator',5,1,NULL,0,'189',NULL,1,0,0x00001000,63,2,34,4,'1',0,16,'bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; bonus bAspdRate,8;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1268,'Wild_Beast_Claw','Wild Beast Claw',5,20,NULL,1450,'160',NULL,1,1,0x00001000,18,2,34,4,'55',1,16,'bonus3 bAutoSpell,"NPC_CRITICALWOUND",(getrefine()>=9?2:1),100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1269,'Inverse_Scale','Inverse Scale',5,20,NULL,1500,'140',NULL,1,0,0x00001000,18,2,34,4,'55',1,16,'bonus bAtkEle,Ele_Holy; bonus3 bAutoSpell,"NPC_DRAGONFEAR",1,30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1270,'Drill_Katar','Drill Katar',5,20,NULL,1400,'110',NULL,1,1,0x00001000,18,2,34,4,'55',1,16,'bonus bHit,30; bonus3 bAutoSpell,"ST_FULLSTRIP",1,150;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1271,'Blood_Tears','Blood Tears',5,20,NULL,1700,'120',NULL,1,2,0x00001000,18,2,34,4,'55',1,16,'bonus3 bAutoSpell,"NPC_WIDEBLEEDING",(getrefine()>=9?2:1),30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1272,'Scratcher','Scratcher',5,20,NULL,0,'120',NULL,1,0,0x00001000,63,2,34,1,'0',0,16,'bonus2 bAddClass,Class_All,50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1273,'Bloody_Roar_C','Refined Bloody Roar',5,1,NULL,0,'148',NULL,1,0,0x00001000,63,2,34,4,'0',0,16,'bonus bIgnoreDefRace,RC_DemiHuman; bonus bIgnoreDefRace,RC_Player; bonus2 bHPRegenRate,3,5000;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1274,'Unholy_Touch_C','Refined Unholy Touch',5,1,NULL,0,'179',NULL,1,0,0x00001000,63,2,34,4,'0',0,16,'bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,5000; bonus bCritical,-1; bonus bUnbreakableWeapon;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1274,'Unholy_Touch_C','Refined Unholy Touch',5,1,NULL,0,'179',NULL,1,0,0x00001000,63,2,34,4,'0',0,16,'bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,5000; bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1275,'Katar_Of_Cold_Icicle_','Katar of Frozen Icicle',5,45000,NULL,1200,'105',NULL,1,3,0x00001000,63,2,34,3,'55',1,16,'bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1276,'Katar_Of_Thornbush_','Katar of Quaking',5,45000,NULL,1200,'105',NULL,1,3,0x00001000,63,2,34,3,'55',1,16,'bonus bAtkEle,Ele_Earth; bonus2 bAddEff,Eff_Blind,500;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1277,'Katar_Of_Raging_Blaze_','Katar of Raging Blaze',5,45000,NULL,1200,'105',NULL,1,3,0x00001000,63,2,34,3,'55',1,16,'bonus bAtkEle,Ele_Fire; bonus2 bAddEff,Eff_Silence,500;',NULL,NULL); @@ -675,9 +675,9 @@ REPLACE INTO `item_db_re` VALUES (1278,'Katar_Of_Piercing_Wind_','Katar of Pierc REPLACE INTO `item_db_re` VALUES (1279,'BF_Katar1','Brave Carnage Katar',5,20,NULL,0,'130',NULL,1,0,0x00001000,63,2,34,3,'80',1,16,'bonus bStr,1; bonus bDex,1; bonus bLuk,1; bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1280,'BF_Katar2','Valorous Carnage Katar',5,20,NULL,0,'130',NULL,1,0,0x00001000,63,2,34,3,'80',1,16,'bonus bStr,1; bonus bDex,1; bonus bLuk,1; bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus bCritAtkRate,20; bonus bAspdRate,5; bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1281,'Krieger_Katar1','Glorious Bloody Roar',5,20,NULL,0,'140',NULL,1,0,0x00001000,63,2,34,4,'80',1,16,'bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-4,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-4,2); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; } if(.@r>8) autobonus "{ bonus bAspdRate,100; }",70,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }";',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1282,'Krieger_Katar2','Glorious Jamadhar',5,20,NULL,0,'140',NULL,1,0,0x00001000,63,2,34,4,'80',1,16,'bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-4,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-4,2); bonus2 bCriticalAddRace,RC_DemiHuman,5; bonus2 bCriticalAddRace,RC_Player,5; } if(.@r>8) autobonus "{ bonus bAspdRate,100; }",70,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1282,'Krieger_Katar2','Glorious Jamadhar',5,20,NULL,0,'140',NULL,1,0,0x00001000,63,2,34,4,'80',1,16,'bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus bCritAtkRate,20; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-4,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-4,2); bonus2 bCriticalAddRace,RC_DemiHuman,5; bonus2 bCriticalAddRace,RC_Player,5; } if(.@r>8) autobonus "{ bonus bAspdRate,100; }",70,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1283,'Katar_Of_Speed','Katar Of Speed',5,20,NULL,0,'175',NULL,1,0,0x00001000,63,2,34,4,'0',0,16,'bonus2 bSkillAtk,"AS_SONICBLOW",25; bonus bAspdRate,3;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1284,'Krishna','Krishna',5,20,NULL,1200,'120',NULL,1,2,0x00001000,18,2,34,3,'50',1,16,'bonus2 bSkillAtk,"AS_GRIMTOOTH",10; bonus3 bAutoSpell,"AS_SONICBLOW",max(getskilllv("AS_SONICBLOW"),1),5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1284,'Krishna','Krishna',5,20,NULL,1200,'120',NULL,1,2,0x00001000,18,2,34,3,'50',1,16,'bonus2 bSkillAtk,"AS_GRIMTOOTH",10; bonus3 bAutoSpell,"AS_SONICBLOW",max(getskilllv("AS_SONICBLOW"),1),100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1285,'Cakram','Chakram',5,20,NULL,1000,'130',NULL,1,2,0x00001000,18,2,34,3,'50',1,16,'if(getskilllv("AS_KATAR")==10) { bonus bHit,10; } bonus2 bSkillAtk,"ASC_METEORASSAULT",20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1286,'Jamadhar_C','Jamadhar',5,0,NULL,0,'200',NULL,1,0,0x00001000,63,2,34,3,'1',0,16,'bonus bUnbreakableWeapon; bonus2 bAddSize,Size_All,40;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1287,'Durga','Durga',5,20,NULL,1200,'190',NULL,1,1,0x00001000,63,2,34,3,'100',1,16,NULL,NULL,NULL); @@ -691,32 +691,33 @@ REPLACE INTO `item_db_re` VALUES (1294,'Velum_Scare','Vellum Scale',5,20,NULL,12 REPLACE INTO `item_db_re` VALUES (1295,'Blood_Tears_','Blood Tears',5,20,NULL,1700,'120',NULL,1,3,0x00001000,18,2,34,4,'55',1,16,'bonus3 bAutoSpell,"NPC_WIDEBLEEDING",(getrefine()>=9?2:1),30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1296,'Metal_Katar','Metal Katar',5,20,NULL,0,'75',NULL,1,1,0x00001000,63,2,34,3,'1',1,16,'.@r = getrefine(); bonus bBaseAtk,(.@r*5); bonus bCritAtkRate,.@r; .@i = min(BaseLevel/10,12); if(.@i>2) bonus bBaseAtk,((.@i-2)*5);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1297,'Inverse_Scale_','Inverse Scale',5,20,NULL,1500,'140',NULL,1,2,0x00001000,18,2,34,4,'55',1,16,'bonus bAtkEle,Ele_Holy; bonus3 bAutoSpell,"NPC_DRAGONFEAR",1,30;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1298,'Shiver_Katar','Katar Of Horror',5,60000,NULL,2700,'110',NULL,1,2,0x00001000,63,2,34,4,'105',1,16,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1299,'TE_Woe_Katar','TE Woe Katar',5,0,NULL,0,'120',NULL,1,0,0x00001000,63,2,34,3,'40',1,16,'bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Bleeding,3000;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1298,'Shiver_Katar','Katar Of Horror',5,60000,NULL,2700,'110',NULL,1,2,0x00001000,63,2,34,4,'105',1,16,'bonus bCritical,getrefine();',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1299,'TE_Woe_Katar','TE Woe Katar',5,0,NULL,0,'120',NULL,1,0,0x00001000,63,2,34,3,'40',1,16,'bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Bleeding,1000;',NULL,NULL); #=================================================================== # 1-Handed Axes #=================================================================== +REPLACE INTO `item_db_re` VALUES (1300,'Cleaver_','Cleaver',5,20,NULL,1200,'140',NULL,1,3,0x000444A2,63,2,2,4,'44',1,6,'bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5; bonus3 bAddMonsterDropItem,517,RC_Brute,3000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1301,'Axe','Axe',5,500,NULL,800,'38',NULL,1,3,0x000654E3,63,2,2,1,'3',1,6,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1302,'Axe_','Axe',5,500,NULL,800,'38',NULL,1,4,0x000654E3,63,2,2,1,'3',1,6,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1303,'Axe__','Axe',5,500,NULL,800,'38',NULL,1,0,0x000654E3,63,2,2,1,'3',1,6,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1304,'Orcish_Axe','Orcish Axe',5,20,NULL,1500,'75',NULL,1,0,0x000654E3,63,2,2,3,'3',1,6,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1305,'Cleaver','Cleaver',5,20,NULL,1200,'140',NULL,1,0,0x000444A2,63,2,2,4,'44',1,6,'bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5; bonus3 bAddMonsterDropItem,517,RC_Brute,3000;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1306,'War_Axe','War Axe',5,20,NULL,4200,'140',NULL,1,1,0x00040400,63,2,2,3,'76',1,6,'bonus bDex,2; bonus bLuk,2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1307,'Windhawk','Windhawk',5,18000,NULL,1500,'115',NULL,1,0,0x000654E2,63,2,2,2,'14',1,6,'bonus bAtkEle,Ele_Wind; bonus bAspdRate,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1306,'War_Axe','War Axe',5,20,NULL,4200,'140',NULL,1,1,0x00040400,63,2,2,3,'76',1,6,'bonus bDex,2; bonus bLuk,2; bonus bUnbreakableWeapon;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1307,'Windhawk','Windhawk',5,18000,NULL,1500,'115',NULL,1,0,0x000654E2,63,2,2,2,'14',1,6,'bonus bAtkEle,Ele_Wind; bonus bAspdRate,5; bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1308,'Golden_Axe','Golden Axe',5,20,NULL,3000,'170',NULL,1,0,0x00000001,63,2,2,4,'45',1,6,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1309,'Orcish_Axe_','Orcish Axe',5,20,NULL,1500,'75',NULL,1,4,0x000654E3,63,2,2,3,'3',1,6,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1310,'Krieger_Onehand_Axe1','Glorious Cleaver',5,20,NULL,0,'130',NULL,1,0,0x000444A2,63,2,2,4,'80',1,6,'bonus2 bAddRace,RC_DemiHuman,75; bonus2 bAddRace,RC_Player,75; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-4,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-4,2); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; bonus bAspdRate,5; } if(.@r>8) { bonus bAspdRate,5; bonus3 bAutoSpell,"NPC_CRITICALWOUND",1,50; bonus4 bAutoSpellOnSkill,"MC_MAMMONITE","NPC_CRITICALWOUND",2,200; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1311,'Vecer_Axe','Vecer Axe',5,20,NULL,1500,'140',NULL,1,2,0x000444A2,18,2,2,3,'50',1,6,'if(readparam(bLuk)>=90) { bonus bBaseAtk,20; } if(readparam(bDex)>=90) { bonus bCritical,5; } if(readparam(bDex)>=90&&readparam(bLuk)>=90) { bonus2 bSkillAtk,"MC_MAMMONITE",15; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1312,'Orcish_Axe_C','Orcish Axe',5,0,NULL,0,'110',NULL,1,0,0x000654E3,63,2,2,3,'1',0,6,'bonus2 bAddSize,Size_All,70;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1313,'Tourist_Axe','Tourist Axe',5,0,NULL,500,'77',NULL,1,0,0x000654E3,63,2,2,1,'1',0,6,'bonus bStr,2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1314,'F_Tomahawk_C','Tomahawk',5,2,NULL,0,'200',NULL,1,0,0x000444A2,63,2,34,4,'0',0,7,'bonus bAtkEle,Ele_Wind;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1315,'F_Right_Epsilon_C','Light Epsilon',5,1,NULL,0,'229',NULL,1,0,0x000444A2,63,2,34,4,'1',0,7,'bonus bAtkEle,Ele_Holy; bonus bStr,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1314,'F_Tomahawk_C','Tomahawk',5,2,NULL,0,'200',NULL,1,0,0x000444A2,63,2,34,4,'0',0,7,'bonus bAtkEle,Ele_Wind; skill "ITM_TOMAHAWK",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1315,'F_Right_Epsilon_C','Light Epsilon',5,1,NULL,0,'229',NULL,1,0,0x000444A2,63,2,34,4,'1',0,7,'bonus bAtkEle,Ele_Holy; bonus bStr,10; bonus2 bAddRace,RC_Demon,3; skill "AL_HEAL",3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1316,'Adventure_Axe','Adventure Axe',5,0,NULL,0,'100',NULL,1,0,0x00040420,63,2,2,1,'1',0,6,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1317,'Academy_Axe','Academy Axe',5,0,NULL,1600,'130',NULL,1,1,0x00040420,63,2,2,1,'30',1,6,'bonus bUnbreakableWeapon; bonus bAspdRate,5-(BaseLevel/10); bonus bMaxHP,200-(40*(BaseLevel/10));',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1318,'Dofle_Axe','Deflation Axe',5,50000,NULL,1800,'180',NULL,1,2,0x000654E2,63,2,2,4,'105',1,6,'bonus bUnbreakableWeapon;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1319,'TE_Woe_Axe','TE Woe Axe',5,0,NULL,0,'100',NULL,1,0,0x000654E3,63,2,2,3,'40',1,6,'bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Freeze,3000;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1321,'Dofle_Axe_','Deflation Axe',5,50000,NULL,1800,'180',NULL,1,3,0x000654E2,63,2,2,4,'105',1,6,'bonus bUnbreakableWeapon;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1322,'Ru_Blue_Axe','Blue Axe',5,10,NULL,1800,'180',NULL,1,1,0xFFFFFFFF,63,2,2,1,'1',1,6,'bonus bStr,5; bonus bVit,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1318,'Dofle_Axe','Deflation Axe',5,50000,NULL,1800,'180',NULL,1,2,0x000654E2,63,2,2,4,'105',1,6,'skill "ITM_TOMAHAWK",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1319,'TE_Woe_Axe','TE Woe Axe',5,0,NULL,0,'100',NULL,1,0,0x000654E3,63,2,2,3,'40',1,6,'bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Freeze,1000;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1321,'Dofle_Axe_','Deflation Axe',5,50000,NULL,1800,'180',NULL,1,3,0x000654E2,63,2,2,4,'105',1,6,'skill "ITM_TOMAHAWK",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1322,'Ru_Blue_Axe','Blue Axe',5,10,NULL,1800,'180',NULL,1,1,0xFFFBFFFF,56,2,2,1,'1',1,6,'bonus bStr,5; bonus bVit,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1323,'Ru_Gold_Axe','Ru Gold Axe',5,0,NULL,1800,'180',NULL,1,2,0x00040000,56,2,2,3,'120',1,6,'bonus bStr,8; bonus bInt,8;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1324,'War_Axe_','War Axe',5,20,NULL,4200,'140',NULL,1,3,0x00040400,63,2,2,3,'76',1,6,'bonus bDex,2; bonus bLuk,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1326,'Illusion_War_Axe','Illusion War Axe',5,0,NULL,4200,'180',NULL,1,2,0x00040420,63,2,2,4,'120',1,6,'bonus bStr,2; bonus bDex,2; bonus bLuk,2; .@r = getrefine(); if (.@r >= 9) { .@val = 40; } else if (.@r >= 7) { .@val = 20; } bonus2 bSkillAtk,"NC_AXETORNADO",(100+.@val); bonus2 bSkillAtk,"NC_AXEBOOMERANG",(100+.@val); bonus2 bSkillAtk,"GN_CART_TORNADO",(75+.@val);',NULL,NULL); @@ -724,6 +725,7 @@ REPLACE INTO `item_db_re` VALUES (1326,'Illusion_War_Axe','Illusion War Axe',5,0 # 2-Handed Axes #=================================================================== REPLACE INTO `item_db_re` VALUES (1333,'Golden_Wrench','Golden Wrench',5,NULL,NULL,5500,'220',NULL,1,2,0x00000400,56,2,2,4,'170',1,6,'.@r = getrefine(); bonus bUnbreakableWeapon; bonus2 bAddClass,Class_all,5; bonus bBaseAtk,4*.@r; if (.@r>=11) .@val = 35; else if (.@r>=9) .@val = 20; bonus2 bSkillAtk,"NC_AXEBOOMERANG",.@val; bonus2 bSkillAtk,"NC_POWERSWING",.@val;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1336,'Guardian_Knight_Axe','Guardian Knight Axe',5,0,NULL,1500,'210',NULL,1,2,0xFFFFFBFF,56,2,2,4,'170',1,6,'bonus bUnbreakableWeapon; bonus2 bAddClass,Class_All,5; .@r = getrefine(); bonus bLongAtkRate,.@r; if(.@r >= 9){ bonus2 bSkillAtk,"NC_POWERSWING",20; } if(.@r >= 11){ bonus2 bAddRace,RC_Undead,20; bonus2 bAddRace,RC_Angel,20; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1351,'Battle_Axe','Battle Axe',5,5400,NULL,1500,'80',NULL,1,3,0x000444A2,63,2,34,1,'3',1,7,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1352,'Battle_Axe_','Battle Axe',5,5400,NULL,1500,'80',NULL,1,4,0x000444A2,63,2,34,1,'3',1,7,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1353,'Battle_Axe__','Battle Axe',5,5400,NULL,1500,'80',NULL,1,0,0x000444A2,63,2,34,1,'3',1,7,NULL,NULL,NULL); @@ -751,28 +753,28 @@ REPLACE INTO `item_db_re` VALUES (1374,'Tomahawk_C','Tomahawk',5,2,NULL,0,'200', REPLACE INTO `item_db_re` VALUES (1375,'Berdysz','Berdysz',5,20,NULL,2500,'200',NULL,1,2,0x000444A2,18,2,34,3,'70',1,7,'bonus2 bSubSize,Size_Medium,13; bonus2 bSubSize,Size_Large,15;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1376,'Heart_Breaker','Heart Breaker',5,20,NULL,2000,'175',NULL,1,1,0x000444A2,18,2,34,4,'70',1,7,'bonus bCritical,20+getrefine(); bonus bAspdRate,5; if((Class==Job_Whitesmith)||(Class==Job_Creator)||(Class==Job_Mechanic)||(Class==Job_Mechanic_T)||(Class==Job_Genetic)||(Class==Job_Genetic_T)) bonus3 bAutoSpell,"BS_HAMMERFALL",3,30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1377,'Hurricane_Fury','Hurricane\'s Fury',5,20,NULL,3500,'332',NULL,1,1,0x000444A2,18,2,34,4,'80',1,7,'.@r = getrefine(); bonus2 bSubSize,Size_Medium,10+.@r; bonus bAspdRate,.@r; bonus3 bAutoSpell,"NPC_PULSESTRIKE",5,20;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1378,'Great_Axe_C','Refined Great Axe',5,1,NULL,0,'215',NULL,1,0,0x000444A2,63,2,34,4,'0',0,7,'bonus bStr,5; bonus bHit,20; bonus2 bAddSkillBlow,"MC_MAMMONITE",5; bonus2 bAddEff,Eff_Stun,2000;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1378,'Great_Axe_C','Refined Great Axe',5,1,NULL,0,'215',NULL,1,0,0x000444A2,63,2,34,4,'0',0,7,'bonus bStr,5; bonus bHit,20; bonus2 bSkillAtk,"MC_MAMMONITE",20; bonus2 bAddEff,Eff_Stun,2000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1379,'BF_Two_Handed_Axe1','Valorous Insane Battle Axe',5,20,NULL,0,'200',NULL,1,0,0x000444A2,63,2,34,3,'80',1,7,'bonus bStr,3; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bAddRace,RC_Player,55; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,20; bonus2 bIgnoreDefRaceRate,RC_Player,20; bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1380,'BF_Two_Handed_Axe2','Brave Insane Battle Axe',5,20,NULL,0,'200',NULL,1,0,0x000444A2,63,2,34,3,'80',1,7,'bonus bStr,3; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bAddRace,RC_Player,55; autobonus "{ bonus bBreakArmorRate,10000; }",20,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1381,'N_Battle_Axe','Novice Battle Axe',5,0,NULL,0,'100',NULL,1,3,0x000444A2,63,2,34,1,'3',0,7,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1382,'Krieger_Twohand_Axe1','Glorious Two-Handed Axe',5,20,NULL,0,'220',NULL,1,0,0x000444A2,63,2,34,4,'80',1,7,'bonus2 bAddRace,RC_DemiHuman,70; bonus2 bAddRace,RC_Player,70; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(min(14,.@r)-3,2); bonus2 bAddRace,RC_Player,pow(min(14,.@r)-3,2); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; bonus3 bAutoSpell,"NPC_CRITICALWOUND",1,50; } if(.@r>8) { bonus3 bAutoSpell,"NPC_CRITICALWOUND",1,100; bonus4 bAutoSpellOnSkill,"MC_MAMMONITE","NPC_CRITICALWOUND",2,200; bonus4 bAutoSpellOnSkill,"WS_CARTTERMINATION","NPC_CRITICALWOUND",2,200; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1383,'Holy_Celestial_Axe','Celestial Axe',5,20,NULL,1500,'200',NULL,1,0,0x000444A2,63,2,34,4,'60',1,7,'bonus bAtkEle,Ele_Holy; bonus bVit,10; bonus2 bAddRace,RC_Undead,10; bonus3 bAutoSpell,"AL_BLESSING",5,30;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1384,'Veteran_Axe','Veteran Axe',5,10000,NULL,3000,'250',NULL,1,2,0x000444A2,63,2,34,3,'80',1,7,'if(getskilllv("BS_DAGGER")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_SWORD")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_TWOHANDSWORD")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_KNUCKLE")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_SPEAR")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_AXE")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_MACE")==3) { bonus bBaseAtk,10; } bonus bVit,2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1385,'Bradium_Stonehammer','Bradium Stone Hammer',5,20,NULL,2700,'210',NULL,1,0,0x000444A2,18,2,34,4,'75',1,7,'bonus3 bAddEffOnSkill,"BS_HAMMERFALL",Eff_Stun,500+(200*getrefine());',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1386,'Doom_Slayer_I','Doom Slayer',5,0,NULL,0,'20',NULL,1,0,0x000444A2,63,2,34,4,'0',0,7,'if(readparam(bStr)>=95){ bonus bBaseAtk,400; bonus2 bAddEff,Eff_Stun,3000; bonus bAspdRate,-25; bonus bUseSPrate,100; bonus bBreakArmorRate,500; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1387,'Giant_Axe','Giant Axe',5,20,NULL,4000,'330',NULL,1,1,0x000444A2,18,2,34,3,'50',1,7,'bonus2 bSkillAtk,"WS_CARTTERMINATION",15; if(readparam(bStr)>=95) { bonus bHit,10; bonus bAspdRate,3; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1383,'Holy_Celestial_Axe','Celestial Axe',5,20,NULL,1500,'200',NULL,1,0,0x00040420,63,2,34,4,'60',1,7,'bonus2 bAddRace,RC_Undead,10; bonus3 bAutoSpell,"AL_BLESSING",5,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1384,'Veteran_Axe','Veteran Axe',5,10000,NULL,3000,'250',NULL,1,2,0x000444A2,63,2,34,3,'80',1,7,'if(getskilllv("BS_DAGGER")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_SWORD")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_TWOHANDSWORD")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_KNUCKLE")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_SPEAR")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_AXE")==3) { bonus bBaseAtk,10; } if(getskilllv("BS_MACE")==3) { bonus bBaseAtk,10; } bonus bVit,2; bonus4 bAutoSpellOnSkill,"BS_HAMMERFALL",50,3,"SM_MAGNUM";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1385,'Bradium_Stonehammer','Bradium Stone Hammer',5,20,NULL,2700,'210',NULL,1,0,0x00000400,2,2,34,4,'75',1,7,'bonus3 bAddEffOnSkill,"BS_HAMMERFALL",Eff_Stun,500+(200*getrefine());',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1386,'Doom_Slayer_I','Doom Slayer',5,0,NULL,0,'20',NULL,1,0,0x000444A2,63,2,34,4,'0',0,7,'bonus bAspdRate,-25; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,400; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1387,'Giant_Axe','Giant Axe',5,20,NULL,4000,'330',NULL,1,1,0x00044480,18,2,34,3,'50',1,7,'bonus2 bSkillAtk,"WS_CARTTERMINATION",15; if(readparam(bStr)>=95) { bonus bHit,10; bonus bAspdRate,3; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1388,'Two_Handed_Axe_C','Two-Handed Axe',5,0,NULL,0,'220',NULL,1,0,0x000444A2,63,2,34,3,'1',0,7,'bonus2 bAddSize,Size_All,40;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1389,'E_Tomahawk_C','Tomahawk',5,2,NULL,0,'200',NULL,1,0,0x000444A2,63,2,34,4,'0',0,7,'bonus bAtkEle,Ele_Wind;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1390,'E_Right_Epsilon_C','Light Epsilon',5,1,NULL,0,'229',NULL,1,0,0x000444A2,63,2,34,4,'1',0,7,'bonus bAtkEle,Ele_Holy; bonus bStr,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1391,'P_Two_Handed_Axe1','Eden Two-Handed Axe I',5,0,NULL,0,'195',NULL,1,0,0x000444A2,63,2,34,3,'60',0,7,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1392,'Ygnus_Stale','Ignus Steel',5,56000,NULL,1900,'250',NULL,1,1,0x000444A2,63,2,34,4,'95',1,7,'bonus bAtkEle,Ele_Fire; bonus bUnbreakableWeapon; bonus2 bAddEff,Eff_Burning,300; bonus2 bAddEff2,Eff_Burning,300;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1393,'End_Sektura','End Sectora',5,56000,NULL,1900,'250',NULL,1,1,0x000444A2,63,2,34,4,'95',1,7,'bonus bAtkEle,Ele_Water; bonus bUnbreakableWeapon; bonus2 bAddEff,Eff_Crystalize,300; bonus2 bAddEff2,Eff_Crystalize,300;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1394,'Upg_Two_Handed_Axe','Upg Two Handed Axe',5,20,NULL,2000,'110',NULL,1,1,0x000444A2,63,2,34,3,'1',1,7,'bonus bBaseAtk,(getrefine()*14); if(BaseLevel>70) bonus bBaseAtk,(((BaseLevel-70)/10)*10);',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1392,'Ygnus_Stale','Ignus Steel',5,56000,NULL,1900,'250',NULL,1,1,0x00044480,58,2,34,4,'95',1,7,'bonus bAtkEle,Ele_Fire; bonus bUnbreakableWeapon; bonus2 bAddEff,Eff_Burning,200; bonus2 bAddEff2,Eff_Burning,100;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1393,'End_Sektura','End Sectora',5,56000,NULL,1900,'250',NULL,1,1,0x00044480,58,2,34,4,'95',1,7,'bonus bAtkEle,Ele_Water; bonus bUnbreakableWeapon; bonus2 bAddEff,Eff_Freeze,300; bonus2 bAddEff2,Eff_Freeze,300;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1394,'Upg_Two_Handed_Axe','Upg Two Handed Axe',5,20,NULL,2000,'110',NULL,1,1,0x000444A2,63,2,34,3,'1',1,7,'bonus bBaseAtk,(getrefine()*14); if(BaseLevel>70) bonus bBaseAtk,(((BaseLevel-70)/10)*10); bonus bUnbreakableWeapon;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1395,'Velum_Buster','Vellum Buster',5,20,NULL,2500,'50',NULL,1,0,0x000444A2,63,2,34,4,'95',1,7,'bonus bUnbreakableWeapon; bonus3 bSPVanishRaceRate,RC_Player,1000,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1396,'Velum_Guillotine','Vellum Guillotine',5,20,NULL,5500,'300',NULL,1,0,0x000444A2,63,2,34,4,'95',1,7,'bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bIgnoreDefRaceRate,RC_Player,30; .@r = getrefine(); if(.@r>=6) { bonus2 bSkillAtk,"NC_AXEBOOMERANG",80; bonus2 bSkillAtk,"NC_POWERSWING",80; } if(.@r>=9) { bonus2 bAddRace,RC_Player,60; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1397,'Bradium_Stonehammer_','Bradium Stonehammer',5,20,NULL,2700,'210',NULL,1,2,0x000444A2,63,2,34,4,'75',1,7,'bonus bUnbreakableWeapon;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1397,'Bradium_Stonehammer_','Bradium Stone Hammer',5,20,NULL,2700,'210',NULL,1,2,0x00000400,2,2,34,4,'75',1,7,'bonus3 bAddEffOnSkill,"BS_HAMMERFALL",Eff_Stun,500+(200*getrefine());',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1398,'Metal_Two_Handed_Axe','Metal Two Handed Axe',5,20,NULL,0,'105',NULL,1,1,0x000444A2,63,2,34,3,'1',1,7,'bonus bUnbreakableWeapon; bonus bBaseAtk,(getrefine()*7); .@i = min(BaseLevel/10,12); if(.@i>2) bonus bBaseAtk,((.@i-2)*5);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1399,'TE_Woe_Two_Handed_Axe','TE Woe Two Handed Axe',5,0,NULL,0,'150',NULL,1,0,0x000444A2,63,2,34,3,'40',1,7,'bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Stun,3000;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1399,'TE_Woe_Two_Handed_Axe','TE Woe Two Handed Axe',5,0,NULL,0,'150',NULL,1,0,0x000444A2,63,2,34,3,'40',1,7,'bonus bUnbreakableWeapon; bonus2 bAddRace,RC_Player,40; bonus2 bAddEff,Eff_Stun,1000;',NULL,NULL); #=================================================================== # 1-Handed Spears #=================================================================== From ca56c060cf3d4c11b0f6da9c5d5b2d8e8e5c3d7e Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Mon, 27 Apr 2020 20:21:22 +0200 Subject: [PATCH 068/212] Added independent idle time and settings for homunculus share (#4761) * Follow up to 921b3e2c3e9eae36cbf2ca35bcede6e0d73ba074 --- conf/battle/homunc.conf | 24 ++++++++++++++++++++++-- doc/script_commands.txt | 8 ++++++++ src/map/atcommand.cpp | 2 ++ src/map/battle.cpp | 3 ++- src/map/battle.hpp | 1 + src/map/clif.cpp | 24 ++++++++++++++++++++++++ src/map/mob.cpp | 4 ++-- src/map/pc.hpp | 3 ++- src/map/script.cpp | 12 ++++++++++++ 9 files changed, 75 insertions(+), 6 deletions(-) diff --git a/conf/battle/homunc.conf b/conf/battle/homunc.conf index 8338fe68b2..253e22cce4 100644 --- a/conf/battle/homunc.conf +++ b/conf/battle/homunc.conf @@ -62,15 +62,35 @@ homunculus_S_growth_level: 99 // Official: yes homunculus_autofeed_always: yes -// Is getting exp/item from the homunculus disabled when you're idle? +// Is getting exp/item from the homunculus disabled when their master's idle? // Set to no, or the amount of seconds (NOT milliseconds) that need to pass before considering // a character idle. // Characters in a chat/vending are always considered idle. // A character's idle status is reset upon item use/skill use/attack (auto attack counts too)/movement. -// You will only receive items if 'homunculus_autoloot' is activated, +// Their master will only receive items if 'homunculus_autoloot' is activated, // otherwise they will be dropped on the ground as usual. +// NOTE: This option uses a special timer to track idle time, separated from the normal idle timer. hom_idle_no_share: no +// How the server should measure the homunculus master's idle time? (for homunculus exp share and autoloot ONLY) (Note 3) +// (This will only work if 'hom_idle_no_share' is enabled). +// 0x001 - Walk Request +// 0x002 - UseSkillToID Request (Targetted skill use attempt) +// 0x004 - UseSkillToPos Request (AoE skill use attempt) +// 0x008 - UseItem Request (Including equip/unequip) +// 0x010 - Attack Request +// 0x020 - Chat Request (Whisper, Party, Guild, Battlegrounds, etc) +// 0x040 - Sit/Standup Request +// 0x080 - Emotion Request +// 0x100 - DropItem Request +// 0x200 - @/#Command Request +// Please note that at least 1 option has to be enabled. +// Be mindful that the more options used, the easier it becomes to cheat this features. +// Default: walk (0x1) + useskilltoid (0x2) + useskilltopos (0x4) + useitem (0x8) + attack (0x10) = 0x1F +// NOTE: This allows you to configure different settings for homunculus, separated from normal idle timer and 'idletime_option'. +// It will only apply to homunculus-only kills and it will not affect normal autoloot and party share options. +idletime_hom_option: 0x1F + // The rate at which homunculus gain experience from kills. (Note 2) // Only applies to renewal mode. // Official: 10% diff --git a/doc/script_commands.txt b/doc/script_commands.txt index c8e313893c..49bae2d921 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -3907,6 +3907,14 @@ Name is optional, and defaults to the attached player if omitted. --------------------------------------- +*checkidlehom({""}) + +Returns the time, in seconds, that the specified player has been idle for homunculus item/exp share. +Name is optional, and defaults to the attached player if omitted. +This will only work if 'hom_idle_no_share' and 'idletime_hom_option' are enabled (see '/conf/battle/homunc.conf'). + +--------------------------------------- + *agitcheck() *agitcheck2() *agitcheck3() diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index fb48eabf99..b5d04a12c4 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -10728,6 +10728,8 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message if (battle_config.idletime_option&IDLE_ATCOMMAND) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_ATCOMMAND) + sd->idletime_hom = last_tick; //Clearing these to be used once more. memset(command, '\0', sizeof(command)); diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 7aec469987..208f2e45f3 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -8820,7 +8820,7 @@ static const struct _battle_data { { "fame_pharmacy_10", &battle_config.fame_pharmacy_10, 50, 0, INT_MAX, }, { "mail_delay", &battle_config.mail_delay, 1000, 1000, INT_MAX, }, { "at_monsterignore", &battle_config.autotrade_monsterignore, 0, 0, 1, }, - { "idletime_option", &battle_config.idletime_option, 0x25, 1, INT_MAX, }, + { "idletime_option", &battle_config.idletime_option, 0x1F, 0x1, 0xFFF, }, { "spawn_direction", &battle_config.spawn_direction, 0, 0, 1, }, { "arrow_shower_knockback", &battle_config.arrow_shower_knockback, 1, 0, 1, }, { "devotion_rdamage_skill_only", &battle_config.devotion_rdamage_skill_only, 1, 0, 1, }, @@ -8894,6 +8894,7 @@ static const struct _battle_data { { "boss_nopc_idleskill_rate", &battle_config.boss_nopc_idleskill_rate, 100, 0, 100, }, { "boss_nopc_move_rate", &battle_config.boss_nopc_move_rate, 100, 0, 100, }, { "hom_idle_no_share", &battle_config.hom_idle_no_share, 0, 0, INT_MAX, }, + { "idletime_hom_option", &battle_config.idletime_hom_option, 0x1F, 0x1, 0xFFF, }, { "devotion_standup_fix", &battle_config.devotion_standup_fix, 1, 0, 1, }, { "feature.bgqueue", &battle_config.feature_bgqueue, 1, 0, 1, }, { "homunculus_exp_gain", &battle_config.homunculus_exp_gain, 10, 0, 100, }, diff --git a/src/map/battle.hpp b/src/map/battle.hpp index 1ebd060839..17c53d4305 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -672,6 +672,7 @@ struct Battle_Config int boss_nopc_idleskill_rate; int boss_nopc_move_rate; int hom_idle_no_share; + int idletime_hom_option; int devotion_standup_fix; int feature_bgqueue; int homunculus_exp_gain; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index a3d5f2759a..d3a7adbd85 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -10242,6 +10242,8 @@ static bool clif_process_message(struct map_session_data* sd, bool whisperFormat if (battle_config.idletime_option&IDLE_CHAT) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_CHAT) + sd->idletime_hom = last_tick; return true; } @@ -11018,6 +11020,8 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) //Set last idle time... [Skotlex] if (battle_config.idletime_option&IDLE_WALK) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_WALK) + sd->idletime_hom = last_tick; unit_walktoxy(&sd->bl, x, y, 4); } @@ -11232,6 +11236,8 @@ void clif_parse_Emotion(int fd, struct map_session_data *sd) if (battle_config.idletime_option&IDLE_EMOTION) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_EMOTION) + sd->idletime_hom = last_tick; if (sd->state.block_action & PCBLOCK_EMOTION) { clif_skill_fail(sd, 1, USESKILL_FAIL_LEVEL, 1); @@ -11316,6 +11322,8 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, pc_delinvincibletimer(sd); if (battle_config.idletime_option&IDLE_ATTACK) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_ATTACK) + sd->idletime_hom = last_tick; unit_attack(&sd->bl, target_id, action_type != 0); break; case 0x02: // sitdown @@ -11346,6 +11354,8 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, if (battle_config.idletime_option&IDLE_SIT) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_SIT) + sd->idletime_hom = last_tick; pc_setsit(sd); skill_sit(sd, true); @@ -11369,6 +11379,8 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, if (pc_setstand(sd, false)) { if (battle_config.idletime_option&IDLE_SIT) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_SIT) + sd->idletime_hom = last_tick; skill_sit(sd, false); clif_standing(&sd->bl); } @@ -11626,6 +11638,8 @@ void clif_parse_DropItem(int fd, struct map_session_data *sd){ if (battle_config.idletime_option&IDLE_DROPITEM) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_DROPITEM) + sd->idletime_hom = last_tick; return; } @@ -11656,6 +11670,8 @@ void clif_parse_UseItem(int fd, struct map_session_data *sd) //Whether the item is used or not is irrelevant, the char ain't idle. [Skotlex] if (battle_config.idletime_option&IDLE_USEITEM) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_USEITEM) + sd->idletime_hom = last_tick; n = RFIFOW(fd,packet_db[RFIFOW(fd,0)].pos[0])-2; if(n <0 || n >= MAX_INVENTORY) @@ -11703,6 +11719,8 @@ void clif_parse_EquipItem(int fd,struct map_session_data *sd) if (battle_config.idletime_option&IDLE_USEITEM) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_USEITEM) + sd->idletime_hom = last_tick; //Client doesn't send the position for ammo. if(sd->inventory_data[index]->type == IT_AMMO) @@ -11742,6 +11760,8 @@ void clif_parse_UnequipItem(int fd,struct map_session_data *sd) if (battle_config.idletime_option&IDLE_USEITEM) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_USEITEM) + sd->idletime_hom = last_tick; pc_unequipitem(sd,index,1); } @@ -12391,6 +12411,8 @@ void clif_parse_skill_toid( struct map_session_data* sd, uint16 skill_id, uint16 // This is done here, because homunculi and mercenaries can be triggered by AI and not by the player itself if (battle_config.idletime_option&IDLE_USESKILLTOID) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_USESKILLTOID) + sd->idletime_hom = last_tick; if( sd->npc_id ){ if( pc_hasprogress( sd, WIP_DISABLE_SKILLITEM ) || !sd->npc_item_flag || !( inf & INF_SELF_SKILL ) ){ @@ -12519,6 +12541,8 @@ static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uin //Whether skill fails or not is irrelevant, the char ain't idle. [Skotlex] if (battle_config.idletime_option&IDLE_USESKILLTOPOS) sd->idletime = last_tick; + if (battle_config.hom_idle_no_share && sd->hd && battle_config.idletime_hom_option&IDLE_USESKILLTOPOS) + sd->idletime_hom = last_tick; if( skill_isNotOk(skill_id, sd) ) return; diff --git a/src/map/mob.cpp b/src/map/mob.cpp index b230aacedf..218cb387dd 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -2186,8 +2186,8 @@ static void mob_item_drop(struct mob_data *md, struct item_drop_list *dlist, str if( sd == NULL ) sd = map_charid2sd(dlist->third_charid); test_autoloot = sd && (drop_rate <= sd->state.autoloot || pc_isautolooting(sd, ditem->item_data.nameid)) - && (battle_config.idle_no_autoloot == 0 || DIFF_TICK(last_tick, sd->idletime) < battle_config.idle_no_autoloot) - && (battle_config.homunculus_autoloot?(battle_config.hom_idle_no_share == 0 || !pc_isidle_hom(sd)):!flag); + && (flag?(battle_config.homunculus_autoloot?(battle_config.hom_idle_no_share == 0 || !pc_isidle_hom(sd)):0): + (battle_config.idle_no_autoloot == 0 || DIFF_TICK(last_tick, sd->idletime) < battle_config.idle_no_autoloot)); #ifdef AUTOLOOT_DISTANCE test_autoloot = test_autoloot && sd->bl.m == md->bl.m && check_distance_blxy(&sd->bl, dlist->x, dlist->y, AUTOLOOT_DISTANCE); diff --git a/src/map/pc.hpp b/src/map/pc.hpp index f18cf6a469..54c74d7718 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -366,6 +366,7 @@ struct map_session_data { int npc_timer_id; //For player attached npc timers. [Skotlex] unsigned int chatID; time_t idletime; + time_t idletime_hom; struct s_progressbar { int npc_id; @@ -910,7 +911,7 @@ extern struct s_job_info job_info[CLASS_COUNT]; #define pc_isdead(sd) ( (sd)->state.dead_sit == 1 ) #define pc_issit(sd) ( (sd)->vd.dead_sit == 2 ) #define pc_isidle_party(sd) ( (sd)->chatID || (sd)->state.vending || (sd)->state.buyingstore || DIFF_TICK(last_tick, (sd)->idletime) >= battle_config.idle_no_share ) -#define pc_isidle_hom(sd) ( (sd)->hd && ( (sd)->chatID || (sd)->state.vending || (sd)->state.buyingstore || DIFF_TICK(last_tick, (sd)->idletime) >= battle_config.hom_idle_no_share ) ) +#define pc_isidle_hom(sd) ( (sd)->hd && ( (sd)->chatID || (sd)->state.vending || (sd)->state.buyingstore || DIFF_TICK(last_tick, (sd)->idletime_hom) >= battle_config.hom_idle_no_share ) ) #define pc_istrading(sd) ( (sd)->npc_id || (sd)->state.vending || (sd)->state.buyingstore || (sd)->state.trading ) #define pc_cant_act(sd) ( (sd)->npc_id || (sd)->state.vending || (sd)->state.buyingstore || (sd)->chatID || ((sd)->sc.opt1 && (sd)->sc.opt1 != OPT1_BURNING) || (sd)->state.trading || (sd)->state.storage_flag || (sd)->state.prevend ) diff --git a/src/map/script.cpp b/src/map/script.cpp index 6bd04b65d7..388918fbc9 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -17384,6 +17384,17 @@ BUILDIN_FUNC(checkidle) return SCRIPT_CMD_SUCCESS; } +BUILDIN_FUNC(checkidlehom) +{ + TBL_PC *sd = NULL; + + if( script_nick2sd(2,sd) ) + script_pushint(st, DIFF_TICK(last_tick, sd->idletime_hom)); + else + script_pushint(st, 0); + return SCRIPT_CMD_SUCCESS; +} + BUILDIN_FUNC(searchitem) { struct script_data* data = script_getdata(st, 2); @@ -25082,6 +25093,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(checkvending,"?"), BUILDIN_DEF(checkchatting,"?"), BUILDIN_DEF(checkidle,"?"), + BUILDIN_DEF(checkidlehom,"?"), BUILDIN_DEF(openmail,"?"), BUILDIN_DEF(openauction,"?"), BUILDIN_DEF(checkcell,"siii"), From 251b6cbc590cf593020726687903eb3cf8deef9c Mon Sep 17 00:00:00 2001 From: Chaos92 Date: Tue, 28 Apr 2020 23:51:28 +0800 Subject: [PATCH 069/212] Add Flame Basin, Isle of Bios, Morse's Cave and Temple of Demon God Mob Card Drop (#4842) * Enable Despair God Morocc Card ItemID --- db/re/item_db.txt | 2 +- db/re/mob_db.txt | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 52f1979baf..32f4bc30d2 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -12318,7 +12318,7 @@ 27318,Miguel_Card,Miguel Card,6,20,,10,,,,,,,,64,,,,,{ bonus bCritAtkRate,20; bonus2 bSubRace,RC_All,-10; },{},{} 27319,R48_85_BESTIA_Card,R48-85-BESTIA Card,6,20,,10,,,,,,,,16,,,,,{ bonus2 bAddEle,Ele_Poison,40; },{},{} 27320,E_EA1L_card,E-EA1L card,6,20,,10,,,,,,,,2,,,,,{ .@r = getrefine(); .@val = 3; if (.@r >= 9) { .@val += 2; if (.@r >= 11) { .@val += 5; } } bonus2 bMagicAtkEle,Ele_Fire,.@val; },{},{} -// 27321,Despair_God_Morocc_Card,Despair God Morocc Card,6,20,,10,,,,,,,,64,,,,,{ bonus2 bAddClass,Class_All,10; bonus bMaxHPRate,-50; bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_Player,30; bonus2 bAddRace,RC_Angel,30; autobonus3 "{ }",1000,5000,"NV_FIRSTAID","{ active_transform 3097,5000; }"; /* unknown transformation rates */ },{},{} +27321,Despair_God_Morocc_Card,Despair God Morocc Card,6,20,,10,,,,,,,,64,,,,,{ bonus2 bAddClass,Class_All,10; bonus bMaxHPRate,-50; bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_Player,30; bonus2 bAddRace,RC_Angel,30; autobonus3 "{ }",1000,5000,"NV_FIRSTAID","{ active_transform 3097,5000; }"; /* unknown transformation rates */ },{},{} 27322,Demon_God's_Apostle_Ahat_Card,Demon God's Apostle Ahat Card,6,20,,10,,,,,,,,136,,,,,{ bonus bMaxSPrate,5; },{},{} 27323,Demon_God's_Apostle_Shnaim_Card,Demon God's Apostle Shnaim Card,6,20,,10,,,,,,,,136,,,,,{ bonus bMaxHPrate,5; },{},{} 27324,Brinaranea_Card,Brinaranea Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bMagicAtkEle,Ele_Water,15; },{},{} diff --git a/db/re/mob_db.txt b/db/re/mob_db.txt index 81e932aba8..d237060a85 100644 --- a/db/re/mob_db.txt +++ b/db/re/mob_db.txt @@ -2156,7 +2156,7 @@ 2996,XM_CELINE_KIMI,Celine Kimi,Celine Kimi,160,66666666,1,4444444,4033332,2,6666,6666,479,444,144,166,44,444,166,166,10,12,2,1,28,0x6283695,100,768,1056,480,444444,616,10000,617,10000,22534,10000,22534,4000,18549,4000,7642,4000,19701,100,13442,100,712,10000,0,0,0,0,0,0,0,0 2997,G_XM_CELINE_KIMI,Kimi's Phantom,Kimi's Phantom,160,66666666,1,0,0,2,6666,6666,479,444,144,166,44,444,166,166,10,12,2,1,28,0x6203695,100,768,1056,480,0,0,0,0,0,0,0,6683,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2998,EP14_MORS_EVENT,Weakened Morocc,Weakened Morocc,158,1771440,1,12390,16104,1,1872,900,113,45,87,51,45,88,106,50,12,12,2,6,60,0x6200085,200,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -2999,EP14_MORS_BOSSA,Morocc Necromancer,Morocc Necromancer,158,4000000,1,2106000,1336500,1,700,0,215,555,165,190,142,146,299,93,12,12,1,7,60,0x6280085,100,300,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,0,0,0,0,0,0,522,200,0,0,0,0,0,0 +2999,EP14_MORS_BOSSA,Morocc Necromancer,Morocc Necromancer,158,4000000,1,2106000,1336500,1,700,0,215,555,165,190,142,146,299,93,12,12,1,7,60,0x6280085,100,300,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,0,0,0,0,0,0,522,200,0,0,0,0,27326,1 3000,EP14_MORS_BOSSB,Morocc Necromancer,Morocc Necromancer,101,80000000,1,2310750,1465200,12,700,1,1,1,1,1,1,180,1,1,12,12,1,7,82,0x6280084,2000,2700,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,22537,10000,22537,10000,0,0,522,200,0,0,0,0,0,0 3001,EP14_MORS_MOB1,Morocc's Ghoul,Morocc's Ghoul,158,295240,1,1239,1610,1,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,1000,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3002,EP14_MORS_MOB2,Morocc's Osiris,Morocc's Osiris,158,442860,1,1239,1610,1,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,200,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -2173,20 +2173,20 @@ 3013,EP14_3_DEATH_B_MOB1,Corrupt Orc Warrior,Corrupt Orc Warrior,158,300000,1,12390,16104,1,948,215,240,60,150,85,150,40,122,70,10,12,1,7,42,0x0000085,150,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0 3014,EP14_3_DEATH_B_MOB2,Corrupt Desert Wolf,Corrupt Desert Wolf,158,292450,1,12390,16104,1,948,215,240,50,120,85,110,55,130,70,10,12,1,2,43,0x0000085,150,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0 3015,EP14_3_DEATH_B_MOB3,Corrupt Phen,Corrupt Phen,158,284110,1,12390,16104,1,948,215,240,100,110,85,95,70,115,70,10,12,1,5,41,0x0000085,150,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0 -3016,EP14_3_DEATH_C_MOB1,Corrupt Orc Zombie,Corrupt Orc Zombie,158,375000,1,12390,16104,1,948,215,150,150,180,145,202,40,88,30,10,12,1,7,49,0x0000085,170,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0 +3016,EP14_3_DEATH_C_MOB1,Corrupt Orc Zombie,Corrupt Orc Zombie,158,375000,1,12390,16104,1,948,215,150,150,180,145,202,40,88,30,10,12,1,7,49,0x0000085,170,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,27328,1 3017,EP14_3_DEATH_C_MOB2,Corrupt Verit,Corrupt Verit,158,352715,1,12390,16104,1,948,215,200,100,166,87,150,60,150,130,10,12,1,2,49,0x0000085,150,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0 3018,EP14_3_DEATH_C_MOB3,Corrupt Megalodon,Corrupt Megalodon,158,347413,1,12390,16104,1,948,215,240,300,157,80,140,90,209,84,10,12,1,5,49,0x0000085,170,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0 //3019,CELINE_KIMI -3020,FIRE_CONDOR,Fire Condor,Fire Condor,141,125114,1,7021,7481,1,38,1201,71,45,104,72,66,10,113,52,10,12,1,2,43,0x0000081,110,1148,648,480,0,0,0,0,0,0,0,6691,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -3021,FIRE_SAND_MAN,Fire Sand Man,Fire Sandman,143,130501,1,7207,7734,1,38,1356,122,73,84,36,25,55,124,35,10,12,1,0,63,0x003885,150,1672,720,288,0,0,0,0,0,0,0,6694,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -3022,FIRE_FRILLDORA,Fire Frilldora,Fire Frilldora,147,141301,1,7807,8199,1,38,1392,134,40,148,38,128,45,121,30,10,12,1,2,63,0x0000081,130,1540,720,432,0,0,0,0,0,0,0,6694,1500,6696,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -3023,FIRE_GOLEM,Fire Golem,Fire Golem,148,180213,1,8912,9464,1,38,1321,292,102,70,78,267,25,84,25,10,12,2,0,83,0x003885,200,1608,816,396,0,0,0,0,0,0,0,6693,2000,6695,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +3020,FIRE_CONDOR,Fire Condor,Fire Condor,141,125114,1,7021,7481,1,38,1201,71,45,104,72,66,10,113,52,10,12,1,2,43,0x0000081,110,1148,648,480,0,0,0,0,0,0,0,6691,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27026,1 +3021,FIRE_SAND_MAN,Fire Sand Man,Fire Sandman,143,130501,1,7207,7734,1,38,1356,122,73,84,36,25,55,124,35,10,12,1,0,63,0x003885,150,1672,720,288,0,0,0,0,0,0,0,6694,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27027,1 +3022,FIRE_FRILLDORA,Fire Frilldora,Fire Frilldora,147,141301,1,7807,8199,1,38,1392,134,40,148,38,128,45,121,30,10,12,1,2,63,0x0000081,130,1540,720,432,0,0,0,0,0,0,0,6694,1500,6696,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27028,1 +3023,FIRE_GOLEM,Fire Golem,Fire Golem,148,180213,1,8912,9464,1,38,1321,292,102,70,78,267,25,84,25,10,12,2,0,83,0x003885,200,1608,816,396,0,0,0,0,0,0,0,6693,2000,6695,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27029,1 //3024,14_3_MERCENARY_A //3025,14_3_MERCENARY_B 3026,FIREPIT,Fire Pit,Fire Pit,17,10,1,58,43,1,38,12,20,3,15,8,17,0,15,0,10,12,1,1,29,0x170000,400,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -3027,FULBUK,Fire Bug,Fire Bug,150,234,1,58,47,1,38,12,20,3,15,8,17,0,15,0,10,12,1,1,29,0x0000001,120,1288,288,768,0,0,0,0,0,0,0,6689,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +3027,FULBUK,Fire Bug,Fire Bug,150,234,1,58,47,1,38,12,20,3,15,8,17,0,15,0,10,12,1,1,29,0x0000001,120,1288,288,768,0,0,0,0,0,0,0,6689,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27030,1 3028,SONIA,Sonia,Sonia,17,20,1,58,43,1,38,12,20,3,15,8,17,0,15,0,10,12,1,1,29,0x170000,400,2612,912,288,0,0,0,0,0,0,0,6690,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -3029,GRIM_REAPER_ANKOU,Grim Reaper Ankou,Reaper Yanku,159,50000000,1553,300000,330000,1,1500,1000,200,70,200,100,200,200,220,100,10,12,2,1,89,0x6200085,200,900,864,480,0,0,0,0,0,0,0,607,500,603,200,604,200,22537,10000,0,0,522,200,0,0,0,0,0,0,0,0 +3029,GRIM_REAPER_ANKOU,Grim Reaper Ankou,Reaper Yanku,159,50000000,1553,300000,330000,1,1500,1000,200,70,200,100,200,200,220,100,10,12,2,1,89,0x6200085,200,900,864,480,0,0,0,0,0,0,0,607,500,603,200,604,200,22537,10000,0,0,522,200,0,0,0,0,0,0,27327,1 //3030,STANDING_SOUL //3031,MUTANT_NECROMANCER //3032,MUTANT_GHOUL @@ -2248,13 +2248,13 @@ //3088,MM_BRINARANEA_BABY,Mm Brinaranea Baby,Mm Brinaranea Baby,155,155600,1,0,1,1,1,1,80,200,16,26,30,115,79,5,10,12,2,0,20,0x0,300,1000,1000,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //3089,MM_LOCO_KASA,Mm Loco Kasa,Mm Loco Kasa,155,185000,1,0,0,1,3266,666,30,30,88,44,88,21,95,44,10,12,2,6,47,0x2000000,200,1500,600,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //3090,MM_LOCO_SALAMANDER,Mm Loco Salamander,Mm Loco Salamander,155,217650,1,0,0,1,2678,1257,121,36,60,103,45,35,172,15,10,12,1,6,47,0x2000000,200,1000,500,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -3091,MM_BRINARANEA,Brinaranea,Brinaranea,165,81650000,1,0,0,3,8255,197,264,177,135,135,12,72,220,91,10,12,2,6,61,0x6280000,200,1020,500,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -3092,MM_MUSPELLSKOLL,Muspellskoll,Muspellskoll,165,55620000,1,0,0,3,9672,98,211,140,202,119,6,45,275,71,10,12,2,6,63,0x6280000,200,608,408,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +3091,MM_BRINARANEA,Brinaranea,Brinaranea,165,81650000,1,0,0,3,8255,197,264,177,135,135,12,72,220,91,10,12,2,6,61,0x6280000,200,1020,500,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27324,1 +3092,MM_MUSPELLSKOLL,Muspellskoll,Muspellskoll,165,55620000,1,0,0,3,9672,98,211,140,202,119,6,45,275,71,10,12,2,6,63,0x6280000,200,608,408,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27325,1 //3093,MM_BRINARANEA_CORE,Mm Brinaranea Core,Mm Brinaranea Core,160,300,1,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,6,21,0x2170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //3094,MM_MUSPELLSKOLL_CORE,Mm Muspellskoll Core,Mm Muspellskoll Core,160,300,1,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,6,23,0x2170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //3095,MM_GOD_SHADOW,Mm God Shadow,Mm God Shadow,1,100000000,1,0,0,0,2,1,1,1,1,1,1,1,1,1,10,12,0,6,23,0x2170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -//3096,MM_MOROCC_KID,Mm Morocc Kid,Mm Morocc Kid,175,80000000,1,0,0,3,4980,209,158,134,90,122,7,87,287,36,10,12,0,6,66,0x6280000,200,1000,460,350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -3097,MM_MOROCC_ADT,Despair God Morocc,Despair God Morocc,175,120000000,1,0,0,3,5523,175,203,155,122,103,12,106,269,51,10,12,1,6,47,0x6280000,200,750,510,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +//3096,MM_MOROCC_KID,Mm Morocc Kid,Mm Morocc Kid,175,80000000,1,0,0,3,4980,209,158,134,90,122,7,87,287,36,10,12,0,6,66,0x6280000,200,1000,460,350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4559,1 +3097,MM_MOROCC_ADT,Despair God Morocc,Despair God Morocc,175,120000000,1,0,0,3,5523,175,203,155,122,103,12,106,269,51,10,12,1,6,47,0x6280000,200,750,510,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27321,1 //3098,MM_MOROCC_ORIGIN,Mm Morocc Origin,Mm Morocc Origin,160,3258000,1,0,0,3,6177,40,351,212,195,35,5,36,355,7,10,12,2,6,87,0x6280000,350,2000,750,750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //3099,MM_MOROCC_REST,Mm Morocc Rest,Mm Morocc Rest,160,1450000,1,0,0,3,2963,67,112,98,110,98,13,48,271,9,10,12,2,6,87,0x6280000,200,500,510,350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //3100,MM_MANA_BLACK,Mm Mana Black,Mm Mana Black,1,30,0,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,0,20,0x170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 @@ -2262,8 +2262,8 @@ 3102,MM_MANA_RED,Mana of Life,Mana of Life,1,30,0,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,0,20,0x170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3103,MM_MANA_YELLOW,Mana of Earth,Mana of Earth,1,30,0,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,0,20,0x170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //3104,MM_MANA_BLUE,Mm Mana Blue,Mm Mana Blue,1,30,0,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,0,20,0x170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -//3105,MM_GB_MOROCC_1,Mm Gb Morocc 1,Mm Gb Morocc 1,149,5000000,1,0,0,1,1901,145,199,35,126,91,63,61,114,37,10,12,2,8,43,0x6200000,110,576,480,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -//3106,MM_GB_MOROCC_4,Mm Gb Morocc 4,Mm Gb Morocc 4,149,5000000,1,0,0,1,1235,599,109,54,114,88,62,97,164,43,10,12,1,6,68,0x6200000,150,1536,648,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +//3105,MM_GB_MOROCC_1,Mm Gb Morocc 1,Mm Gb Morocc 1,149,5000000,1,0,0,1,1901,145,199,35,126,91,63,61,114,37,10,12,2,8,43,0x6200000,110,576,480,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27322,1 +//3106,MM_GB_MOROCC_4,Mm Gb Morocc 4,Mm Gb Morocc 4,149,5000000,1,0,0,1,1235,599,109,54,114,88,62,97,164,43,10,12,1,6,68,0x6200000,150,1536,648,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27323,1 //3107,E_EASTER_BUNNY,Easter Bunny,Easter Bunny,1,15,1,0,0,1,0,0,160,5,1,1,1,1,999,1,10,12,1,2,60,0x1F0000,200,1456,456,336,0,0,0,0,0,0,0,22571,3000,949,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3108,JITTERBUG1,Jitterbug1,Jitterbug1,135,2614000,1,36804,23170,1,3210,695,123,68,189,78,81,51,108,56,10,12,2,6,49,0x6203695,150,676,2400,480,0,0,0,0,0,0,0,1935,250,2988,500,15101,500,6719,5000,6719,1000,0,0,0,0,0,0,0,0,27109,1 3109,JITTERBUG2,Jitterbug2,Jitterbug2,135,2614000,1,36804,23170,1,3210,695,123,68,189,78,81,51,108,56,10,12,2,6,49,0x6203695,150,676,2400,480,0,0,0,0,0,0,0,1990,250,2989,500,15100,500,6719,5000,6719,1000,0,0,0,0,0,0,0,0,27109,1 From 53ad415e7a1394c3de2c2bdf42ffc58888ba97f5 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Tue, 28 Apr 2020 17:51:36 +0200 Subject: [PATCH 070/212] SQL synchronization --- sql-files/item_db_re.sql | 2 +- sql-files/mob_db_re.sql | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 7857ca54b8..d991a3d07c 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -12350,7 +12350,7 @@ REPLACE INTO `item_db_re` VALUES (27317,'Mutant_Twin_Caput_Card','Mutant Twin Ca REPLACE INTO `item_db_re` VALUES (27318,'Miguel_Card','Miguel Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus bCritAtkRate,20; bonus2 bSubRace,RC_All,-10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27319,'R48_85_BESTIA_Card','R48-85-BESTIA Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus2 bAddEle,Ele_Poison,40;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27320,'E_EA1L_card','E-EA1L card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'.@r = getrefine(); .@val = 3; if (.@r >= 9) { .@val += 2; if (.@r >= 11) { .@val += 5; } } bonus2 bMagicAtkEle,Ele_Fire,.@val;',NULL,NULL); -#REPLACE INTO `item_db_re` VALUES (27321,'Despair_God_Morocc_Card','Despair God Morocc Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus2 bAddClass,Class_All,10; bonus bMaxHPRate,-50; bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_Player,30; bonus2 bAddRace,RC_Angel,30; autobonus3 "{ }",1000,5000,"NV_FIRSTAID","{ active_transform 3097,5000; }"; /* unknown transformation rates */',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (27321,'Despair_God_Morocc_Card','Despair God Morocc Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus2 bAddClass,Class_All,10; bonus bMaxHPRate,-50; bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_Player,30; bonus2 bAddRace,RC_Angel,30; autobonus3 "{ }",1000,5000,"NV_FIRSTAID","{ active_transform 3097,5000; }"; /* unknown transformation rates */',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27322,'Demon_God\'s_Apostle_Ahat_Card','Demon God\'s Apostle Ahat Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus bMaxSPrate,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27323,'Demon_God\'s_Apostle_Shnaim_Card','Demon God\'s Apostle Shnaim Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (27324,'Brinaranea_Card','Brinaranea Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus2 bMagicAtkEle,Ele_Water,15;',NULL,NULL); diff --git a/sql-files/mob_db_re.sql b/sql-files/mob_db_re.sql index 35a545f4d8..6161c5686a 100644 --- a/sql-files/mob_db_re.sql +++ b/sql-files/mob_db_re.sql @@ -2223,7 +2223,7 @@ REPLACE INTO `mob_db_re` VALUES (2995,'XM_TEDDY_BEAR','Abandoned Teddy Bear','Ab REPLACE INTO `mob_db_re` VALUES (2996,'XM_CELINE_KIMI','Celine Kimi','Celine Kimi',160,66666666,1,4444444,4033332,2,6666,6666,479,444,144,166,44,444,166,166,10,12,2,1,28,0x6283695,100,768,1056,480,444444,616,10000,617,10000,22534,10000,22534,4000,18549,4000,7642,4000,19701,100,13442,100,712,10000,0,0,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (2997,'G_XM_CELINE_KIMI','Kimi\'s Phantom','Kimi\'s Phantom',160,66666666,1,0,0,2,6666,6666,479,444,144,166,44,444,166,166,10,12,2,1,28,0x6203695,100,768,1056,480,0,0,0,0,0,0,0,6683,10000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (2998,'EP14_MORS_EVENT','Weakened Morocc','Weakened Morocc',158,1771440,1,12390,16104,1,1872,900,113,45,87,51,45,88,106,50,12,12,2,6,60,0x6200085,200,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (2999,'EP14_MORS_BOSSA','Morocc Necromancer','Morocc Necromancer',158,4000000,1,2106000,1336500,1,700,0,215,555,165,190,142,146,299,93,12,12,1,7,60,0x6280085,100,300,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,0,0,0,0,0,0,522,200,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2999,'EP14_MORS_BOSSA','Morocc Necromancer','Morocc Necromancer',158,4000000,1,2106000,1336500,1,700,0,215,555,165,190,142,146,299,93,12,12,1,7,60,0x6280085,100,300,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,0,0,0,0,0,0,522,200,0,0,0,0,27326,1); REPLACE INTO `mob_db_re` VALUES (3000,'EP14_MORS_BOSSB','Morocc Necromancer','Morocc Necromancer',101,80000000,1,2310750,1465200,12,700,1,1,1,1,1,1,180,1,1,12,12,1,7,82,0x6280084,2000,2700,384,288,0,0,0,0,0,0,0,607,2000,603,200,604,200,22537,10000,22537,10000,0,0,522,200,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3001,'EP14_MORS_MOB1','Morocc\'s Ghoul','Morocc\'s Ghoul',158,295240,1,1239,1610,1,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,1000,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3002,'EP14_MORS_MOB2','Morocc\'s Osiris','Morocc\'s Osiris',158,442860,1,1239,1610,1,1872,900,113,45,87,51,45,88,106,50,12,12,1,6,60,0x6200085,200,2612,824,440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); @@ -2240,20 +2240,20 @@ REPLACE INTO `mob_db_re` VALUES (3012,'EP14_3_DEATH_A_MOB3','Corrupt Familiar',' REPLACE INTO `mob_db_re` VALUES (3013,'EP14_3_DEATH_B_MOB1','Corrupt Orc Warrior','Corrupt Orc Warrior',158,300000,1,12390,16104,1,948,215,240,60,150,85,150,40,122,70,10,12,1,7,42,0x0000085,150,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3014,'EP14_3_DEATH_B_MOB2','Corrupt Desert Wolf','Corrupt Desert Wolf',158,292450,1,12390,16104,1,948,215,240,50,120,85,110,55,130,70,10,12,1,2,43,0x0000085,150,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3015,'EP14_3_DEATH_B_MOB3','Corrupt Phen','Corrupt Phen',158,284110,1,12390,16104,1,948,215,240,100,110,85,95,70,115,70,10,12,1,5,41,0x0000085,150,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3016,'EP14_3_DEATH_C_MOB1','Corrupt Orc Zombie','Corrupt Orc Zombie',158,375000,1,12390,16104,1,948,215,150,150,180,145,202,40,88,30,10,12,1,7,49,0x0000085,170,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (3016,'EP14_3_DEATH_C_MOB1','Corrupt Orc Zombie','Corrupt Orc Zombie',158,375000,1,12390,16104,1,948,215,150,150,180,145,202,40,88,30,10,12,1,7,49,0x0000085,170,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,27328,1); REPLACE INTO `mob_db_re` VALUES (3017,'EP14_3_DEATH_C_MOB2','Corrupt Verit','Corrupt Verit',158,352715,1,12390,16104,1,948,215,200,100,166,87,150,60,150,130,10,12,1,2,49,0x0000085,150,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3018,'EP14_3_DEATH_C_MOB3','Corrupt Megalodon','Corrupt Megalodon',158,347413,1,12390,16104,1,948,215,240,300,157,80,140,90,209,84,10,12,1,5,49,0x0000085,170,864,400,150,0,0,0,0,0,0,0,607,10,603,20,604,20,715,20,717,20,716,20,522,20,0,0,0,0,0,0); #3019,CELINE_KIMI -REPLACE INTO `mob_db_re` VALUES (3020,'FIRE_CONDOR','Fire Condor','Fire Condor',141,125114,1,7021,7481,1,38,1201,71,45,104,72,66,10,113,52,10,12,1,2,43,0x0000081,110,1148,648,480,0,0,0,0,0,0,0,6691,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3021,'FIRE_SAND_MAN','Fire Sand Man','Fire Sandman',143,130501,1,7207,7734,1,38,1356,122,73,84,36,25,55,124,35,10,12,1,0,63,0x003885,150,1672,720,288,0,0,0,0,0,0,0,6694,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3022,'FIRE_FRILLDORA','Fire Frilldora','Fire Frilldora',147,141301,1,7807,8199,1,38,1392,134,40,148,38,128,45,121,30,10,12,1,2,63,0x0000081,130,1540,720,432,0,0,0,0,0,0,0,6694,1500,6696,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3023,'FIRE_GOLEM','Fire Golem','Fire Golem',148,180213,1,8912,9464,1,38,1321,292,102,70,78,267,25,84,25,10,12,2,0,83,0x003885,200,1608,816,396,0,0,0,0,0,0,0,6693,2000,6695,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (3020,'FIRE_CONDOR','Fire Condor','Fire Condor',141,125114,1,7021,7481,1,38,1201,71,45,104,72,66,10,113,52,10,12,1,2,43,0x0000081,110,1148,648,480,0,0,0,0,0,0,0,6691,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27026,1); +REPLACE INTO `mob_db_re` VALUES (3021,'FIRE_SAND_MAN','Fire Sand Man','Fire Sandman',143,130501,1,7207,7734,1,38,1356,122,73,84,36,25,55,124,35,10,12,1,0,63,0x003885,150,1672,720,288,0,0,0,0,0,0,0,6694,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27027,1); +REPLACE INTO `mob_db_re` VALUES (3022,'FIRE_FRILLDORA','Fire Frilldora','Fire Frilldora',147,141301,1,7807,8199,1,38,1392,134,40,148,38,128,45,121,30,10,12,1,2,63,0x0000081,130,1540,720,432,0,0,0,0,0,0,0,6694,1500,6696,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27028,1); +REPLACE INTO `mob_db_re` VALUES (3023,'FIRE_GOLEM','Fire Golem','Fire Golem',148,180213,1,8912,9464,1,38,1321,292,102,70,78,267,25,84,25,10,12,2,0,83,0x003885,200,1608,816,396,0,0,0,0,0,0,0,6693,2000,6695,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27029,1); #3024,14_3_MERCENARY_A #3025,14_3_MERCENARY_B REPLACE INTO `mob_db_re` VALUES (3026,'FIREPIT','Fire Pit','Fire Pit',17,10,1,58,43,1,38,12,20,3,15,8,17,0,15,0,10,12,1,1,29,0x170000,400,2612,912,288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3027,'FULBUK','Fire Bug','Fire Bug',150,234,1,58,47,1,38,12,20,3,15,8,17,0,15,0,10,12,1,1,29,0x0000001,120,1288,288,768,0,0,0,0,0,0,0,6689,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (3027,'FULBUK','Fire Bug','Fire Bug',150,234,1,58,47,1,38,12,20,3,15,8,17,0,15,0,10,12,1,1,29,0x0000001,120,1288,288,768,0,0,0,0,0,0,0,6689,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27030,1); REPLACE INTO `mob_db_re` VALUES (3028,'SONIA','Sonia','Sonia',17,20,1,58,43,1,38,12,20,3,15,8,17,0,15,0,10,12,1,1,29,0x170000,400,2612,912,288,0,0,0,0,0,0,0,6690,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3029,'GRIM_REAPER_ANKOU','Grim Reaper Ankou','Reaper Yanku',159,50000000,1553,300000,330000,1,1500,1000,200,70,200,100,200,200,220,100,10,12,2,1,89,0x6200085,200,900,864,480,0,0,0,0,0,0,0,607,500,603,200,604,200,22537,10000,0,0,522,200,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (3029,'GRIM_REAPER_ANKOU','Grim Reaper Ankou','Reaper Yanku',159,50000000,1553,300000,330000,1,1500,1000,200,70,200,100,200,200,220,100,10,12,2,1,89,0x6200085,200,900,864,480,0,0,0,0,0,0,0,607,500,603,200,604,200,22537,10000,0,0,522,200,0,0,0,0,0,0,27327,1); #3030,STANDING_SOUL #3031,MUTANT_NECROMANCER #3032,MUTANT_GHOUL @@ -2315,13 +2315,13 @@ REPLACE INTO `mob_db_re` VALUES (3074,'TIMEHOLDER','Time Holder','Time Holder',1 #REPLACE INTO `mob_db_re` VALUES (3088,'MM_BRINARANEA_BABY','Mm Brinaranea Baby','Mm Brinaranea Baby',155,155600,1,0,1,1,1,1,80,200,16,26,30,115,79,5,10,12,2,0,20,0x0,300,1000,1000,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); #REPLACE INTO `mob_db_re` VALUES (3089,'MM_LOCO_KASA','Mm Loco Kasa','Mm Loco Kasa',155,185000,1,0,0,1,3266,666,30,30,88,44,88,21,95,44,10,12,2,6,47,0x2000000,200,1500,600,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); #REPLACE INTO `mob_db_re` VALUES (3090,'MM_LOCO_SALAMANDER','Mm Loco Salamander','Mm Loco Salamander',155,217650,1,0,0,1,2678,1257,121,36,60,103,45,35,172,15,10,12,1,6,47,0x2000000,200,1000,500,600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3091,'MM_BRINARANEA','Brinaranea','Brinaranea',165,81650000,1,0,0,3,8255,197,264,177,135,135,12,72,220,91,10,12,2,6,61,0x6280000,200,1020,500,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3092,'MM_MUSPELLSKOLL','Muspellskoll','Muspellskoll',165,55620000,1,0,0,3,9672,98,211,140,202,119,6,45,275,71,10,12,2,6,63,0x6280000,200,608,408,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (3091,'MM_BRINARANEA','Brinaranea','Brinaranea',165,81650000,1,0,0,3,8255,197,264,177,135,135,12,72,220,91,10,12,2,6,61,0x6280000,200,1020,500,768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27324,1); +REPLACE INTO `mob_db_re` VALUES (3092,'MM_MUSPELLSKOLL','Muspellskoll','Muspellskoll',165,55620000,1,0,0,3,9672,98,211,140,202,119,6,45,275,71,10,12,2,6,63,0x6280000,200,608,408,336,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27325,1); #REPLACE INTO `mob_db_re` VALUES (3093,'MM_BRINARANEA_CORE','Mm Brinaranea Core','Mm Brinaranea Core',160,300,1,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,6,21,0x2170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); #REPLACE INTO `mob_db_re` VALUES (3094,'MM_MUSPELLSKOLL_CORE','Mm Muspellskoll Core','Mm Muspellskoll Core',160,300,1,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,6,23,0x2170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); #REPLACE INTO `mob_db_re` VALUES (3095,'MM_GOD_SHADOW','Mm God Shadow','Mm God Shadow',1,100000000,1,0,0,0,2,1,1,1,1,1,1,1,1,1,10,12,0,6,23,0x2170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -#REPLACE INTO `mob_db_re` VALUES (3096,'MM_MOROCC_KID','Mm Morocc Kid','Mm Morocc Kid',175,80000000,1,0,0,3,4980,209,158,134,90,122,7,87,287,36,10,12,0,6,66,0x6280000,200,1000,460,350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -REPLACE INTO `mob_db_re` VALUES (3097,'MM_MOROCC_ADT','Despair God Morocc','Despair God Morocc',175,120000000,1,0,0,3,5523,175,203,155,122,103,12,106,269,51,10,12,1,6,47,0x6280000,200,750,510,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +#REPLACE INTO `mob_db_re` VALUES (3096,'MM_MOROCC_KID','Mm Morocc Kid','Mm Morocc Kid',175,80000000,1,0,0,3,4980,209,158,134,90,122,7,87,287,36,10,12,0,6,66,0x6280000,200,1000,460,350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4559,1); +REPLACE INTO `mob_db_re` VALUES (3097,'MM_MOROCC_ADT','Despair God Morocc','Despair God Morocc',175,120000000,1,0,0,3,5523,175,203,155,122,103,12,106,269,51,10,12,1,6,47,0x6280000,200,750,510,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27321,1); #REPLACE INTO `mob_db_re` VALUES (3098,'MM_MOROCC_ORIGIN','Mm Morocc Origin','Mm Morocc Origin',160,3258000,1,0,0,3,6177,40,351,212,195,35,5,36,355,7,10,12,2,6,87,0x6280000,350,2000,750,750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); #REPLACE INTO `mob_db_re` VALUES (3099,'MM_MOROCC_REST','Mm Morocc Rest','Mm Morocc Rest',160,1450000,1,0,0,3,2963,67,112,98,110,98,13,48,271,9,10,12,2,6,87,0x6280000,200,500,510,350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); #REPLACE INTO `mob_db_re` VALUES (3100,'MM_MANA_BLACK','Mm Mana Black','Mm Mana Black',1,30,0,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,0,20,0x170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); @@ -2329,8 +2329,8 @@ REPLACE INTO `mob_db_re` VALUES (3101,'MM_MANA_WHITE','Mana White','Mana White', REPLACE INTO `mob_db_re` VALUES (3102,'MM_MANA_RED','Mana of Life','Mana of Life',1,30,0,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,0,20,0x170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3103,'MM_MANA_YELLOW','Mana of Earth','Mana of Earth',1,30,0,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,0,20,0x170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); #REPLACE INTO `mob_db_re` VALUES (3104,'MM_MANA_BLUE','Mm Mana Blue','Mm Mana Blue',1,30,0,0,0,0,1,1,1,1,1,1,1,1,1,1,10,12,0,0,20,0x170000,2000,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -#REPLACE INTO `mob_db_re` VALUES (3105,'MM_GB_MOROCC_1','Mm Gb Morocc 1','Mm Gb Morocc 1',149,5000000,1,0,0,1,1901,145,199,35,126,91,63,61,114,37,10,12,2,8,43,0x6200000,110,576,480,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -#REPLACE INTO `mob_db_re` VALUES (3106,'MM_GB_MOROCC_4','Mm Gb Morocc 4','Mm Gb Morocc 4',149,5000000,1,0,0,1,1235,599,109,54,114,88,62,97,164,43,10,12,1,6,68,0x6200000,150,1536,648,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +#REPLACE INTO `mob_db_re` VALUES (3105,'MM_GB_MOROCC_1','Mm Gb Morocc 1','Mm Gb Morocc 1',149,5000000,1,0,0,1,1901,145,199,35,126,91,63,61,114,37,10,12,2,8,43,0x6200000,110,576,480,432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27322,1); +#REPLACE INTO `mob_db_re` VALUES (3106,'MM_GB_MOROCC_4','Mm Gb Morocc 4','Mm Gb Morocc 4',149,5000000,1,0,0,1,1235,599,109,54,114,88,62,97,164,43,10,12,1,6,68,0x6200000,150,1536,648,300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27323,1); #REPLACE INTO `mob_db_re` VALUES (3107,'E_EASTER_BUNNY','Easter Bunny','Easter Bunny',1,15,1,0,0,1,0,0,160,5,1,1,1,1,999,1,10,12,1,2,60,0x1F0000,200,1456,456,336,0,0,0,0,0,0,0,22571,3000,949,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); REPLACE INTO `mob_db_re` VALUES (3108,'JITTERBUG1','Jitterbug1','Jitterbug1',135,2614000,1,36804,23170,1,3210,695,123,68,189,78,81,51,108,56,10,12,2,6,49,0x6203695,150,676,2400,480,0,0,0,0,0,0,0,1935,250,2988,500,15101,500,6719,5000,6719,1000,0,0,0,0,0,0,0,0,27109,1); REPLACE INTO `mob_db_re` VALUES (3109,'JITTERBUG2','Jitterbug2','Jitterbug2',135,2614000,1,36804,23170,1,3210,695,123,68,189,78,81,51,108,56,10,12,2,6,49,0x6203695,150,676,2400,480,0,0,0,0,0,0,0,1990,250,2989,500,15100,500,6719,5000,6719,1000,0,0,0,0,0,0,0,0,27109,1); From 4829f3775d5371e65d6648cf05b6f0c2810bb664 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 30 Apr 2020 00:55:06 +1000 Subject: [PATCH 071/212] Fix Lord of Vermilion damage (#4855) * Fixes #4852. * Fixes Lord of Vermilion damage not accounting for the total of each hit. Thanks to @mazvi and @Latiosu! --- src/map/battle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 208f2e45f3..b225ae318c 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -6247,7 +6247,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case WZ_VERMILION: if(sd) - skillratio += 25 + skill_lv * 5; + skillratio += 300 + skill_lv * 100; else skillratio += 20 * skill_lv - 20; //Monsters use old formula break; From fe14af99625d16f3c7ef1e8192a2d3b0214f33f1 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Thu, 30 Apr 2020 01:44:53 +0200 Subject: [PATCH 072/212] Fixed duplicate itemshops and pointshops (#4850) --- src/map/npc.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/map/npc.cpp b/src/map/npc.cpp index b5600a7d2e..581c857d6c 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -3429,6 +3429,8 @@ const char* npc_parse_duplicate(char* w1, char* w2, char* w3, char* w4, const ch case NPCTYPE_POINTSHOP: case NPCTYPE_MARKETSHOP: ++npc_shop; + safestrncpy( dnd->u.shop.pointshop_str, nd->u.shop.pointshop_str, strlen( nd->u.shop.pointshop_str ) ); + nd->u.shop.itemshop_nameid = dnd->u.shop.itemshop_nameid; nd->u.shop.shop_item = dnd->u.shop.shop_item; nd->u.shop.count = dnd->u.shop.count; break; From 331b31d8cf5b6c25c9c5302f0c038d179cdf38ec Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 30 Apr 2020 11:08:56 +1000 Subject: [PATCH 073/212] Fix WZ_HEAVENDRIVE skill ratio (#4862) * Adjusted to account for the default 100. Thanks to @Latiosu! --- src/map/battle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index b225ae318c..0388893a6e 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -6240,7 +6240,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; #ifdef RENEWAL case WZ_HEAVENDRIVE: - skillratio += 125; + skillratio += 25; break; case WZ_METEOR: skillratio += 25; From 2ca94ad41158f6b8432a97970af82922a79ee472 Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 30 Apr 2020 09:33:38 -0400 Subject: [PATCH 074/212] Adds back removed skills from kRO (#4803) * Fixes #4802. * Adds back AB_EUCHARISTICA, GN_SLINGITEM, and GN_MAKEBOMB. * Adds back CR_CULTIVATION for renewal. * Skills are disabled in the skill tree database but gives easy ability to re-enable. * Fixes an issue with pre-renewal produce database spitting errors when using any production-type skills. Thanks to @trinitynetworks! --- db/pre-re/produce_db.txt | 10 ++-- db/pre-re/skill_db.yml | 65 +++++++++++++++----- db/pre-re/skill_nocast_db.txt | 1 + db/pre-re/skill_tree.txt | 9 +++ db/re/produce_db.txt | 72 +++++++++++++---------- db/re/skill_db.yml | 87 ++++++++++++++++++++------- db/re/skill_nocast_db.txt | 5 ++ db/re/skill_tree.txt | 11 ++++ src/map/battle.cpp | 29 +++++++++ src/map/itemdb.hpp | 13 +++- src/map/skill.cpp | 108 ++++++++++++++++++++++++++++++++-- src/map/skill.hpp | 10 ++-- src/map/status.cpp | 10 ++++ 13 files changed, 348 insertions(+), 82 deletions(-) diff --git a/db/pre-re/produce_db.txt b/db/pre-re/produce_db.txt index d5d36204fa..72ea41ac47 100644 --- a/db/pre-re/produce_db.txt +++ b/db/pre-re/produce_db.txt @@ -618,15 +618,15 @@ //---- Create Bomb --- ItemLV=28 --------------- //-- Apple Bomb <-- GN_MAKEBOMB Lv1, Apple Bomb CB, 1 Apple, 1 Scell, 1 Detonator, 1 Gun Powder -246,13260,28,2496,1,6279,0,512,1,911,1,1051,1,6244,1 +//246,13260,28,2496,1,6279,0,512,1,911,1,1051,1,6244,1 //-- Coconut Bomb <-- GN_MAKEBOMB Lv1, Coconut Bomb CB, 1 Detonator, 1 Coconut Fruit, 2 Gun Powder -247,13261,28,2496,1,6281,0,1051,1,6263,1,6244,2 +//247,13261,28,2496,1,6281,0,1051,1,6263,1,6244,2 //-- Melon Bomb <-- GN_MAKEBOMB Lv1, Melon Bomb CB, 1 Sticky Mucus, 1 Detonator, 2 Gun Powder, 1 Melon -248,13262,28,2496,1,6282,0,938,1,1051,1,6244,2,6264,1 +//248,13262,28,2496,1,6282,0,938,1,1051,1,6244,2,6264,1 //-- Pineapple Bomb <-- GN_MAKEBOMB Lv1, Pinepple Bomb CB, 1 Cactus Needle, 1 Detonator, 3 Gun Powder, 1 Pineapple -249,13263,28,2496,1,6280,0,952,1,1051,1,6244,3,6265,1 +//249,13263,28,2496,1,6280,0,952,1,1051,1,6244,3,6265,1 //-- Banana Bomb <-- GN_MAKEBOMB Lv1, Banana Bomb CB, 1 Banana, 1 Detonator, 4 Gun Powder, 1 Mould Powder -250,13264,28,2496,1,6283,0,513,1,1051,1,6244,4,7001,1 +//250,13264,28,2496,1,6283,0,513,1,1051,1,6244,4,7001,1 //---- Special Pharmacy --- ItemLV=29 ---------- //-- Seed Of Horny Plant <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Prickly Fruit diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index 1af3fa6869..ae124f184b 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -19244,10 +19244,10 @@ Body: Amount: 70 - Level: 4 Amount: 80 -# - Id: 2049 # Removed on kRO -# Name: AB_EUCHARISTICA -# Description: Eucharistica -# MaxLevel: 10 + - Id: 2049 # Removed on kRO + Name: AB_EUCHARISTICA + Description: Eucharistica + MaxLevel: 10 - Id: 2050 Name: AB_RENOVATIO Description: Renovatio @@ -27233,10 +27233,25 @@ Body: ItemCost: - Item: Mandragora_Flowerpot Amount: 1 -# - Id: 2493 # Removed on kRO -# Name: GN_SLINGITEM -# Description: Sling Item -# MaxLevel: 1 + - Id: 2493 # Removed on kRO + Name: GN_SLINGITEM + Description: Sling Item + MaxLevel: 1 + TargetType: Support + DamageFlags: + NoDamage: true + Flags: + NoTargetSelf: true + Range: 11 + Hit: Single + HitCount: 1 + Cooldown: 1000 + FixedCastTime: -1 + Requires: + SpCost: 4 + Ammo: + Throwweapon: true + AmmoAmount: 1 - Id: 2494 Name: GN_CHANGEMATERIAL Description: Change Material @@ -27263,10 +27278,21 @@ Body: Amount: 5 - Level: 2 Amount: 40 -# - Id: 2496 # Removed on kRO -# Name: GN_MAKEBOMB -# Description: Create Bomb -# MaxLevel: 2 + - Id: 2496 # Removed on kRO + Name: GN_MAKEBOMB + Description: Create Bomb + MaxLevel: 2 + TargetType: Self + DamageFlags: + NoDamage: true + Hit: Single + HitCount: 1 + Requires: + SpCost: + - Level: 1 + Amount: 5 + - Level: 2 + Amount: 40 - Id: 2497 Name: GN_S_PHARMACY Description: Special Pharmacy @@ -27278,10 +27304,17 @@ Body: HitCount: 1 Requires: SpCost: 12 -# - Id: 2498 # Removed on kRO -# Name: GN_SLINGITEM_RANGEMELEEATK -# Description: Sling Item Attack -# MaxLevel: 1 + - Id: 2498 # Removed on kRO + Name: GN_SLINGITEM_RANGEMELEEATK + Description: Sling Item Attack + MaxLevel: 1 + Type: Weapon + TargetType: Attack + Range: 11 + Hit: Single + HitCount: 1 + Requires: + SpCost: 1 - Id: 2533 Name: ALL_ODINS_RECALL Description: Odin's Recall diff --git a/db/pre-re/skill_nocast_db.txt b/db/pre-re/skill_nocast_db.txt index f0bcf50c4c..5081ede917 100644 --- a/db/pre-re/skill_nocast_db.txt +++ b/db/pre-re/skill_nocast_db.txt @@ -179,3 +179,4 @@ 2303,2048 //SC_BLOODYLUST 2419,2048 //WM_POEMOFNETHERWORLD 2482,2048 //GN_WALLOFTHORN +2493,2048 //GN_SLINGITEM diff --git a/db/pre-re/skill_tree.txt b/db/pre-re/skill_tree.txt index 8ac125d3ca..30d0ab48ec 100644 --- a/db/pre-re/skill_tree.txt +++ b/db/pre-re/skill_tree.txt @@ -2577,6 +2577,7 @@ 4057,2046,10,2045,5,0,0,0,0,0,0,0,0 //AB_ORATIO#Oratio# 4057,2047,4,72,1,0,0,0,0,0,0,0,0 //AB_LAUDAAGNUS#Lauda Agnus# 4057,2048,4,2047,2,0,0,0,0,0,0,0,0 //AB_LAUDARAMUS#Lauda Ramus# +//4057,2049,10,2044,1,2053,1,0,0,0,0,0,0 //AB_EUCHARISTICA#Eucharistica# 4057,2050,4,2043,3,0,0,0,0,0,0,0,0 //AB_RENOVATIO#Renovatio# 4057,2051,5,2050,1,0,0,0,0,0,0,0,0 //AB_HIGHNESSHEAL#Highness Heal# 4057,2052,5,2048,2,0,0,0,0,0,0,0,0 //AB_CLEARANCE#Clearance# @@ -2923,6 +2924,7 @@ 4063,2046,10,2045,5,0,0,0,0,0,0,0,0 //AB_ORATIO#Oratio# 4063,2047,4,72,1,0,0,0,0,0,0,0,0 //AB_LAUDAAGNUS#Lauda Agnus# 4063,2048,4,2047,2,0,0,0,0,0,0,0,0 //AB_LAUDARAMUS#Lauda Ramus# +//4063,2049,10,2044,1,2053,1,0,0,0,0,0,0 //AB_EUCHARISTICA#Eucharistica# 4063,2050,4,2043,3,0,0,0,0,0,0,0,0 //AB_RENOVATIO#Renovatio# 4063,2051,5,2050,1,0,0,0,0,0,0,0,0 //AB_HIGHNESSHEAL#Highness Heal# 4063,2052,5,2048,2,0,0,0,0,0,0,0,0 //AB_CLEARANCE#Clearance# @@ -3403,8 +3405,10 @@ 4071,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4071,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4071,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# +//4071,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item# 4071,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4071,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# +//4071,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb# 4071,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4071,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4071,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# @@ -3845,8 +3849,10 @@ 4078,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4078,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4078,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# +//4078,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item# 4078,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4078,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# +//4078,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb# 4078,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4078,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4078,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# @@ -4574,6 +4580,7 @@ 4099,2046,10,2045,5,0,0,0,0,0,0,0,0 //AB_ORATIO#Oratio# 4099,2047,4,72,1,0,0,0,0,0,0,0,0 //AB_LAUDAAGNUS#Lauda Agnus# 4099,2048,4,2047,2,0,0,0,0,0,0,0,0 //AB_LAUDARAMUS#Lauda Ramus# +//4099,2049,10,2044,1,2053,1,0,0,0,0,0,0 //AB_EUCHARISTICA#Eucharistica# 4099,2050,4,2043,3,0,0,0,0,0,0,0,0 //AB_RENOVATIO#Renovatio# 4099,2051,5,2050,1,0,0,0,0,0,0,0,0 //AB_HIGHNESSHEAL#Highness Heal# 4099,2052,5,2048,2,0,0,0,0,0,0,0,0 //AB_CLEARANCE#Clearance# @@ -5052,8 +5059,10 @@ 4107,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4107,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4107,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# +//4107,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item# 4107,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4107,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# +//4107,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb# 4107,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4107,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4107,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# diff --git a/db/re/produce_db.txt b/db/re/produce_db.txt index 427caead60..6160b53b91 100644 --- a/db/re/produce_db.txt +++ b/db/re/produce_db.txt @@ -616,69 +616,79 @@ //-- Petti Tail Noodle <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 2 Petti Tail, 1 Fine Noodle, 1 Cool Gravy 245,12434,27,2495,1,11022,0,6248,1,6260,2,6261,1,6262,1 -//---- Create Bomb --- ItemLV=28 --------------- Removed skill (free slot) +//---- Create Bomb --- ItemLV=28 --------------- +//-- Apple Bomb <-- GN_MAKEBOMB Lv1, Apple Bomb CB, 1 Apple, 1 Scell, 1 Detonator, 1 Gun Powder +//246,13260,28,2496,1,6279,0,512,1,911,1,1051,1,6244,1 +//-- Coconut Bomb <-- GN_MAKEBOMB Lv1, Coconut Bomb CB, 1 Detonator, 1 Coconut Fruit, 2 Gun Powder +//247,13261,28,2496,1,6281,0,1051,1,6263,1,6244,2 +//-- Melon Bomb <-- GN_MAKEBOMB Lv1, Melon Bomb CB, 1 Sticky Mucus, 1 Detonator, 2 Gun Powder, 1 Melon +//248,13262,28,2496,1,6282,0,938,1,1051,1,6244,2,6264,1 +//-- Pineapple Bomb <-- GN_MAKEBOMB Lv1, Pinepple Bomb CB, 1 Cactus Needle, 1 Detonator, 3 Gun Powder, 1 Pineapple +//249,13263,28,2496,1,6280,0,952,1,1051,1,6244,3,6265,1 +//-- Banana Bomb <-- GN_MAKEBOMB Lv1, Banana Bomb CB, 1 Banana, 1 Detonator, 4 Gun Powder, 1 Mould Powder +//250,13264,28,2496,1,6283,0,513,1,1051,1,6244,4,7001,1 //---- Special Pharmacy --- ItemLV=29 ---------- //-- Seed Of Horny Plant <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Prickly Fruit -246,6210,29,2497,1,6284,0,576,10 +251,6210,29,2497,1,6284,0,576,10 //-- Bloodsuck Plant Seed <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Root Of Maneater -247,6211,29,2497,1,6284,0,1033,10 +252,6211,29,2497,1,6284,0,1033,10 //-- Bomb Mushroom Spore <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Mushroom Spore, 2 Gun Powder, 5 Poison Spore -248,6212,29,2497,1,6284,0,921,10,6244,2,7033,5 +253,6212,29,2497,1,6284,0,921,10,6244,2,7033,5 //-- HP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 White Herb, 5 Monster's Feed, 10 Empty Bottle, 1 Hot Sauce -249,12422,29,2497,1,11023,0,509,10,528,5,713,10,7455,1 +254,12422,29,2497,1,11023,0,509,10,528,5,713,10,7455,1 //-- HP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 Yellow Herb, 10 White Herb, 10 Empty Bottle, 1 Hot Sauce -250,12423,29,2497,1,11023,0,508,10,509,10,713,10,7455,1 +255,12423,29,2497,1,11023,0,508,10,509,10,713,10,7455,1 //-- HP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 15 White Herb, 3 Fruit Of Mastela, 1 Holy Water, 10 Empty Bottle, 1 Hot Sauce -251,12424,29,2497,1,11023,0,509,15,522,3,523,1,713,10,7455,1 +256,12424,29,2497,1,11023,0,509,15,522,3,523,1,713,10,7455,1 //-- SP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Grape, 10 Lemon, 10 Empty Bottle, 1 Sweet Sauce -252,12425,29,2497,1,11024,0,514,10,568,10,713,10,7453,1 +257,12425,29,2497,1,11024,0,514,10,568,10,713,10,7453,1 //-- SP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Blue Herb, 10 Honey, 10 Empty Bottle, 1 Sweet Sauce -253,12426,29,2497,1,11024,0,510,10,518,10,713,10,7453,1 +258,12426,29,2497,1,11024,0,510,10,518,10,713,10,7453,1 //-- SP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 15 Blue Herb, 10 Royal Jelly, 10 Empty Bottle, 1 Sweet Sauce -254,12427,29,2497,1,11024,0,510,15,526,10,713,10,7453,1 +259,12427,29,2497,1,11024,0,510,15,526,10,713,10,7453,1 //-- Enrich White Potion Z <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 White Potion, 10 White Herb, 1 Alchol, 10 Empty Cylinder -255,12428,29,2497,1,6285,0,504,20,509,10,970,1,1092,10 +260,12428,29,2497,1,6285,0,504,20,509,10,970,1,1092,10 //-- Vitata 500 <-- GN_S_PHARMACY Lv1, Quality Potion Book, 10 Blue Herb, 10 Grape, 10 Honey, 10 Empty Cylinder -256,12436,29,2497,1,6285,0,510,10,514,10,518,10,1092,10 +261,12436,29,2497,1,6285,0,510,10,514,10,518,10,1092,10 //-- Enrich Celermine Juice <-- GN_S_PHARMACY Lv1, Quality Potion Book, 5 Center Potion, 5 Awakening Potion, 10 Empty Cylinder, 5 Hot Sauce -257,12437,29,2497,1,6285,0,645,5,656,5,1092,10,7455,5 +262,12437,29,2497,1,6285,0,645,5,656,5,1092,10,7455,5 //-- Cure Free <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 Green Herb, 1 Fruit Of Mastela, 5 Panacea, 1 Leaf Of Yggdrasil, 10 Empty Cylinder -258,12475,29,2497,1,6285,0,511,20,522,1,525,5,610,1,1092,10 +263,12475,29,2497,1,6285,0,511,20,522,1,525,5,610,1,1092,10 //-- Golden X <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Yggdrasilberry, 5 Gold -//259,100231,29,2497,1,1092,10,607,10,969,5 +//264,100231,29,2497,1,1092,10,607,10,969,5 //-- Red Herb Activator <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 45 Red Herb, 5 Yggdrasil Seed -//260,100232,29,2497,1,1092,10,507,45,608,5 +//265,100232,29,2497,1,1092,10,507,45,608,5 //-- Blue Herb Activator <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 15 Blue Herb, 5 Yggdrasil Seed -//261,100233,29,2497,1,1092,10,510,15,608,5 +//266,100233,29,2497,1,1092,10,510,15,608,5 //-- Concentrated Red Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Empty Potion Bottle, 15 Red Syrup -//262,1100003,29,2497,1,1092,10,1093,10,11621,15 +//267,1100003,29,2497,1,1092,10,1093,10,11621,15 //-- Concentrated Blue Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Empty Potion Bottle, 15 Blue Syrup -//263,1100004,29,2497,1,1092,10,1093,10,11624,15 +//268,1100004,29,2497,1,1092,10,1093,10,11624,15 //-- Concentrated Golden Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Empty Potion Bottle, 15 White Syrup, 15 Yellow Syrup -//264,1100005,29,2497,1,1092,10,1093,10,11623,15,11622,15 +//269,1100005,29,2497,1,1092,10,1093,10,11623,15,11622,15 //=============================================== //--------------------LEVEL 30----------- // Novice Red Potion (569) <-- 2 Red Herbs, 1 Apple -265,569,30,0,0,11058,0,507,2,512,1 +270,569,30,0,0,11058,0,507,2,512,1 // Novice Magnifier (12325) <-- 3 Fine-grained Trunk, 1 Jellopy -266,12325,30,0,0,11058,0,1066,3,909,1 +271,12325,30,0,0,11058,0,1066,3,909,1 // Novice Fly Wing (12323) <-- 2 Fluffs, 2 Feathers, 2 Jellopies -267,12323,30,0,0,11058,0,914,2,949,2,909,2 +272,12323,30,0,0,11058,0,914,2,949,2,909,2 // Novice Cutter (13040) <-- 10 Shells, 10 Worm Peelings, 1 Phracon -268,13040,30,0,0,11058,0,935,10,955,10,1010,1 +273,13040,30,0,0,11058,0,935,10,955,10,1010,1 // Little Unripe Apple (12846) <-- 1 Apple, 1 Green Herb -269,12846,30,0,0,11058,0,512,1,511,1 +274,12846,30,0,0,11058,0,512,1,511,1 // Four Leaf Clover (706) <-- 200 Clovers, 200 Sticky Mucus -270,706,30,0,0,11058,0,705,200,938,200 +275,706,30,0,0,11058,0,705,200,938,200 // Banana Juice (532) <-- 1 Banana, 1 Milk -271,532,30,0,0,11058,0,513,1,519,1 +276,532,30,0,0,11058,0,513,1,519,1 // Apple Juice (531) <-- 1 Apple, 1 Milk -272,531,30,0,0,11058,0,512,1,519,1 +277,531,30,0,0,11058,0,512,1,519,1 // Carrot Juice (534) <-- 1 Carrot, 1 Milk -273,534,30,0,0,11058,0,515,1,519,1 +278,534,30,0,0,11058,0,515,1,519,1 // Grape Juice (533) <-- 1 Grape, 1 Milk -274,533,30,0,0,11058,0,514,1,519,1 +279,533,30,0,0,11058,0,514,1,519,1 // Unripe Apple (619) <-- 10 Sticky Mucus, 20 Green Herbs, 10 Apples -275,619,30,0,0,11058,0,938,10,511,20,512,10 +280,619,30,0,0,11058,0,938,10,511,20,512,10 diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 0c028c6c31..4a960ce3a4 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -13591,10 +13591,24 @@ Body: Amount: 1 - Item: Acid_Bottle Amount: 1 -# - Id: 491 # Removed on kRO -# Name: CR_CULTIVATION -# Description: Plant Cultivation -# MaxLevel: 2 + - Id: 491 # Removed on kRO + Name: CR_CULTIVATION + Description: Plant Cultivation + MaxLevel: 2 + TargetType: Ground + DamageFlags: + NoDamage: true + Range: 1 + Hit: Single + HitCount: 1 + Duration1: 300000 + Requires: + SpCost: 10 + ItemCost: + - Item: Mushroom_Spore + Amount: 1 + - Item: Stem + Amount: 1 - Id: 492 Name: ITEM_ENCHANTARMS Description: Weapon Enchantment @@ -20010,10 +20024,10 @@ Body: Amount: 70 - Level: 4 Amount: 80 -# - Id: 2049 # Removed on kRO -# Name: AB_EUCHARISTICA -# Description: Eucharistica -# MaxLevel: 10 + - Id: 2049 # Removed on kRO + Name: AB_EUCHARISTICA + Description: Eucharistica + MaxLevel: 10 - Id: 2050 Name: AB_RENOVATIO Description: Renovatio @@ -28319,10 +28333,25 @@ Body: ItemCost: - Item: Mandragora_Flowerpot Amount: 1 -# - Id: 2493 # Removed on kRO -# Name: GN_SLINGITEM -# Description: Sling Item -# MaxLevel: 1 + - Id: 2493 # Removed on kRO + Name: GN_SLINGITEM + Description: Sling Item + MaxLevel: 1 + TargetType: Support + DamageFlags: + NoDamage: true + Flags: + NoTargetSelf: true + Range: 11 + Hit: Single + HitCount: 1 + Cooldown: 1000 + FixedCastTime: -1 + Requires: + SpCost: 4 + Ammo: + Throwweapon: true + AmmoAmount: 1 - Id: 2494 Name: GN_CHANGEMATERIAL Description: Change Material @@ -28349,10 +28378,21 @@ Body: Amount: 5 - Level: 2 Amount: 40 -# - Id: 2496 # Removed on kRO -# Name: GN_MAKEBOMB -# Description: Create Bomb -# MaxLevel: 2 + - Id: 2496 # Removed on kRO + Name: GN_MAKEBOMB + Description: Create Bomb + MaxLevel: 2 + TargetType: Self + DamageFlags: + NoDamage: true + Hit: Single + HitCount: 1 + Requires: + SpCost: + - Level: 1 + Amount: 5 + - Level: 2 + Amount: 40 - Id: 2497 Name: GN_S_PHARMACY Description: Special Pharmacy @@ -28364,10 +28404,17 @@ Body: HitCount: 1 Requires: SpCost: 12 -# - Id: 2498 # Removed on kRO -# Name: GN_SLINGITEM_RANGEMELEEATK -# Description: Sling Item Attack -# MaxLevel: 1 + - Id: 2498 # Removed on kRO + Name: GN_SLINGITEM_RANGEMELEEATK + Description: Sling Item Attack + MaxLevel: 1 + Type: Weapon + TargetType: Attack + Range: 11 + Hit: Single + HitCount: 1 + Requires: + SpCost: 1 - Id: 2533 Name: ALL_ODINS_RECALL Description: Odin's Recall diff --git a/db/re/skill_nocast_db.txt b/db/re/skill_nocast_db.txt index 8416237b93..2b84a15287 100644 --- a/db/re/skill_nocast_db.txt +++ b/db/re/skill_nocast_db.txt @@ -56,6 +56,7 @@ 395,4 //CG_MOONLIT 409,4 //WE_CALLPARENT 410,4 //WE_CALLBABY +491,4 //CR_CULTIVATION 530,4 //NJ_KIRIKAGE 691,4 //CASH_ASSUMPTIO 2284,4 //SC_FATALMENACE @@ -94,6 +95,7 @@ 438,8 //SG_SUN_BLESS 439,8 //SG_MOON_BLESS 440,8 //SG_STAR_BLESS +491,8 //CR_CULTIVATION 530,8 //NJ_KIRIKAGE 691,8 //CASH_ASSUMPITO 2284,8 //SC_FATALMENACE @@ -130,6 +132,7 @@ 409,16 // WE_CALLPARENT 410,16 // WE_CALLBABY 426,16 // TK_HIGHJUMP +491,16 //CR_CULTIVATION 529,16 // NJ_SHADOWJUMP // 530,16 // NJ_KIRIKAGE 691,16 // CASH_ASSUMPTIO @@ -216,9 +219,11 @@ //---------------------------------------------------------------------------- 232,2048 //AM_CANNIBALIZE 233,2048 //AM_SPHEREMINE +491,2048 //CR_CULTIVATION 1013,2048 //BS_GREED 2419,2048 //WM_POEMOFNETHERWORLD 2482,2048 //GN_WALLOFTHORN +2493,2048 //GN_SLINGITEM //---------------------------------------------------------------------------- // Zone 8 - WOE:TE Dungeons diff --git a/db/re/skill_tree.txt b/db/re/skill_tree.txt index f8aae0d36d..712d65db90 100644 --- a/db/re/skill_tree.txt +++ b/db/re/skill_tree.txt @@ -1266,6 +1266,7 @@ 4019,478,10,231,5,0,0,0,0,0,0,0,0 //CR_SLIMPITCHER#Aid Condensed Potion# 4019,479,5,234,5,235,5,236,5,237,5,0,0 //CR_FULLPROTECTION#Full Protection# 4019,490,10,229,5,230,5,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION#Acid Demonstration# +//4019,491,2,0,0,0,0,0,0,0,0,0,0 //CR_CULTIVATION#Cultivation# 4019,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# 4019,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher# 4019,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1# @@ -2603,6 +2604,7 @@ 4057,2046,10,2045,5,0,0,0,0,0,0,0,0 //AB_ORATIO#Oratio# 4057,2047,4,72,1,0,0,0,0,0,0,0,0 //AB_LAUDAAGNUS#Lauda Agnus# 4057,2048,4,2047,2,0,0,0,0,0,0,0,0 //AB_LAUDARAMUS#Lauda Ramus# +//4057,2049,10,2044,1,2053,1,0,0,0,0,0,0 //AB_EUCHARISTICA#Eucharistica# 4057,2050,4,2043,3,0,0,0,0,0,0,0,0 //AB_RENOVATIO#Renovatio# 4057,2051,5,2050,1,0,0,0,0,0,0,0,0 //AB_HIGHNESSHEAL#Highness Heal# 4057,2052,5,2048,2,0,0,0,0,0,0,0,0 //AB_CLEARANCE#Clearance# @@ -2951,6 +2953,7 @@ 4063,2046,10,2045,5,0,0,0,0,0,0,0,0 //AB_ORATIO#Oratio# 4063,2047,4,72,1,0,0,0,0,0,0,0,0 //AB_LAUDAAGNUS#Lauda Agnus# 4063,2048,4,2047,2,0,0,0,0,0,0,0,0 //AB_LAUDARAMUS#Lauda Ramus# +//4063,2049,10,2044,1,2053,1,0,0,0,0,0,0 //AB_EUCHARISTICA#Eucharistica# 4063,2050,4,2043,3,0,0,0,0,0,0,0,0 //AB_RENOVATIO#Renovatio# 4063,2051,5,2050,1,0,0,0,0,0,0,0,0 //AB_HIGHNESSHEAL#Highness Heal# 4063,2052,5,2048,2,0,0,0,0,0,0,0,0 //AB_CLEARANCE#Clearance# @@ -3433,8 +3436,10 @@ 4071,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4071,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4071,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# +//4071,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item# 4071,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4071,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# +//4071,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb# 4071,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4071,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4071,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# @@ -3857,6 +3862,7 @@ 4078,478,10,231,5,0,0,0,0,0,0,0,0 //CR_SLIMPITCHER#Aid Condensed Potion# 4078,479,5,234,5,235,5,236,5,237,5,0,0 //CR_FULLPROTECTION#Full Protection# 4078,490,10,229,5,230,5,0,0,0,0,0,0 //CR_ACIDDEMONSTRATION#Acid Demonstration# +//4078,491,2,0,0,0,0,0,0,0,0,0,0 //CR_CULTIVATION#Cultivation# 4078,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# 4078,446,1,0,0,0,0,0,0,0,0,0,0 //AM_BERSERKPITCHER#Berserk Pitcher# 4078,496,1,228,10,0,0,0,0,0,0,0,0 //AM_TWILIGHT1#Twilight Alchemy 1# @@ -3876,8 +3882,10 @@ 4078,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4078,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4078,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# +//4078,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item# 4078,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4078,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# +//4078,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb# 4078,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4078,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4078,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# @@ -4608,6 +4616,7 @@ 4099,2046,10,2045,5,0,0,0,0,0,0,0,0 //AB_ORATIO#Oratio# 4099,2047,4,72,1,0,0,0,0,0,0,0,0 //AB_LAUDAAGNUS#Lauda Agnus# 4099,2048,4,2047,2,0,0,0,0,0,0,0,0 //AB_LAUDARAMUS#Lauda Ramus# +//4099,2049,10,2044,1,2053,1,0,0,0,0,0,0 //AB_EUCHARISTICA#Eucharistica# 4099,2050,4,2043,3,0,0,0,0,0,0,0,0 //AB_RENOVATIO#Renovatio# 4099,2051,5,2050,1,0,0,0,0,0,0,0,0 //AB_HIGHNESSHEAL#Highness Heal# 4099,2052,5,2048,2,0,0,0,0,0,0,0,0 //AB_CLEARANCE#Clearance# @@ -5096,8 +5105,10 @@ 4107,2486,5,2485,3,0,0,0,0,0,0,0,0 //GN_FIRE_EXPANSION#Fire Expansion# 4107,2490,5,2480,3,0,0,0,0,0,0,0,0 //GN_HELLS_PLANT#Hell's Plant# 4107,2492,5,2490,3,0,0,0,0,0,0,0,0 //GN_MANDRAGORA#Howling of Mandragora# +//4107,2493,1,2494,1,0,0,0,0,0,0,0,0 //GN_SLINGITEM#Sling Item# 4107,2494,1,0,0,0,0,0,0,0,0,0,0 //GN_CHANGEMATERIAL#Change Material# 4107,2495,2,2497,1,0,0,0,0,0,0,0,0 //GN_MIX_COOKING#Mix Cooking# +//4107,2496,2,2495,1,0,0,0,0,0,0,0,0 //GN_MAKEBOMB#Create Bomb# 4107,2497,10,0,0,0,0,0,0,0,0,0,0 //GN_S_PHARMACY#Special Pharmacy# 4107,5003,5,2497,1,0,0,0,0,0,0,0,0 //GN_ILLUSIONDOOPING#Hallucination Drug# 4107,5014,5,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE#Full Throttle# diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 0388893a6e..e7b1a6ad23 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -4433,6 +4433,35 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + 700 + 100 * skill_lv; RE_LVL_DMOD(100); break; + case GN_SLINGITEM_RANGEMELEEATK: + if( sd ) { + switch( sd->itemid ) { + case ITEMID_APPLE_BOMB: + skillratio += 200 + status_get_str(src) + status_get_dex(src); + break; + case ITEMID_COCONUT_BOMB: + case ITEMID_PINEAPPLE_BOMB: + skillratio += 700 + status_get_str(src) + status_get_dex(src); + break; + case ITEMID_MELON_BOMB: + skillratio += 400 + status_get_str(src) + status_get_dex(src); + break; + case ITEMID_BANANA_BOMB: + skillratio += 777 + status_get_str(src) + status_get_dex(src); + break; + case ITEMID_BLACK_LUMP: + skillratio += -100 + (status_get_str(src) + status_get_agi(src) + status_get_dex(src)) / 3; + break; + case ITEMID_BLACK_HARD_LUMP: + skillratio += -100 + (status_get_str(src) + status_get_agi(src) + status_get_dex(src)) / 2; + break; + case ITEMID_VERY_HARD_LUMP: + skillratio += -100 + status_get_str(src) + status_get_agi(src) + status_get_dex(src); + break; + } + RE_LVL_DMOD(100); + } + break; case GN_HELLS_PLANT_ATK: skillratio += -100 + 500 * skill_lv + sstatus->int_ * (10 - (sd ? pc_checkskill(sd, AM_CANNIBALIZE) : 0)); // !TODO: Confirm INT and Cannibalize bonus RE_LVL_DMOD(100); diff --git a/src/map/itemdb.hpp b/src/map/itemdb.hpp index b9d4277c93..546d4ef14c 100644 --- a/src/map/itemdb.hpp +++ b/src/map/itemdb.hpp @@ -176,10 +176,21 @@ enum genetic_item_list ITEMID_VITATA500, ITEMID_CONCENTRATED_CEROMAIN_SOUP, ITEMID_CURE_FREE = 12475, - ITEMID_BLACK_LUMP = 13265, + ITEMID_APPLE_BOMB = 13260, + ITEMID_COCONUT_BOMB, + ITEMID_MELON_BOMB, + ITEMID_PINEAPPLE_BOMB, + ITEMID_BANANA_BOMB, + ITEMID_BLACK_LUMP, ITEMID_BLACK_HARD_LUMP, ITEMID_VERY_HARD_LUMP, ITEMID_MYSTERIOUS_POWDER, + ITEMID_HP_INC_POTS_TO_THROW = 13275, + ITEMID_HP_INC_POTM_TO_THROW, + ITEMID_HP_INC_POTL_TO_THROW, + ITEMID_SP_INC_POTS_TO_THROW, + ITEMID_SP_INC_POTM_TO_THROW, + ITEMID_SP_INC_POTL_TO_THROW, }; ///Guillotine Cross diff --git a/src/map/skill.cpp b/src/map/skill.cpp index de4943197a..b90d56880f 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -446,6 +446,8 @@ unsigned short skill_dummy2skill_id(unsigned short skill_id) { return GN_CRAZYWEED; case GN_HELLS_PLANT_ATK: return GN_HELLS_PLANT; + case GN_SLINGITEM_RANGEMELEEATK: + return GN_SLINGITEM; case RL_R_TRIP_PLUSATK: return RL_R_TRIP; case NPC_MAXPAIN_ATK: @@ -1867,6 +1869,28 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SO_VARETYR_SPEAR: sc_start(src,bl, SC_STUN, 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); break; + case GN_SLINGITEM_RANGEMELEEATK: + if( sd ) { + switch( sd->itemid ) { // Starting SCs here instead of do it in skill_additional_effect to simplify the code. + case ITEMID_COCONUT_BOMB: + sc_start(src,bl, SC_STUN, 5 + sd->status.job_level / 2, skill_lv, 1000 * sd->status.job_level / 3); + sc_start2(src,bl, SC_BLEEDING, 3 + sd->status.job_level / 2, skill_lv, src->id, 1000 * status_get_lv(src) / 4 + sd->status.job_level / 3); + break; + case ITEMID_MELON_BOMB: + sc_start4(src, bl, SC_MELON_BOMB, 100, skill_lv, 20 + sd->status.job_level, 10 + sd->status.job_level / 2, 0, 1000 * status_get_lv(src) / 4); + break; + case ITEMID_BANANA_BOMB: + { + uint16 duration = (battle_config.banana_bomb_duration ? battle_config.banana_bomb_duration : 1000 * sd->status.job_level / 4); + + sc_start(src,bl, SC_BANANA_BOMB_SITDOWN, status_get_lv(src) + sd->status.job_level + sstatus->dex / 6 - status_get_lv(bl) - tstatus->agi / 4 - tstatus->luk / 5, skill_lv, duration); + sc_start(src,bl, SC_BANANA_BOMB, 100, skill_lv, 30000); + break; + } + } + sd->itemid = -1; + } + break; case GN_HELLS_PLANT_ATK: sc_start(src,bl, SC_STUN, 20 + 10 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); sc_start2(src,bl, SC_BLEEDING, 5 + 5 * skill_lv, skill_lv, src->id,skill_get_time(skill_id, skill_lv)); @@ -3595,6 +3619,9 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * case GN_FIRE_EXPANSION_ACID: dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, CR_ACIDDEMONSTRATION, skill_lv, DMG_MULTI_HIT); break; + case GN_SLINGITEM_RANGEMELEEATK: + dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,GN_SLINGITEM,-2,DMG_SINGLE); + break; case EL_STONE_RAIN: dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?DMG_MULTI_HIT:DMG_SPLASH); break; @@ -4847,6 +4874,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case SR_GENTLETOUCH_QUIET: case WM_SEVERE_RAINSTORM_MELEE: case WM_GREAT_ECHO: + case GN_SLINGITEM_RANGEMELEEATK: case KO_SETSUDAN: case RL_MASS_SPIRAL: case RL_BANISHING_BUSTER: @@ -11072,7 +11100,63 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(src,src,skill_id,skill_lv,1); } break; + case GN_SLINGITEM: + if( sd ) { + int ammo_id; + + i = sd->equip_index[EQI_AMMO]; + if( i < 0 ) + break; // No ammo. + ammo_id = sd->inventory_data[i]->nameid; + if( ammo_id <= 0 ) + break; + sd->itemid = ammo_id; + if( itemdb_group_item_exists(IG_BOMB, ammo_id) ) { + if(battle_check_target(src,bl,BCT_ENEMY) > 0) {// Only attack if the target is an enemy. + if( ammo_id == ITEMID_PINEAPPLE_BOMB ) + map_foreachincell(skill_area_sub,bl->m,bl->x,bl->y,BL_CHAR,src,GN_SLINGITEM_RANGEMELEEATK,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); + else + skill_attack(BF_WEAPON,src,src,bl,GN_SLINGITEM_RANGEMELEEATK,skill_lv,tick,flag); + } else //Otherwise, it fails, shows animation and removes items. + clif_skill_fail(sd,GN_SLINGITEM_RANGEMELEEATK,USESKILL_FAIL,0); + } else if (itemdb_group_item_exists(IG_THROWABLE, ammo_id)) { + switch (ammo_id) { + case ITEMID_HP_INC_POTS_TO_THROW: // MaxHP +(500 + Thrower BaseLv * 10 / 3) and heals 1% MaxHP + sc_start2(src, bl, SC_PROMOTE_HEALTH_RESERCH, 100, 2, 1, 500000); + status_percent_heal(bl, 1, 0); + break; + case ITEMID_HP_INC_POTM_TO_THROW: // MaxHP +(1500 + Thrower BaseLv * 10 / 3) and heals 2% MaxHP + sc_start2(src, bl, SC_PROMOTE_HEALTH_RESERCH, 100, 2, 2, 500000); + status_percent_heal(bl, 2, 0); + break; + case ITEMID_HP_INC_POTL_TO_THROW: // MaxHP +(2500 + Thrower BaseLv * 10 / 3) and heals 5% MaxHP + sc_start2(src, bl, SC_PROMOTE_HEALTH_RESERCH, 100, 2, 3, 500000); + status_percent_heal(bl, 5, 0); + break; + case ITEMID_SP_INC_POTS_TO_THROW: // MaxSP +(Thrower BaseLv / 10 - 5)% and recovers 2% MaxSP + sc_start2(src, bl, SC_ENERGY_DRINK_RESERCH, 100, 2, 1, 500000); + status_percent_heal(bl, 0, 2); + break; + case ITEMID_SP_INC_POTM_TO_THROW: // MaxSP +(Thrower BaseLv / 10)% and recovers 4% MaxSP + sc_start2(src, bl, SC_ENERGY_DRINK_RESERCH, 100, 2, 2, 500000); + status_percent_heal(bl, 0, 4); + break; + case ITEMID_SP_INC_POTL_TO_THROW: // MaxSP +(Thrower BaseLv / 10 + 5)% and recovers 8% MaxSP + sc_start2(src, bl, SC_ENERGY_DRINK_RESERCH, 100, 2, 3, 500000); + status_percent_heal(bl, 0, 8); + break; + default: + if (dstsd) + run_script(sd->inventory_data[i]->script, 0, dstsd->bl.id, fake_nd->bl.id); + break; + } + } + } + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + clif_skill_nodamage(src,bl,skill_id,skill_lv,1);// This packet is received twice actually, I think it is to show the animation. + break; case GN_MIX_COOKING: + case GN_MAKEBOMB: case GN_S_PHARMACY: if( sd ) { int qty = 1; @@ -11080,7 +11164,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sd->skill_lv_old = skill_lv; if( skill_id != GN_S_PHARMACY && skill_lv > 1 ) qty = 10; - clif_cooking_list(sd,(skill_id - GN_MIX_COOKING) + 27,skill_id,qty,6); + clif_cooking_list(sd,(skill_id - GN_MIX_COOKING) + 27,skill_id,qty,skill_id==GN_MAKEBOMB?5:6); clif_skill_nodamage(src,bl,skill_id,skill_lv,1); } break; @@ -15516,6 +15600,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case GN_MIX_COOKING: + case GN_MAKEBOMB: case GN_S_PHARMACY: case GN_CHANGEMATERIAL: if( sd->menuskill_id != skill_id ) @@ -16542,6 +16627,7 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, } break; case GN_MIX_COOKING: + case GN_MAKEBOMB: case GN_S_PHARMACY: case GN_CHANGEMATERIAL: if( sd->menuskill_id != skill_id ) @@ -19922,7 +20008,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh } while( j >= 0 && x > 0 ); } - if ((equip = (itemdb_isequip(nameid) && skill_id != GN_CHANGEMATERIAL ))) + if ((equip = (itemdb_isequip(nameid) && skill_id != GN_CHANGEMATERIAL && skill_id != GN_MAKEBOMB ))) wlv = itemdb_wlv(nameid); if (!equip) { @@ -20065,6 +20151,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh case ITEMID_SP_INCREASE_POTION_MEDIUM: difficulty += 15; break; + case ITEMID_BANANA_BOMB: case ITEMID_HP_INCREASE_POTION_MEDIUM: case ITEMID_SP_INCREASE_POTION_LARGE: case ITEMID_VITATA500: @@ -20094,6 +20181,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh make_per = 10000; } break; + case GN_MAKEBOMB: case GN_MIX_COOKING: { int difficulty = 30 + rnd()%120; // Random number between (30 ~ 150) @@ -20102,14 +20190,25 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh qty = ~(5 + rnd()%5) + 1; switch(nameid){// difficulty factor + case ITEMID_APPLE_BOMB: + difficulty += 5; + break; + case ITEMID_COCONUT_BOMB: + case ITEMID_MELON_BOMB: + difficulty += 10; + break; case ITEMID_SAVAGE_FULL_ROAST: case ITEMID_COCKTAIL_WARG_BLOOD: case ITEMID_MINOR_STEW: case ITEMID_SIROMA_ICED_TEA: case ITEMID_DROSERA_HERB_SALAD: case ITEMID_PETITE_TAIL_NOODLES: + case ITEMID_PINEAPPLE_BOMB: difficulty += 15; break; + case ITEMID_BANANA_BOMB: + difficulty += 20; + break; } if( make_per >= 30 && make_per > difficulty) @@ -20232,7 +20331,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh tmp_item.amount = 0; for (i = 0; i < qty; i++) { //Apply quantity modifiers. - if ((skill_id == GN_MIX_COOKING || skill_id == GN_S_PHARMACY) && make_per > 1) { + if ((skill_id == GN_MIX_COOKING || skill_id == GN_MAKEBOMB || skill_id == GN_S_PHARMACY) && make_per > 1) { tmp_item.amount = qty; break; } @@ -20335,7 +20434,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0,0); } } - if (skill_id == GN_MIX_COOKING || skill_id == GN_S_PHARMACY) { + if (skill_id == GN_MIX_COOKING || skill_id == GN_MAKEBOMB || skill_id == GN_S_PHARMACY) { clif_produceeffect(sd,6,nameid); clif_misceffect(&sd->bl,5); clif_msg_skill(sd,skill_id,ITEM_PRODUCE_SUCCESS); @@ -20399,6 +20498,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh clif_msg_skill(sd,skill_id,ITEM_PRODUCE_FAIL); } break; + case GN_MAKEBOMB: case GN_S_PHARMACY: case GN_CHANGEMATERIAL: clif_produceeffect(sd,7,nameid); diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 380925ca99..6d8c1e35d7 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -27,7 +27,7 @@ struct skill_unit; struct skill_unit_group; struct status_change_entry; -#define MAX_SKILL_PRODUCE_DB 280 /// Max Produce DB +#define MAX_SKILL_PRODUCE_DB 281 /// Max Produce DB #define MAX_PRODUCE_RESOURCE 12 /// Max Produce requirements #define MAX_SKILL_ARROW_DB 150 /// Max Arrow Creation DB #define MAX_ARROW_RESULT 5 /// Max Arrow results/created @@ -1176,7 +1176,7 @@ enum e_skill { CG_HERMODE, CG_TAROTCARD, CR_ACIDDEMONSTRATION, - CR_CULTIVATION, + CR_CULTIVATION, // Removed on kRO (renewal) ITEM_ENCHANTARMS, TK_MISSION, SL_HIGH, @@ -1760,12 +1760,12 @@ enum e_skill { GN_HELLS_PLANT, GN_HELLS_PLANT_ATK, GN_MANDRAGORA, - GN_SLINGITEM, + GN_SLINGITEM, // Removed on kRO GN_CHANGEMATERIAL, GN_MIX_COOKING, - GN_MAKEBOMB, + GN_MAKEBOMB, // Removed on kRO GN_S_PHARMACY, - GN_SLINGITEM_RANGEMELEEATK, + GN_SLINGITEM_RANGEMELEEATK, // Removed on kRO AB_SECRAMENT = 2515, WM_SEVERE_RAINSTORM_MELEE, diff --git a/src/map/status.cpp b/src/map/status.cpp index b5b13e1d1f..beb43b1bc9 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -4525,6 +4525,16 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) sd->magic_addrace[RC_DRAGON]+=skill; sd->subrace[RC_DRAGON]+=skill; } + if ((skill = pc_checkskill(sd, AB_EUCHARISTICA)) > 0) { + sd->right_weapon.addrace[RC_DEMON] += skill; + sd->right_weapon.addele[ELE_DARK] += skill; + sd->left_weapon.addrace[RC_DEMON] += skill; + sd->left_weapon.addele[ELE_DARK] += skill; + sd->magic_addrace[RC_DEMON] += skill; + sd->magic_addele[ELE_DARK] += skill; + sd->subrace[RC_DEMON] += skill; + sd->subele[ELE_DARK] += skill; + } if(sc->count) { if(sc->data[SC_CONCENTRATE]) { // Update the card-bonus data From be0c0efe40db74b67b5d2b26d14bfc46977309b9 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Thu, 30 Apr 2020 16:49:40 +0200 Subject: [PATCH 075/212] Follow up to 38cf16edbaa36836072780b4481023e57e014892 *Thanks to @aleos89 and @LordWhiplash --- src/map/battle.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index e7b1a6ad23..f641a3fca0 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -3768,7 +3768,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case MO_FINGEROFFENSIVE: #ifdef RENEWAL - skillratio += 500 + skill_lv * 2; + skillratio += 500 + skill_lv * 200; if (tsc && tsc->data[SC_BLADESTOP]) skillratio += skillratio / 2; #else @@ -5481,8 +5481,12 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block } break; case MO_FINGEROFFENSIVE: - if (sd) - wd.div_ = (battle_config.finger_offensive_type)?1:sd->spiritball_old; + if (sd) { + if (battle_config.finger_offensive_type) + wd.div_ = 1; + else if ((sd->spiritball + sd->spiritball_old) < wd.div_) + wd.div_ = sd->spiritball + sd->spiritball_old; + } break; case KN_PIERCE: From da523d9fcd0cef2c379c0f232e6af98ef6f23b01 Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 30 Apr 2020 11:12:54 -0400 Subject: [PATCH 076/212] Stop vending when an invalid list is received (#4868) * Fixes #4778. * Vending will now be stopped if an invalid list is received. Thanks to @blipblopblip! --- src/map/vending.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/map/vending.cpp b/src/map/vending.cpp index f2232be490..7f41d5f69a 100755 --- a/src/map/vending.cpp +++ b/src/map/vending.cpp @@ -350,8 +350,11 @@ int8 vending_openvending(struct map_session_data* sd, const char* message, const i++; // item successfully added } - if( i != j ) - clif_displaymessage (sd->fd, msg_txt(sd,266)); //"Some of your items cannot be vended and were removed from the shop." + if (i != j) { + clif_displaymessage(sd->fd, msg_txt(sd, 266)); //"Some of your items cannot be vended and were removed from the shop." + clif_skill_fail(sd, MC_VENDING, USESKILL_FAIL_LEVEL, 0); // custom reply packet + return 5; + } if( i == 0 ) { // no valid item found clif_skill_fail(sd, MC_VENDING, USESKILL_FAIL_LEVEL, 0); // custom reply packet From 8f19cfc3a1c84e933a5bd293f9be776b373927a8 Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 30 Apr 2020 12:17:50 -0400 Subject: [PATCH 077/212] Fixes Weapon Crush and Weapon Blocking combo (#4809) * Fixes #4808. * Weapon Crush now uses SC_WEAPONBLOCK_ON to track the target instead of SC_COMBO. * Also fixes Quick Draw Shot target selection. * Quick Draw Shot and Weapon Blocking should be considered a combo and not end physical attacks when casting them. * SC_QD_SHOT_READY will no longer become active if the player has 193+ ASPD. * SC_QD_SHOT_READY will now end once Quick Draw Shot has been casted. * Cleans up skill_check_condition_sc_required and removes duplicate code. Thanks to @wdivet, @LordWhiplash, and @ecdarreola! --- db/pre-re/skill_db.yml | 2 ++ db/re/skill_db.yml | 2 ++ src/map/battle.cpp | 8 ++++-- src/map/skill.cpp | 62 ++++++++++++++---------------------------- src/map/unit.cpp | 19 ++++++++++--- 5 files changed, 46 insertions(+), 47 deletions(-) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index ae124f184b..3c4031a070 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -18583,6 +18583,8 @@ Body: Duration1: 60000 Requires: SpCost: 20 + Status: + Weaponblock_On: true - Id: 2031 Name: GC_VENOMPRESSURE Description: Venom Pressure diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 4a960ce3a4..fa3f96191e 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -19339,6 +19339,8 @@ Body: FixedCastTime: -1 Requires: SpCost: 20 + Status: + Weaponblock_On: true - Id: 2031 Name: GC_VENOMPRESSURE Description: Venom Pressure diff --git a/src/map/battle.cpp b/src/map/battle.cpp index f641a3fca0..23afdeaa92 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1171,7 +1171,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if( sc->data[SC_WEAPONBLOCKING] && flag&(BF_SHORT|BF_WEAPON) && rnd()%100 < sc->data[SC_WEAPONBLOCKING]->val2 ) { clif_skill_nodamage(bl,src,GC_WEAPONBLOCKING,sc->data[SC_WEAPONBLOCKING]->val1,1); - sc_start(src, bl, SC_WEAPONBLOCK_ON, 100, 0, skill_get_time2(GC_WEAPONBLOCKING, 1)); + sc_start(src, bl, SC_WEAPONBLOCK_ON, 100, src->id, skill_get_time2(GC_WEAPONBLOCKING, 1)); d->dmg_lv = ATK_BLOCK; return 0; } @@ -3483,7 +3483,11 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s { wd->div_ = skill_get_num(GS_CHAINACTION,skill_lv); wd->type = DMG_MULTI_HIT; - sc_start(src,src,SC_QD_SHOT_READY,100,target->id,skill_get_time(RL_QD_SHOT,1)); + + status_data *status = status_get_status_data(src); + + if (status && status->amotion > 70) // Only triggers if ASPD < 193 + sc_start(src,src,SC_QD_SHOT_READY,100,target->id,skill_get_time(RL_QD_SHOT,1)); } else if(sc && sc->data[SC_FEARBREEZE] && sd->weapontype1==W_BOW && (i = sd->equip_index[EQI_AMMO]) >= 0 && sd->inventory_data[i] && sd->inventory.u.items_inventory[i].amount > 1) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index b90d56880f..013099aaf4 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -2969,7 +2969,6 @@ int skill_is_combo(uint16 skill_id) { case TK_COUNTER: case TK_JUMPKICK: case HT_POWER: - case GC_WEAPONCRUSH: case SR_DRAGONCOMBO: return 1; case SR_FALLENEMPIRE: @@ -4859,6 +4858,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case NC_POWERSWING: case NC_MAGMA_ERUPTION: case GC_CROSSIMPACT: + case GC_WEAPONCRUSH: case GC_VENOMPRESSURE: case SC_TRIANGLESHOT: case SC_FEINTBOMB: @@ -5703,13 +5703,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } break; - case GC_WEAPONCRUSH: - if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == GC_WEAPONBLOCKING ) - skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); - else if( sd ) - clif_skill_fail(sd,skill_id,USESKILL_FAIL_GC_WEAPONBLOCKING,0); - break; - case GC_CROSSRIPPERSLASHER: if( sd && !(sc && sc->data[SC_ROLLINGCUTTER]) ) clif_skill_fail(sd,skill_id,USESKILL_FAIL_CONDITION,0); @@ -11502,11 +11495,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui // Main target always receives damage clif_skill_nodamage(src, src, skill_id, skill_lv, 1); skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_LEVEL); - } - else { + } else { clif_skill_nodamage(src, src, skill_id, skill_lv, 1); map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); } + status_change_end(src, SC_QD_SHOT_READY, INVALID_TIMER); // End here to prevent spamming of the skill onto the target. skill_area_temp[0] = 0; skill_area_temp[1] = 0; break; @@ -15507,54 +15500,47 @@ int skill_isammotype(struct map_session_data *sd, unsigned short skill_id) * @return True if condition is met, False otherwise **/ static bool skill_check_condition_sc_required(struct map_session_data *sd, unsigned short skill_id, struct s_skill_condition *require) { - struct status_change *sc = NULL; - - if (require->status.empty()) + if (require == nullptr || require->status.empty()) return true; nullpo_ret(sd); - if (!require) - return false; + status_change *sc = &sd->sc; - if (!(sc = &sd->sc)) { + if (sc == nullptr) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); return false; } - /* May has multiple requirements */ + // May have multiple requirements for (const auto &reqStatus : require->status) { if (reqStatus == SC_NONE) continue; + useskill_fail_cause cause; + switch (reqStatus) { - /* Official fail msg */ + // Official fail message case SC_PUSH_CART: - if (!sc->data[SC_PUSH_CART]) { - clif_skill_fail(sd, skill_id, USESKILL_FAIL_CART, 0); - return false; - } + cause = USESKILL_FAIL_CART; break; case SC_POISONINGWEAPON: - if (!sc->data[SC_POISONINGWEAPON]) { - clif_skill_fail(sd, skill_id, USESKILL_FAIL_GC_POISONINGWEAPON, 0); - return false; - } + cause = USESKILL_FAIL_GC_POISONINGWEAPON; break; - case GC_COUNTERSLASH: - if (!sc->data[SC_WEAPONBLOCK_ON]) { - clif_skill_fail(sd, skill_id, USESKILL_FAIL_GC_WEAPONBLOCKING, 0); - return false; - } + case SC_WEAPONBLOCK_ON: + cause = USESKILL_FAIL_GC_WEAPONBLOCKING; break; default: - if (!sc->data[reqStatus]) { - clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); - return false; - } + cause = USESKILL_FAIL_LEVEL; break; } + + if (!sc->data[reqStatus]) { + clif_skill_fail(sd, skill_id, cause, 0); + return false; + } } + return true; } @@ -16107,12 +16093,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i return false; } break; - case GC_WEAPONCRUSH: - if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == GC_WEAPONBLOCKING) ) { - clif_skill_fail(sd, skill_id, USESKILL_FAIL_GC_WEAPONBLOCKING, 0); - return false; - } - break; case RA_WUGMASTERY: if( (pc_isfalcon(sd) && !battle_config.warg_can_falcon) || pc_isridingwug(sd) || sd->sc.data[SC__GROOMY]) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); diff --git a/src/map/unit.cpp b/src/map/unit.cpp index cb6a209a4c..25acc3c751 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -1574,10 +1574,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui target_id = src->id; combo = 1; - } else if ( target_id == src->id && - inf&INF_SELF_SKILL && - (skill->inf2[INF2_NOTARGETSELF] || - (skill_id == RL_QD_SHOT && sc && sc->data[SC_QD_SHOT_READY])) ) { + } else if (target_id == src->id && inf&INF_SELF_SKILL && skill->inf2[INF2_NOTARGETSELF]) { target_id = ud->target; // Auto-select target. [Skotlex] combo = 1; } @@ -1594,6 +1591,20 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui return 0; } break; + case GC_WEAPONCRUSH: + if (sc && sc->data[SC_WEAPONBLOCK_ON]) { + if ((target = map_id2bl(sc->data[SC_WEAPONBLOCK_ON]->val1)) == nullptr) + return 0; + combo = 1; + } + break; + case RL_QD_SHOT: + if (sc && sc->data[SC_QD_SHOT_READY]) { + if ((target = map_id2bl(sc->data[SC_QD_SHOT_READY]->val1)) == nullptr) + return 0; + combo = 1; + } + break; case WE_MALE: case WE_FEMALE: if (!sd->status.partner_id) From 40c776340f7548c42046f4c4cca8d5bd73078cca Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Thu, 30 Apr 2020 18:51:41 +0200 Subject: [PATCH 078/212] Follow up to 77dd729d770bcc9fc508ff09160419224bf5120b --- src/map/status.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/map/status.cpp b/src/map/status.cpp index beb43b1bc9..add5def4a0 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -5665,7 +5665,12 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) // Absolute ASPD % modifiers amotion = amotion * status->aspd_rate / 1000; if (sd->ud.skilltimer != INVALID_TIMER && (skill_lv = pc_checkskill(sd, SA_FREECAST)) > 0) +#ifdef RENEWAL_ASPD + amotion = amotion * 5 * (skill_lv + 10) / 100; +#else amotion += (2000 - amotion) * ( 55 - 5 * ( skill_lv + 1 ) ) / 100; //Increases amotion to reduce ASPD to the corresponding absolute percentage for each level (overriding other adjustments) +#endif + #ifdef RENEWAL_ASPD // RE ASPD % modifier amotion += (max(0xc3 - amotion, 2) * (status->aspd_rate2 + status_calc_aspd(bl, sc, false))) / 100; From e92f88a030dc6a2fb8a0ffe6bf1c1d2d1a977e26 Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 30 Apr 2020 13:51:09 -0400 Subject: [PATCH 079/212] Fixes battle config skill_removetrap_type (#4865) * Fixes an array out of bounds check when attempting to return used traps to a player through HT_REMOVETRAP. Thanks to @marky291! --- src/map/skill.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 013099aaf4..40bb80df5e 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -9008,14 +9008,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui { // get back all items used to deploy the trap for( i = 0; i < MAX_SKILL_ITEM_REQUIRE; i++ ) { - if( skill_group->require.itemid[i + 1] > 0 ) + if( skill_group->require.itemid[i] > 0 ) { int flag2; struct item item_tmp; memset(&item_tmp,0,sizeof(item_tmp)); - item_tmp.nameid = skill_group->require.itemid[i + 1]; + item_tmp.nameid = skill_group->require.itemid[i]; item_tmp.identify = 1; - item_tmp.amount = skill_group->require.amount[i + 1]; + item_tmp.amount = skill_group->require.amount[i]; if( item_tmp.nameid && (flag2=pc_additem(sd,&item_tmp,item_tmp.amount,LOG_TYPE_OTHER)) ){ clif_additem(sd,0,0,flag2); map_addflooritem(&item_tmp,item_tmp.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,4,0); From 2e4ec1d1f656daaad832033c31a8b6939cb8d266 Mon Sep 17 00:00:00 2001 From: Chaos92 Date: Fri, 1 May 2020 23:56:48 +0800 Subject: [PATCH 080/212] Fix description typo for Bio4 Reward Script (#4851) --- npc/re/merchants/bio4_reward.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npc/re/merchants/bio4_reward.txt b/npc/re/merchants/bio4_reward.txt index 9a363a4f26..01f3cf57dc 100644 --- a/npc/re/merchants/bio4_reward.txt +++ b/npc/re/merchants/bio4_reward.txt @@ -489,10 +489,10 @@ lhz_cube,233,24,4 script Sorcerer#Bio4Reward 4_M_UMDANCEKID,{ next; mes "[Pudding]"; mes "Let me see.. the equipments discovered until now are...."; - mes "6 Armors, 14 Weapons."; + mes "7 Armors, 14 Weapons."; next; while(1) { - switch(select("Ok, I don't have to know more.", "6 Armors", "14 Weapons")) { + switch(select("Ok, I don't have to know more.", "7 Armors", "14 Weapons")) { case 1: mes "[Pudding]"; mes "If you obtain '^F2766EWill of Warrior^000000' or '^952420Thirst for Blood^000000', and obtain also equipment which is capable to accept their power, bring them to me. I will be waiting."; From 9794aa2b8010587af7640b7e7b7725bdf380daca Mon Sep 17 00:00:00 2001 From: Aleos Date: Sun, 3 May 2020 11:30:50 -0400 Subject: [PATCH 081/212] Fixes an issue with status timers being destroyed (#4885) * Fixes #4856. * Follow up to d1f8c8c and 652d77e. * A missing break from an old commit along with a refactor in code resulted in a "valid" fall through and breaking status change timers. * Also fixes a potential crash with Book of Creating Star. Thanks to @OptimusM, @technoken, @sader1992, @mazvi, and @akiyamamio16 for helping debug! --- src/map/skill.cpp | 1 + src/map/status.cpp | 15 +++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 40bb80df5e..fe3ca228a6 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -19078,6 +19078,7 @@ int skill_delunitgroup_(struct skill_unit_group *group, const char* file, int li status_change_end(target, SC_SPIDERWEB, INVALID_TIMER); } } + break; case SG_SUN_WARM: case SG_MOON_WARM: case SG_STAR_WARM: diff --git a/src/map/status.cpp b/src/map/status.cpp index add5def4a0..b054987ce5 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -14622,17 +14622,16 @@ TIMER_FUNC(status_change_timer){ break; case SC_CREATINGSTAR: if (--(sce->val4) >= 0) { // Needed to check who the caster is and what AoE is giving the status. - struct block_list *star_caster = map_id2bl(sce->val2), *star_aoe = map_id2bl(sce->val3); + struct block_list *star_caster = map_id2bl(sce->val2); + struct skill_unit *star_aoe = (struct skill_unit *)map_id2bl(sce->val3); - if (!star_caster || status_isdead(star_caster) || star_caster->m != bl->m) + if (star_caster == nullptr || status_isdead(star_caster) || star_caster->m != bl->m || star_aoe == nullptr) break; - map_freeblock_lock(); - if (star_aoe) - skill_attack(BF_WEAPON,star_caster,star_aoe,bl,SJ_BOOKOFCREATINGSTAR,sce->val1,tick,0); - if (sc->data[type]) - sc_timer_next(500 + tick); - map_freeblock_unlock(); + sc_timer_next(500 + tick); + + // Attack after timer to prevent errors + skill_attack(BF_WEAPON, star_caster, &star_aoe->bl, bl, SJ_BOOKOFCREATINGSTAR, sce->val1, tick, 0); return 0; } break; From 9309986a86053c4906e80ae33578d5774e53f018 Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 4 May 2020 10:20:25 -0400 Subject: [PATCH 082/212] Heat Barrel should be giving fixed ASPD (#4867) * Heat Barrel's ASPD bonus should be a fixed amount, not at a rate. Thanks to @LordWhiplash! --- src/map/status.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/status.cpp b/src/map/status.cpp index b054987ce5..dd04aaa0d9 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -7478,8 +7478,6 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b bonus += sc->data[sc_val]->val1; if (sc->data[SC_ATTHASTE_CASH]) bonus += sc->data[SC_ATTHASTE_CASH]->val1; - if (sc->data[SC_HEAT_BARREL]) - bonus += sc->data[SC_HEAT_BARREL]->val1; } else { if (sc->data[SC_DONTFORGETME]) bonus -= sc->data[SC_DONTFORGETME]->val2 / 10; @@ -7587,6 +7585,8 @@ static short status_calc_fix_aspd(struct block_list *bl, struct status_change *s aspd -= sc->data[SC_MTF_ASPD2]->val1; if (sc->data[SC_SOULSHADOW]) aspd -= 10 * sc->data[SC_SOULSHADOW]->val2; + if (sc->data[SC_HEAT_BARREL]) + aspd -= sc->data[SC_HEAT_BARREL]->val1 * 10; return cap_value(aspd, 0, 2000); // Will be recap for proper bl anyway } From c1246ebe9a1b06b903bf127b33556c4fc3351cc7 Mon Sep 17 00:00:00 2001 From: LordWhiplash <62680611+LordWhiplash@users.noreply.github.com> Date: Mon, 4 May 2020 12:21:17 -0300 Subject: [PATCH 083/212] Fixes some Star Emperor/Soul Reaper skills (#4869) * Adds missing SP requirements for SP_SPA, SJ_FULLMOONKICK, SP_CURSEEXPLOSION, SJ_SOLARBURST. * Fixes SJ_FALLINGSTAR duration. * Increases SJ_FALLINGSTAR_ATK and SJ_FALLINGSTAR_ATK2 to level 10. Thanks to @LordWhiplash! --- db/re/skill_db.yml | 63 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index fa3f96191e..644a6b05c2 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -29454,6 +29454,12 @@ Body: Amount: 55 - Level: 7 Amount: 60 + - Level: 8 + Amount: 65 + - Level: 9 + Amount: 70 + - Level: 10 + Amount: 75 State: Moonstance - Id: 2577 Name: SJ_LIGHTOFSTAR @@ -29652,8 +29658,7 @@ Body: HitCount: 1 CastCancel: true CastTime: 1000 - Duration1: 126000 - Cooldown: + Duration1: - Level: 1 Time: 120000 - Level: 2 @@ -29668,6 +29673,12 @@ Body: Time: 220000 - Level: 7 Time: 240000 + - Level: 8 + Time: 260000 + - Level: 9 + Time: 280000 + - Level: 10 + Time: 300000 FixedCastTime: 2000 Requires: SpCost: @@ -29685,6 +29696,12 @@ Body: Amount: 65 - Level: 7 Amount: 70 + - Level: 8 + Amount: 75 + - Level: 9 + Amount: 80 + - Level: 10 + Amount: 85 State: Starstance - Id: 2585 Name: SJ_GRAVITYCONTROL @@ -29861,6 +29878,12 @@ Body: Amount: 49 - Level: 7 Amount: 52 + - Level: 8 + Amount: 55 + - Level: 9 + Amount: 58 + - Level: 10 + Amount: 61 State: Sunstance - Id: 2593 Name: SJ_PROMINENCEKICK @@ -29885,7 +29908,7 @@ Body: - Id: 2594 Name: SJ_FALLINGSTAR_ATK Description: Falling Star Attack - MaxLevel: 7 + MaxLevel: 10 Type: Weapon TargetType: Self DamageFlags: @@ -29903,7 +29926,7 @@ Body: - Id: 2595 Name: SJ_FALLINGSTAR_ATK2 Description: Falling Star Attack 2 - MaxLevel: 7 + MaxLevel: 10 Type: Weapon TargetType: Attack DamageFlags: @@ -30097,6 +30120,16 @@ Body: Amount: 65 - Level: 5 Amount: 70 + - Level: 6 + Amount: 75 + - Level: 7 + Amount: 80 + - Level: 8 + Amount: 85 + - Level: 9 + Amount: 90 + - Level: 10 + Amount: 95 - Id: 2601 Name: SP_SOULCURSE Description: Soul Curse @@ -30145,6 +30178,16 @@ Body: Amount: 64 - Level: 5 Amount: 68 + - Level: 6 + Amount: 72 + - Level: 7 + Amount: 76 + - Level: 8 + Amount: 80 + - Level: 9 + Amount: 84 + - Level: 10 + Amount: 88 SpiritSphereCost: - Level: 1 Amount: 1 @@ -30246,6 +30289,12 @@ Body: Area: 2 - Level: 7 Area: 3 + - Level: 8 + Area: 3 + - Level: 9 + Area: 3 + - Level: 10 + Area: 4 CastCancel: true CastTime: 500 AfterCastActDelay: 500 @@ -30268,6 +30317,12 @@ Body: Amount: 86 - Level: 7 Amount: 90 + - Level: 8 + Amount: 94 + - Level: 9 + Amount: 98 + - Level: 10 + Amount: 102 SpiritSphereCost: - Level: 1 Amount: 2 From ea59d8049082cc791ac2f36258c1bf6ea125c64a Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 4 May 2020 11:56:14 -0400 Subject: [PATCH 084/212] Corrects Feint Bomb not hiding the caster (#4874) * Resolves an issue with Feint Bomb not hiding the caster. Thanks to @Badarosk0! --- src/map/skill.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index fe3ca228a6..68461c1423 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -12904,7 +12904,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui } map_foreachinallrange(unit_changetarget, src, AREA_SIZE, BL_MOB, src, &group->unit->bl); // Release all targets against the caster skill_blown(src, src, skill_get_blewcount(skill_id, skill_lv), unit_getdir(src), BLOWN_IGNORE_NO_KNOCKBACK); // Don't stop the caster from backsliding if special_state.no_knockback is active - clif_skill_nodamage(src,src,skill_id,skill_lv,sc_start(src,src,type,100,skill_lv,skill_get_time2(skill_id,skill_lv))); + clif_skill_nodamage(src, src, skill_id, skill_lv, 0); + sc_start(src, src, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); } break; From 24ea092dd2255f3bb97e4168f1966e9858ca899d Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Tue, 5 May 2020 02:20:11 +1000 Subject: [PATCH 085/212] Fix bonuses for SJ_STARSTANCE and SJ_LUNARSTANCE (#4884) * Fix Max HP bonus for SJ_LUNARSTANCE * Fix missing ASPD bonus in renewal for SJ_STARSTANCE --- src/map/status.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/map/status.cpp b/src/map/status.cpp index dd04aaa0d9..5bd7880271 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -3398,7 +3398,7 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += 30; #endif if(sc->data[SC_LUNARSTANCE]) - bonus += bonus * sc->data[SC_LUNARSTANCE]->val2 / 100; + bonus += sc->data[SC_LUNARSTANCE]->val2; //Decreasing if(sc->data[SC_VENOMBLEED]) @@ -7547,6 +7547,8 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b bonus += sc->data[SC_INCREASEAGI]->val1; if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_ASPDRATE) bonus += 20; + if (sc->data[SC_STARSTANCE]) + bonus += sc->data[SC_STARSTANCE]->val2; struct map_session_data* sd = BL_CAST(BL_PC, bl); uint8 skill_lv; From 77f91e5af1cd9b06f2be7878bdafdbd896626b4f Mon Sep 17 00:00:00 2001 From: Kreustoo Date: Tue, 5 May 2020 17:17:13 +0200 Subject: [PATCH 086/212] Fixes WoE:TE God item requirement message (#4893) * Fixes #4844. * Adjusts the WoE:TE God item quest stating it needs 1 Giant's Chisel instead of 4. Thanks to @ElinhoPP and @Kreustoo! --- npc/re/quests/woe_te/te_goditem_alde1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npc/re/quests/woe_te/te_goditem_alde1.txt b/npc/re/quests/woe_te/te_goditem_alde1.txt index 5ebb93d71a..27d0d64021 100644 --- a/npc/re/quests/woe_te/te_goditem_alde1.txt +++ b/npc/re/quests/woe_te/te_goditem_alde1.txt @@ -284,7 +284,7 @@ S_Material: mes "^4d4dff4 Presberk's Leather"; mes "1 Spirit of Hugin"; mes "1 Spirit of Munin"; - mes "1 Giant's Chisel"; + mes "4 Giant's Chisel"; mes "1 Jormungand's Rib"; mes "1 Wizardry Staff"; mes "1 Muspellium and Essence of Rune, respectively^000000"; From c6aceea6c3666e267dde88d26abbfb7627840225 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Wed, 6 May 2020 16:38:30 +0200 Subject: [PATCH 087/212] Follow up to fe14af99625d16f3c7ef1e8192a2d3b0214f33f1 * Thanks to @CairoLee --- src/map/npc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/npc.cpp b/src/map/npc.cpp index 581c857d6c..f65a3c5755 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -3429,10 +3429,11 @@ const char* npc_parse_duplicate(char* w1, char* w2, char* w3, char* w4, const ch case NPCTYPE_POINTSHOP: case NPCTYPE_MARKETSHOP: ++npc_shop; - safestrncpy( dnd->u.shop.pointshop_str, nd->u.shop.pointshop_str, strlen( nd->u.shop.pointshop_str ) ); + safestrncpy( nd->u.shop.pointshop_str, dnd->u.shop.pointshop_str, strlen( dnd->u.shop.pointshop_str ) ); nd->u.shop.itemshop_nameid = dnd->u.shop.itemshop_nameid; nd->u.shop.shop_item = dnd->u.shop.shop_item; nd->u.shop.count = dnd->u.shop.count; + nd->u.shop.discount = dnd->u.shop.discount; break; case NPCTYPE_WARP: From 5e8d9aafabf9a0d84d3956db897af8c015f1b133 Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 6 May 2020 13:36:27 -0400 Subject: [PATCH 088/212] Job Improvement Project - Kagerou & Oboro (#4425) * Fixes #4424. * kRO Changelog: http://ro.gnjoy.com/news/notice/View.asp?BBSMode=10001&seq=7081 Thanks to @Badarosk0, @OptimusM, @teededung, and @Angelic234! --- db/re/skill_db.yml | 103 +++++++++++++++++++++++++++---------------- db/re/skill_tree.txt | 16 +++---- src/map/battle.cpp | 41 ++++++++++++----- src/map/skill.cpp | 2 - src/map/status.cpp | 5 ++- 5 files changed, 108 insertions(+), 59 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 644a6b05c2..de56d13ddd 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -15474,7 +15474,6 @@ Body: Time: 4000 - Level: 10 Time: 4400 - AfterCastActDelay: 1000 FixedCastTime: - Level: 1 Time: 200 @@ -30635,26 +30634,56 @@ Body: - Id: 3004 Name: KO_JYUMONJIKIRI Description: Cross Slash - MaxLevel: 5 + MaxLevel: 10 Type: Weapon TargetType: Attack Range: - Level: 1 - Size: 3 + Size: 4 - Level: 2 Size: 4 - Level: 3 - Size: 5 + Size: 4 - Level: 4 - Size: 6 + Size: 5 - Level: 5 + Size: 5 + - Level: 6 + Size: 5 + - Level: 7 + Size: 6 + - Level: 8 + Size: 6 + - Level: 9 + Size: 6 + - Level: 10 Size: 7 Hit: Multi_Hit HitCount: -2 Element: Weapon AfterCastActDelay: 500 Duration1: 3000 - Cooldown: 5000 + Cooldown: # !TODO: Confirm cooldown + - Level: 1 + Time: 4000 + - Level: 2 + Time: 3900 + - Level: 3 + Time: 3800 + - Level: 4 + Time: 3700 + - Level: 5 + Time: 3600 + - Level: 6 + Time: 3500 + - Level: 7 + Time: 3400 + - Level: 8 + Time: 3300 + - Level: 9 + Time: 3200 + - Level: 10 + Time: 3100 FixedCastTime: -1 Requires: SpCost: @@ -30668,6 +30697,16 @@ Body: Amount: 16 - Level: 5 Amount: 18 + - Level: 6 + Amount: 20 + - Level: 7 + Amount: 22 + - Level: 8 + Amount: 24 + - Level: 9 + Amount: 26 + - Level: 10 + Amount: 28 - Id: 3005 Name: KO_SETSUDAN Description: Soul Cutter @@ -30697,7 +30736,7 @@ Body: Description: Kunai Explosion MaxLevel: 5 Type: Weapon - TargetType: Ground + TargetType: Attack DamageFlags: Splash: true IgnoreFlee: true @@ -30793,7 +30832,7 @@ Body: Amount: 20 Ammo: Kunai: true - AmmoAmount: 8 + AmmoAmount: 2 - Id: 3008 Name: KO_MUCHANAGE Description: Rapid Throw @@ -30890,52 +30929,42 @@ Body: - Id: 3009 Name: KO_HUUMARANKA Description: Swirling Petal - MaxLevel: 5 + MaxLevel: 10 Type: Weapon - TargetType: Ground + TargetType: Attack DamageFlags: Splash: true - Range: - - Level: 1 - Size: 9 - - Level: 2 - Size: 10 - - Level: 3 - Size: 11 - - Level: 4 - Size: 12 - - Level: 5 - Size: 13 + Range: 11 Hit: Multi_Hit HitCount: -5 Element: Weapon SplashArea: 3 - CastTime: - - Level: 1 - Time: 1000 - - Level: 2 - Time: 1200 - - Level: 3 - Time: 1400 - - Level: 4 - Time: 1600 - - Level: 5 - Time: 1800 - AfterCastActDelay: 1000 + CastTime: 1500 + AfterCastActDelay: 500 Duration1: 100 Cooldown: 3000 FixedCastTime: -1 Requires: SpCost: - Level: 1 - Amount: 24 + Amount: 22 - Level: 2 - Amount: 28 + Amount: 24 - Level: 3 - Amount: 32 + Amount: 26 - Level: 4 - Amount: 36 + Amount: 28 - Level: 5 + Amount: 30 + - Level: 6 + Amount: 32 + - Level: 7 + Amount: 34 + - Level: 8 + Amount: 36 + - Level: 9 + Amount: 38 + - Level: 10 Amount: 40 Weapon: Huuma: true diff --git a/db/re/skill_tree.txt b/db/re/skill_tree.txt index 712d65db90..96c67e1685 100644 --- a/db/re/skill_tree.txt +++ b/db/re/skill_tree.txt @@ -5601,12 +5601,12 @@ 4211,3001,1,530,5,0,0,0,0,0,0,0,0 //KO_YAMIKUMO## 4211,3002,5,0,0,0,0,0,0,0,0,0,0 //KO_RIGHT## 4211,3003,5,0,0,0,0,0,0,0,0,0,0 //KO_LEFT## -4211,3004,5,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## +4211,3004,10,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## 4211,3005,5,3004,2,0,0,0,0,0,0,0,0 //KO_SETSUDAN## 4211,3006,5,524,5,0,0,0,0,0,0,0,0 //KO_BAKURETSU## 4211,3007,5,3006,1,0,0,0,0,0,0,0,0 //KO_HAPPOKUNAI## 4211,3008,10,3010,3,0,0,0,0,0,0,0,0 //KO_MUCHANAGE## -4211,3009,5,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## +4211,3009,10,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## 4211,3010,5,526,1,0,0,0,0,0,0,0,0 //KO_MAKIBISHI## 4211,3011,5,533,10,0,0,0,0,0,0,0,0 //KO_MEIKYOUSISUI## 4211,3012,5,531,1,0,0,0,0,0,0,0,0 //KO_ZANZOU## @@ -5653,12 +5653,12 @@ 4212,3001,1,530,5,0,0,0,0,0,0,0,0 //KO_YAMIKUMO## 4212,3002,5,0,0,0,0,0,0,0,0,0,0 //KO_RIGHT## 4212,3003,5,0,0,0,0,0,0,0,0,0,0 //KO_LEFT## -4212,3004,5,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## +4212,3004,10,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## 4212,3005,5,3004,2,0,0,0,0,0,0,0,0 //KO_SETSUDAN## 4212,3006,5,524,5,0,0,0,0,0,0,0,0 //KO_BAKURETSU## 4212,3007,5,3006,1,0,0,0,0,0,0,0,0 //KO_HAPPOKUNAI## 4212,3008,10,3010,3,0,0,0,0,0,0,0,0 //KO_MUCHANAGE## -4212,3009,5,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## +4212,3009,10,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## 4212,3010,5,526,1,0,0,0,0,0,0,0,0 //KO_MAKIBISHI## 4212,3011,5,533,10,0,0,0,0,0,0,0,0 //KO_MEIKYOUSISUI## 4212,3012,5,531,1,0,0,0,0,0,0,0,0 //KO_ZANZOU## @@ -5857,12 +5857,12 @@ 4223,3001,1,530,5,0,0,0,0,0,0,0,0 //KO_YAMIKUMO## 4223,3002,5,0,0,0,0,0,0,0,0,0,0 //KO_RIGHT## 4223,3003,5,0,0,0,0,0,0,0,0,0,0 //KO_LEFT## -4223,3004,5,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## +4223,3004,10,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## 4223,3005,5,3004,2,0,0,0,0,0,0,0,0 //KO_SETSUDAN## 4223,3006,5,524,5,0,0,0,0,0,0,0,0 //KO_BAKURETSU## 4223,3007,5,3006,1,0,0,0,0,0,0,0,0 //KO_HAPPOKUNAI## 4223,3008,10,3010,3,0,0,0,0,0,0,0,0 //KO_MUCHANAGE## -4223,3009,5,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## +4223,3009,10,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## 4223,3010,5,526,1,0,0,0,0,0,0,0,0 //KO_MAKIBISHI## 4223,3011,5,533,10,0,0,0,0,0,0,0,0 //KO_MEIKYOUSISUI## 4223,3012,5,531,1,0,0,0,0,0,0,0,0 //KO_ZANZOU## @@ -5911,12 +5911,12 @@ 4224,3001,1,530,5,0,0,0,0,0,0,0,0 //KO_YAMIKUMO## 4224,3002,5,0,0,0,0,0,0,0,0,0,0 //KO_RIGHT## 4224,3003,5,0,0,0,0,0,0,0,0,0,0 //KO_LEFT## -4224,3004,5,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## +4224,3004,10,3001,1,0,0,0,0,0,0,0,0 //KO_JYUMONJIKIRI## 4224,3005,5,3004,2,0,0,0,0,0,0,0,0 //KO_SETSUDAN## 4224,3006,5,524,5,0,0,0,0,0,0,0,0 //KO_BAKURETSU## 4224,3007,5,3006,1,0,0,0,0,0,0,0,0 //KO_HAPPOKUNAI## 4224,3008,10,3010,3,0,0,0,0,0,0,0,0 //KO_MUCHANAGE## -4224,3009,5,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## +4224,3009,10,525,5,0,0,0,0,0,0,0,0 //KO_HUUMARANKA## 4224,3010,5,526,1,0,0,0,0,0,0,0,0 //KO_MAKIBISHI## 4224,3011,5,533,10,0,0,0,0,0,0,0,0 //KO_MEIKYOUSISUI## 4224,3012,5,531,1,0,0,0,0,0,0,0,0 //KO_ZANZOU## diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 23afdeaa92..35ef71d266 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1899,6 +1899,15 @@ int64 battle_addmastery(struct map_session_data *sd,struct block_list *target,in damage += (skill * 2); #endif + // Kagerou/Oboro Spirit Charm bonus + if (sd->spiritcharm >= MAX_SPIRITCHARM) { + if ((sd->spiritcharm_type == CHARM_TYPE_FIRE && status->def_ele == ELE_EARTH) || + (sd->spiritcharm_type == CHARM_TYPE_WATER && status->def_ele == ELE_FIRE) || + (sd->spiritcharm_type == CHARM_TYPE_LAND && status->def_ele == ELE_WIND) || + (sd->spiritcharm_type == CHARM_TYPE_WIND && status->def_ele == ELE_WATER)) + damage += damage * 30 / 100; + } + if(type == 0) weapon = sd->weapontype1; else @@ -3337,6 +3346,8 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list * #endif sstatus->batk + sstatus->rhw.atk + (index >= 0 && sd->inventory_data[index] ? sd->inventory_data[index]->atk : 0)) * (skill_lv + 5) / 5; + if (sc && sc->data[SC_KAGEMUSYA]) + damagevalue += damagevalue * sc->data[SC_KAGEMUSYA]->val2 / 100; ATK_ADD(wd->damage, wd->damage2, damagevalue); #ifdef RENEWAL ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue); @@ -4029,6 +4040,9 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * #endif break; #ifdef RENEWAL + case NJ_SYURIKEN: + skillratio += 5 * skill_lv; + break; case NJ_KUNAI: skillratio += -100 + 100 * skill_lv; break; @@ -4499,13 +4513,18 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 700; break; case KO_JYUMONJIKIRI: - skillratio += -100 + 150 * skill_lv; + skillratio += -100 + 200 * skill_lv; RE_LVL_DMOD(120); if(tsc && tsc->data[SC_JYUMONJIKIRI]) skillratio += skill_lv * status_get_lv(src); + if (sc && sc->data[SC_KAGEMUSYA]) + skillratio += skillratio * sc->data[SC_KAGEMUSYA]->val2 / 100; break; case KO_HUUMARANKA: - skillratio += -100 + 150 * skill_lv + sstatus->agi + sstatus->dex + (sd ? pc_checkskill(sd,NJ_HUUMA) * 100 : 0); + skillratio += -100 + 150 * skill_lv + sstatus->str + (sd ? pc_checkskill(sd,NJ_HUUMA) * 100 : 0); + RE_LVL_DMOD(100); + if (sc && sc->data[SC_KAGEMUSYA]) + skillratio += skillratio * sc->data[SC_KAGEMUSYA]->val2 / 100; break; case KO_SETSUDAN: skillratio += 100 * (skill_lv - 1); @@ -4521,6 +4540,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + (sd ? pc_checkskill(sd,NJ_TOBIDOUGU) : 1) * (50 + sstatus->dex / 4) * skill_lv * 4 / 10; RE_LVL_DMOD(120); skillratio += 10 * (sd ? sd->status.job_level : 1); + if (sc && sc->data[SC_KAGEMUSYA]) + skillratio += skillratio * sc->data[SC_KAGEMUSYA]->val2 / 100; break; case KO_MAKIBISHI: skillratio += -100 + 20 * skill_lv; @@ -4691,10 +4712,10 @@ static int64 battle_calc_skill_constant_addition(struct Damage* wd, struct block else atk = sstatus->matk_min; break; -#endif case NJ_SYURIKEN: atk = 4 * skill_lv; break; +#endif #ifdef RENEWAL case HT_FREEZINGTRAP: if(sd) @@ -6222,17 +6243,17 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case NJ_KOUENKA: skillratio -= 10; if(sd && sd->spiritcharm_type == CHARM_TYPE_FIRE && sd->spiritcharm > 0) - skillratio += 20 * sd->spiritcharm; + skillratio += 10 * sd->spiritcharm; break; case NJ_KAENSIN: skillratio -= 50; if(sd && sd->spiritcharm_type == CHARM_TYPE_FIRE && sd->spiritcharm > 0) - skillratio += 10 * sd->spiritcharm; + skillratio += 20 * sd->spiritcharm; break; case NJ_BAKUENRYU: skillratio += 50 + 150 * skill_lv; if(sd && sd->spiritcharm_type == CHARM_TYPE_FIRE && sd->spiritcharm > 0) - skillratio += 15 * sd->spiritcharm; + skillratio += 100 * sd->spiritcharm; break; case NJ_HYOUSENSOU: #ifdef RENEWAL @@ -6241,12 +6262,12 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += 2 * skill_lv; #endif if(sd && sd->spiritcharm_type == CHARM_TYPE_WATER && sd->spiritcharm > 0) - skillratio += 5 * sd->spiritcharm; + skillratio += 20 * sd->spiritcharm; break; case NJ_HYOUSYOURAKU: skillratio += 50 * skill_lv; if(sd && sd->spiritcharm_type == CHARM_TYPE_WATER && sd->spiritcharm > 0) - skillratio += 25 * sd->spiritcharm; + skillratio += 100 * sd->spiritcharm; break; case NJ_RAIGEKISAI: #ifdef RENEWAL @@ -6255,12 +6276,12 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += 60 + 40 * skill_lv; #endif if(sd && sd->spiritcharm_type == CHARM_TYPE_WIND && sd->spiritcharm > 0) - skillratio += 15 * sd->spiritcharm; + skillratio += 20 * sd->spiritcharm; break; case NJ_KAMAITACHI: skillratio += 100 * skill_lv; if(sd && sd->spiritcharm_type == CHARM_TYPE_WIND && sd->spiritcharm > 0) - skillratio += 10 * sd->spiritcharm; + skillratio += 100 * sd->spiritcharm; break; case NJ_HUUJIN: #ifdef RENEWAL diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 68461c1423..37b053c6bf 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -12478,8 +12478,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case SO_WATER_INSIGNIA: case SO_WIND_INSIGNIA: case SO_EARTH_INSIGNIA: - case KO_HUUMARANKA: - case KO_BAKURETSU: case KO_ZENKAI: case MH_LAVA_SLIDE: case MH_VOLCANIC_ASH: diff --git a/src/map/status.cpp b/src/map/status.cpp index 5bd7880271..f16627d6f8 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -11600,9 +11600,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty clif_status_change(bl,EFST_ACTIVE_MONSTER_TRANSFORM,1,0,1002,0,0); break; case SC_KAGEMUSYA: - val2 = tick/1000; + val2 = 20; // Damage increase bonus val3 = val1 * 2; tick_time = 1000; + val4 = tick / tick_time; break; case SC_ZANGETSU: if( status_get_hp(bl) % 2 == 0 ) @@ -14462,7 +14463,7 @@ TIMER_FUNC(status_change_timer){ } break; case SC_KAGEMUSYA: - if( --(sce->val2) >= 0 ) { + if( --(sce->val4) >= 0 ) { if(!status_charge(bl, 0, 1)) break; sc_timer_next(1000+tick); return 0; From 2863dc262bd00333fec035ef83fec3c6ed00e4f5 Mon Sep 17 00:00:00 2001 From: Yashim Wong Date: Thu, 7 May 2020 02:28:23 +0800 Subject: [PATCH 089/212] Fixed Bard's Musical Strike AfterCastDelay (#4904) * Fixes #4903. * Fixes Bard's Musical Stroke AfterCastDelay from 3.0 seconds to 0.3 seconds. Thanks to @yashimwong! --- db/re/skill_db.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index de56d13ddd..c22907d46e 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -8756,7 +8756,7 @@ Body: HitCount: 2 Element: Weapon CastTime: 500 - AfterCastActDelay: 3000 + AfterCastActDelay: 300 FixedCastTime: 300 Requires: SpCost: 12 From eaa0a873f6ce1635835b698b337c5662fefbf40d Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 6 May 2020 14:57:09 -0400 Subject: [PATCH 090/212] Adjusts Adoramus cooldown (#4900) * Follow up to d699def. * Adjusts Adoramus cooldown from 2 seconds to 2.5 seconds. Thanks to @Badarosk0! --- db/re/skill_db.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index c22907d46e..c93dd989a9 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -19680,7 +19680,7 @@ Body: Time: 55000 - Level: 10 Time: 60000 - Cooldown: 2000 + Cooldown: 2500 FixedCastTime: -1 Requires: SpCost: From 956f14bbfd29d9d44d5b0e326055d3b7e87f5692 Mon Sep 17 00:00:00 2001 From: LordWhiplash <62680611+LordWhiplash@users.noreply.github.com> Date: Wed, 6 May 2020 22:28:43 -0300 Subject: [PATCH 091/212] Missing NC_ARMSCANNON Cooldown (#4906) * Adds cool down for Arms Cannon. Thanks to @LordWhiplash! --- db/re/skill_db.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index c93dd989a9..64eeb4ea54 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -21276,17 +21276,18 @@ Body: Time: 2000 - Level: 5 Time: 2200 - AfterCastActDelay: + AfterCastActDelay: 1000 + Cooldown: - Level: 1 - Time: 1000 + Time: 150 - Level: 2 - Time: 1000 + Time: 200 - Level: 3 - Time: 1000 + Time: 300 - Level: 4 - Time: 1000 + Time: 450 - Level: 5 - Time: 1000 + Time: 650 FixedCastTime: - Level: 1 Time: 600 From 931155ee33e54239d3459695a13ea229e3f70242 Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 7 May 2020 14:48:44 -0400 Subject: [PATCH 092/212] Job Improvement Project - Super Novice (#4429) * Fixes #4427. * kRO Changelog: http://ro.gnjoy.com/news/notice/View.asp?BBSMode=10001&seq=7081 Thanks to @Rytech2! --- db/job_db2.txt | 4 +- db/re/job_db1.txt | 2 +- db/re/skill_db.yml | 25 ++++++++++++ db/re/skill_tree.txt | 52 ++++++++++++++++++++++--- sql-files/upgrades/upgrade_20200506.sql | 11 ++++++ src/map/battle.cpp | 7 ++++ src/map/pc.hpp | 4 +- src/map/script_constants.hpp | 1 + src/map/skill.cpp | 33 ++++++++++++---- src/map/skill.hpp | 4 ++ src/map/status.cpp | 47 +++++++++++++++++----- src/map/status.hpp | 2 + 12 files changed, 163 insertions(+), 29 deletions(-) create mode 100644 sql-files/upgrades/upgrade_20200506.sql diff --git a/db/job_db2.txt b/db/job_db2.txt index c02bb99015..dd8219049d 100644 --- a/db/job_db2.txt +++ b/db/job_db2.txt @@ -280,9 +280,9 @@ // Baby Mechanic (Mado) 4112,6,1,0,0,1,0,6,2,5,4,0,0,4,6,0,0,2,0,3,3,4,5,0,0,3,6,0,0,3,0,1,1,3,6,0,0,4,4,0,0,0,3,3,1,1,0,0,5,2,0,6,1,5,0,4,3,2,0,5,1 // Super Novice (Expanded) -4190,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0 +4190,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,4,5,0 // Super Baby (Expanded) -4191,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0 +4191,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,0,3,0,4,5,0,6,0,1,2,4,5,0 // Kagerou 4211,5,0,4,0,2,3,0,1,6,0,5,1,2,0,4,6,3,0,1,5,2,0,6,3,4,0,5,0,2,0,1,4,0,5,4,0,3,5,1,0,2,4,1,0,5,6,2,1,0,5 // Oboro diff --git a/db/re/job_db1.txt b/db/re/job_db1.txt index 6db7ae21a0..8a3aecdad8 100644 --- a/db/re/job_db1.txt +++ b/db/re/job_db1.txt @@ -262,7 +262,7 @@ // Baby Mechanic (Mado) 4112, 30000,90 ,500 ,400 ,40 ,60 ,65 ,200 ,200 ,200 ,45 ,48 ,48 ,50 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,6 // Super Novice (Expanded) -4190, 20000,0 ,500 ,100 ,40 ,55 ,57 ,200 ,200 ,200 ,50 ,200 ,50 ,55 ,65 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,65 ,10 +4190, 20000,0 ,5000 ,500 ,40 ,55 ,57 ,200 ,200 ,200 ,50 ,200 ,50 ,55 ,65 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,65 ,10 // Super Baby (Expanded) 4191, 20000,0 ,500 ,100 ,40 ,55 ,57 ,200 ,200 ,200 ,50 ,200 ,50 ,55 ,65 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,65 ,10 // Kagerou diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 64eeb4ea54..47f53dea02 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -33561,6 +33561,31 @@ Body: FixedCastTime: 2000 Requires: SpCost: 70 + - Id: 5075 + Name: NV_BREAKTHROUGH + Description: Break Through + MaxLevel: 5 + - Id: 5076 + Name: NV_HELPANGEL + Description: Help Angel + MaxLevel: 1 + TargetType: Self + DamageFlags: + NoDamage: true + Splash: true + Hit: Single + HitCount: 1 + SplashArea: 7 + CastCancel: true + AfterCastActDelay: 500 + Duration1: 20000 + Cooldown: 300000 + Requires: + SpCost: 1 + - Id: 5077 + Name: NV_TRANSCENDENCE + Description: Transcendence + MaxLevel: 5 - Id: 8001 Name: HLIF_HEAL Description: Healing Touch diff --git a/db/re/skill_tree.txt b/db/re/skill_tree.txt index 96c67e1685..9a8b1fc302 100644 --- a/db/re/skill_tree.txt +++ b/db/re/skill_tree.txt @@ -5455,34 +5455,54 @@ 4190,53,1,52,3,0,0,0,0,0,0,0,0 //TF_DETOXIFY#Detoxify# 4190,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby# 4190,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus# +4190,68,5,31,1,66,3,0,0,0,0,0,0 //PR_ASPERSIO#Aspersio# 4190,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary# 4190,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery# +4190,74,5,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#Magnificat# 4190,75,5,70,7,0,0,0,0,0,0,0,0 //PR_GLORIA#Gloria# 4190,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar# 4190,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher# +4190,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm# 4190,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder# +4190,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion# 4190,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball# 4190,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall# 4190,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova# +4190,89,10,15,1,84,3,0,0,0,0,0,0 //WZ_STORMGUST#Storm Gust# 4190,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike# 4190,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive# 4190,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire# 4190,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense# 4190,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding# 4190,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research# +4190,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair# 4190,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap# -4190,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman# -4190,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher# -4190,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap# +4190,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine# +4190,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane# 4190,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison# +4190,139,10,138,3,0,0,0,0,0,0,0,0 //AS_POISONREACT#Poison React# +4190,140,10,138,5,0,0,0,0,0,0,0,0 //AS_VENOMDUST#Venom Dust# +4190,141,10,139,5,140,5,0,0,0,0,0,0 //AS_SPLASHER#Venom Splasher# +4190,210,10,50,1,0,0,0,0,0,0,0,0 //RG_SNATCHER#Gank# +4190,211,10,210,4,0,0,0,0,0,0,0,0 //RG_STEALCOIN#Mug# +4190,212,10,211,4,0,0,0,0,0,0,0,0 //RG_BACKSTAP#Back Stab# 4190,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk# +4190,214,5,212,2,213,2,0,0,0,0,0,0 //RG_RAID#Sightless Raid# 4190,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery# 4190,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith# +4190,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard# +4190,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite# +4190,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang# 4190,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross# 4190,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists# 4190,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere# 4190,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere# +4190,270,5,262,1,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#Fury# 4190,365,1,9,1,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#Stave Crasher# +4190,401,1,261,5,262,1,270,5,0,0,0,0 //CH_SOULCOLLECT#Hyper Spirit Sphere# +4190,5075,5,0,0,0,0,0,0,0,0,0,0 //NV_BREAKTHROUGH#Break Through# +4190,5076,1,0,0,0,0,0,0,0,0,0,0 //NV_HELPANGEL#Help Angel# +4190,5077,5,0,0,0,0,0,0,0,0,0,0 //NV_TRANSCENDENCE#Transcendence# 4190,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# 4190,2544,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTDECORATE#Cart Decorate# //Super Baby (Expanded) @@ -5540,34 +5560,54 @@ 4191,408,1,0,0,0,0,0,0,0,0,0,0 //WE_BABY#Baby# 4191,409,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLPARENT#Call Parent# 4191,66,5,0,0,0,0,0,0,0,0,0,0 //PR_IMPOSITIO#Impositio Manus# +4191,68,5,31,1,66,3,0,0,0,0,0,0 //PR_ASPERSIO#Aspersio# 4191,70,10,28,1,0,0,0,0,0,0,0,0 //PR_SANCTUARY#Sanctuary# 4191,72,1,0,0,0,0,0,0,0,0,0,0 //PR_STRECOVERY#Status Recovery# +4191,74,5,0,0,0,0,0,0,0,0,0,0 //PR_MAGNIFICAT#Magnificat# 4191,75,5,70,7,0,0,0,0,0,0,0,0 //PR_GLORIA#Gloria# 4191,80,10,18,1,0,0,0,0,0,0,0,0 //WZ_FIREPILLAR#Fire Pillar# 4191,81,10,20,1,10,1,0,0,0,0,0,0 //WZ_SIGHTRASHER#Sightrasher# +4191,83,10,81,2,21,1,0,0,0,0,0,0 //WZ_METEOR#Meteor Storm# 4191,84,10,11,1,20,1,0,0,0,0,0,0 //WZ_JUPITEL#Jupiter Thunder# +4191,85,10,21,1,84,5,0,0,0,0,0,0 //WZ_VERMILION#Lord of Vermilion# 4191,86,5,14,1,20,1,0,0,0,0,0,0 //WZ_WATERBALL#Water Ball# 4191,87,10,16,1,15,1,0,0,0,0,0,0 //WZ_ICEWALL#Ice Wall# 4191,88,10,87,1,0,0,0,0,0,0,0,0 //WZ_FROSTNOVA#Frost Nova# +4191,89,10,15,1,84,3,0,0,0,0,0,0 //WZ_STORMGUST#Storm Gust# 4191,90,5,16,1,0,0,0,0,0,0,0,0 //WZ_EARTHSPIKE#Earth Spike# 4191,91,5,90,3,0,0,0,0,0,0,0,0 //WZ_HEAVENDRIVE#Heaven's Drive# 4191,92,5,91,1,0,0,0,0,0,0,0,0 //WZ_QUAGMIRE#Quagmire# 4191,93,1,0,0,0,0,0,0,0,0,0,0 //WZ_ESTIMATION#Sense# 4191,105,1,0,0,0,0,0,0,0,0,0,0 //BS_HILTBINDING#Hilt Binding# 4191,107,10,105,1,0,0,0,0,0,0,0,0 //BS_WEAPONRESEARCH#Weaponry Research# +4191,108,1,107,1,0,0,0,0,0,0,0,0 //BS_REPAIRWEAPON#Weapon Repair# 4191,115,5,0,0,0,0,0,0,0,0,0,0 //HT_SKIDTRAP#Skid Trap# -4191,119,5,120,1,0,0,0,0,0,0,0,0 //HT_SANDMAN#Sandman# -4191,120,5,115,1,0,0,0,0,0,0,0,0 //HT_FLASHER#Flasher# -4191,121,5,120,1,0,0,0,0,0,0,0,0 //HT_FREEZINGTRAP#Freezing Trap# +4191,116,5,0,0,0,0,0,0,0,0,0,0 //HT_LANDMINE#Land Mine# +4191,126,10,0,0,0,0,0,0,0,0,0,0 //HT_BEASTBANE#Beast Bane# 4191,138,10,52,1,0,0,0,0,0,0,0,0 //AS_ENCHANTPOISON#Enchant Poison# +4191,139,10,138,3,0,0,0,0,0,0,0,0 //AS_POISONREACT#Poison React# +4191,140,10,138,5,0,0,0,0,0,0,0,0 //AS_VENOMDUST#Venom Dust# +4191,141,10,139,5,140,5,0,0,0,0,0,0 //AS_SPLASHER#Venom Splasher# +4191,210,10,50,1,0,0,0,0,0,0,0,0 //RG_SNATCHER#Gank# +4191,211,10,210,4,0,0,0,0,0,0,0,0 //RG_STEALCOIN#Mug# +4191,212,10,211,4,0,0,0,0,0,0,0,0 //RG_BACKSTAP#Back Stab# 4191,213,5,51,1,0,0,0,0,0,0,0,0 //RG_TUNNELDRIVE#Stalk# +4191,214,5,212,2,213,2,0,0,0,0,0,0 //RG_RAID#Sightless Raid# 4191,226,10,0,0,0,0,0,0,0,0,0,0 //AM_AXEMASTERY#Axe Mastery# 4191,248,10,0,0,0,0,0,0,0,0,0,0 //CR_TRUST#Faith# +4191,249,10,0,0,0,0,0,0,0,0,0,0 //CR_AUTOGUARD#Guard# +4191,250,5,249,5,0,0,0,0,0,0,0,0 //CR_SHIELDCHARGE#Smite# +4191,251,5,250,3,0,0,0,0,0,0,0,0 //CR_SHIELDBOOMERANG#Shield Boomerang# 4191,253,10,248,7,0,0,0,0,0,0,0,0 //CR_HOLYCROSS#Holy Cross# 4191,259,10,23,10,22,10,0,0,0,0,0,0 //MO_IRONHAND#Iron Fists# 4191,261,5,259,2,0,0,0,0,0,0,0,0 //MO_CALLSPIRITS#Summon Spirit Sphere# 4191,262,1,261,5,0,0,0,0,0,0,0,0 //MO_ABSORBSPIRITS#Absorb Spirit Sphere# +4191,270,5,262,1,0,0,0,0,0,0,0,0 //MO_EXPLOSIONSPIRITS#Fury# 4191,365,1,9,1,0,0,0,0,0,0,0,0 //HW_MAGICCRASHER#Stave Crasher# +4191,401,1,261,5,262,1,270,5,0,0,0,0 //CH_SOULCOLLECT#Hyper Spirit Sphere# +4191,5075,5,0,0,0,0,0,0,0,0,0,0 //NV_BREAKTHROUGH#Break Through# +4191,5076,1,0,0,0,0,0,0,0,0,0,0 //NV_HELPANGEL#Help Angel# +4191,5077,5,0,0,0,0,0,0,0,0,0,0 //NV_TRANSCENDENCE#Transcendence# 4191,2535,1,41,1,0,0,0,0,0,0,0,0 //ALL_BUYING_STORE#Open Buying Store# 4191,2544,1,0,0,0,0,0,0,0,0,0,0 //MC_CARTDECORATE#Cart Decorate# 4191,5065,1,0,0,0,0,0,0,0,0,0,0 //WE_CHEERUP#Cheer Up# diff --git a/sql-files/upgrades/upgrade_20200506.sql b/sql-files/upgrades/upgrade_20200506.sql new file mode 100644 index 0000000000..031eb291ee --- /dev/null +++ b/sql-files/upgrades/upgrade_20200506.sql @@ -0,0 +1,11 @@ +-- HT_SANDMAN +UPDATE `char` c, `skill` s SET `c`.skill_point = `c`.skill_point + `s`.lv WHERE (`c`.class = 4190 OR `c`.class = 4191) AND `s`.id = 119 AND `c`.char_id = `s`.char_id; +DELETE FROM `skill` USING `skill`, `char` WHERE (`char`.class = 4190 OR `char`.class = 4191) AND `skill`.id = 119 AND `char`.char_id = `skill`.char_id; + +-- HT_FLASHER +UPDATE `char` c, `skill` s SET `c`.skill_point = `c`.skill_point + `s`.lv WHERE (`c`.class = 4190 OR `c`.class = 4191) AND `s`.id = 120 AND `c`.char_id = `s`.char_id; +DELETE FROM `skill` USING `skill`, `char` WHERE (`char`.class = 4190 OR `char`.class = 4191) AND `skill`.id = 120 AND `char`.char_id = `skill`.char_id; + +-- HT_FREEZINGTRAP +UPDATE `char` c, `skill` s SET `c`.skill_point = `c`.skill_point + `s`.lv WHERE (`c`.class = 4190 OR `c`.class = 4191) AND `s`.id = 121 AND `c`.char_id = `s`.char_id; +DELETE FROM `skill` USING `skill`, `char` WHERE (`char`.class = 4190 OR `char`.class = 4191) AND `skill`.id = 121 AND `char`.char_id = `skill`.char_id; diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 35ef71d266..b2d7d05fd2 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -3112,6 +3112,13 @@ static void battle_calc_attack_masteries(struct Damage* wd, struct block_list *s #endif } + if (skill_id == NV_BREAKTHROUGH) { + ATK_ADD(wd->damage, wd->damage2, 15 * skill_lv + (skill_lv > 4 ? 25 : 0)); +#ifdef RENEWAL + ATK_ADD(wd->masteryAtk, wd->masteryAtk2, 15 * skill_lv + (skill_lv > 4 ? 25 : 0)); +#endif + } + switch(skill_id) { case RA_WUGDASH: case RA_WUGSTRIKE: diff --git a/src/map/pc.hpp b/src/map/pc.hpp index 54c74d7718..bf135dbb1a 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -57,8 +57,8 @@ enum sc_type : int16; #define ACHIEVEMENTLEVEL "AchievementLevel" //Update this max as necessary. 55 is the value needed for Super Baby currently -//Raised to 85 since Expanded Super Baby needs it. -#define MAX_SKILL_TREE 85 +//Raised to 105 since Expanded Super Baby needs it. +#define MAX_SKILL_TREE 105 //Total number of classes (for data storage) #define CLASS_COUNT (JOB_MAX - JOB_NOVICE_HIGH + JOB_MAX_BASIC) diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 6ea81c393a..fb2b68cc1a 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1578,6 +1578,7 @@ export_constant(SC_HELLS_PLANT); export_constant(SC_INCREASE_MAXHP); export_constant(SC_INCREASE_MAXSP); + export_constant(SC_HELPANGEL); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); #endif diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 37b053c6bf..cf7158f411 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -595,27 +595,43 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk if( (!heal || (target && target->type == BL_MER)) && skill_id != NPC_EVILLAND ) hp >>= 1; - if (sd && ((skill = pc_checkskill(sd, SU_POWEROFSEA)) > 0)) { + if (sd) { + if (pc_checkskill(sd, SU_POWEROFSEA) > 0) { #ifdef RENEWAL - hp_bonus += 10; + hp_bonus += 10; #else - hp += hp * 10 / 100; + hp += hp * 10 / 100; #endif - if (pc_checkskill(sd, SU_TUNABELLY) == 5 && pc_checkskill(sd, SU_TUNAPARTY) == 5 && pc_checkskill(sd, SU_BUNCHOFSHRIMP) == 5 && pc_checkskill(sd, SU_FRESHSHRIMP) == 5) + if (pc_checkskill(sd, SU_TUNABELLY) == 5 && pc_checkskill(sd, SU_TUNAPARTY) == 5 && pc_checkskill(sd, SU_BUNCHOFSHRIMP) == 5 && pc_checkskill(sd, SU_FRESHSHRIMP) == 5) #ifdef RENEWAL - hp_bonus += 20; + hp_bonus += 20; #else - hp += hp * 20 / 100; + hp += hp * 20 / 100; #endif - } + } - if (sd && (skill = pc_skillheal_bonus(sd, skill_id))) + if ((skill = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0) +#ifdef RENEWAL + hp_bonus += 2; +#else + hp += hp * skill * 2 / 100; +#endif + + if ((skill = pc_checkskill(sd, NV_TRANSCENDENCE)) > 0) +#ifdef RENEWAL + hp_bonus += 3; +#else + hp += hp * skill * 3 / 100; +#endif + + if (skill = pc_skillheal_bonus(sd, skill_id)) #ifdef RENEWAL hp_bonus += skill; #else hp += hp * skill / 100; #endif + } if (tsd && (skill = pc_skillheal2_bonus(tsd, skill_id))) #ifdef RENEWAL @@ -7690,6 +7706,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case CASH_INCAGI: case CASH_ASSUMPTIO: case WM_FRIGG_SONG: + case NV_HELPANGEL: if( sd == NULL || sd->status.party_id == 0 || (flag & 1) ) clif_skill_nodamage(bl, bl, skill_id, skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); else if( sd ) diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 6d8c1e35d7..c13854c3c2 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -1957,6 +1957,10 @@ enum e_skill { AB_VITUPERATUM = 5072, AB_CONVENIO, + ALL_LIGHTNING_STORM, + NV_BREAKTHROUGH, + NV_HELPANGEL, + NV_TRANSCENDENCE, HLIF_HEAL = 8001, HLIF_AVOID, diff --git a/src/map/status.cpp b/src/map/status.cpp index f16627d6f8..98fce72184 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -1099,6 +1099,10 @@ void initChangeTables(void) set_sc( SP_SOULREAPER , SC_SOULREAPER , EFST_SOULREAPER , SCB_NONE ); set_sc( SP_SOULCOLLECT , SC_SOULCOLLECT , EFST_SOULCOLLECT , SCB_NONE ); +#ifdef RENEWAL + set_sc( NV_HELPANGEL , SC_HELPANGEL , EFST_HELPANGEL , SCB_NONE ); +#endif + /* Storing the target job rather than simply SC_SPIRIT simplifies code later on */ SkillStatusChangeTable[skill_get_index(SL_ALCHEMIST)] = (sc_type)MAPID_ALCHEMIST, SkillStatusChangeTable[skill_get_index(SL_MONK)] = (sc_type)MAPID_MONK, @@ -3299,11 +3303,11 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { //Only for BL_PC if (bl->type == BL_PC) { struct map_session_data *sd = map_id2sd(bl->id); - uint8 i; + uint16 skill_lv; bonus += sd->bonus.hp; - if ((i = pc_checkskill(sd,CR_TRUST)) > 0) - bonus += i * 200; + if ((skill_lv = pc_checkskill(sd,CR_TRUST)) > 0) + bonus += skill_lv * 200; if (pc_checkskill(sd,SU_SPRITEMABLE) > 0) bonus += 1000; if (pc_checkskill(sd, SU_POWEROFSEA) > 0) { @@ -3312,6 +3316,10 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19) bonus += 2000; } + if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0) + bonus += 350 * skill_lv + (skill_lv > 4 ? 250 : 0); + if ((skill_lv = pc_checkskill(sd, NV_TRANSCENDENCE)) > 0) + bonus += 350 * skill_lv + (skill_lv > 4 ? 250 : 0); #ifndef HP_SP_TABLES if ((sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.base_level >= 99) bonus += 2000; // Supernovice lvl99 hp bonus. @@ -3467,15 +3475,15 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { //Only for BL_PC if (bl->type == BL_PC) { struct map_session_data *sd = map_id2sd(bl->id); - uint8 i; + uint16 skill_lv; bonus += sd->bonus.sp; - if ((i = pc_checkskill(sd,SL_KAINA)) > 0) - bonus += 30 * i; - if ((i = pc_checkskill(sd,RA_RESEARCHTRAP)) > 0) - bonus += 200 + 20 * i; - if ((i = pc_checkskill(sd,WM_LESSON)) > 0) - bonus += 30 * i; + if ((skill_lv = pc_checkskill(sd,SL_KAINA)) > 0) + bonus += 30 * skill_lv; + if ((skill_lv = pc_checkskill(sd,RA_RESEARCHTRAP)) > 0) + bonus += 200 + 20 * skill_lv; + if ((skill_lv = pc_checkskill(sd,WM_LESSON)) > 0) + bonus += 30 * skill_lv; if (pc_checkskill(sd,SU_SPRITEMABLE) > 0) bonus += 100; if (pc_checkskill(sd, SU_POWEROFSEA) > 0) { @@ -3484,6 +3492,10 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19) bonus += 200; } + if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0) + bonus += 30 * skill_lv + (skill_lv > 4 ? 50 : 0); + if ((skill_lv = pc_checkskill(sd, NV_TRANSCENDENCE)) > 0) + bonus += 30 * skill_lv + (skill_lv > 4 ? 50 : 0); } //Bonus by SC @@ -5572,6 +5584,8 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) // Any +MATK you get from skills and cards, including cards in weapon, is added here. if (sd) { + uint16 skill_lv; + if (sd->bonus.ematk > 0) status->matk_min += sd->bonus.ematk; if (pc_checkskill(sd, SU_POWEROFLAND) > 0) { @@ -5579,6 +5593,8 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) pc_checkskill(sd, SU_CHATTERING) + pc_checkskill(sd, SU_MEOWMEOW) + pc_checkskill(sd, SU_NYANGGRASS)) > 19) status->matk_min += status->matk_min * 20 / 100; } + if ((skill_lv = pc_checkskill(sd, NV_TRANSCENDENCE)) > 0) + status->matk_min += 15 * skill_lv + (skill_lv > 4 ? 25 : 0); } status->matk_min = status_calc_ematk(bl, sc, status->matk_min); @@ -11958,6 +11974,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val1 = 15; // Heal Power rate bonus val2 = 30; // SP Recovery rate bonus break; + case SC_HELPANGEL: + tick_time = 1000; + val4 = tick / tick_time; + break; case SC_SUNSTANCE: val2 = 2 + val1; // ATK Increase @@ -14657,6 +14677,13 @@ TIMER_FUNC(status_change_timer){ return 0; } break; + case SC_HELPANGEL: + if (--(sce->val4) >= 0) { + status_heal(bl, 1000, 350, 2); + sc_timer_next(1000 + tick); + return 0; + } + break; } // If status has an interval and there is at least 100ms remaining time, wait for next interval diff --git a/src/map/status.hpp b/src/map/status.hpp index 95a01cb0db..ff114ac473 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -924,6 +924,8 @@ enum sc_type : int16 { SC_INCREASE_MAXHP, // EFST_ATKER_ASPD SC_INCREASE_MAXSP, // EFST_ATKER_MOVESPEED + SC_HELPANGEL, + #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled #endif From d1719f670ffa77b6849bc97817b4d047c6970afd Mon Sep 17 00:00:00 2001 From: Kreustoo Date: Fri, 8 May 2020 14:28:14 +0200 Subject: [PATCH 093/212] Adds missing args for round/ceil/floor (#4899) * Fixes #4898. * Only missing one integer in parameter in BUILDIN_DEF2, already ready to read in the definition of the function. Thanks to @Kreustoo! --- src/map/script.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/script.cpp b/src/map/script.cpp index 388918fbc9..8b5ebd683e 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -25291,9 +25291,9 @@ struct script_function buildin_func[] = { BUILDIN_DEF(getequiprefinecost,"iii?"), - BUILDIN_DEF2(round, "round", "i"), - BUILDIN_DEF2(round, "ceil", "i"), - BUILDIN_DEF2(round, "floor", "i"), + BUILDIN_DEF2(round, "round", "ii"), + BUILDIN_DEF2(round, "ceil", "ii"), + BUILDIN_DEF2(round, "floor", "ii"), BUILDIN_DEF(getequiptradability, "i?"), BUILDIN_DEF(mail, "isss*"), BUILDIN_DEF(open_roulette,"?"), From 73140bd078036ef173568918102e42f824ee148c Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Sat, 9 May 2020 15:53:17 +0200 Subject: [PATCH 094/212] Fixed monster messages not loading (#4908) --- src/map/mob.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 218cb387dd..56ac411314 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -3768,7 +3768,7 @@ int mobskill_use(struct mob_data *md, t_tick tick, int event) } } //Skill used. Post-setups... - if ( ms[ i ].msg_id ){ //Display color message [SnakeDrak] + if ( ms[i].msg_id ){ //Display color message [SnakeDrak] struct mob_chat *mc = mob_chat(ms[i].msg_id); if (mc) { @@ -5525,10 +5525,9 @@ static void mob_load(void) }; // First we parse all the possible monsters to add additional data in the second loop - if( db_use_sqldbs ){ + if( db_use_sqldbs ) mob_read_sqldb(); - mob_read_sqlskilldb(); - }else{ + else { for(int i = 0; i < ARRAYLENGTH(dbsubpath); i++){ int n2 = strlen(db_path)+strlen(DBPATH)+strlen(dbsubpath[i])+1; char* dbsubpath2 = (char*)aMalloc(n2+1); @@ -5553,7 +5552,7 @@ static void mob_load(void) char* dbsubpath1 = (char*)aMalloc(n1+1); char* dbsubpath2 = (char*)aMalloc(n2+1); bool silent = i > 0; - + if(i==0) { safesnprintf(dbsubpath1,n1,"%s%s",db_path,dbsubpath[i]); safesnprintf(dbsubpath2,n2,"%s/%s%s",db_path,DBPATH,dbsubpath[i]); @@ -5561,14 +5560,16 @@ static void mob_load(void) safesnprintf(dbsubpath1,n1,"%s%s",db_path,dbsubpath[i]); safesnprintf(dbsubpath2,n1,"%s%s",db_path,dbsubpath[i]); } - - if( !db_use_sqldbs ){ + + sv_readdb(dbsubpath1, "mob_chat_db.txt", '#', 3, 3, -1, &mob_parse_row_chatdb, silent); + + if( db_use_sqldbs ) + mob_read_sqlskilldb(); + else mob_readskilldb(dbsubpath2, silent); - } sv_readdb(dbsubpath2, "mob_race2_db.txt", ',', 2, MAX_RACE2_MOBS, -1, &mob_readdb_race2, silent); sv_readdb(dbsubpath1, "mob_item_ratio.txt", ',', 2, 2+MAX_ITEMRATIO_MOBS, -1, &mob_readdb_itemratio, silent); - sv_readdb(dbsubpath1, "mob_chat_db.txt", '#', 3, 3, -1, &mob_parse_row_chatdb, silent); sv_readdb(dbsubpath2, "mob_random_db.txt", ',', 4, 4, -1, &mob_readdb_group, silent); sv_readdb(dbsubpath2, "mob_branch.txt", ',', 4, 4, -1, &mob_readdb_group, silent); sv_readdb(dbsubpath2, "mob_poring.txt", ',', 4, 4, -1, &mob_readdb_group, silent); @@ -5577,7 +5578,7 @@ static void mob_load(void) sv_readdb(dbsubpath1, "mob_mission.txt", ',', 4, 4, -1, &mob_readdb_group, silent); sv_readdb(dbsubpath1, "mob_classchange.txt", ',', 4, 4, -1, &mob_readdb_group, silent); sv_readdb(dbsubpath2, "mob_drop.txt", ',', 3, 5, -1, &mob_readdb_drop, silent); - + aFree(dbsubpath1); aFree(dbsubpath2); } From fb890c747c7f591aab7290d5e84b69c6ab51e024 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Sun, 10 May 2020 04:12:29 +0200 Subject: [PATCH 095/212] Fixed Piano Key Quest hidden warp position in pre-re (#4888) --- npc/pre-re/quests/quests_niflheim.txt | 10 ++++++++++ npc/pre-re/scripts_athena.conf | 1 + npc/quests/quests_niflheim.txt | 2 +- npc/re/quests/quests_niflheim.txt | 10 ++++++++++ npc/re/scripts_athena.conf | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 npc/pre-re/quests/quests_niflheim.txt create mode 100644 npc/re/quests/quests_niflheim.txt diff --git a/npc/pre-re/quests/quests_niflheim.txt b/npc/pre-re/quests/quests_niflheim.txt new file mode 100644 index 0000000000..0a193cfa55 --- /dev/null +++ b/npc/pre-re/quests/quests_niflheim.txt @@ -0,0 +1,10 @@ +//===== rAthena Script ======================================= +//= Quest NPCs related to Niflheim +//===== Description: ========================================= +//= [Official Conversion] +//= Piano Key Ouest +//===== Additional Comments: ================================= +//= 1.0 Moved Piano3 to pre-re/re paths. [Daegaladh] +//============================================================ + +nif_in,114,181,0 duplicate(Piano3) #Piano3 HIDDEN_NPC,1,1 diff --git a/npc/pre-re/scripts_athena.conf b/npc/pre-re/scripts_athena.conf index 4cb4306aee..d58007278c 100644 --- a/npc/pre-re/scripts_athena.conf +++ b/npc/pre-re/scripts_athena.conf @@ -93,5 +93,6 @@ npc: npc/pre-re/quests/quests_izlude.txt npc: npc/pre-re/quests/quests_lighthalzen.txt npc: npc/pre-re/quests/quests_morocc.txt npc: npc/pre-re/quests/quests_nameless.txt +npc: npc/pre-re/quests/quests_niflheim.txt npc: npc/pre-re/quests/the_sign_quest.txt npc: npc/pre-re/quests/quests_veins.txt diff --git a/npc/quests/quests_niflheim.txt b/npc/quests/quests_niflheim.txt index 5953066c60..d475b80268 100644 --- a/npc/quests/quests_niflheim.txt +++ b/npc/quests/quests_niflheim.txt @@ -249,7 +249,7 @@ OnTouch_: end; } -nif_in,118,151,0 script #Piano3 111,1,1,{ +- script Piano3 HIDDEN_NPC,{ end; OnTouch_: diff --git a/npc/re/quests/quests_niflheim.txt b/npc/re/quests/quests_niflheim.txt new file mode 100644 index 0000000000..2184ae3090 --- /dev/null +++ b/npc/re/quests/quests_niflheim.txt @@ -0,0 +1,10 @@ +//===== rAthena Script ======================================= +//= Quest NPCs related to Niflheim +//===== Description: ========================================= +//= [Official Conversion] +//= Piano Key Ouest +//===== Additional Comments: ================================= +//= 1.0 Moved Piano3 to pre-re/re paths. [Daegaladh] +//============================================================ + +nif_in,118,151,0 duplicate(Piano3) #Piano3 HIDDEN_NPC,1,1 diff --git a/npc/re/scripts_athena.conf b/npc/re/scripts_athena.conf index 99f1ef0ed4..9371c883aa 100644 --- a/npc/re/scripts_athena.conf +++ b/npc/re/scripts_athena.conf @@ -198,6 +198,7 @@ npc: npc/re/quests/quests_malaya.txt npc: npc/re/quests/quests_mora.txt npc: npc/re/quests/quests_morocc.txt npc: npc/re/quests/quests_nameless.txt +npc: npc/re/quests/quests_niflheim.txt npc: npc/re/quests/quests_rockridge.txt npc: npc/re/quests/quests_veins.txt npc: npc/re/quests/the_sign_quest.txt From 39f3a17f54dc626d69f5ee3655f0699ed1062a48 Mon Sep 17 00:00:00 2001 From: ~Neutral~ <33843418+NeutralDev@users.noreply.github.com> Date: Sat, 9 May 2020 21:21:41 -0500 Subject: [PATCH 096/212] Fixed Dual Wielding Axes breaking when they should be unbreakable (#4518) --- src/map/skill.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index cf7158f411..4de4a72568 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -2659,6 +2659,9 @@ int skill_break_equip(struct block_list *src, struct block_list *bl, unsigned sh case W_2HSTAFF: case W_BOOK: //Rods and Books can't be broken [Skotlex] case W_HUUMA: + case W_DOUBLE_AA: // Axe usage during dual wield should also prevent breaking [Neutral] + case W_DOUBLE_DA: + case W_DOUBLE_SA: where &= ~EQP_WEAPON; } } From c4609b19d6910ae05d6424a8cb1da2142d870ef0 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Sun, 10 May 2020 05:30:24 +0200 Subject: [PATCH 097/212] Follow up to b2aa7e698da55bcae198dfcda7ab706f35d958e3 --- src/map/skill.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 4de4a72568..3985450d76 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -8568,7 +8568,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case TF_BACKSLIDING: //This is the correct implementation as per packet logging information. [Skotlex] skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),unit_getdir(bl),(enum e_skill_blown)(BLOWN_IGNORE_NO_KNOCKBACK|BLOWN_DONT_SEND_PACKET)); clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); +#ifdef RENEWAL clif_blown(src); // Always blow, otherwise it shows a casting animation. [Lemongrass] +#endif break; case TK_HIGHJUMP: From 49c4ddf8f904a3dde22b092adc41da3fb1438968 Mon Sep 17 00:00:00 2001 From: Sader Fawall Date: Sun, 10 May 2020 08:34:00 +0200 Subject: [PATCH 098/212] npctalk script command now accepts color parameter (#4910) Co-authored-by: Jittapan Pluemsumran Co-authored-by: Lemongrass3110 Co-authored-by: Aleos --- doc/script_commands.txt | 5 +++-- src/map/script.cpp | 10 +++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 49bae2d921..60fd044798 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -6596,13 +6596,14 @@ Returns true if the command was executed on the other NPC successfully, false if --------------------------------------- -*npctalk ""{,"",""}; +*npctalk ""{,"",{,}}; This command will display a message as if the NPC object running it was a player talking - that is, above their head and in the chat window. The display name of the NPC won't get appended in front of the message. If the option is given and not empty, then that NPC will display the message, -else the attached NPC will display the message. +else the attached NPC will display the message, +the color format is in RGB (0xRRGGBB). The color is White by default. Target for : - bc_all : Broadcast message is sent server-wide (only in the chat window). diff --git a/src/map/script.cpp b/src/map/script.cpp index 8b5ebd683e..7ff47a67fd 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -15048,12 +15048,16 @@ BUILDIN_FUNC(npctalk) { struct npc_data* nd = NULL; const char* str = script_getstr(st,2); + int color = 0xFFFFFF; if (script_hasdata(st, 3) && strlen(script_getstr(st,3)) > 0) nd = npc_name2id(script_getstr(st, 3)); else nd = (struct npc_data *)map_id2bl(st->oid); + if (script_hasdata(st, 5)) + color = script_getnum(st, 5); + if (nd != NULL) { send_target target = AREA; char message[CHAT_SIZE_MAX]; @@ -15069,12 +15073,12 @@ BUILDIN_FUNC(npctalk) } safesnprintf(message, sizeof(message), "%s", str); if (target != SELF) - clif_messagecolor(&nd->bl, color_table[COLOR_WHITE], message, false, target); + clif_messagecolor(&nd->bl, color, message, true, target); else { TBL_PC *sd = map_id2sd(st->rid); if (sd == NULL) return SCRIPT_CMD_FAILURE; - clif_messagecolor_target(&nd->bl, color_table[COLOR_WHITE], message, false, target, sd); + clif_messagecolor_target(&nd->bl, color, message, true, target, sd); } } return SCRIPT_CMD_SUCCESS; @@ -24950,7 +24954,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF2(atcommand,"charcommand","s"), // [MouseJstr] BUILDIN_DEF(movenpc,"sii?"), // [MouseJstr] BUILDIN_DEF(message,"ss"), // [MouseJstr] - BUILDIN_DEF(npctalk,"s??"), // [Valaris] + BUILDIN_DEF(npctalk,"s???"), // [Valaris] BUILDIN_DEF(chatmes,"s?"), // [Jey] BUILDIN_DEF(mobcount,"ss"), BUILDIN_DEF(getlook,"i?"), From 8d2c26d115f0c44fb2d53efb5409c43ad0103946 Mon Sep 17 00:00:00 2001 From: Yashim Wong Date: Sun, 10 May 2020 14:49:46 +0800 Subject: [PATCH 099/212] Removed sonic blow attack animation (#4926) --- src/map/skill.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 3985450d76..5d7af188e3 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -2270,9 +2270,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 !battle_check_range(bl, tbl, skill_get_range2(src, skill, autospl_skill_lv, true))) continue; - if (skill == AS_SONICBLOW) - pc_stop_attack(sd); //Special case, Sonic Blow autospell should stop the player attacking. - else if (skill == PF_SPIDERWEB) //Special case, due to its nature of coding. + if (skill == PF_SPIDERWEB) //Special case, due to its nature of coding. type = CAST_GROUND; sd->state.autocast = 1; From 48fd0e859b7ae3b640700b7b7c82e1b239805562 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Sun, 10 May 2020 15:54:43 +0200 Subject: [PATCH 100/212] Follow up to 8d2c26d115f0c44fb2d53efb5409c43ad0103946 --- src/map/skill.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 5d7af188e3..76dc470300 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -2272,6 +2272,10 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if (skill == PF_SPIDERWEB) //Special case, due to its nature of coding. type = CAST_GROUND; +#ifndef RENEWAL + else if (skill == AS_SONICBLOW) + pc_stop_attack(sd); //Special case, Sonic Blow autospell should stop the player attacking. +#endif sd->state.autocast = 1; skill_consume_requirement(sd,skill,autospl_skill_lv,1); From c5a0279b5ca86a91e09c18c2f7de57c39443d87d Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 11 May 2020 14:08:33 -0400 Subject: [PATCH 101/212] Adds skill placeholder for Super Novice Expanded (#4919) * Adds skill placeholder for Super Novice Expanded in the pre-renewal skill database. * Prevents undefined skill errors for pc_checkskill. Thanks to @gidzdlcrz! --- db/pre-re/skill_db.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index 3c4031a070..f9dffe81d0 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -30115,6 +30115,18 @@ Body: Name: AB_CONVENIO Description: Convenio MaxLevel: 1 + - Id: 5075 + Name: NV_BREAKTHROUGH + Description: Break Through + MaxLevel: 1 + - Id: 5076 + Name: NV_HELPANGEL + Description: Help Angel + MaxLevel: 1 + - Id: 5077 + Name: NV_TRANSCENDENCE + Description: Transcendence + MaxLevel: 1 - Id: 8001 Name: HLIF_HEAL Description: Healing Touch From 5154e078999ea8b0ae8680126933fe11a2506dd9 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Tue, 12 May 2020 23:09:22 +0200 Subject: [PATCH 102/212] Follow up to 73140bd078036ef173568918102e42f824ee148c --- src/map/mob.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 56ac411314..1a8f47c532 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -5563,7 +5563,7 @@ static void mob_load(void) sv_readdb(dbsubpath1, "mob_chat_db.txt", '#', 3, 3, -1, &mob_parse_row_chatdb, silent); - if( db_use_sqldbs ) + if( db_use_sqldbs && i == 0 ) mob_read_sqlskilldb(); else mob_readskilldb(dbsubpath2, silent); From 147214cb1bd12ed262745517b15703a4e3d5895b Mon Sep 17 00:00:00 2001 From: Joam <35770095+attackjom@users.noreply.github.com> Date: Thu, 14 May 2020 03:37:56 +0700 Subject: [PATCH 103/212] Fixes Meteor Assault and card bonuses (#4932) * Fixes #4912. * Meteor assault should increase damage with ATK item bonus. Thanks to @attackjom! --- db/re/skill_db.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 47f53dea02..e4226fda02 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -11274,7 +11274,6 @@ Body: TargetType: Self DamageFlags: Splash: true - IgnoreAtkCard: true Flags: TargetTrap: true IgnoreAutoGuard: true From 132e74bd13629898c0d1f0c16be5a6a33607c734 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Thu, 14 May 2020 02:57:13 +0200 Subject: [PATCH 104/212] Follow up to c4609b19d6910ae05d6424a8cb1da2142d870ef0 --- src/map/skill.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 76dc470300..34b1862845 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -8568,7 +8568,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case TF_BACKSLIDING: //This is the correct implementation as per packet logging information. [Skotlex] - skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),unit_getdir(bl),(enum e_skill_blown)(BLOWN_IGNORE_NO_KNOCKBACK|BLOWN_DONT_SEND_PACKET)); + skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),unit_getdir(bl),(enum e_skill_blown)(BLOWN_IGNORE_NO_KNOCKBACK +#ifdef RENEWAL + |BLOWN_DONT_SEND_PACKET +#endif + )); clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); #ifdef RENEWAL clif_blown(src); // Always blow, otherwise it shows a casting animation. [Lemongrass] From 061e586a1fc7330a0f98ac0c6076b6c6c840d6dc Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 13 May 2020 21:02:57 -0400 Subject: [PATCH 105/212] Few Genetic skill fixes (#4813) * Fixes Acid Demonstration to use the target's VIT and not casters. * Fixes Fire Expansion - Acid to behave like Acid Demonstration. * Fixes Crazy Weed not doing 2 damage attacks. * Crazy Weed is now a long ranged physical attack. * Adjusts Hell's Plant behavior to no longer be removed on map change. * Adds missing status icon for Hell's Plant. * Fixes Hell's Plant attack formula when learning Summon Flora. * Hell's Plant now uses the caster's weapon as the element. * Hell's Plant no longer ignores the target's DEF and Element. * Fixes Hell's Plant removing Thorns Trap. * Removes fixed cast time from Xeno Slasher. * Adds new Genetic Pharmacy potions (items are disabled until int32 item ID support). * Fixes Spore Explosion's splash attack doing the same damage as the initial. Thanks to @teededung, @Badarosk0, @cahya1992, and @OptimusM! --- db/pre-re/skill_db.yml | 4 +-- db/re/item_db.txt | 7 ++++++ db/re/produce_db.txt | 4 +-- db/re/skill_db.yml | 16 +++--------- src/map/battle.cpp | 49 +++++++++++++----------------------- src/map/pc.cpp | 14 +++++++---- src/map/script_constants.hpp | 3 +++ src/map/skill.cpp | 13 ++-------- src/map/status.cpp | 5 +++- src/map/status.hpp | 3 +++ src/map/unit.cpp | 1 - 11 files changed, 53 insertions(+), 66 deletions(-) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index f9dffe81d0..a01fc0e56f 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -26706,8 +26706,8 @@ Body: DamageFlags: Splash: true Range: 11 - Hit: Single - HitCount: 3 + Hit: Multi_Hit + HitCount: 2 Element: Weapon SplashArea: - Level: 1 diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 32f4bc30d2..0c7c77e842 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -13457,3 +13457,10 @@ //=================================================================== 32350,Farthezan,Farthezan,5,20,,1100,130:180,,1,2,0x00004000,56,2,2,4,170,1,2,{ .@r = getrefine(); bonus2 bSkillAtk,"PA_PRESSURE",40; bonus bVariableCastrate,-.@r; if (.@r>=9) bonus2 bSkillAtk,"LG_RAYOFGENESIS",30; if (.@r>=11) { bonus2 bSkillAtk,"LG_RAYOFGENESIS",20; bonus2 bSkillAtk,"PA_PRESSURE",20; } },{},{} 32351,Estal,Estal,5,20,,700,195,,1,2,0x00040000,56,2,2,4,170,1,2,{ .@r = getrefine(); bonus2 bSkillCooldown,"GN_SPORE_EXPLOSION",-1000; bonus bBaseAtk,4*.@r; if (.@r>=11) .@val = 50; else if (.@r>=9) .@val = 30; bonus2 bSkillAtk,"GN_SPORE_EXPLOSION",.@val; },{},{} + +//100231,Ref_T_Potion,Golden X,0,10,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_REF_T_POTION,30000,0; },{},{} +//100232,Add_Atk_Potion,Red Herb Activator,0,10,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ADD_ATK_DAMAGE,500000,15; },{},{} +//100233,Add_Matk_Potion,Blue Herb Activator,0,10,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ADD_MATK_DAMAGE,500000,15; },{},{} +//1100003,Concentrated_R_P,Concentrated Red Potion,0,10,,2,,,,,0xFFFFFFFF,63,2,,,120,,,{ itemheal rand(655,675),0; },{},{} +//1100004,Concentrated_B_P,Concentrated Blue Potion,0,10,,2,,,,,0xFFFFFFFF,63,2,,,120,,,{ itemheal 0,rand(340,360); },{},{} +//1100005,Concentrated_G_P,Concentrated Gold Potion,0,10,,2,,,,,0xFFFFFFFF,63,2,,,180,,,{ itemheal rand(2730,2750),0; },{},{} diff --git a/db/re/produce_db.txt b/db/re/produce_db.txt index 6160b53b91..8016bc9fd0 100644 --- a/db/re/produce_db.txt +++ b/db/re/produce_db.txt @@ -665,8 +665,8 @@ //267,1100003,29,2497,1,1092,10,1093,10,11621,15 //-- Concentrated Blue Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Empty Potion Bottle, 15 Blue Syrup //268,1100004,29,2497,1,1092,10,1093,10,11624,15 -//-- Concentrated Golden Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Empty Potion Bottle, 15 White Syrup, 15 Yellow Syrup -//269,1100005,29,2497,1,1092,10,1093,10,11623,15,11622,15 +//-- Concentrated Golden Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Empty Potion Bottle, 15 White Syrup, 10 Yellow Syrup +//269,1100005,29,2497,1,1092,10,1093,10,11623,15,11622,10 //=============================================== //--------------------LEVEL 30----------- diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index e4226fda02..523b3f10c7 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -27990,6 +27990,7 @@ Body: Flags: TargetTrap: true IgnoreLandProtector: true + Range: 5 Hit: Multi_Hit HitCount: 2 Element: Weapon @@ -28177,15 +28178,9 @@ Body: Name: GN_FIRE_EXPANSION_ACID Description: Fire Expansion Acid MaxLevel: 10 - Type: Misc + Type: Weapon TargetType: Attack - DamageFlags: - IgnoreDefense: true - IgnoreFlee: true - Flags: - IgnoreBgReduction: true - IgnoreGvgReduction: true - Range: 11 + Range: 9 Hit: Multi_Hit HitCount: - Level: 1 @@ -28273,11 +28268,9 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - DamageFlags: - IgnoreElement: true - IgnoreDefCard: true Hit: Single HitCount: 1 + Element: Weapon CopyFlags: Skill: Reproduce: true @@ -34493,7 +34486,6 @@ Body: Time: 3500 Duration1: 500 Duration2: 120000 - FixedCastTime: 500 Requires: SpCost: - Level: 1 diff --git a/src/map/battle.cpp b/src/map/battle.cpp index b2d7d05fd2..205ae04655 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1351,13 +1351,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } #endif - if (sc->data[SC_DEFENDER] && - skill_id != NJ_ZENYNAGE && skill_id != KO_MUCHANAGE && -#ifdef RENEWAL - ((flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON) || skill_id == GN_FIRE_EXPANSION_ACID)) -#else - (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) -#endif + if (sc->data[SC_DEFENDER] && skill_id != NJ_ZENYNAGE && skill_id != KO_MUCHANAGE && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) damage -= damage * sc->data[SC_DEFENDER]->val2 / 100; if(sc->data[SC_ADJUSTMENT] && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) @@ -1625,6 +1619,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (hd && (rnd()%100<50) ) hom_addspiritball(hd, 10); // According to WarpPortal, this is a flat 50% chance } + + if (flag & BF_WEAPON && (sce = sc->data[SC_ADD_ATK_DAMAGE])) + damage += damage * sce->val1 / 100; + if (flag & BF_MAGIC && (sce = sc->data[SC_ADD_MATK_DAMAGE])) + damage += damage * sce->val1 / 100; } //End of caster SC_ check if (tsc && tsc->count) { @@ -3902,9 +3901,10 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 100 + 50 * skill_lv; #endif break; + case GN_FIRE_EXPANSION_ACID: #ifdef RENEWAL case CR_ACIDDEMONSTRATION: - skillratio += -100 + 200 * skill_lv + sstatus->int_ + sstatus->vit; // !TODO: Confirm status bonus + skillratio += -100 + 200 * skill_lv + sstatus->int_ + tstatus->vit; // !TODO: Confirm status bonus if (target->type == BL_PC) skillratio /= 2; break; @@ -4446,9 +4446,9 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case GN_SPORE_EXPLOSION: - if (wd->miscflag & 2048) - skillratio += 200; // Target - skillratio += -100 + 180 * skill_lv + sstatus->int_; + skillratio += -100 + 180 * skill_lv; + if (wd->miscflag & 8) + skillratio += 200 + sstatus->int_; // Target receives extra damage RE_LVL_DMOD(100); break; case GN_WALLOFTHORN: @@ -4488,7 +4488,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * } break; case GN_HELLS_PLANT_ATK: - skillratio += -100 + 500 * skill_lv + sstatus->int_ * (10 - (sd ? pc_checkskill(sd, AM_CANNIBALIZE) : 0)); // !TODO: Confirm INT and Cannibalize bonus + skillratio += -100 + 500 * skill_lv + sstatus->int_ * (sd ? pc_checkskill(sd, AM_CANNIBALIZE) : 5); // !TODO: Confirm INT and Cannibalize bonus RE_LVL_DMOD(100); break; // Physical Elemantal Spirits Attack Skills @@ -5864,7 +5864,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl switch(skill_id) { case NJ_ISSEN: case ASC_BREAKER: - case GN_FIRE_EXPANSION_ACID: break; //These skills will do a card fix later default: #endif @@ -5885,7 +5884,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl case MC_CARTREVOLUTION: case MO_INVESTIGATE: case SR_GATEOFHELL: - case GN_FIRE_EXPANSION_ACID: case KO_BAKURETSU: //case NC_MAGMA_ERUPTION: // Forced to neutral element @@ -5945,7 +5943,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl switch (skill_id) { case NJ_ISSEN: case ASC_BREAKER: - case GN_FIRE_EXPANSION_ACID: return wd; //These skills will do a GVG fix later default: #endif @@ -6940,30 +6937,15 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * md.damage = 0; } break; - case GN_FIRE_EXPANSION_ACID: -#ifdef RENEWAL - // Official Renewal formula [helvetica] - // damage = 7 * ((atk + matk)/skill level) * (target vit/100) - // skill is a "forced neutral" type skill, it benefits from weapon element but final damage - // is considered "neutral" for purposes of resistances - { - struct Damage atk = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0); - struct Damage matk = battle_calc_magic_attack(src, target, skill_id, skill_lv, 0); - md.damage = 7 * ((atk.damage/skill_lv + matk.damage/skill_lv) * tstatus->vit / 100 ); - - // AD benefits from endow/element but damage is forced back to neutral - md.damage = battle_attr_fix(src, target, md.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); - } - // Fall through -#else +#ifndef RENEWAL case CR_ACIDDEMONSTRATION: if(tstatus->vit+sstatus->int_) //crash fix md.damage = (int)((int64)7*tstatus->vit*sstatus->int_*sstatus->int_ / (10*(tstatus->vit+sstatus->int_))); else md.damage = 0; if (tsd) md.damage>>=1; -#endif break; +#endif case NJ_ZENYNAGE: case KO_MUCHANAGE: md.damage = skill_get_zeny(skill_id, skill_lv); @@ -7274,6 +7256,9 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i if (sc && sc->data[SC_WHITEIMPRISON]) return 0; // White Imprison does not reflect any damage + if (ssc && ssc->data[SC_REF_T_POTION]) + return 0; + if (flag & BF_SHORT) {//Bounces back part of the damage. if ( (skill_get_inf2(skill_id, INF2_ISTRAP) || !status_reflect) && sd && sd->bonus.short_weapon_damage_return ) { rdamage += damage * sd->bonus.short_weapon_damage_return / 100; diff --git a/src/map/pc.cpp b/src/map/pc.cpp index ded9f0889e..be33c709d3 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -5822,6 +5822,7 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in int16 m = map_mapindex2mapid(mapindex); struct map_data *mapdata = map_getmapdata(m); + status_change *sc = status_get_sc(&sd->bl); sd->state.changemap = (sd->mapindex != mapindex); sd->state.warping = 1; @@ -5842,8 +5843,8 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in bg_team_leave(sd, false, true); sd->state.pmap = sd->bl.m; - if (sd->sc.count) { // Cancel some map related stuff. - if (sd->sc.data[SC_JAILED]) + if (sc && sc->count) { // Cancel some map related stuff. + if (sc->data[SC_JAILED]) return SETPOS_MAPINDEX; //You may not get out! status_change_end(&sd->bl, SC_BOSSMAPINFO, INVALID_TIMER); status_change_end(&sd->bl, SC_WARM, INVALID_TIMER); @@ -5851,8 +5852,8 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in status_change_end(&sd->bl, SC_MOON_COMFORT, INVALID_TIMER); status_change_end(&sd->bl, SC_STAR_COMFORT, INVALID_TIMER); status_change_end(&sd->bl, SC_MIRACLE, INVALID_TIMER); - if (sd->sc.data[SC_KNOWLEDGE]) { - struct status_change_entry *sce = sd->sc.data[SC_KNOWLEDGE]; + if (sc->data[SC_KNOWLEDGE]) { + struct status_change_entry *sce = sc->data[SC_KNOWLEDGE]; if (sce->timer != INVALID_TIMER) delete_timer(sce->timer, status_change_timer); sce->timer = add_timer(gettick() + skill_get_time(SG_KNOWLEDGE, sce->val1), status_change_timer, sd->bl.id, SC_KNOWLEDGE); @@ -5962,6 +5963,9 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in } else if(sd->state.active) //Tag player for rewarping after map-loading is done. [Skotlex] sd->state.rewarp = 1; + if (sc && sc->data[SC_HELLS_PLANT]) + skill_unit_move_unit_group(skill_id2group(sc->data[SC_HELLS_PLANT]->val4), m, x - sd->bl.x, y - sd->bl.y); + sd->mapindex = mapindex; sd->bl.m = m; sd->bl.x = sd->ud.to_x = x; @@ -6006,7 +6010,7 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in } pc_cell_basilica(sd); - + //check if we gonna be rewarped [lighta] if(npc_check_areanpc(1,m,x,y,0)){ sd->count_rewarp++; diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index fb2b68cc1a..cae9051e67 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1579,6 +1579,9 @@ export_constant(SC_INCREASE_MAXHP); export_constant(SC_INCREASE_MAXSP); export_constant(SC_HELPANGEL); + export_constant(SC_REF_T_POTION); + export_constant(SC_ADD_ATK_DAMAGE); + export_constant(SC_ADD_MATK_DAMAGE); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); #endif diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 34b1862845..549c238fff 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -3631,7 +3631,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * case EL_HURRICANE: case EL_HURRICANE_ATK: case KO_BAKURETSU: - case GN_CRAZYWEED_ATK: case GN_HELLS_PLANT_ATK: case SU_SV_ROOTTWIST_ATK: dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,DMG_SPLASH); @@ -5217,13 +5216,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if( skill_area_temp[1] != bl->id && !inf2[INF2_ISNPC] ) sflag |= SD_ANIMATION; // original target gets no animation (as well as all NPC skills) - switch (skill_id) { - case GN_SPORE_EXPLOSION: - if (flag&2 && skill_area_temp[1] == bl->id) - sflag |= 2048; // Flag for main target - break; - } - // If a enemy player is standing next to a mob when splash Es- skill is casted, the player won't get hurt. if ((skill_id == SP_SHA || skill_id == SP_SWHOO) && !battle_config.allow_es_magic_pc && bl->type != BL_MOB) break; @@ -11101,7 +11093,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case GN_SPORE_EXPLOSION: clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - skill_castend_damage_id(src, bl, skill_id, skill_lv, tick, flag|1|2); // First attack to target + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|8); sc_start4(src, bl, type, 100, skill_lv, skill_id, src->id, 0, skill_get_time(skill_id, skill_lv)); break; case GN_MANDRAGORA: @@ -13046,7 +13038,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui break; case GN_HELLS_PLANT: - skill_clear_unitgroup(src); + status_change_end(src, type, INVALID_TIMER); // Remove previous group if ((sg = skill_unitsetting(src, skill_id, skill_lv, src->x, src->y, 0)) != nullptr) sc_start4(src, src, type, 100, skill_lv, 0, 0, sg->group_id, skill_get_time(skill_id, skill_lv)); break; @@ -19110,7 +19102,6 @@ int skill_delunitgroup_(struct skill_unit_group *group, const char* file, int li case SG_MOON_WARM: case SG_STAR_WARM: case LG_BANDING: - case GN_HELLS_PLANT: { status_change *sc = status_get_sc(src); sc_type type = status_skill2sc(group->skill_id); diff --git a/src/map/status.cpp b/src/map/status.cpp index 98fce72184..acadfaa983 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -966,7 +966,7 @@ void initChangeTables(void) set_sc( GN_SPORE_EXPLOSION , SC_SPORE_EXPLOSION , EFST_SPORE_EXPLOSION, SCB_NONE ); set_sc( GN_FIRE_EXPANSION_SMOKE_POWDER , SC_SMOKEPOWDER , EFST_FIRE_EXPANSION_SMOKE_POWDER, SCB_FLEE ); set_sc( GN_FIRE_EXPANSION_TEAR_GAS , SC_TEARGAS , EFST_FIRE_EXPANSION_TEAR_GAS , SCB_HIT|SCB_FLEE ); - add_sc( GN_HELLS_PLANT , SC_HELLS_PLANT ); + set_sc( GN_HELLS_PLANT , SC_HELLS_PLANT , EFST_HELLS_PLANT_ARMOR , SCB_NONE ); set_sc( GN_MANDRAGORA , SC_MANDRAGORA , EFST_MANDRAGORA , SCB_INT ); set_sc_with_vfx( GN_ILLUSIONDOPING , SC_ILLUSIONDOPING , EFST_ILLUSIONDOPING , SCB_HIT ); @@ -1381,6 +1381,9 @@ void initChangeTables(void) StatusIconChangeTable[SC_ANCILLA] = EFST_ANCILLA; StatusIconChangeTable[SC_WEAPONBLOCK_ON] = EFST_WEAPONBLOCK_ON; + StatusIconChangeTable[SC_REF_T_POTION] = EFST_REF_T_POTION; + StatusIconChangeTable[SC_ADD_ATK_DAMAGE] = EFST_ADD_ATK_DAMAGE; + StatusIconChangeTable[SC_ADD_MATK_DAMAGE] = EFST_ADD_MATK_DAMAGE; // Battleground Queue StatusIconChangeTable[SC_ENTRY_QUEUE_APPLY_DELAY] = EFST_ENTRY_QUEUE_APPLY_DELAY; diff --git a/src/map/status.hpp b/src/map/status.hpp index ff114ac473..447316faec 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -923,6 +923,9 @@ enum sc_type : int16 { SC_HELLS_PLANT, SC_INCREASE_MAXHP, // EFST_ATKER_ASPD SC_INCREASE_MAXSP, // EFST_ATKER_MOVESPEED + SC_REF_T_POTION, + SC_ADD_ATK_DAMAGE, + SC_ADD_MATK_DAMAGE, SC_HELPANGEL, diff --git a/src/map/unit.cpp b/src/map/unit.cpp index 25acc3c751..6c8b6de35b 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -2957,7 +2957,6 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER); status_change_end(bl, SC_NEUTRALBARRIER_MASTER, INVALID_TIMER); status_change_end(bl, SC_STEALTHFIELD_MASTER, INVALID_TIMER); - status_change_end(bl, SC_HELLS_PLANT, INVALID_TIMER); status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER); status_change_end(bl, SC__MANHOLE, INVALID_TIMER); status_change_end(bl, SC_VACUUM_EXTREME, INVALID_TIMER); From 6ed4dbd6d9dfb04e8924221986baf63a7c000e23 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Thu, 14 May 2020 03:03:05 +0200 Subject: [PATCH 106/212] SQL synchronization --- sql-files/item_db_re.sql | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index d991a3d07c..359d863265 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -13490,3 +13490,10 @@ REPLACE INTO `item_db_re` VALUES (32302,'Crimson_Rose','Crimson Rose',5,20,NULL, REPLACE INTO `item_db_re` VALUES (32350,'Farthezan','Farthezan',5,20,NULL,1100,'130:180',NULL,1,2,0x00004000,56,2,2,4,'170',1,2,'.@r = getrefine(); bonus2 bSkillAtk,"PA_PRESSURE",40; bonus bVariableCastrate,-.@r; if (.@r>=9) bonus2 bSkillAtk,"LG_RAYOFGENESIS",30; if (.@r>=11) { bonus2 bSkillAtk,"LG_RAYOFGENESIS",20; bonus2 bSkillAtk,"PA_PRESSURE",20; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (32351,'Estal','Estal',5,20,NULL,700,'195',NULL,1,2,0x00040000,56,2,2,4,'170',1,2,'.@r = getrefine(); bonus2 bSkillCooldown,"GN_SPORE_EXPLOSION",-1000; bonus bBaseAtk,4*.@r; if (.@r>=11) .@val = 50; else if (.@r>=9) .@val = 30; bonus2 bSkillAtk,"GN_SPORE_EXPLOSION",.@val;',NULL,NULL); +#REPLACE INTO `item_db_re` VALUES (100231,'Ref_T_Potion','Golden X',0,10,NULL,30,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_REF_T_POTION,30000,0;',NULL,NULL); +#REPLACE INTO `item_db_re` VALUES (100232,'Add_Atk_Potion','Red Herb Activator',0,10,NULL,30,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_ADD_ATK_DAMAGE,500000,15;',NULL,NULL); +#REPLACE INTO `item_db_re` VALUES (100233,'Add_Matk_Potion','Blue Herb Activator',0,10,NULL,30,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_ADD_MATK_DAMAGE,500000,15;',NULL,NULL); +#REPLACE INTO `item_db_re` VALUES (1100003,'Concentrated_R_P','Concentrated Red Potion',0,10,NULL,2,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,'120',NULL,NULL,'itemheal rand(655,675),0;',NULL,NULL); +#REPLACE INTO `item_db_re` VALUES (1100004,'Concentrated_B_P','Concentrated Blue Potion',0,10,NULL,2,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,'120',NULL,NULL,'itemheal 0,rand(340,360);',NULL,NULL); +#REPLACE INTO `item_db_re` VALUES (1100005,'Concentrated_G_P','Concentrated Gold Potion',0,10,NULL,2,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,'180',NULL,NULL,'itemheal rand(2730,2750),0;',NULL,NULL); + From f60da2b3fa76a6121f00a802ca19d0f99b2751d4 Mon Sep 17 00:00:00 2001 From: Mark Hester Date: Thu, 14 May 2020 03:02:10 +0100 Subject: [PATCH 107/212] Allow blank SQL passwords (#4827) * Allow blank password for log and login schema. Thanks to @marky291! --- src/login/account.cpp | 2 +- src/map/map.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/login/account.cpp b/src/login/account.cpp index 522bdb6e40..7c4a3c9a6d 100644 --- a/src/login/account.cpp +++ b/src/login/account.cpp @@ -81,7 +81,7 @@ AccountDB* account_db_sql(void) { safestrncpy(db->db_hostname, "127.0.0.1", sizeof(db->db_hostname)); db->db_port = 3306; safestrncpy(db->db_username, "ragnarok", sizeof(db->db_username)); - safestrncpy(db->db_password, "ragnarok", sizeof(db->db_password)); + safestrncpy(db->db_password, "", sizeof(db->db_password)); safestrncpy(db->db_database, "ragnarok", sizeof(db->db_database)); safestrncpy(db->codepage, "", sizeof(db->codepage)); // other settings diff --git a/src/map/map.cpp b/src/map/map.cpp index 5aab4518b8..fbee5a8c7e 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -93,7 +93,7 @@ char guild_storage_log_table[32] = "guild_storage_log"; char log_db_ip[64] = "127.0.0.1"; int log_db_port = 3306; char log_db_id[32] = "ragnarok"; -char log_db_pw[32] = "ragnarok"; +char log_db_pw[32] = ""; char log_db_db[32] = "log"; Sql* logmysql_handle; From 9bbf4f17e3ec3e862ea34971586f323c1915614c Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 14 May 2020 08:58:50 -0400 Subject: [PATCH 108/212] Fixes Ur's and Peuz's Greave refine bonus (#4890) * Fixes #4889. * Fixes Ur's and Peuz's Greave giving negative stats if the refine is less than 8. Thanks to @Questune09! --- db/re/item_db.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 0c7c77e842..0400afa62e 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -1697,8 +1697,8 @@ 2472,Shoes_Of_Judgement,Shoes Of Judgement,4,20,,300,,12,,0,0x00000100,63,2,64,,100,1,0,{ bonus2 bSkillAtk,"AB_JUDEX",30; bonus2 bSkillUseSP,"AB_JUDEX",-40; bonus bMaxSP,150; },{},{} 2473,Para_Team_Boots4,Eden Team Boots IV,4,0,,0,,20,,0,0xFFFFFFFF,63,2,64,,60,0,0,{ bonus bAgi,1; bonus bVit,1; bonus bHPrecovRate,28; bonus bSPrecovRate,12; },{},{} 2474,Lehmannza_Shoes,Lehmannza Shoes,4,20,,500,,3,,1,0xFFFFFFFF,63,2,64,,60,1,0,{ bonus bMdef,3; },{},{} -2475,Ur_Greave,Ur's Greaves,4,20,,900,,32,,1,0x00000080,56,2,64,,100,1,0,{ bonus bMaxSP,40; .@r = getrefine(); bonus bMaxHPrate,(.@r<=7?.@r-7:1); },{},{} -2476,Peuz_Greave,Peuz's Greaves,4,20,,900,,32,,1,0x00000080,56,2,64,,100,1,0,{ bonus bMaxSP,40; .@r = getrefine(); bonus bAgi,(.@r<=7?.@r-7:1); },{},{} +2475,Ur_Greave,Ur's Greaves,4,20,,900,,32,,1,0x00000080,56,2,64,,100,1,0,{ bonus bMaxSP,40; .@r = getrefine(); if(.@r>7) bonus bMaxHPrate,.@r-7; },{},{} +2476,Peuz_Greave,Peuz's Greaves,4,20,,900,,32,,1,0x00000080,56,2,64,,100,1,0,{ bonus bMaxSP,40; .@r = getrefine(); if(.@r>7) bonus bAgi,.@r-7; },{},{} 2477,Sabah_Shoes,Sapha Shoes,4,20,,400,,18,,1,0x00001000,63,2,64,,100,1,0,{ bonus bMaxSP,30; bonus bLuk,3; },{},{} 2478,Nab_Shoes,Nab Shoes,4,20,,400,,18,,1,0x00001000,63,2,64,,100,1,0,{ bonus bFlee,3; bonus bInt,2; },{},{} 2479,White_Wing_Boots,White Wing Boots,4,20,,400,,18,,1,0x00000800,63,2,64,,100,1,0,{ bonus bAgi,2; bonus2 bSkillUseSP,"RA_AIMEDBOLT",10; },{},{} From 0a0b05e6a1801050d1b49d7993140a2dd7a7b05e Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Thu, 14 May 2020 14:58:58 +0200 Subject: [PATCH 109/212] SQL synchronization --- sql-files/item_db_re.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 359d863265..124e9efb4c 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -1729,8 +1729,8 @@ REPLACE INTO `item_db_re` VALUES (2471,'Shoes_Of_Affection','Shoes Of Affection' REPLACE INTO `item_db_re` VALUES (2472,'Shoes_Of_Judgement','Shoes Of Judgement',4,20,NULL,300,NULL,12,NULL,0,0x00000100,63,2,64,NULL,'100',1,0,'bonus2 bSkillAtk,"AB_JUDEX",30; bonus2 bSkillUseSP,"AB_JUDEX",-40; bonus bMaxSP,150;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2473,'Para_Team_Boots4','Eden Team Boots IV',4,0,NULL,0,NULL,20,NULL,0,0xFFFFFFFF,63,2,64,NULL,'60',0,0,'bonus bAgi,1; bonus bVit,1; bonus bHPrecovRate,28; bonus bSPrecovRate,12;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2474,'Lehmannza_Shoes','Lehmannza Shoes',4,20,NULL,500,NULL,3,NULL,1,0xFFFFFFFF,63,2,64,NULL,'60',1,0,'bonus bMdef,3;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2475,'Ur_Greave','Ur\'s Greaves',4,20,NULL,900,NULL,32,NULL,1,0x00000080,56,2,64,NULL,'100',1,0,'bonus bMaxSP,40; .@r = getrefine(); bonus bMaxHPrate,(.@r<=7?.@r-7:1);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2476,'Peuz_Greave','Peuz\'s Greaves',4,20,NULL,900,NULL,32,NULL,1,0x00000080,56,2,64,NULL,'100',1,0,'bonus bMaxSP,40; .@r = getrefine(); bonus bAgi,(.@r<=7?.@r-7:1);',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2475,'Ur_Greave','Ur\'s Greaves',4,20,NULL,900,NULL,32,NULL,1,0x00000080,56,2,64,NULL,'100',1,0,'bonus bMaxSP,40; .@r = getrefine(); if(.@r>7) bonus bMaxHPrate,.@r-7;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2476,'Peuz_Greave','Peuz\'s Greaves',4,20,NULL,900,NULL,32,NULL,1,0x00000080,56,2,64,NULL,'100',1,0,'bonus bMaxSP,40; .@r = getrefine(); if(.@r>7) bonus bAgi,.@r-7;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2477,'Sabah_Shoes','Sapha Shoes',4,20,NULL,400,NULL,18,NULL,1,0x00001000,63,2,64,NULL,'100',1,0,'bonus bMaxSP,30; bonus bLuk,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2478,'Nab_Shoes','Nab Shoes',4,20,NULL,400,NULL,18,NULL,1,0x00001000,63,2,64,NULL,'100',1,0,'bonus bFlee,3; bonus bInt,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2479,'White_Wing_Boots','White Wing Boots',4,20,NULL,400,NULL,18,NULL,1,0x00000800,63,2,64,NULL,'100',1,0,'bonus bAgi,2; bonus2 bSkillUseSP,"RA_AIMEDBOLT",10;',NULL,NULL); From 7004fe3d95610a8311628a53e84201dd8f6f8863 Mon Sep 17 00:00:00 2001 From: aleos Date: Thu, 14 May 2020 22:26:54 -0400 Subject: [PATCH 110/212] Fixes Basilica duration * Fixes #4913. * Fixes Basilica duration to be 30 + 30 * skill_lv. Thanks to @Badarosk0! --- db/re/skill_db.yml | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 523b3f10c7..60e84670ad 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -9900,26 +9900,15 @@ Body: Time: 1000 Duration1: - Level: 1 - Time: 20000 + Time: 60000 - Level: 2 - Time: 25000 + Time: 90000 - Level: 3 - Time: 30000 + Time: 120000 - Level: 4 - Time: 35000 + Time: 150000 - Level: 5 - Time: 40000 - Duration2: - - Level: 1 - Time: 20000 - - Level: 2 - Time: 25000 - - Level: 3 - Time: 30000 - - Level: 4 - Time: 35000 - - Level: 5 - Time: 40000 + Time: 180000 Cooldown: 30000 FixedCastTime: - Level: 1 From 15c954ef23d9a6bfa6ea542424df47d29ff80dea Mon Sep 17 00:00:00 2001 From: Aleos Date: Sun, 17 May 2020 15:28:13 -0400 Subject: [PATCH 111/212] Fixes instance map name faults (#4945) * Fixes #4915. * Fixes instance map names when it reaches 1000. * Fixes instances with more than 8 character crashing the client. * Other minor cleanups. Thanks to @voyfmyuh and @Atemo! Co-authored-by: Atemo --- src/map/instance.cpp | 25 +++++++++++++------------ src/map/map.cpp | 8 ++++---- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/map/instance.cpp b/src/map/instance.cpp index f56c768bc7..3a9004d6bd 100644 --- a/src/map/instance.cpp +++ b/src/map/instance.cpp @@ -616,7 +616,7 @@ int instance_create(int owner_id, const char *name, e_instance_mode mode) { clif_instance_create(instance_id, instance_wait.id.size()); instance_subscription_timer(0,0,0,0); - ShowInfo("[Instance] Created: %s (%d).\n", name, instance_id); + ShowInfo("[Instance] Created: %s (%d)\n", name, instance_id); // Start the instance timer on instance creation instance_startkeeptimer(entry, instance_id); @@ -708,11 +708,13 @@ int instance_addmap(int instance_id) { * Returns an instance map ID * @param m: Source map ID * @param instance_id: Instance to search - * @return Map ID in this instance + * @return Map ID in this instance or -1 on failure */ int16 instance_mapid(int16 m, int instance_id) { - if(m < 0) { + const char *name = map_mapid2mapname(m); + + if (name == nullptr) { ShowError("instance_mapid: Map ID %d does not exist.\n", m); return -1; } @@ -722,18 +724,17 @@ int16 instance_mapid(int16 m, int instance_id) if(!idata || idata->state != INSTANCE_BUSY) return -1; - const char *iname = map_mapid2mapname(m); - for (const auto &it : idata->map) { if (it.src_m == m) { - char alt_name[MAP_NAME_LENGTH]; + char iname[MAP_NAME_LENGTH], alt_name[MAP_NAME_LENGTH]; + + strcpy(iname, name); if (!(strchr(iname, '@')) && strlen(iname) > 8) { - memmove((void*)iname, iname + (strlen(iname) - 9), strlen(iname)); - snprintf(alt_name, sizeof(alt_name), "%d#%s", instance_id, iname); - } - else - snprintf(alt_name, sizeof(alt_name), "%.3d%s", instance_id, iname); + memmove(iname, iname + (strlen(iname) - 9), strlen(iname)); + snprintf(alt_name, sizeof(alt_name), "%d#%s", (instance_id % 1000), iname); + } else + snprintf(alt_name, sizeof(alt_name), "%.3d%s", (instance_id % 1000), iname); return map_mapname2mapid(alt_name); } } @@ -847,7 +848,7 @@ bool instance_destroy(int instance_id) if( idata->regs.arrays ) idata->regs.arrays->destroy(idata->regs.arrays, script_free_array_db); - ShowInfo("[Instance] Destroyed %d.\n", instance_id); + ShowInfo("[Instance] Destroyed: %s (%d)\n", instance_db.find(idata->id)->name.c_str(), instance_id); instances.erase(instance_id); diff --git a/src/map/map.cpp b/src/map/map.cpp index fbee5a8c7e..6227ffb4ed 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -2703,7 +2703,7 @@ int map_addinstancemap(int src_m, int instance_id) if(strlen(name) > 20) { // against buffer overflow - ShowError("map_addinstancemap: can't add long map name \"%s\"\n", name); + ShowError("map_addinstancemap: Map name \"%s\" is too long.\n", name); return -2; } @@ -2732,7 +2732,7 @@ int map_addinstancemap(int src_m, int instance_id) // Alter the name // Due to this being custom we only worry about preserving as many characters as necessary for accurate map distinguishing // This also allows us to maintain complete independence with main map functions - if ((strchr(iname, '@') == NULL) && strlen(iname) > 8) { + if ((strchr(iname, '@') == nullptr) && strlen(iname) > 8) { memmove(iname, iname + (strlen(iname) - 9), strlen(iname)); snprintf(dst_map->name, sizeof(dst_map->name), "%d#%s", (instance_id % 1000), iname); } else @@ -2766,12 +2766,12 @@ int map_addinstancemap(int src_m, int instance_id) dst_map->block_mob = (struct block_list **)aCalloc(1,size); dst_map->index = mapindex_addmap(-1, dst_map->name); - dst_map->channel = NULL; + dst_map->channel = nullptr; dst_map->mob_delete_timer = INVALID_TIMER; map_data_copy(dst_map, src_map); - ShowInfo("[Instance] Created map '%s' ('%d') from map '%s' ('%d')\n", dst_map->name, dst_map->m, name, src_map->m); + ShowInfo("[Instance] Created map '%s' (%d) from '%s' (%d).\n", dst_map->name, dst_map->m, name, src_map->m); map_addmap2db(dst_map); From 4534be1a253b2d32d5862061c0bf90979ff0933d Mon Sep 17 00:00:00 2001 From: flamefury Date: Sun, 17 May 2020 15:49:29 -0700 Subject: [PATCH 112/212] Suffragium should be a self AoE to party (#4955) * Fixes #4954. * Suffragium is a self cast skill that applies to the party in a 31x31 area, including self. Thanks to @flamefury! --- db/re/skill_db.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 60e84670ad..29eea36040 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -2381,16 +2381,13 @@ Body: Description: Suffragium MaxLevel: 3 Type: Magic - TargetType: Support + TargetType: Self DamageFlags: NoDamage: true Splash: true - Flags: - NoTargetSelf: true - Range: 9 Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 18 CastCancel: true CastTime: 1000 AfterCastActDelay: 1000 From 9dd553b87d9019084bb417a0bb7a91f9886bfe3b Mon Sep 17 00:00:00 2001 From: Sader Fawall Date: Mon, 18 May 2020 01:22:14 +0200 Subject: [PATCH 113/212] Updates item storages documentation (#4937) * Updates the documentation for the different types of player item storages to reflect that current maximum capacity. Thanks to @sader1992! --- src/common/mmo.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index 896faadb3b..d30158aff9 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -377,7 +377,7 @@ struct s_storage { unsigned get : 1; unsigned put : 1; } state; - union { // Max for inventory, storage, cart, and guild storage are 1637 each without changing this struct and struct item [2014/10/27] + union { // Max for inventory, storage, cart, and guild storage are 818 each without changing this struct and struct item [2016/08/14] struct item items_inventory[MAX_INVENTORY]; struct item items_storage[MAX_STORAGE]; struct item items_cart[MAX_CART]; From 83fc3e270a297b88f6ba31ee6c31a53fe6fe2792 Mon Sep 17 00:00:00 2001 From: Aleos Date: Sun, 17 May 2020 19:47:40 -0400 Subject: [PATCH 114/212] Adjusts area size config back to 14 cells (#4967) * Partial revert of ea8da71. * Adjusts the battle config for the area size back to 14 cells. * Adjusts the Bard/Dancer songs to be 15 cells rather than attempting to use AREA_SIZE. --- conf/battle/client.conf | 2 +- db/re/skill_db.yml | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/conf/battle/client.conf b/conf/battle/client.conf index dfe0ede82a..3bb10b7cd6 100644 --- a/conf/battle/client.conf +++ b/conf/battle/client.conf @@ -38,7 +38,7 @@ hide_woe_damage: no pet_hair_style: 100 // Visible area size (how many squares away from a player they can see) -area_size: 15 +area_size: 14 // Maximum walk path (how many cells a player can walk going to cursor) max_walk_path: 17 diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 29eea36040..cad49b89ca 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -8553,7 +8553,7 @@ Body: IsEnsemble: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 60000 @@ -8607,7 +8607,7 @@ Body: IsEnsemble: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 60000 @@ -8639,7 +8639,7 @@ Body: IsEnsemble: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 60000 @@ -8693,7 +8693,7 @@ Body: IsEnsemble: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 60000 @@ -8715,7 +8715,7 @@ Body: IsEnsemble: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 60000 @@ -8833,7 +8833,7 @@ Body: IsSong: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 20000 @@ -8875,7 +8875,7 @@ Body: IsSong: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 20000 @@ -8917,7 +8917,7 @@ Body: IsSong: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 20000 @@ -8959,7 +8959,7 @@ Body: IsSong: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 20000 @@ -9085,7 +9085,7 @@ Body: IsSong: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 20000 @@ -9169,7 +9169,7 @@ Body: IsSong: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 20000 @@ -9211,7 +9211,7 @@ Body: IsSong: true Hit: Single HitCount: 1 - SplashArea: -1 + SplashArea: 15 CastTime: 1000 Duration1: 60000 Duration2: 20000 From fde031fb19a0017b2e9c6f0e4a398c9f48c51078 Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 18 May 2020 09:44:12 -0400 Subject: [PATCH 115/212] Job Improvement Project - Minstrel/Wanderer (#4701) * Fixes #4211. * kRO Changelog: http://ro.gnjoy.com/news/update/View.asp?seq=235&curpage=1 * kRO Changelog 2: http://ro.gnjoy.com/news/update/View.asp?seq=246&curpage=1 Thanks to @Angelic234, @Litro, @LordWhiplash, @Feelmeone, @ecdarreola, and @teededung! --- db/import-tmpl/improvise_db.yml | 31 --- db/improvise_db.yml | 37 --- db/pre-re/skill_db.yml | 19 +- db/pre-re/skill_tree.txt | 24 +- db/re/improvise_db.yml | 65 ----- db/re/skill_db.yml | 337 ++++++++---------------- db/re/skill_nocast_db.txt | 4 + db/re/skill_tree.txt | 24 +- doc/skill_db.txt | 1 - doc/yaml/db/improvise_db.yml | 10 - sql-files/upgrades/upgrade_2020xxxx.sql | 3 + src/map/battle.cpp | 44 ++-- src/map/map-server.vcxproj | 1 - src/map/script_constants.hpp | 2 +- src/map/skill.cpp | 315 ++++++---------------- src/map/skill.hpp | 5 +- src/map/status.cpp | 121 ++++----- src/map/status.hpp | 1 + src/tool/csv2yaml.cpp | 28 -- 19 files changed, 296 insertions(+), 776 deletions(-) delete mode 100644 db/import-tmpl/improvise_db.yml delete mode 100644 db/improvise_db.yml delete mode 100644 db/re/improvise_db.yml delete mode 100644 doc/yaml/db/improvise_db.yml create mode 100644 sql-files/upgrades/upgrade_2020xxxx.sql diff --git a/db/import-tmpl/improvise_db.yml b/db/import-tmpl/improvise_db.yml deleted file mode 100644 index 2c0afce465..0000000000 --- a/db/import-tmpl/improvise_db.yml +++ /dev/null @@ -1,31 +0,0 @@ -# This file is a part of rAthena. -# Copyright(C) 2019 rAthena Development Team -# https://rathena.org - https://github.com/rathena -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -########################################################################### -# Improvised Song Database -########################################################################### -# -# Improvised Song Settings -# -########################################################################### -# - Skill Skill to be casted by Improvised Song. -# Probability Probability of skill compared to others in database (1 = 0.01%, 10000 = 100%). -########################################################################### - -Header: - Type: IMPROVISED_SONG_DB - Version: 1 diff --git a/db/improvise_db.yml b/db/improvise_db.yml deleted file mode 100644 index 0e53f56229..0000000000 --- a/db/improvise_db.yml +++ /dev/null @@ -1,37 +0,0 @@ -# This file is a part of rAthena. -# Copyright(C) 2019 rAthena Development Team -# https://rathena.org - https://github.com/rathena -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -########################################################################### -# Improvised Song Database -########################################################################### -# -# Improvised Song Settings -# -########################################################################### -# - Skill Skill to be casted by Improvised Song. -# Probability Probability of skill compared to others in database (1 = 0.01%, 10000 = 100%). -########################################################################### - -Header: - Type: IMPROVISED_SONG_DB - Version: 1 - -Footer: - Imports: - - Path: db/re/improvise_db.yml - Mode: Renewal - - Path: db/import/improvise_db.yml diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index a01fc0e56f..66e834f131 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -2071,8 +2071,6 @@ Body: TargetType: Attack DamageFlags: NoDamage: true - Flags: - IncreaseGloomyDayDamage: true Range: -2 Hit: Single HitCount: 1 @@ -6699,8 +6697,6 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - Flags: - IncreaseGloomyDayDamage: true Range: - Level: 1 Size: 3 @@ -10658,7 +10654,6 @@ Body: IgnoreDefense: true Flags: TargetTrap: true - IncreaseGloomyDayDamage: true Range: 5 Hit: Multi_Hit HitCount: 5 @@ -12834,8 +12829,6 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - Flags: - IncreaseGloomyDayDamage: true Range: 4 Hit: Multi_Hit HitCount: 5 @@ -16847,8 +16840,6 @@ Body: MaxLevel: 10 Type: Weapon TargetType: Attack - Flags: - IncreaseGloomyDayDamage: true Range: 5 Hit: Multi_Hit HitCount: -5 @@ -19889,9 +19880,9 @@ Body: IgnoreDefCard: true Flags: AllowOnWarg: true - IncreaseDanceWithWugDamage: true IgnoreAutoGuard: true IgnoreCicada: true + IncreaseDanceWithWugDamage: true Range: 9 Hit: Single HitCount: 1 @@ -19919,9 +19910,9 @@ Body: IgnoreDefCard: true Flags: AlterRangeVulture: true - IncreaseDanceWithWugDamage: true IgnoreAutoGuard: true IgnoreCicada: true + IncreaseDanceWithWugDamage: true Range: 9 Hit: Single HitCount: 1 @@ -24313,7 +24304,7 @@ Body: Reproduce: true Requires: SpCost: 1 - - Id: 2417 + - Id: 2417 # Removed on kRO Name: WM_DOMINION_IMPULSE Description: Dominion Impulse MaxLevel: 1 @@ -24326,6 +24317,7 @@ Body: HitCount: 1 SplashArea: 5 AfterCastActDelay: 1000 + FixedCastTime: -1 Requires: SpCost: 10 - Id: 2418 @@ -32136,8 +32128,6 @@ Body: TargetType: Attack DamageFlags: NoDamage: true - Flags: - IncreaseGloomyDayDamage: true Range: -2 Hit: Single HitCount: 1 @@ -32162,7 +32152,6 @@ Body: IgnoreDefense: true Flags: TargetTrap: true - IncreaseGloomyDayDamage: true Range: 5 Hit: Multi_Hit HitCount: 5 diff --git a/db/pre-re/skill_tree.txt b/db/pre-re/skill_tree.txt index 30d0ab48ec..7cb347fe2a 100644 --- a/db/pre-re/skill_tree.txt +++ b/db/pre-re/skill_tree.txt @@ -3219,9 +3219,9 @@ 4068,2382,5,2422,1,0,0,0,0,0,0,0,0 //MI_ECHOSONG#Echo Song# 4068,2383,5,2422,1,0,0,0,0,0,0,0,0 //MI_HARMONIZE#Harmonize# 4068,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4068,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4068,2413,5,0,0,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4068,2414,5,317,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4068,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4068,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4068,2418,5,316,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4068,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4068,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -3275,9 +3275,9 @@ 4069,2351,5,2422,1,0,0,0,0,0,0,0,0 //WA_SYMPHONY_OF_LOVER#Symphony of Lovers# 4069,2352,5,2422,1,0,0,0,0,0,0,0,0 //WA_MOONLIT_SERENADE#Moonlit Serenade# 4069,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4069,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4069,2413,5,0,0,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4069,2414,5,325,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4069,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4069,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4069,2418,5,324,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4069,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4069,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -3649,9 +3649,9 @@ 4075,2382,5,2422,1,0,0,0,0,0,0,0,0 //MI_ECHOSONG#Echo Song# 4075,2383,5,2422,1,0,0,0,0,0,0,0,0 //MI_HARMONIZE#Harmonize# 4075,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4075,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4075,2413,5,0,0,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4075,2414,5,317,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4075,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4075,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4075,2418,5,316,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4075,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4075,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -3711,9 +3711,9 @@ 4076,2351,5,2422,1,0,0,0,0,0,0,0,0 //WA_SYMPHONY_OF_LOVER#Symphony of Lovers# 4076,2352,5,2422,1,0,0,0,0,0,0,0,0 //WA_MOONLIT_SERENADE#Moonlit Serenade# 4076,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4076,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4076,2413,5,0,0,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4076,2414,5,325,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4076,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4076,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4076,2418,5,324,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4076,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4076,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -4870,9 +4870,9 @@ 4104,2382,5,2422,1,0,0,0,0,0,0,0,0 //MI_ECHOSONG#Echo Song# 4104,2383,5,2422,1,0,0,0,0,0,0,0,0 //MI_HARMONIZE#Harmonize# 4104,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4104,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4104,2413,5,0,0,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4104,2414,5,317,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4104,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4104,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4104,2418,5,316,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4104,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4104,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -4927,9 +4927,9 @@ 4105,2351,5,2422,1,0,0,0,0,0,0,0,0 //WA_SYMPHONY_OF_LOVER#Symphony of Lovers# 4105,2352,5,2422,1,0,0,0,0,0,0,0,0 //WA_MOONLIT_SERENADE#Moonlit Serenade# 4105,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4105,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4105,2413,5,0,0,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4105,2414,5,325,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4105,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4105,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4105,2418,5,324,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4105,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4105,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# diff --git a/db/re/improvise_db.yml b/db/re/improvise_db.yml deleted file mode 100644 index 4961d20f8d..0000000000 --- a/db/re/improvise_db.yml +++ /dev/null @@ -1,65 +0,0 @@ -# This file is a part of rAthena. -# Copyright(C) 2019 rAthena Development Team -# https://rathena.org - https://github.com/rathena -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -########################################################################### -# Improvised Song Database -########################################################################### -# -# Improvised Song Settings -# -########################################################################### -# - Skill Skill to be casted by Improvised Song. -# Probability Probability of skill compared to others in database (1 = 0.01%, 10000 = 100%). -########################################################################### - -Header: - Type: IMPROVISED_SONG_DB - Version: 1 - -Body: - - Skill: MG_NAPALMBEAT - Probability: 6000 - - Skill: MG_SAFETYWALL - Probability: 4000 - - Skill: MG_SOULSTRIKE - Probability: 6000 - - Skill: MG_COLDBOLT - Probability: 6000 - - Skill: MG_FROSTDIVER - Probability: 6000 - - Skill: MG_FIREBALL - Probability: 6000 - - Skill: MG_FIREWALL - Probability: 4000 - - Skill: MG_FIREBOLT - Probability: 6000 - - Skill: MG_LIGHTNINGBOLT - Probability: 6000 - - Skill: MG_THUNDERSTORM - Probability: 4000 - - Skill: WZ_FIREPILLAR - Probability: 4000 - - Skill: WZ_METEOR - Probability: 4000 - - Skill: WZ_JUPITEL - Probability: 6000 - - Skill: WZ_VERMILION - Probability: 4000 - - Skill: WZ_WATERBALL - Probability: 6000 - - Skill: WZ_STORMGUST - Probability: 4000 diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index cad49b89ca..4c2a2fe18e 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -2106,8 +2106,6 @@ Body: TargetType: Attack DamageFlags: NoDamage: true - Flags: - IncreaseGloomyDayDamage: true Range: -2 Hit: Multi_Hit HitCount: -3 @@ -7077,8 +7075,6 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - Flags: - IncreaseGloomyDayDamage: true Range: - Level: 1 Size: 3 @@ -8555,7 +8551,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 60000 Cooldown: 20000 Requires: @@ -8609,7 +8605,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 60000 Cooldown: 20000 Requires: @@ -8695,7 +8691,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 60000 Cooldown: 20000 Requires: @@ -8717,7 +8713,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 60000 Cooldown: 20000 Requires: @@ -8835,7 +8831,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 20000 Cooldown: 20000 Requires: @@ -8877,7 +8873,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 20000 Cooldown: 20000 Requires: @@ -8919,7 +8915,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 20000 Cooldown: 20000 Requires: @@ -8961,7 +8957,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 20000 Cooldown: 20000 Requires: @@ -9087,7 +9083,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 20000 Cooldown: 20000 Requires: @@ -9171,7 +9167,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 20000 Cooldown: 20000 Requires: @@ -9213,7 +9209,7 @@ Body: HitCount: 1 SplashArea: 15 CastTime: 1000 - Duration1: 60000 + Duration1: 180000 Duration2: 20000 Cooldown: 20000 Requires: @@ -10976,7 +10972,6 @@ Body: TargetType: Attack Flags: TargetTrap: true - IncreaseGloomyDayDamage: true Range: 5 Hit: Multi_Hit HitCount: 5 @@ -13209,8 +13204,6 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - Flags: - IncreaseGloomyDayDamage: true Range: - Level: 1 Size: 7 @@ -17536,8 +17529,6 @@ Body: MaxLevel: 10 Type: Weapon TargetType: Attack - Flags: - IncreaseGloomyDayDamage: true Range: 5 Hit: Multi_Hit HitCount: -5 @@ -20668,9 +20659,9 @@ Body: IgnoreDefCard: true Flags: AllowOnWarg: true - IncreaseDanceWithWugDamage: true IgnoreAutoGuard: true IgnoreCicada: true + IncreaseDanceWithWugDamage: true Range: 9 Hit: Single HitCount: 1 @@ -20698,9 +20689,9 @@ Body: IgnoreDefCard: true Flags: AlterRangeVulture: true - IncreaseDanceWithWugDamage: true IgnoreAutoGuard: true IgnoreCicada: true + IncreaseDanceWithWugDamage: true Range: 9 Hit: Single HitCount: 1 @@ -23106,8 +23097,6 @@ Body: MaxLevel: 10 Type: Weapon TargetType: Attack - Flags: - IncreaseGloomyDayDamage: true Range: 1 Hit: Single HitCount: 5 @@ -24842,21 +24831,11 @@ Body: Splash: true Hit: Single HitCount: 1 - SplashArea: - - Level: 1 - Area: 7 - - Level: 2 - Area: 8 - - Level: 3 - Area: 9 - - Level: 4 - Area: 10 - - Level: 5 - Area: 11 + SplashArea: -1 CastCancel: true CastTime: 1000 AfterCastActDelay: 2000 - Duration1: 60000 + Duration1: 180000 FixedCastTime: -1 Requires: SpCost: @@ -24883,21 +24862,11 @@ Body: Splash: true Hit: Single HitCount: 1 - SplashArea: - - Level: 1 - Area: 7 - - Level: 2 - Area: 8 - - Level: 3 - Area: 9 - - Level: 4 - Area: 10 - - Level: 5 - Area: 11 + SplashArea: -1 CastCancel: true CastTime: 1000 AfterCastActDelay: 2000 - Duration1: 60000 + Duration1: 180000 FixedCastTime: -1 Requires: SpCost: @@ -24924,21 +24893,11 @@ Body: Splash: true Hit: Single HitCount: 1 - SplashArea: - - Level: 1 - Area: 7 - - Level: 2 - Area: 8 - - Level: 3 - Area: 9 - - Level: 4 - Area: 10 - - Level: 5 - Area: 11 + SplashArea: -1 CastCancel: true CastTime: 1000 AfterCastActDelay: 2000 - Duration1: 60000 + Duration1: 180000 FixedCastTime: -1 Requires: SpCost: @@ -24965,21 +24924,11 @@ Body: Splash: true Hit: Single HitCount: 1 - SplashArea: - - Level: 1 - Area: 7 - - Level: 2 - Area: 8 - - Level: 3 - Area: 9 - - Level: 4 - Area: 10 - - Level: 5 - Area: 11 + SplashArea: -1 CastCancel: true CastTime: 1000 AfterCastActDelay: 2000 - Duration1: 60000 + Duration1: 180000 FixedCastTime: -1 Requires: SpCost: @@ -25020,7 +24969,7 @@ Body: CastCancel: true CastTime: 1000 AfterCastActDelay: 2000 - Duration1: 60000 + Duration1: 180000 FixedCastTime: -1 Requires: SpCost: @@ -25088,29 +25037,7 @@ Body: Skill: Reproduce: true CastCancel: true - CastTime: # !TODO: Confirm all times - - Level: 1 - Time: 1000 - - Level: 2 - Time: 1500 - - Level: 3 - Time: 2000 - - Level: 4 - Time: 2500 - - Level: 5 - Time: 3000 - - Level: 6 - Time: 3500 - - Level: 7 - Time: 4000 - - Level: 8 - Time: 4500 - - Level: 9 - Time: 5000 - - Level: 10 - Time: 5500 - AfterCastActDelay: 1000 - Cooldown: + CastTime: # !TODO: Confirm cast times - Level: 1 Time: 1000 - Level: 2 @@ -25131,6 +25058,8 @@ Body: Time: 5000 - Level: 10 Time: 5500 + AfterCastActDelay: 500 + Cooldown: 2500 FixedCastTime: -1 Requires: SpCost: @@ -25158,44 +25087,33 @@ Body: Name: WM_REVERBERATION Description: Reverberation MaxLevel: 5 - TargetType: Ground + TargetType: Attack DamageFlags: - NoDamage: true Splash: true Flags: IsTrap: true Range: 9 Hit: Single HitCount: 1 - SplashArea: 2 + SplashArea: + - Level: 1 + Area: 2 + - Level: 2 + Area: 2 + - Level: 3 + Area: 2 + - Level: 4 + Area: 3 + - Level: 5 + Area: 3 CopyFlags: Skill: Reproduce: true CastCancel: true - CastTime: - - Level: 1 - Time: 1100 - - Level: 2 - Time: 1200 - - Level: 3 - Time: 1300 - - Level: 4 - Time: 1400 - - Level: 5 - Time: 1500 - AfterCastActDelay: 1000 - Duration1: - - Level: 1 - Time: 9000 - - Level: 2 - Time: 10000 - - Level: 3 - Time: 11000 - - Level: 4 - Time: 12000 - - Level: 5 - Time: 13000 - FixedCastTime: -1 + CastTime: 1000 + AfterCastActDelay: 500 + Cooldown: 150 + FixedCastTime: 500 Requires: SpCost: - Level: 1 @@ -25208,13 +25126,10 @@ Body: Amount: 42 - Level: 5 Amount: 48 - Unit: - Id: Reverberation - Interval: 1000 - Target: Enemy - Flag: - NoKnockback: true - - Id: 2415 + Ammo: + Arrow: true + AmmoAmount: 10 + - Id: 2415 # Removed on kRO Name: WM_REVERBERATION_MELEE Description: Reverberation Melee MaxLevel: 5 @@ -25222,7 +25137,6 @@ Body: TargetType: Attack DamageFlags: Splash: true - SplashSplit: true Hit: Single HitCount: 1 Element: Weapon @@ -25238,18 +25152,12 @@ Body: MaxLevel: 5 Type: Magic TargetType: Attack - DamageFlags: - Splash: true - SplashSplit: true - Hit: Single - HitCount: 1 - SplashArea: 2 + Hit: Multi_Hit + HitCount: 10 CopyFlags: Skill: Reproduce: true - Requires: - SpCost: 1 - - Id: 2417 + - Id: 2417 # Removed on kRO Name: WM_DOMINION_IMPULSE Description: Dominion Impulse MaxLevel: 1 @@ -25387,7 +25295,7 @@ Body: Whip: true ItemCost: - Item: Protect_Neck_Candy - Amount: 1 + Amount: 2 Unit: Id: Netherworld Range: 1 @@ -25505,7 +25413,7 @@ Body: Name: WM_LULLABY_DEEPSLEEP Description: Deep Sleep Lullaby MaxLevel: 5 - TargetType: Self + TargetType: Attack DamageFlags: NoDamage: true Splash: true @@ -25513,19 +25421,19 @@ Body: HitCount: 1 SplashArea: - Level: 1 - Area: 5 + Area: 1 - Level: 2 - Area: 6 + Area: 1 - Level: 3 - Area: 7 + Area: 1 - Level: 4 - Area: 8 + Area: 2 - Level: 5 - Area: 9 + Area: 2 CastCancel: true CastTime: 2000 AfterCastActDelay: 1000 - Duration1: + Duration1: # !TODO: What's the updated duration? - Level: 1 Time: 12000 - Level: 2 @@ -25553,6 +25461,9 @@ Body: Weapon: Musical: true Whip: true + ItemCost: + - Item: Protect_Neck_Candy + Amount: 2 - Id: 2423 Name: WM_SIRCLEOFNATURE Description: Circle of Nature's Sound @@ -25563,21 +25474,11 @@ Body: Splash: true Hit: Single HitCount: 1 - SplashArea: - - Level: 1 - Area: 3 - - Level: 2 - Area: 4 - - Level: 3 - Area: 5 - - Level: 4 - Area: 6 - - Level: 5 - Area: 7 + SplashArea: -1 CastCancel: true CastTime: 2000 AfterCastActDelay: 1000 - Duration1: 60000 + Duration1: 180000 Cooldown: 15000 FixedCastTime: -1 Requires: @@ -25600,7 +25501,7 @@ Body: Description: Improvised Song MaxLevel: 5 Type: Magic - TargetType: Self + TargetType: Attack DamageFlags: NoDamage: true Range: 9 @@ -25638,17 +25539,7 @@ Body: CastCancel: true CastTime: 1000 AfterCastActDelay: 1000 - Duration1: - - Level: 1 - Time: 30000 - - Level: 2 - Time: 45000 - - Level: 3 - Time: 60000 - - Level: 4 - Time: 75000 - - Level: 5 - Time: 90000 + Duration1: 60000 Cooldown: 10000 FixedCastTime: 500 Requires: @@ -25719,7 +25610,7 @@ Body: Amount: 120 ItemCost: - Item: Protect_Neck_Candy - Amount: 1 + Amount: 2 - Id: 2427 Name: WM_SONG_OF_MANA Description: Song of Mana @@ -25746,17 +25637,7 @@ Body: CastCancel: true CastTime: 1000 AfterCastActDelay: 1000 - Duration1: - - Level: 1 - Time: 30000 - - Level: 2 - Time: 60000 - - Level: 3 - Time: 90000 - - Level: 4 - Time: 120000 - - Level: 5 - Time: 150000 + Duration1: 120000 Cooldown: 90000 FixedCastTime: 500 Requires: @@ -25774,6 +25655,9 @@ Body: Weapon: Musical: true Whip: true + ItemCost: + - Item: Protect_Neck_Candy + Amount: 1 - Id: 2428 Name: WM_DANCE_WITH_WUG Description: Dance With A Warg @@ -25810,17 +25694,7 @@ Body: - Level: 5 Time: 3500 AfterCastActDelay: 1000 - Duration1: - - Level: 1 - Time: 30000 - - Level: 2 - Time: 60000 - - Level: 3 - Time: 90000 - - Level: 4 - Time: 120000 - - Level: 5 - Time: 150000 + Duration1: 120000 Cooldown: 90000 FixedCastTime: 500 Requires: @@ -25838,30 +25712,32 @@ Body: Weapon: Musical: true Whip: true + ItemCost: + - Item: Protect_Neck_Candy + Amount: 1 - Id: 2429 Name: WM_SOUND_OF_DESTRUCTION Description: Sound of Destruction MaxLevel: 5 - TargetType: Ground + TargetType: Self DamageFlags: + NoDamage: true Splash: true - IgnoreFlee: true Flags: IsChorus: true - Range: 9 Hit: Single HitCount: 1 SplashArea: - Level: 1 - Area: 4 + Area: 5 - Level: 2 - Area: 4 + Area: 5 - Level: 3 - Area: 5 - - Level: 4 - Area: 5 - - Level: 5 Area: 6 + - Level: 4 + Area: 6 + - Level: 5 + Area: 7 CastCancel: true CastTime: - Level: 2 @@ -25873,18 +25749,8 @@ Body: - Level: 5 Time: 2000 AfterCastActDelay: 1000 - Duration1: 5000 - Cooldown: - - Level: 1 - Time: 6000 - - Level: 2 - Time: 7000 - - Level: 3 - Time: 8000 - - Level: 4 - Time: 9000 - - Level: 5 - Time: 10000 + Duration1: 10000 + Cooldown: 60000 FixedCastTime: 500 Requires: SpCost: @@ -25901,6 +25767,9 @@ Body: Weapon: Musical: true Whip: true + ItemCost: + - Item: Protect_Neck_Candy + Amount: 10 - Id: 2430 Name: WM_SATURDAY_NIGHT_FEVER Description: Saturday Night Fever @@ -25959,7 +25828,7 @@ Body: Time: 4000 - Level: 5 Time: 2000 - Cooldown: 180000 + Cooldown: 60000 FixedCastTime: 1000 Requires: SpCost: @@ -25976,6 +25845,9 @@ Body: Weapon: Musical: true Whip: true + ItemCost: + - Item: Protect_Neck_Candy + Amount: 5 - Id: 2431 Name: WM_LERADS_DEW Description: Lerad's Dew @@ -26002,17 +25874,7 @@ Body: CastCancel: true CastTime: 1000 AfterCastActDelay: 1000 - Duration1: - - Level: 1 - Time: 20000 - - Level: 2 - Time: 30000 - - Level: 3 - Time: 40000 - - Level: 4 - Time: 50000 - - Level: 5 - Time: 60000 + Duration1: 120000 Cooldown: 180000 FixedCastTime: 500 Requires: @@ -26030,6 +25892,9 @@ Body: Weapon: Musical: true Whip: true + ItemCost: + - Item: Protect_Neck_Candy + Amount: 1 - Id: 2432 Name: WM_MELODYOFSINK Description: Melody of Sink @@ -26067,7 +25932,7 @@ Body: Time: 50000 - Level: 5 Time: 60000 - Cooldown: 180000 + Cooldown: 20000 FixedCastTime: 500 Requires: SpCost: @@ -26084,6 +25949,9 @@ Body: Weapon: Musical: true Whip: true + ItemCost: + - Item: Protect_Neck_Candy + Amount: 2 - Id: 2433 Name: WM_BEYOND_OF_WARCRY Description: Warcry of Beyond @@ -26121,7 +25989,7 @@ Body: Time: 50000 - Level: 5 Time: 60000 - Cooldown: 180000 + Cooldown: 20000 FixedCastTime: 500 Requires: SpCost: @@ -26138,6 +26006,9 @@ Body: Weapon: Musical: true Whip: true + ItemCost: + - Item: Protect_Neck_Candy + Amount: 2 - Id: 2434 Name: WM_UNLIMITED_HUMMING_VOICE Description: Unlimited Humming Voice @@ -26202,6 +26073,9 @@ Body: Weapon: Musical: true Whip: true + ItemCost: + - Item: Protect_Neck_Candy + Amount: 5 - Id: 2516 Name: WM_SEVERE_RAINSTORM_MELEE Description: Severe Rainstorm Melee @@ -35983,8 +35857,6 @@ Body: TargetType: Attack DamageFlags: NoDamage: true - Flags: - IncreaseGloomyDayDamage: true Range: -2 Hit: Single HitCount: 1 @@ -36009,7 +35881,6 @@ Body: TargetType: Attack Flags: TargetTrap: true - IncreaseGloomyDayDamage: true Range: 5 Hit: Multi_Hit HitCount: 5 diff --git a/db/re/skill_nocast_db.txt b/db/re/skill_nocast_db.txt index 2b84a15287..85d621d0fd 100644 --- a/db/re/skill_nocast_db.txt +++ b/db/re/skill_nocast_db.txt @@ -33,7 +33,11 @@ 328,1 //DC_DONTFORGETME 2422,1 //WM_LULLABY_DEEPSLEEP 2423,1 //WM_SIRCLEOFNATURE +2425,1 //WM_GLOOMYDAY +2429,1 //WM_SOUND_OF_DESTRUCTION 2430,1 //WM_SATURDAY_NIGHT_FEVER +2432,1 //WM_MELODYOFSINK +2433,1 //WM_BEYOND_OF_WARCRY 2455,1 //SO_ARRULLO 2299,1 //SC_MANHOLE diff --git a/db/re/skill_tree.txt b/db/re/skill_tree.txt index 9a8b1fc302..0b1c054d44 100644 --- a/db/re/skill_tree.txt +++ b/db/re/skill_tree.txt @@ -3250,9 +3250,9 @@ 4068,2382,5,2422,1,0,0,0,0,0,0,0,0 //MI_ECHOSONG#Echo Song# 4068,2383,5,2422,1,0,0,0,0,0,0,0,0 //MI_HARMONIZE#Harmonize# 4068,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4068,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4068,2413,10,2414,5,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4068,2414,5,317,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4068,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4068,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4068,2418,5,316,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4068,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4068,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -3306,9 +3306,9 @@ 4069,2351,5,2422,1,0,0,0,0,0,0,0,0 //WA_SYMPHONY_OF_LOVER#Symphony of Lovers# 4069,2352,5,2422,1,0,0,0,0,0,0,0,0 //WA_MOONLIT_SERENADE#Moonlit Serenade# 4069,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4069,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4069,2413,10,2414,5,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4069,2414,5,325,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4069,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4069,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4069,2418,5,324,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4069,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4069,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -3681,9 +3681,9 @@ 4075,2382,5,2422,1,0,0,0,0,0,0,0,0 //MI_ECHOSONG#Echo Song# 4075,2383,5,2422,1,0,0,0,0,0,0,0,0 //MI_HARMONIZE#Harmonize# 4075,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4075,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4075,2413,10,2414,5,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4075,2414,5,317,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4075,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4075,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4075,2418,5,316,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4075,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4075,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -3744,9 +3744,9 @@ 4076,2351,5,2422,1,0,0,0,0,0,0,0,0 //WA_SYMPHONY_OF_LOVER#Symphony of Lovers# 4076,2352,5,2422,1,0,0,0,0,0,0,0,0 //WA_MOONLIT_SERENADE#Moonlit Serenade# 4076,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4076,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4076,2413,10,2414,5,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4076,2414,5,325,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4076,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4076,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4076,2418,5,324,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4076,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4076,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -4913,9 +4913,9 @@ 4104,2382,5,2422,1,0,0,0,0,0,0,0,0 //MI_ECHOSONG#Echo Song# 4104,2383,5,2422,1,0,0,0,0,0,0,0,0 //MI_HARMONIZE#Harmonize# 4104,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4104,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4104,2413,10,2414,5,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4104,2414,5,317,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4104,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4104,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4104,2418,5,316,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4104,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4104,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# @@ -4971,9 +4971,9 @@ 4105,2351,5,2422,1,0,0,0,0,0,0,0,0 //WA_SYMPHONY_OF_LOVER#Symphony of Lovers# 4105,2352,5,2422,1,0,0,0,0,0,0,0,0 //WA_MOONLIT_SERENADE#Moonlit Serenade# 4105,2412,10,0,0,0,0,0,0,0,0,0,0 //WM_LESSON#Lesson# -4105,2413,10,2417,1,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# +4105,2413,10,2414,5,0,0,0,0,0,0,0,0 //WM_METALICSOUND#Metallic Sound# 4105,2414,5,325,5,0,0,0,0,0,0,0,0 //WM_REVERBERATION#Reverberation# -4105,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# +//4105,2417,1,2414,1,0,0,0,0,0,0,0,0 //WM_DOMINION_IMPULSE#Dominion Impulse# 4105,2418,5,324,5,0,0,0,0,0,0,0,0 //WM_SEVERE_RAINSTORM#Severe Rainstorm# 4105,2419,5,2412,1,0,0,0,0,0,0,0,0 //WM_POEMOFNETHERWORLD#Poem Of The Netherworld# 4105,2420,5,2419,3,0,0,0,0,0,0,0,0 //WM_VOICEOFSIREN#Voice Of Siren# diff --git a/doc/skill_db.txt b/doc/skill_db.txt index 05a36d1904..7f2582e560 100644 --- a/doc/skill_db.txt +++ b/doc/skill_db.txt @@ -97,7 +97,6 @@ AllowOnWarg - Usable while riding Warg. AllowOnMado - Usable while on Madogear. TargetManHole - Target enemy with SC__MANHOLE. TargetHidden - Target enemy with OPTION_HIDE. -IncreaseGloomyDayDamage - Increase SC_GLOOMYDAY_SK damage. IncreaseDanceWithWugDamage - Increase SC_DANCEWITHWUG damage. IgnoreWugBite - Ignore RA_WUGBITE. IgnoreAutoGuard - Not blocked by SC_AUTOGUARD (When TargetType is Weapon only). diff --git a/doc/yaml/db/improvise_db.yml b/doc/yaml/db/improvise_db.yml deleted file mode 100644 index aa84b08bd3..0000000000 --- a/doc/yaml/db/improvise_db.yml +++ /dev/null @@ -1,10 +0,0 @@ -########################################################################### -# Improvised Song Database -########################################################################### -# -# Improvised Song Settings -# -########################################################################### -# - Skill Skill to be casted by Improvised Song. -# Probability Probability of skill compared to others in database (1 = 0.01%, 10000 = 100%). -########################################################################### diff --git a/sql-files/upgrades/upgrade_2020xxxx.sql b/sql-files/upgrades/upgrade_2020xxxx.sql new file mode 100644 index 0000000000..cdc536564e --- /dev/null +++ b/sql-files/upgrades/upgrade_2020xxxx.sql @@ -0,0 +1,3 @@ +-- WM_DOMINION_IMPULSE +UPDATE `char` c, `skill` s SET `c`.skill_point = `c`.skill_point + `s`.lv WHERE `s`.id = 2417 AND `c`.char_id = `s`.char_id; +DELETE FROM `skill` WHERE `id` = 2417; diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 205ae04655..4691e291bc 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1340,6 +1340,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam status_change_end(bl,SC_VOICEOFSIREN,INVALID_TIMER); } + if (sc->data[SC_SOUNDOFDESTRUCTION]) + damage <<= 1; + // Damage reductions // Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz] #ifndef RENEWAL @@ -1624,6 +1627,10 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam damage += damage * sce->val1 / 100; if (flag & BF_MAGIC && (sce = sc->data[SC_ADD_MATK_DAMAGE])) damage += damage * sce->val1 / 100; + if (sc->data[SC_DANCEWITHWUG] && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) + damage += damage * sc->data[SC_DANCEWITHWUG]->val1 / 100; + if (sc->data[SC_UNLIMITEDHUMMINGVOICE] && flag&BF_MAGIC) + damage += damage * sc->data[SC_UNLIMITEDHUMMINGVOICE]->val3 / 100; } //End of caster SC_ check if (tsc && tsc->count) { @@ -2393,7 +2400,7 @@ bool is_infinite_defense(struct block_list *target, int flag) if(target->type == BL_SKILL) { TBL_SKILL *su = ((TBL_SKILL*)target); - if (su && su->group && (su->group->skill_id == WM_REVERBERATION || su->group->skill_id == NPC_REVERBERATION || su->group->skill_id == WM_POEMOFNETHERWORLD)) + if (su && su->group && (su->group->skill_id == NPC_REVERBERATION || su->group->skill_id == WM_POEMOFNETHERWORLD)) return true; } @@ -4411,11 +4418,6 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += skillratio * 25 / 100; RE_LVL_DMOD(100); break; - case WM_REVERBERATION_MELEE: - // ATK [{(Skill Level x 100) + 300} x Caster Base Level / 100] - skillratio += 200 + 100 * ((sd) ? pc_checkskill(sd, WM_REVERBERATION) : 1); - RE_LVL_DMOD(100); - break; case WM_SEVERE_RAINSTORM_MELEE: //ATK [{(Caster DEX + AGI) x (Skill Level / 5)} x Caster Base Level / 100] % skillratio = (status_get_dex(src) + status_get_agi(src)) * skill_lv / 5; @@ -4424,13 +4426,11 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case WM_GREAT_ECHO: - skillratio += 300 + 200 * skill_lv; + skillratio += -100 + 250 + 500 * skill_lv; if (sd) { - int chorusbonus = battle_calc_chorusbonus(sd); - - // Chorus bonus don't count the first 2 Minstrels/Wanderers and only increases when their are 3 or more. [Rytech] - if (chorusbonus >= 1 && chorusbonus <= 5) - skillratio += 100<<(chorusbonus-1); // 1->100; 2->200; 3->400; 4->800; 5->1600 + skillratio += pc_checkskill(sd, WM_LESSON) * 50; // !TODO: Confirm bonus + if (skill_check_pc_partner(sd, skill_id, &skill_lv, AREA_SIZE, 0) > 0) + skillratio <<= 1; } RE_LVL_DMOD(100); break; @@ -4843,10 +4843,6 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st #endif } } - if (sc->data[SC_GLOOMYDAY_SK] && skill_get_inf2(skill_id, INF2_INCREASEGLOOMYDAYDAMAGE)) { - ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_GLOOMYDAY_SK]->val2); - RE_ALLATK_ADDRATE(wd, sc->data[SC_GLOOMYDAY_SK]->val2); - } if (sc->data[SC_DANCEWITHWUG]) { if (skill_get_inf2(skill_id, INF2_INCREASEDANCEWITHWUGDAMAGE)) { ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_DANCEWITHWUG]->val1 * 10 * battle_calc_chorusbonus(sd)); @@ -6034,6 +6030,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list if (mflag&ELE_DARK) s_ele = ELE_DARK; break; + case WM_REVERBERATION_MAGIC: + if (sd) + s_ele = sd->bonus.arrow_ele; + break; case SO_PSYCHIC_WAVE: if( sc && sc->count ) { if( sc->data[SC_HEATER_OPTION] ) @@ -6449,11 +6449,13 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case WM_METALICSOUND: skillratio += -100 + 120 * skill_lv + 60 * ((sd) ? pc_checkskill(sd, WM_LESSON) : 1); + if (tsc && tsc->data[SC_SLEEP]) + skillratio += 100; // !TODO: Confirm target sleeping bonus RE_LVL_DMOD(100); break; case WM_REVERBERATION_MAGIC: - // MATK [{(Skill Level x 100) + 100} x Casters Base Level / 100] % - skillratio += 100 * skill_lv; + // MATK [{(Skill Level x 300) + 400} x Casters Base Level / 100] % + skillratio += -100 + 700 + 300 * skill_lv; RE_LVL_DMOD(100); break; case SO_FIREWALK: @@ -7009,10 +7011,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * case NC_MAGMA_ERUPTION_DOTDAMAGE: // 'Eruption' damage md.damage = 800 + 200 * skill_lv; break; - case WM_SOUND_OF_DESTRUCTION: - md.damage = 1000 * skill_lv + sstatus->int_ * ((sd) ? pc_checkskill(sd,WM_LESSON) : 1); - md.damage += md.damage * 10 * ((sd) ? battle_calc_chorusbonus(sd) / 100 : 0); - break; case GN_THORNS_TRAP: md.damage = 100 + 200 * skill_lv + status_get_int(src); break; @@ -8099,7 +8097,7 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f if( !su || !su->group) return 0; if( skill_get_inf2(su->group->skill_id, INF2_ISTRAP) && su->group->unit_id != UNT_USED_TRAPS) { - if (!skill_id || su->group->skill_id == WM_REVERBERATION || su->group->skill_id == NPC_REVERBERATION || su->group->skill_id == WM_POEMOFNETHERWORLD) { + if (!skill_id || su->group->skill_id == NPC_REVERBERATION || su->group->skill_id == WM_POEMOFNETHERWORLD) { ; } else if (skill_get_inf2(skill_id, INF2_TARGETTRAP)) { // Only a few skills can target traps diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj index b4955a18a7..60c680616e 100644 --- a/src/map/map-server.vcxproj +++ b/src/map/map-server.vcxproj @@ -307,7 +307,6 @@ - diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index cae9051e67..77092b5f6a 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1582,6 +1582,7 @@ export_constant(SC_REF_T_POTION); export_constant(SC_ADD_ATK_DAMAGE); export_constant(SC_ADD_MATK_DAMAGE); + export_constant(SC_SOUNDOFDESTRUCTION); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); #endif @@ -7518,7 +7519,6 @@ export_constant(INF2_ALLOWONMADO); export_constant(INF2_TARGETMANHOLE); export_constant(INF2_TARGETHIDDEN); - export_constant(INF2_INCREASEGLOOMYDAYDAMAGE); export_constant(INF2_INCREASEDANCEWITHWUGDAMAGE); export_constant(INF2_IGNOREWUGBITE); export_constant(INF2_IGNOREAUTOGUARD); diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 549c238fff..4e0ff08903 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -89,8 +89,6 @@ static unsigned short skill_arrow_count; AbraDatabase abra_db; -ImprovisedSongDatabase improvised_song_db; - ReadingSpellbookDatabase reading_spellbook_db; #define MAX_SKILL_CHANGEMATERIAL_DB 75 @@ -932,6 +930,7 @@ bool skill_isNotOk(uint16 skill_id, struct map_session_data *sd) case WM_SIRCLEOFNATURE: case WM_SOUND_OF_DESTRUCTION: case WM_LULLABY_DEEPSLEEP: + case WM_GLOOMYDAY: case WM_SATURDAY_NIGHT_FEVER: if( !mapdata_flag_vs(mapdata) ) { clif_skill_teleportmessage(sd,2); // This skill uses this msg instead of skill fails. @@ -1832,47 +1831,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SR_HOWLINGOFLION: sc_start(src,bl, SC_FEAR, 5 + 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); break; - case WM_SOUND_OF_DESTRUCTION: - if( tsc && ( tsc->data[SC_SWINGDANCE] || tsc->data[SC_SYMPHONYOFLOVER] || tsc->data[SC_MOONLITSERENADE] || - tsc->data[SC_RUSHWINDMILL] || tsc->data[SC_ECHOSONG] || tsc->data[SC_HARMONIZE] || - tsc->data[SC_VOICEOFSIREN] || tsc->data[SC_DEEPSLEEP] || tsc->data[SC_SIRCLEOFNATURE] || - tsc->data[SC_GLOOMYDAY] || tsc->data[SC_GLOOMYDAY_SK] || tsc->data[SC_SONGOFMANA] || - tsc->data[SC_DANCEWITHWUG] || tsc->data[SC_SATURDAYNIGHTFEVER] || tsc->data[SC_LERADSDEW] || - tsc->data[SC_MELODYOFSINK] || tsc->data[SC_BEYONDOFWARCRY] || tsc->data[SC_UNLIMITEDHUMMINGVOICE] ) && - rnd()%100 < 4 * skill_lv + 2 * ((sd) ? pc_checkskill(sd, WM_LESSON) : skill_get_max(WM_LESSON)) + 10 * battle_calc_chorusbonus(sd)) { - status_change_start(src, bl, SC_STUN, 10000, skill_lv, 0, 0, 0, skill_get_time(skill_id,skill_lv), SCSTART_NOTICKDEF); - status_change_end(bl, SC_DANCING, INVALID_TIMER); - status_change_end(bl, SC_RICHMANKIM, INVALID_TIMER); - status_change_end(bl, SC_ETERNALCHAOS, INVALID_TIMER); - status_change_end(bl, SC_DRUMBATTLE, INVALID_TIMER); - status_change_end(bl, SC_NIBELUNGEN, INVALID_TIMER); - status_change_end(bl, SC_INTOABYSS, INVALID_TIMER); - status_change_end(bl, SC_SIEGFRIED, INVALID_TIMER); - status_change_end(bl, SC_WHISTLE, INVALID_TIMER); - status_change_end(bl, SC_ASSNCROS, INVALID_TIMER); - status_change_end(bl, SC_POEMBRAGI, INVALID_TIMER); - status_change_end(bl, SC_APPLEIDUN, INVALID_TIMER); - status_change_end(bl, SC_HUMMING, INVALID_TIMER); - status_change_end(bl, SC_FORTUNE, INVALID_TIMER); - status_change_end(bl, SC_SERVICE4U, INVALID_TIMER); -#ifndef RENEWAL - status_change_end(bl, SC_LONGING, INVALID_TIMER); -#endif - status_change_end(bl, SC_SWINGDANCE, INVALID_TIMER); - status_change_end(bl, SC_SYMPHONYOFLOVER, INVALID_TIMER); - status_change_end(bl, SC_MOONLITSERENADE, INVALID_TIMER); - status_change_end(bl, SC_RUSHWINDMILL, INVALID_TIMER); - status_change_end(bl, SC_ECHOSONG, INVALID_TIMER); - status_change_end(bl, SC_HARMONIZE, INVALID_TIMER); - status_change_end(bl, SC_WINKCHARM, INVALID_TIMER); - status_change_end(bl, SC_SONGOFMANA, INVALID_TIMER); - status_change_end(bl, SC_DANCEWITHWUG, INVALID_TIMER); - status_change_end(bl, SC_LERADSDEW, INVALID_TIMER); - status_change_end(bl, SC_MELODYOFSINK, INVALID_TIMER); - status_change_end(bl, SC_BEYONDOFWARCRY, INVALID_TIMER); - status_change_end(bl, SC_UNLIMITEDHUMMINGVOICE, INVALID_TIMER); - } - break; case SO_EARTHGRAVE: sc_start2(src,bl, SC_BLEEDING, 5 * skill_lv, skill_lv, src->id, skill_get_time2(skill_id, skill_lv)); // Need official rate. [LimitLine] break; @@ -3681,6 +3639,8 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * type = DMG_SPLASH; if (!(flag&SD_ANIMATION)) clif_skill_nodamage(dsrc, bl, skill_id, skill_lv, 1); + // Fall through + case WM_REVERBERATION_MAGIC: dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, dmg_type); break; case SJ_FALLINGSTAR_ATK: @@ -3962,7 +3922,6 @@ static int skill_check_unit_range_sub(struct block_list *bl, va_list ap) case SC_DIMENSIONDOOR: case SC_BLOODYLUST: case NPC_REVERBERATION: - case WM_REVERBERATION: case GN_THORNS_TRAP: case RL_B_TRAP: case SC_ESCAPE: @@ -4382,8 +4341,6 @@ static TIMER_FUNC(skill_timerskill){ } break; case NPC_REVERBERATION_ATK: - case WM_REVERBERATION_MELEE: - case WM_REVERBERATION_MAGIC: skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_LEVEL|SD_ANIMATION); break; case LG_MOONSLASHER: @@ -4550,7 +4507,7 @@ static int skill_active_reverberation(struct block_list *bl, va_list ap) { if (bl->type != BL_SKILL) return 0; - if (su->alive && (sg = su->group) && (sg->skill_id == WM_REVERBERATION || sg->skill_id == NPC_REVERBERATION)) { + if (su->alive && (sg = su->group) && sg->skill_id == NPC_REVERBERATION) { map_foreachinallrange(skill_trap_splash, bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag, bl, gettick()); su->limit = DIFF_TICK(gettick(), sg->tick); sg->unit_id = UNT_USED_TRAPS; @@ -5173,8 +5130,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case SR_SKYNETBLOW: case SR_WINDMILL: case SR_RIDEINLIGHTNING: - case WM_REVERBERATION_MELEE: - case WM_REVERBERATION_MAGIC: case SO_VARETYR_SPEAR: case GN_CART_TORNADO: case GN_CARTCANNON: @@ -5261,8 +5216,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_addtimerskill(src,tick+250,src->id,0,0,skill_id,skill_lv,2,flag|BCT_ENEMY|SD_SPLASH|1); break; case NPC_REVERBERATION_ATK: - case WM_REVERBERATION_MELEE: - case WM_REVERBERATION_MAGIC: case NC_ARMSCANNON: skill_area_temp[1] = 0; starget = splash_target(src); @@ -5688,7 +5641,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case RK_STORMBLAST: if( flag&1 ) - skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); + skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); else { clif_skill_nodamage(src,bl,skill_id,skill_lv,1); map_foreachinallrange(skill_area_sub, bl,skill_get_splash(skill_id, skill_lv),BL_CHAR,src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1,skill_castend_nodamage_id); @@ -6075,6 +6028,16 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } break; + case WM_REVERBERATION: + if (flag & 1) + skill_attack(skill_get_type(WM_REVERBERATION_MAGIC), src, src, bl, WM_REVERBERATION_MAGIC, skill_lv, tick, flag); + else { + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); + battle_consume_ammo(sd, skill_id, skill_lv); // Consume here since Magic/Misc attacks reset arrow_atk + } + break; + case SO_POISON_BUSTER: if( tsc && tsc->data[SC_POISON] ) { skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); @@ -10713,25 +10676,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( !status_isdead(bl) ) break; - if( rnd()%100 < 88 + 2 * skill_lv ) { - int heal = tstatus->sp; - if( heal <= 0 ) - heal = 1; - tstatus->hp = heal; - tstatus->sp -= tstatus->sp * ( 60 - 10 * skill_lv ) / 100; - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); - pc_revive((TBL_PC*)bl,heal,0); - clif_resurrection(bl,1); - } - } - break; + int heal = tstatus->sp; - case WM_SIRCLEOFNATURE: - if( flag&1 ) - sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); - else { - map_foreachinallrange(skill_area_sub,src,skill_get_splash(skill_id,skill_lv),BL_PC,src,skill_id,skill_lv,tick,flag|BCT_ALL|1,skill_castend_nodamage_id); + if( heal <= 0 ) + heal = 1; + tstatus->hp = heal; + tstatus->sp -= tstatus->sp * ( 60 - 10 * skill_lv ) / 100; clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + pc_revive((TBL_PC*)bl,heal,0); + clif_resurrection(bl,1); } break; @@ -10752,7 +10705,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( dstsd && ( pc_checkskill(dstsd,KN_BRANDISHSPEAR) || pc_checkskill(dstsd,LK_SPIRALPIERCE) || pc_checkskill(dstsd,CR_SHIELDCHARGE) || pc_checkskill(dstsd,CR_SHIELDBOOMERANG) || pc_checkskill(dstsd,PA_SHIELDCHAIN) || pc_checkskill(dstsd,LG_SHIELDPRESS) ) ) - { + { // !TODO: Which skills aren't boosted anymore? sc_start(src,bl,SC_GLOOMYDAY_SK,100,skill_lv,skill_get_time(skill_id,skill_lv)); break; } @@ -10760,31 +10713,17 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case WM_SATURDAY_NIGHT_FEVER: - if( flag&1 ) { // Affect to all targets arround the caster and caster too. - if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC__SHADOWFORM])) - break; - sc_start(src,bl, type, 100, skill_lv,skill_get_time(skill_id, skill_lv)); - } else if( flag&2 ) { - if( src->id != bl->id && battle_check_target(src,bl,BCT_ENEMY) > 0 ) - status_fix_damage(src,bl,9999,clif_damage(src,bl,tick,0,0,9999,0,DMG_NORMAL,0,false),skill_id); - } else if( sd ) { - short chance = sstatus->int_/6 + sd->status.job_level/5 + skill_lv*4; - if( !sd->status.party_id || (rnd()%100 > chance)) { - clif_skill_fail(sd,skill_id,USESKILL_FAIL_NEED_HELPER,0); - break; + if( flag&1 ) { + sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); + } else if (sd) { + if( rnd()%100 < sstatus->int_ / 6 + sd->status.job_level / 5 + skill_lv * 4 + pc_checkskill(sd, WM_LESSON) ) { // !TODO: What's the Lesson bonus? + map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); } - if( map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id,skill_lv), - BL_PC, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count) > 7 ) - flag |= 2; - else - flag |= 1; - map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|BCT_SELF, skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, - sc_start(src,src,SC_STOP,100,skill_lv,skill_get_time2(skill_id,skill_lv))); - if( flag&2 ) // Dealed here to prevent conflicts - status_fix_damage(src,bl,9999,clif_damage(src,bl,tick,0,0,9999,0,DMG_NORMAL,0,false),skill_id); } break; + + case WM_SIRCLEOFNATURE: case WM_SONG_OF_MANA: case WM_DANCE_WITH_WUG: case WM_LERADS_DEW: @@ -10792,87 +10731,58 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( flag&1 ) { // These affect to to all party members near the caster. struct status_change *sc = status_get_sc(src); if( sc && sc->data[type] ) { - sc_start2(src,bl,type,100,skill_lv,battle_calc_chorusbonus(sd),skill_get_time(skill_id,skill_lv)); + sc_start2(src,bl,type,100,skill_lv,pc_checkskill(sd, WM_LESSON),skill_get_time(skill_id,skill_lv)); } } else if( sd ) { - if( sc_start2(src,bl,type,100,skill_lv,battle_calc_chorusbonus(sd),skill_get_time(skill_id,skill_lv)) ) + if( sc_start2(src,bl,type,100,skill_lv,pc_checkskill(sd, WM_LESSON),skill_get_time(skill_id,skill_lv)) ) party_foreachsamemap(skill_area_sub,sd,skill_get_splash(skill_id,skill_lv),src,skill_id,skill_lv,tick,flag|BCT_PARTY|1,skill_castend_nodamage_id); clif_skill_nodamage(src,bl,skill_id,skill_lv,1); } break; case WM_MELODYOFSINK: - case WM_BEYOND_OF_WARCRY: if( flag&1 ) { - sc_start2(src,bl,type,100,skill_lv,battle_calc_chorusbonus(sd),skill_get_time(skill_id,skill_lv)); - } else { // These affect to all targets arround the caster. - if( rnd()%100 < 15 + 5 * skill_lv * 5 * battle_calc_chorusbonus(sd) ) { + sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); + } else { // These affect to all targets around the caster. + if( rnd()%100 < 5 + 5 * skill_lv + pc_checkskill(sd, WM_LESSON) ) { // !TODO: What's the Lesson bonus? map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); clif_skill_nodamage(src,bl,skill_id,skill_lv,1); } } break; - case WM_RANDOMIZESPELL: - if (improvised_song_db.empty()) { - clif_skill_nodamage (src, bl, skill_id, skill_lv, 1); - break; + case WM_BEYOND_OF_WARCRY: + if( flag&1 ) { + sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); + } else { // These affect to all targets around the caster. + if( rnd()%100 < 12 + 3 * skill_lv + (sd ? pc_checkskill(sd, WM_LESSON) : 0) ) { // !TODO: What's the Lesson bonus? + map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + } } - else { - int improv_skill_id = 0, improv_skill_lv, checked = 0, checked_max = improvised_song_db.size() * 3; + break; - do { - auto improvise_spell = improvised_song_db.random(); + case WM_SOUND_OF_DESTRUCTION: + if (flag&1) { + sc_start(src, bl, type, 100, skill_lv, (sd ? pc_checkskill(sd, WM_LESSON) * 500 : 0) + skill_get_time(skill_id, skill_lv)); // !TODO: Confirm Lesson increase + } else { + map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); + } + break; - improv_skill_id = improvise_spell->skill_id; + case WM_RANDOMIZESPELL: + if (rnd() % 100 < 30 + (10 * skill_lv)) { + status_change_end(bl, SC_SONGOFMANA, INVALID_TIMER); + status_change_end(bl, SC_DANCEWITHWUG, INVALID_TIMER); + status_change_end(bl, SC_LERADSDEW, INVALID_TIMER); + status_change_end(bl, SC_SATURDAYNIGHTFEVER, INVALID_TIMER); + status_change_end(bl, SC_BEYONDOFWARCRY, INVALID_TIMER); + status_change_end(bl, SC_MELODYOFSINK, INVALID_TIMER); + status_change_end(bl, SC_BEYONDOFWARCRY, INVALID_TIMER); + status_change_end(bl, SC_UNLIMITEDHUMMINGVOICE, INVALID_TIMER); - if( rnd() % 10000 >= improvise_spell->per ){ - break; - } - } while (checked++ < checked_max); - - if (!skill_get_index(improv_skill_id)) { - if (sd) - clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); - break; - } - - improv_skill_lv = min(4 + skill_lv, skill_get_max(improv_skill_id)); - clif_skill_nodamage (src, bl, skill_id, skill_lv, 1); - - if( sd ) { - sd->state.abra_flag = 2; - sd->skillitem = improv_skill_id; - sd->skillitemlv = improv_skill_lv; - sd->skillitem_keep_requirement = false; - clif_item_skill(sd, improv_skill_id, improv_skill_lv); - } else { - struct unit_data *ud = unit_bl2ud(src); - int inf = skill_get_inf(improv_skill_id); - if (!ud) break; - if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { - if (src->type == BL_PET) - bl = (struct block_list*)((TBL_PET*)src)->master; - if (!bl) bl = src; - unit_skilluse_id(src, bl->id, improv_skill_id, improv_skill_lv); - } else { - int target_id = 0; - if (ud->target) - target_id = ud->target; - else switch (src->type) { - case BL_MOB: target_id = ((TBL_MOB*)src)->target_id; break; - case BL_PET: target_id = ((TBL_PET*)src)->target_id; break; - } - if (!target_id) - break; - if (skill_get_casttype(improv_skill_id) == CAST_GROUND) { - bl = map_id2bl(target_id); - if (!bl) bl = src; - unit_skilluse_pos(src, bl->x, bl->y, improv_skill_id, improv_skill_lv); - } else - unit_skilluse_id(src, target_id, improv_skill_id, improv_skill_lv); - } - } + clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); } break; @@ -10976,7 +10886,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src, bl, type, rate, skill_lv, duration); } else { clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ALL|BCT_WOS|1, skill_castend_nodamage_id); + map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); } break; @@ -12099,7 +12009,7 @@ TIMER_FUNC(skill_castend_id){ #endif } - if (sd && ud->skill_id != SA_ABRACADABRA && ud->skill_id != WM_RANDOMIZESPELL) // they just set the data so leave it as it is.[Inkfish] + if (sd && ud->skill_id != SA_ABRACADABRA) // they just set the data so leave it as it is.[Inkfish] sd->skillitem = sd->skillitemlv = sd->skillitem_keep_requirement = 0; if (ud->skilltimer == INVALID_TIMER) { @@ -12487,7 +12397,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case SC_CHAOSPANIC: case SC_MAELSTROM: case SC_BLOODYLUST: - case WM_REVERBERATION: case WM_POEMOFNETHERWORLD: case SO_PSYCHIC_WAVE: case SO_VACUUM_EXTREME: @@ -12964,7 +12873,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui break; case WM_GREAT_ECHO: - case WM_SOUND_OF_DESTRUCTION: i = skill_get_splash(skill_id,skill_lv); map_foreachinarea(skill_area_sub,src->m,x-i,y-i,x+i,y+i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); break; @@ -13863,7 +13771,6 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_ unit_val2 = 0; break; case NPC_REVERBERATION: - case WM_REVERBERATION: unit_val1 = 1 + skill_lv; break; case WM_POEMOFNETHERWORLD: @@ -15424,9 +15331,10 @@ int skill_check_pc_partner(struct map_session_data *sd, uint16 skill_id, uint16 struct map_session_data* tsd; switch (skill_id) { case PR_BENEDICTIO: + case WM_GREAT_ECHO: for (i = 0; i < c; i++) { if ((tsd = map_id2sd(p_sd[i])) != NULL) - status_charge(&tsd->bl, 0, 10); + status_charge(&tsd->bl, 0, (skill_id == PR_BENEDICTIO) ? 10 : skill_get_sp(skill_id, *skill_lv) / 2); } return c; case AB_ADORAMUS: @@ -15456,7 +15364,7 @@ int skill_check_pc_partner(struct map_session_data *sd, uint16 skill_id, uint16 memset (p_sd, 0, sizeof(p_sd)); i = map_foreachinallrange(skill_check_condition_char_sub, &sd->bl, range, BL_PC, &sd->bl, &c, &p_sd, skill_id); - if ( skill_id != PR_BENEDICTIO && skill_id != AB_ADORAMUS && skill_id != WL_COMET ) //Apply the average lv to encore skills. + if ( skill_id != PR_BENEDICTIO && skill_id != AB_ADORAMUS && skill_id != WL_COMET && skill_id != WM_GREAT_ECHO ) //Apply the average lv to encore skills. *skill_lv = (i+(*skill_lv))/(c+1); //I know c should be one, but this shows how it could be used for the average of n partners. return c; } @@ -15680,7 +15588,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i sd->state.arrow_atk = require.ammo?1:0; // perform skill-group checks - if(inf2[INF2_ISCHORUS]) { + if(skill_id != WM_GREAT_ECHO && inf2[INF2_ISCHORUS]) { if (skill_check_pc_partner(sd, skill_id, &skill_lv, AREA_SIZE, 0) < 1) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; @@ -16247,13 +16155,10 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case WM_GREAT_ECHO: { - int count; - count = skill_check_pc_partner(sd, skill_id, &skill_lv, AREA_SIZE, 0); - if( count < 1 ) { - clif_skill_fail(sd,skill_id,USESKILL_FAIL_NEED_HELPER,0); - return false; - } else - require.sp -= require.sp * 20 * count / 100; // -20% each W/M in the party. + int count = skill_check_pc_partner(sd, skill_id, &skill_lv, AREA_SIZE, 1); + + if (count > 0) + require.sp -= require.sp * 20 * count / 100; // -20% each W/M in the party. } break; case SO_FIREWALK: @@ -16981,8 +16886,6 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint if( sc ) { if( sc->data[SC__LAZINESS] ) req.sp += req.sp + sc->data[SC__LAZINESS]->val1 * 10; - if (sc->data[SC_UNLIMITEDHUMMINGVOICE]) - req.sp += req.sp * sc->data[SC_UNLIMITEDHUMMINGVOICE]->val3 / 100; if( sc->data[SC_RECOGNIZEDSPELL] ) req.sp += req.sp / 4; if( sc->data[SC_OFFERTORIUM]) @@ -16995,6 +16898,8 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_SPCONSUM) req.sp -= req.sp * 30 / 100; #endif + if (sc->data[SC_GLOOMYDAY]) + req.sp += req.sp * (skill_lv * 10) / 100; } req.zeny = skill->require.zeny[skill_lv-1]; @@ -17472,6 +17377,8 @@ int skill_vfcastfix(struct block_list *bl, double time, uint16 skill_id, uint16 fixcast_r = max(fixcast_r, sc->data[SC_HEAT_BARREL]->val2); if (sc->data[SC_FREEZING]) fixcast_r -= 50; + if (sc->data[SC_SWINGDANCE]) + fixcast_r = max(fixcast_r, skill_lv * 6); // Additive Fixed CastTime values if (sc->data[SC_MANDRAGORA]) fixed += sc->data[SC_MANDRAGORA]->val1 * 500; @@ -17479,6 +17386,8 @@ int skill_vfcastfix(struct block_list *bl, double time, uint16 skill_id, uint16 fixed -= 1000; if (sc->data[SC_IZAYOI]) fixed = 0; + if (sc->data[SC_GLOOMYDAY]) + fixed += skill_lv * 500; } if (sc && sc->data[SC_SECRAMENT] && skill_id == HW_MAGICPOWER && (flag&2)) // Sacrament lowers Mystical Amplification cast time fixcast_r = max(fixcast_r, sc->data[SC_SECRAMENT]->val2); @@ -17510,7 +17419,7 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv) nullpo_ret(bl); sd = BL_CAST(BL_PC, bl); - if (skill_id == SA_ABRACADABRA || skill_id == WM_RANDOMIZESPELL) + if (skill_id == SA_ABRACADABRA) return 0; //Will use picked skill's delay. if (bl->type&battle_config.no_skill_delay) @@ -18460,12 +18369,7 @@ static int skill_trap_splash(struct block_list *bl, va_list ap) } break; case UNT_REVERBERATION: // For proper skill delay animation when used with Dominion Impulse - if (ss->type != BL_PC) - skill_addtimerskill(ss, tick + 50, bl->id, 0, 0, NPC_REVERBERATION_ATK, sg->skill_lv, BF_WEAPON, 0); - else { - skill_addtimerskill(ss, tick + status_get_amotion(ss), bl->id, 0, 0, WM_REVERBERATION_MELEE, sg->skill_lv, BF_WEAPON, 0); - skill_addtimerskill(ss, tick + status_get_amotion(ss) * 2, bl->id, 0, 0, WM_REVERBERATION_MAGIC, sg->skill_lv, BF_MAGIC, 0); - } + skill_addtimerskill(ss, tick + 50, bl->id, 0, 0, NPC_REVERBERATION_ATK, sg->skill_lv, BF_WEAPON, 0); break; case UNT_FIRINGTRAP: case UNT_ICEBOUNDTRAP: @@ -22804,60 +22708,6 @@ std::shared_ptr ReadingSpellbookDatabase::findBook(int32 n return nullptr; } - -const std::string ImprovisedSongDatabase::getDefaultLocation() { - return std::string(db_path) + "/improvise_db.yml"; -} - -/** -* Reads and parses an entry from the improvise_db. -* @param node: YAML node containing the entry. -* @return count of successfully parsed rows -*/ -uint64 ImprovisedSongDatabase::parseBodyNode(const YAML::Node &node) { - std::string skill_name; - - if (!this->asString(node, "Skill", skill_name)) - return 0; - - uint16 skill_id = skill_name2id(skill_name.c_str()); - - if (!skill_id) { - this->invalidWarning(node["Skill"], "Invalid Improvised Song skill name \"%s\", skipping.\n", skill_name.c_str()); - return 0; - } - - if (!skill_get_inf(skill_id)) { - this->invalidWarning(node["Skill"], "Passive skill %s cannot be casted by Improvised Song.\n", skill_name.c_str()); - return 0; - } - - std::shared_ptr improvise = this->find(skill_id); - bool exists = improvise != nullptr; - - if (!exists) { - if (!this->nodesExist(node, { "Probability" })) - return 0; - - improvise = std::make_shared(); - improvise->skill_id = skill_id; - } - - if (this->nodeExists(node, "Probability")) { - uint16 probability; - - if (!this->asUInt16Rate(node, "Probability", probability)) - return 0; - - improvise->per = probability; - } - - if (!exists) - this->put(skill_id, improvise); - - return 1; -} - const std::string MagicMushroomDatabase::getDefaultLocation() { return std::string(db_path) + "/magicmushroom_db.yml"; } @@ -23247,7 +23097,6 @@ static void skill_readdb(void) } abra_db.load(); - improvised_song_db.load(); magic_mushroom_db.load(); reading_spellbook_db.load(); diff --git a/src/map/skill.hpp b/src/map/skill.hpp index c13854c3c2..451697b659 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -101,7 +101,6 @@ enum e_skill_inf2 : uint8 { INF2_ALLOWONMADO, // Skill that can be used while on Madogear INF2_TARGETMANHOLE, // Skill that can be used to target while under SC__MANHOLE effect INF2_TARGETHIDDEN, // Skill that affects hidden targets - INF2_INCREASEGLOOMYDAYDAMAGE, // Skill that affects SC_GLOOMYDAY_SK INF2_INCREASEDANCEWITHWUGDAMAGE, // Skill that is affected by SC_DANCEWITHWUG INF2_IGNOREWUGBITE, // Skill blocked by RA_WUGBITE INF2_IGNOREAUTOGUARD , // Skill is not blocked by SC_AUTOGUARD (physical-skill only) @@ -1693,9 +1692,9 @@ enum e_skill { WM_LESSON = 2412, WM_METALICSOUND, WM_REVERBERATION, - WM_REVERBERATION_MELEE, + WM_REVERBERATION_MELEE, // Removed on kRO WM_REVERBERATION_MAGIC, - WM_DOMINION_IMPULSE, + WM_DOMINION_IMPULSE, // Removed on kRO WM_SEVERE_RAINSTORM, WM_POEMOFNETHERWORLD, WM_VOICEOFSIREN, diff --git a/src/map/status.cpp b/src/map/status.cpp index acadfaa983..551d6ec58e 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -927,20 +927,21 @@ void initChangeTables(void) set_sc( WA_SWING_DANCE , SC_SWINGDANCE , EFST_SWING, SCB_SPEED|SCB_ASPD ); set_sc( WA_SYMPHONY_OF_LOVER , SC_SYMPHONYOFLOVER , EFST_SYMPHONY_LOVE, SCB_MDEF ); set_sc( WA_MOONLIT_SERENADE , SC_MOONLITSERENADE , EFST_MOONLIT_SERENADE, SCB_MATK ); - set_sc( MI_RUSH_WINDMILL , SC_RUSHWINDMILL , EFST_RUSH_WINDMILL, SCB_WATK ); + set_sc( MI_RUSH_WINDMILL , SC_RUSHWINDMILL , EFST_RUSH_WINDMILL, SCB_WATK|SCB_SPEED ); set_sc( MI_ECHOSONG , SC_ECHOSONG , EFST_ECHOSONG , SCB_DEF ); set_sc( MI_HARMONIZE , SC_HARMONIZE , EFST_HARMONIZE , SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK ); set_sc_with_vfx( WM_POEMOFNETHERWORLD , SC_NETHERWORLD , EFST_NETHERWORLD , SCB_NONE ); set_sc_with_vfx( WM_VOICEOFSIREN , SC_VOICEOFSIREN , EFST_SIREN, SCB_NONE ); set_sc_with_vfx( WM_LULLABY_DEEPSLEEP , SC_DEEPSLEEP , EFST_HANDICAPSTATE_DEEP_SLEEP, SCB_NONE ); - set_sc( WM_SIRCLEOFNATURE , SC_SIRCLEOFNATURE , EFST_SIRCLEOFNATURE , SCB_NONE ); + set_sc( WM_SIRCLEOFNATURE , SC_SIRCLEOFNATURE , EFST_SIRCLEOFNATURE , SCB_REGEN ); set_sc( WM_GLOOMYDAY , SC_GLOOMYDAY , EFST_GLOOMYDAY , SCB_FLEE|SCB_SPEED|SCB_ASPD ); - set_sc( WM_SONG_OF_MANA , SC_SONGOFMANA , EFST_SONG_OF_MANA, SCB_NONE ); + set_sc( WM_SONG_OF_MANA , SC_SONGOFMANA , EFST_SONG_OF_MANA, SCB_REGEN ); set_sc( WM_DANCE_WITH_WUG , SC_DANCEWITHWUG , EFST_DANCE_WITH_WUG, SCB_ASPD ); - set_sc( WM_SATURDAY_NIGHT_FEVER , SC_SATURDAYNIGHTFEVER , EFST_SATURDAY_NIGHT_FEVER, SCB_BATK|SCB_DEF|SCB_FLEE|SCB_REGEN ); + set_sc( WM_SOUND_OF_DESTRUCTION , SC_SOUNDOFDESTRUCTION , EFST_SOUND_OF_DESTRUCTION, SCB_NONE ); + set_sc( WM_SATURDAY_NIGHT_FEVER , SC_SATURDAYNIGHTFEVER , EFST_SATURDAY_NIGHT_FEVER, SCB_HIT|SCB_FLEE|SCB_REGEN ); set_sc( WM_LERADS_DEW , SC_LERADSDEW , EFST_LERADS_DEW, SCB_MAXHP ); - set_sc( WM_MELODYOFSINK , SC_MELODYOFSINK , EFST_MELODYOFSINK , SCB_INT ); - set_sc( WM_BEYOND_OF_WARCRY , SC_BEYONDOFWARCRY , EFST_BEYOND_OF_WARCRY, SCB_STR|SCB_CRI|SCB_MAXHP ); + set_sc( WM_MELODYOFSINK , SC_MELODYOFSINK , EFST_MELODYOFSINK , SCB_INT|SCB_MAXSP ); + set_sc( WM_BEYOND_OF_WARCRY , SC_BEYONDOFWARCRY , EFST_BEYOND_OF_WARCRY, SCB_STR|SCB_MAXHP ); set_sc( WM_UNLIMITED_HUMMING_VOICE , SC_UNLIMITEDHUMMINGVOICE , EFST_UNLIMITED_HUMMING_VOICE, SCB_NONE ); set_sc( WM_FRIGG_SONG , SC_FRIGG_SONG , EFST_FRIGG_SONG , SCB_MAXHP ); @@ -1560,6 +1561,8 @@ void initChangeTables(void) StatusIconChangeTable[SC_USE_SKILL_SP_SPA] = EFST_USE_SKILL_SP_SPA; StatusIconChangeTable[SC_USE_SKILL_SP_SHA] = EFST_USE_SKILL_SP_SHA; + StatusChangeFlagTable[SC_ANCILLA] |= SCB_REGEN; + #ifdef RENEWAL // renewal EDP increases your weapon atk StatusChangeFlagTable[SC_EDP] |= SCB_WATK; @@ -3337,8 +3340,6 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += sc->data[SC_INCMHP]->val1; if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 2) bonus += 500; - if(sc->data[SC_LERADSDEW]) - bonus += sc->data[SC_LERADSDEW]->val3; if (sc->data[SC_PROMOTE_HEALTH_RESERCH]) bonus += sc->data[SC_PROMOTE_HEALTH_RESERCH]->val3; if(sc->data[SC_INSPIRATION]) @@ -3384,6 +3385,8 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += sc->data[SC_EPICLESIS]->val2; if(sc->data[SC_FRIGG_SONG]) bonus += sc->data[SC_FRIGG_SONG]->val2; + if(sc->data[SC_LERADSDEW]) + bonus += sc->data[SC_LERADSDEW]->val3; if(sc->data[SC_FORCEOFVANGUARD]) bonus += (3 * sc->data[SC_FORCEOFVANGUARD]->val1); if(sc->data[SC_INSPIRATION]) @@ -3415,7 +3418,7 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { if(sc->data[SC_VENOMBLEED]) bonus -= 15; if(sc->data[SC_BEYONDOFWARCRY]) - bonus -= sc->data[SC_BEYONDOFWARCRY]->val4; + bonus -= sc->data[SC_BEYONDOFWARCRY]->val3; if(sc->data[SC__WEAKNESS]) bonus -= sc->data[SC__WEAKNESS]->val2; if(sc->data[SC_EQC]) @@ -3542,6 +3545,7 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { //Bonus by SC if (sc) { + //Increasing if(sc->data[SC_INCMSPRATE]) bonus += sc->data[SC_INCMSPRATE]->val1; if(sc->data[SC_RAISINGDRAGON]) @@ -3550,6 +3554,10 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { bonus += sc->data[SC_SERVICE4U]->val2; if(sc->data[SC_MERC_SPUP]) bonus += sc->data[SC_MERC_SPUP]->val2; + + //Decreasing + if (sc->data[SC_MELODYOFSINK]) + bonus -= sc->data[SC_MELODYOFSINK]->val3; } // Max rate reduce is -100% bonus = cap_value(bonus,-100,INT_MAX); @@ -4670,6 +4678,10 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) if (sc->data[SC_FORTUNE]) sd->bonus.crit_atk_rate += 2 * sc->data[SC_FORTUNE]->val1; #endif + if (sc->data[SC_SYMPHONYOFLOVER]) { + sd->subele[ELE_GHOST] += sc->data[SC_SYMPHONYOFLOVER]->val1 * 3; + sd->subele[ELE_HOLY] += sc->data[SC_SYMPHONYOFLOVER]->val1 * 3; + } } status_cpy(&sd->battle_status, base_status); @@ -5180,6 +5192,10 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str regen->rate.sp += 100; } #endif + if (sc->data[SC_SIRCLEOFNATURE]) + regen->rate.hp += sc->data[SC_SIRCLEOFNATURE]->val2; + if (sc->data[SC_SONGOFMANA]) + regen->rate.sp += sc->data[SC_SONGOFMANA]->val3; } /** @@ -5992,7 +6008,7 @@ static unsigned short status_calc_str(struct block_list *bl, struct status_chang if(sc->data[SC_GIANTGROWTH]) str += 30; if(sc->data[SC_BEYONDOFWARCRY]) - str -= sc->data[SC_BEYONDOFWARCRY]->val3; + str -= sc->data[SC_BEYONDOFWARCRY]->val2; if(sc->data[SC_SAVAGE_STEAK]) str += sc->data[SC_SAVAGE_STEAK]->val1; if(sc->data[SC_INSPIRATION]) @@ -6226,7 +6242,7 @@ static unsigned short status_calc_int(struct block_list *bl, struct status_chang if(sc->data[SC_INSPIRATION]) int_ += sc->data[SC_INSPIRATION]->val3; if(sc->data[SC_MELODYOFSINK]) - int_ -= sc->data[SC_MELODYOFSINK]->val3; + int_ -= sc->data[SC_MELODYOFSINK]->val2; if(sc->data[SC_MANDRAGORA]) int_ -= 4 * sc->data[SC_MANDRAGORA]->val1; if(sc->data[SC_COCKTAIL_WARG_BLOOD]) @@ -6473,8 +6489,6 @@ static unsigned short status_calc_batk(struct block_list *bl, struct status_chan batk += batk * sc->data[SC_FLEET]->val3/100; if(sc->data[SC__ENERVATION]) batk -= batk * sc->data[SC__ENERVATION]->val2 / 100; - if(sc->data[SC_SATURDAYNIGHTFEVER]) - batk += 100 * sc->data[SC_SATURDAYNIGHTFEVER]->val1; if( sc->data[SC_ZANGETSU] ) batk += sc->data[SC_ZANGETSU]->val2; if(sc->data[SC_QUEST_BUFF1]) @@ -6765,10 +6779,10 @@ static signed short status_calc_critical(struct block_list *bl, struct status_ch critical += sc->data[SC__INVISIBILITY]->val3 * 10; if (sc->data[SC__UNLUCKY]) critical -= sc->data[SC__UNLUCKY]->val2; - if(sc->data[SC_BEYONDOFWARCRY]) - critical += sc->data[SC_BEYONDOFWARCRY]->val3; if (sc->data[SC_SOULSHADOW]) critical += 10 * sc->data[SC_SOULSHADOW]->val3; + if(sc->data[SC_BEYONDOFWARCRY]) + critical += sc->data[SC_BEYONDOFWARCRY]->val3; return (short)cap_value(critical,10,SHRT_MAX); } @@ -6835,6 +6849,8 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change #endif if (sc->data[SC_SOULFALCON]) hit += sc->data[SC_SOULFALCON]->val3; + if (sc->data[SC_SATURDAYNIGHTFEVER]) + hit -= 50 + 50 * sc->data[SC_SATURDAYNIGHTFEVER]->val1; return (short)cap_value(hit,1,SHRT_MAX); } @@ -6924,7 +6940,7 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change if( sc->data[SC_GLOOMYDAY] ) flee -= flee * sc->data[SC_GLOOMYDAY]->val2 / 100; if( sc->data[SC_SATURDAYNIGHTFEVER] ) - flee -= flee * (40 + 10 * sc->data[SC_SATURDAYNIGHTFEVER]->val1) / 100; + flee -= 20 + 30 * sc->data[SC_SATURDAYNIGHTFEVER]->val1; if( sc->data[SC_WIND_STEP_OPTION] ) flee += flee * sc->data[SC_WIND_STEP_OPTION]->val2 / 100; if( sc->data[SC_TINDER_BREAKER] || sc->data[SC_TINDER_BREAKER2] ) @@ -7052,9 +7068,7 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc, if( sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 1 ) def += (5 + sc->data[SC_BANDING]->val1) * sc->data[SC_BANDING]->val2 / 10; if( sc->data[SC_ECHOSONG] ) - def += def * sc->data[SC_ECHOSONG]->val3 / 100; - if( sc->data[SC_SATURDAYNIGHTFEVER] ) - def -= def * (10 + 10 * sc->data[SC_SATURDAYNIGHTFEVER]->val1) / 100; + def += sc->data[SC_ECHOSONG]->val3; if( sc->data[SC_EARTHDRIVE] ) def -= def * 25 / 100; if( sc->data[SC_CAMOUFLAGE] ) @@ -7409,6 +7423,8 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha val = max(val, sc->data[SC_ARCLOUSEDASH]->val3); if( sc->data[SC_DORAM_WALKSPEED] ) val = max(val, sc->data[SC_DORAM_WALKSPEED]->val1); + if (sc->data[SC_RUSHWINDMILL]) + val = max(val, 25); // !TODO: Confirm bonus movement speed // !FIXME: official items use a single bonus for this [ultramage] if( sc->data[SC_SPEEDUP0] ) // Temporary item-based speedup @@ -11325,17 +11341,17 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty tick_time = 1000; // [GodLesZ] tick time break; case SC_SWINGDANCE: - val3 = 5 * val1 + val2; // Walk speed and aspd reduction. + val3 = 3 * val1 + val2; // Walk speed and aspd reduction. break; case SC_SYMPHONYOFLOVER: - val3 = 12 * val1 + val2 + (sd?sd->status.job_level:50) / 4; // MDEF Increase in % + val3 = 2 * val1 + val2 + (sd?sd->status.job_level:50) / 4; // MDEF Increase break; case SC_MOONLITSERENADE: // MATK Increase case SC_RUSHWINDMILL: // ATK Increase - val3 = 6 * val1 + val2 + (sd?sd->status.job_level:50) / 5; + val3 = 4 + val1 * 3 + val2 + (sd?sd->status.job_level:50) / 5; break; case SC_ECHOSONG: - val3 = 6 * val1 + val2 + (sd?sd->status.job_level:50) / 4; // DEF Increase in % + val3 = 6 * val1 + val2 + (sd?sd->status.job_level:50) / 4; // DEF Increase break; case SC_HARMONIZE: val2 = 5 + 5 * val1; @@ -11349,15 +11365,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty tick_time = 2000; // [GodLesZ] tick time break; case SC_SIRCLEOFNATURE: - val2 = 40 * val1; // HP recovery - val3 = 4 * val1; // SP consume - val4 = tick / 1000; - tick_time = 1000; // [GodLesZ] tick time + val2 = 50 * val1; // HP recovery rate break; case SC_SONGOFMANA: - val3 = 10 + min(5 * val2, 35); - val4 = tick/5000; - tick_time = 5000; // [GodLesZ] tick time + status_heal(bl, 0, status->max_sp * (val1 <= 2 ? 10 : val1 <= 4 ? 15 : 20) / 100, 1); + val3 = 50 * val1; break; case SC_SATURDAYNIGHTFEVER: if (!val4) val4 = skill_get_time2(status_sc2skill(type),val1); @@ -11387,28 +11399,22 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty } break; case SC_DANCEWITHWUG: - val3 = 5 + 5 * val2; // ASPD Increase - val4 = 20 + 10 * val2; // Fixed Cast Time Reduction + val3 = 5 * val1; // ASPD Increase + val4 = 20 + 10 * val1; // Fixed Cast Time Reduction break; case SC_LERADSDEW: - val3 = 200 * val1 + min(300 * val2, 2500); // MaxHP Increase + val3 = 2 + 3 * val1 + min(3 * val2, 25); // MaxHP Increase break; case SC_MELODYOFSINK: - val3 = val1 * val2; // INT Reduction. - val4 = tick/1000; - tick_time = 1000; + val2 = 10 * val1; // INT Reduction. + val3 = 2 + 2 * val1; // MaxSP reduction break; case SC_BEYONDOFWARCRY: - val3 = val1 * val2; // STR and CRIT Reduction - val4 = 4 * val1 + min(4 * (val2 - 2), 40); // MaxHP Reduction + val2 = 10 + 10 * val1; // STR Reduction + val3 = 4 * val1; // MaxHP Reduction break; case SC_UNLIMITEDHUMMINGVOICE: - { - struct unit_data *ud = unit_bl2ud(bl); - if( ud == NULL ) return 0; - ud->state.skillcastcancel = 0; - val3 = 15 - min(3 * val2, 15); - } + val3 = 4 * val1 + min(3 * val2, 15); // !TODO: What's the Lesson bonus? break; case SC_REFLECTDAMAGE: val2 = 15 + 5 * val1; // Reflect amount @@ -14268,25 +14274,6 @@ TIMER_FUNC(status_change_timer){ } break; - case SC_SIRCLEOFNATURE: - if( --(sce->val4) >= 0 ) { - if( !status_charge(bl,0,sce->val3) ) - break; - status_heal(bl, sce->val2, 0, 1); - sc_timer_next(1000 + tick); - return 0; - } - break; - - case SC_SONGOFMANA: - if( --(sce->val4) >= 0 ) { - status_heal(bl,0,sce->val3,3); - sc_timer_next(5000 + tick); - return 0; - } - break; - - case SC_SATURDAYNIGHTFEVER: // 1% HP/SP drain every val4 seconds [Jobbie] if( --(sce->val3) >= 0 ) { @@ -14297,14 +14284,6 @@ TIMER_FUNC(status_change_timer){ } break; - case SC_MELODYOFSINK: - if( --(sce->val4) >= 0 ) { - status_charge(bl, 0, status->max_sp * ( 2 * sce->val1 + 2 * sce->val2 ) / 100); - sc_timer_next(1000+tick); - return 0; - } - break; - case SC_CRYSTALIZE: if( --(sce->val4) >= 0 ) { // Drains 2% of HP and 1% of SP every seconds. if (!status_charge(bl, status->max_hp * 2 / 100, status->max_sp / 100)) diff --git a/src/map/status.hpp b/src/map/status.hpp index 447316faec..2f53737b4e 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -928,6 +928,7 @@ enum sc_type : int16 { SC_ADD_MATK_DAMAGE, SC_HELPANGEL, + SC_SOUNDOFDESTRUCTION, #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index 93036d99f4..34bef42aa8 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -91,7 +91,6 @@ static bool guild_read_guildskill_tree_db( char* split[], int columns, int curre static bool pet_read_db( const char* file ); static bool skill_parse_row_magicmushroomdb(char* split[], int column, int current); static bool skill_parse_row_abradb(char* split[], int columns, int current); -static bool skill_parse_row_improvisedb(char* split[], int columns, int current); static bool skill_parse_row_spellbookdb(char* split[], int columns, int current); static bool mob_readdb_mobavail(char *str[], int columns, int current); static bool skill_parse_row_requiredb(char* split[], int columns, int current); @@ -325,12 +324,6 @@ int do_init( int argc, char** argv ){ return 0; } - if (!process("IMPROVISED_SONG_DB", 1, root_paths, "skill_improvise_db", [](const std::string& path, const std::string& name_ext) -> bool { - return sv_readdb(path.c_str(), name_ext.c_str(), ',', 2, 2, -1, &skill_parse_row_improvisedb, false); - }, "improvise_db")) { - return 0; - } - if (!process("READING_SPELLBOOK_DB", 1, root_paths, "spellbook_db", [](const std::string& path, const std::string& name_ext) -> bool { return sv_readdb(path.c_str(), name_ext.c_str(), ',', 3, 3, -1, &skill_parse_row_spellbookdb, false); })) { @@ -930,25 +923,6 @@ static bool skill_parse_row_abradb(char* split[], int columns, int current) return true; } -// Copied and adjusted from skill.cpp -static bool skill_parse_row_improvisedb(char* split[], int columns, int current) -{ - uint16 skill_id = atoi(split[0]); - std::string *skill_name = util::umap_find(aegis_skillnames, skill_id); - - if (skill_name == nullptr) { - ShowError("Skill name for Improvised Song skill ID %hu is not known.\n", skill_id); - return false; - } - - body << YAML::BeginMap; - body << YAML::Key << "Skill" << YAML::Value << *skill_name; - body << YAML::Key << "Probability" << YAML::Value << atoi(split[1]) / 10; - body << YAML::EndMap; - - return true; -} - // Copied and adjusted from skill.cpp static bool skill_parse_row_spellbookdb(char* split[], int columns, int current) { @@ -1591,8 +1565,6 @@ static bool skill_parse_row_skilldb(char* split[], int columns, int current) { body << YAML::Key << "TargetManHole" << YAML::Value << "true"; if (inf3_val & 0x10000) body << YAML::Key << "TargetHidden" << YAML::Value << "true"; - if (inf3_val & 0x20000) - body << YAML::Key << "IncreaseGloomyDayDamage" << YAML::Value << "true"; if (inf3_val & 0x40000) body << YAML::Key << "IncreaseDanceWithWugDamage" << YAML::Value << "true"; if (inf3_val & 0x80000) From 341d0938024dc818a5e496859b4a811e6fac3ae6 Mon Sep 17 00:00:00 2001 From: aleos Date: Mon, 18 May 2020 10:31:17 -0400 Subject: [PATCH 116/212] Renames SQL Upgrade script --- sql-files/upgrades/{upgrade_2020xxxx.sql => upgrade_20200518.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sql-files/upgrades/{upgrade_2020xxxx.sql => upgrade_20200518.sql} (100%) diff --git a/sql-files/upgrades/upgrade_2020xxxx.sql b/sql-files/upgrades/upgrade_20200518.sql similarity index 100% rename from sql-files/upgrades/upgrade_2020xxxx.sql rename to sql-files/upgrades/upgrade_20200518.sql From a23c84d34514e8fd425a0bffee476b131c2de277 Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 18 May 2020 10:47:21 -0400 Subject: [PATCH 117/212] Job Improvement Project - Guillotine Cross (#4705) * Fixes #4704. * kRO Changelog: http://ro.gnjoy.com/news/update/View.asp?seq=243&curpage=1 Thanks to @Angelic234, @nehpetskie, @ecdarreola, @Haydrich, @Badarosk0, and @LordWhiplash! --- db/re/skill_db.yml | 73 +++++--------------- src/map/battle.cpp | 138 +++++++++++++++++-------------------- src/map/pc.cpp | 2 +- src/map/skill.cpp | 77 ++++++++++++--------- src/map/skill.hpp | 2 +- src/map/status.cpp | 156 ++++++++++++++++++++++++++++++++---------- src/tool/csv2yaml.cpp | 6 +- 7 files changed, 247 insertions(+), 207 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 4c2a2fe18e..778145acee 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -10360,62 +10360,21 @@ Body: Name: ASC_BREAKER Description: Soul Destroyer MaxLevel: 10 - Type: Misc + Type: Weapon TargetType: Attack DamageFlags: - IgnoreAtkCard: true - IgnoreDefense: true - IgnoreFlee: true + Critical: true Range: 9 Hit: Single HitCount: 1 Element: Weapon CastCancel: true CastTime: 250 - AfterCastActDelay: - - Level: 1 - Time: 1000 - - Level: 2 - Time: 1200 - - Level: 3 - Time: 1400 - - Level: 4 - Time: 1600 - - Level: 5 - Time: 1800 - - Level: 6 - Time: 2000 - - Level: 7 - Time: 2200 - - Level: 8 - Time: 2400 - - Level: 9 - Time: 2600 - - Level: 10 - Time: 2800 + AfterCastActDelay: 2000 + Cooldown: 150 FixedCastTime: 250 Requires: - SpCost: - - Level: 1 - Amount: 20 - - Level: 2 - Amount: 20 - - Level: 3 - Amount: 20 - - Level: 4 - Amount: 20 - - Level: 5 - Amount: 20 - - Level: 6 - Amount: 30 - - Level: 7 - Amount: 30 - - Level: 8 - Amount: 30 - - Level: 9 - Amount: 30 - - Level: 10 - Amount: 30 + SpCost: 20 - Id: 380 Name: SN_SIGHT Description: Falcon Eyes @@ -19091,7 +19050,9 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - Range: 3 + DamageFlags: + Critical: true + Range: 7 Hit: Multi_Hit HitCount: -7 Element: Weapon @@ -19109,11 +19070,12 @@ Body: Time: 1000 - Level: 5 Time: 500 + Cooldown: 700 FixedCastTime: -1 CastDelayFlags: IgnoreStatus: true Requires: - SpCost: 25 + SpCost: 40 State: Move_Enable - Id: 2023 Name: GC_DARKILLUSION @@ -19463,13 +19425,13 @@ Body: - Level: 2 Area: 1 - Level: 3 - Area: 1 - - Level: 4 - Area: 1 - - Level: 5 Area: 2 + - Level: 4 + Area: 2 + - Level: 5 + Area: 3 AfterCastActDelay: 200 - Duration1: 3000 + Duration1: 5000 FixedCastTime: -1 Requires: SpCost: 5 @@ -19495,7 +19457,8 @@ Body: Hit: Single HitCount: 1 Element: Weapon - AfterCastActDelay: 1000 + AfterCastActDelay: 500 + Cooldown: 500 FixedCastTime: -1 Requires: SpCost: @@ -31587,7 +31550,7 @@ Body: CopyFlags: Skill: Reproduce: true - Duration1: 5000 + Duration1: 10000 Cooldown: 60000 FixedCastTime: -1 Requires: diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 4691e291bc..b9e3a0e25b 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1342,6 +1342,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (sc->data[SC_SOUNDOFDESTRUCTION]) damage <<= 1; + if (sc->data[SC_DARKCROW] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) + damage += damage * sc->data[SC_DARKCROW]->val2 / 100; // Damage reductions // Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz] @@ -1438,9 +1440,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam damage = i64max(damage, 1); } - if( sc->data[SC_DARKCROW] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT ) - damage += damage * sc->data[SC_DARKCROW]->val2 / 100; - if( (sce=sc->data[SC_MAGMA_FLOW]) && (rnd()%100 <= sce->val2) ) skill_castend_damage_id(bl,src,MH_MAGMA_FLOW,sce->val1,gettick(),0); @@ -1609,10 +1608,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam status_change_end(src,SC_SHIELDSPELL_REF,INVALID_TIMER); } - if( sc->data[SC_POISONINGWEAPON] - && ((flag&BF_WEAPON) && (!skill_id || skill_id == GC_VENOMPRESSURE)) //check skill type poison_smoke is a unit - && (damage > 0 && rnd()%100 < sc->data[SC_POISONINGWEAPON]->val3 )) //did some damage and chance ok (why no additional effect ??) - sc_start2(src,bl,(enum sc_type)sc->data[SC_POISONINGWEAPON]->val2,100,sc->data[SC_POISONINGWEAPON]->val1,sc->data[SC_POISONINGWEAPON]->val4,skill_get_time2(GC_POISONINGWEAPON, 1)); + if (sc->data[SC_POISONINGWEAPON] && flag&BF_SHORT && (skill_id == 0 || skill_id == GC_VENOMPRESSURE) && damage > 0) { + damage += damage * 10 / 100; + if (rnd() % 100 < sc->data[SC_POISONINGWEAPON]->val3) + sc_start4(src, bl, (sc_type)sc->data[SC_POISONINGWEAPON]->val2, 100, sc->data[SC_POISONINGWEAPON]->val1, 0, 1, 0, skill_get_time2(GC_POISONINGWEAPON, 1)); + } if( sc->data[SC__DEADLYINFECT] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->data[SC__DEADLYINFECT]->val1 ) status_change_spread(src, bl, 0); @@ -2237,6 +2237,10 @@ static int battle_range_type(struct block_list *src, struct block_list *target, if (src->type == BL_MOB && (skill_id == AC_SHOWER || skill_id == AM_DEMONSTRATION)) return BF_SHORT; + // Cast range is 7 cells and player jumps to target but skill is considered melee + if (skill_id == GC_CROSSIMPACT) + return BF_SHORT; + //Skill Range Criteria if (battle_config.skillrange_by_distance && (src->type&battle_config.skillrange_by_distance) @@ -2568,6 +2572,12 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct case NJ_KIRIKAGE: cri += 250 + 50*skill_lv; break; +#ifdef RENEWAL + case ASC_BREAKER: +#endif + case GC_CROSSIMPACT: + cri /= 2; + break; } if(tsd && tsd->bonus.critical_def) cri = cri * ( 100 - tsd->bonus.critical_def ) / 100; @@ -2592,13 +2602,12 @@ static int is_attack_piercing(struct Damage* wd, struct block_list *src, struct if(src != NULL) { struct map_session_data *sd = BL_CAST(BL_PC, src); struct status_data *tstatus = status_get_status_data(target); -#ifdef RENEWAL - if( skill_id != PA_SACRIFICE && skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS - && skill_id != PA_SHIELDCHAIN && skill_id != KO_HAPPOKUNAI && skill_id != ASC_BREAKER ) // Renewal: Soul Breaker no longer gains ice pick effect and ice pick effect gets crit benefit [helvetica] -#else - if( skill_id != PA_SACRIFICE && skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS - && skill_id != PA_SHIELDCHAIN && skill_id != KO_HAPPOKUNAI && !is_attack_critical(wd, src, target, skill_id, skill_lv, false) ) + + if( skill_id != PA_SACRIFICE && skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS && skill_id != PA_SHIELDCHAIN && skill_id != KO_HAPPOKUNAI +#ifndef RENEWAL + && !is_attack_critical(wd, src, target, skill_id, skill_lv, false) #endif + ) { //Elemental/Racial adjustments if( sd && (sd->right_weapon.def_ratio_atk_ele & (1<def_ele) || sd->right_weapon.def_ratio_atk_ele & (1<right_weapon.def_ratio_atk_race & (1<race) || sd->right_weapon.def_ratio_atk_race & (1<data[SC_FUSION]) return true; -#ifdef RENEWAL - else if (skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS && skill_id != ASC_BREAKER) // Renewal: Soul Breaker no longer gains ignore DEF from weapon [helvetica] -#else else if (skill_id != CR_GRANDCROSS && skill_id != NPC_GRANDDARKNESS) -#endif { //Ignore Defense? if (sd && (sd->right_weapon.ignore_def_ele & (1<def_ele) || sd->right_weapon.ignore_def_ele & (1<right_weapon.ignore_def_race & (1<race) || sd->right_weapon.ignore_def_race & (1<data[SC_KAGEMUSYA]) max_rate = sc->data[SC_KAGEMUSYA]->val1 * 10; // Same rate as even levels of TF_DOUBLE else +#ifdef RENEWAL + max_rate = max(7 * skill_lv, sd->bonus.double_rate); +#else max_rate = max(5 * skill_lv, sd->bonus.double_rate); +#endif if( rnd()%100 < max_rate ) { wd->div_ = skill_get_num(TF_DOUBLE,skill_lv?skill_lv:1); @@ -3933,12 +3942,15 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * if(sd) skillratio += 20 * pc_checkskill(sd,AS_POISONREACT); break; -#ifndef RENEWAL - // Pre-Renewal: skill ratio for weapon part of damage [helvetica] case ASC_BREAKER: +#ifdef RENEWAL + skillratio += -100 + 140 * skill_lv + sstatus->str + sstatus->int_; // !TODO: Confirm stat modifier + RE_LVL_DMOD(100); +#else + // Pre-Renewal: skill ratio for weapon part of damage [helvetica] skillratio += -100 + 100 * skill_lv; - break; #endif + break; case PA_SACRIFICE: skillratio += -10 + 10 * skill_lv; break; @@ -4128,8 +4140,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(150); // Base level bonus. break; case GC_CROSSIMPACT: - skillratio += 900 + 100 * skill_lv; - RE_LVL_DMOD(120); + skillratio += -100 + 1000 + 150 * skill_lv; + RE_LVL_DMOD(100); break; case GC_COUNTERSLASH: //ATK [{(Skill Level x 150) + 300} x Caster's Base Level / 120]% + ATK [(AGI x 2) + (Caster's Job Level x 4)]% @@ -4143,14 +4155,14 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 200; break; case GC_ROLLINGCUTTER: - skillratio += -50 + 50 * skill_lv; + skillratio += -100 + 50 + 80 * skill_lv; RE_LVL_DMOD(100); break; case GC_CROSSRIPPERSLASHER: - skillratio += 300 + 80 * skill_lv; + skillratio += -100 + 80 * skill_lv + (sstatus->agi * 3); RE_LVL_DMOD(100); if (sc && sc->data[SC_ROLLINGCUTTER]) - skillratio += sc->data[SC_ROLLINGCUTTER]->val1 * status_get_agi(src); + skillratio += sc->data[SC_ROLLINGCUTTER]->val1 * 200; break; case GC_DARKCROW: skillratio += 100 * (skill_lv - 1); @@ -4909,6 +4921,11 @@ static void battle_attack_sc_bonus(struct Damage* wd, struct block_list *src, st RE_ALLATK_ADDRATE(wd, sc->data[SC_GVG_GIANT]->val3); } + if (sc->data[SC_PYREXIA] && sc->data[SC_PYREXIA]->val3 == 0) { + ATK_ADDRATE(wd->damage, wd->damage2, sc->data[SC_PYREXIA]->val2); + RE_ALLATK_ADDRATE(wd, sc->data[SC_PYREXIA]->val2); + } + if (sc->data[SC_MIRACLE]) anger_id = 2; // Always treat all monsters as star flagged monster when in miracle state } @@ -5859,7 +5876,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl #ifdef RENEWAL switch(skill_id) { case NJ_ISSEN: - case ASC_BREAKER: break; //These skills will do a card fix later default: #endif @@ -5938,7 +5954,6 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl #ifdef RENEWAL switch (skill_id) { case NJ_ISSEN: - case ASC_BREAKER: return wd; //These skills will do a GVG fix later default: #endif @@ -6602,13 +6617,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list } } #ifdef RENEWAL - switch(skill_id) { // These skills will do a card fix later - case ASC_BREAKER: - break; - default: - ad.damage += battle_calc_cardfix(BF_MAGIC, src, target, nk, s_ele, 0, ad.damage, 0, ad.flag); - break; - } + ad.damage += battle_calc_cardfix(BF_MAGIC, src, target, nk, s_ele, 0, ad.damage, 0, ad.flag); #endif if(sd) { @@ -6704,7 +6713,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list } } - if (!nk[NK_IGNOREELEMENT] && skill_id != ASC_BREAKER) // Soul Breaker's magic portion is non-elemental. [Secret] + if (!nk[NK_IGNOREELEMENT]) ad.damage = battle_attr_fix(src, target, ad.damage, s_ele, tstatus->def_ele, tstatus->ele_lv); //Apply the physical part of the skill's damage. [Skotlex] @@ -6737,13 +6746,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list //Apply DAMAGE_DIV_FIX and check for min damage battle_apply_div_fix(&ad, skill_id); -#ifdef RENEWAL - switch(skill_id) { - case ASC_BREAKER: - return ad; //These skills will do a GVG fix later - } -#endif - struct map_data *mapdata = map_getmapdata(target->m); ad.damage = battle_calc_damage(src,target,&ad,ad.damage,skill_id,skill_lv); @@ -6887,35 +6889,12 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * case NPC_EVILLAND: md.damage = skill_calc_heal(src,target,skill_id,skill_lv,false); break; +#ifndef RENEWAL case ASC_BREAKER: -#ifdef RENEWAL - // Official Renewal formula [helvetica] - // damage = ((atk + matk) * (3 + (.5 * skill level))) - (edef + sdef + emdef + smdef) - // atk part takes weapon element, matk part is non-elemental - // modified def formula - { - short totaldef, totalmdef; - struct Damage atk, matk; - - atk = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0); - nk.set(NK_IGNOREELEMENT); // atk part takes on weapon element, matk part is non-elemental - matk = battle_calc_magic_attack(src, target, skill_id, skill_lv, 0); - - // (atk + matk) * (3 + (.5 * skill level)) - md.damage = ((30 + (5 * skill_lv)) * (atk.damage + matk.damage)) / 10; - - // modified def reduction, final damage = base damage - (edef + sdef + emdef + smdef) - totaldef = tstatus->def2 + (short)status_get_def(target); - totalmdef = tstatus->mdef + tstatus->mdef2; - md.damage -= totaldef + totalmdef; - } -#else md.damage = 500 + rnd()%500 + 5 * skill_lv * sstatus->int_; nk.set(NK_IGNOREFLEE); nk.set(NK_IGNOREELEMENT); //These two are not properties of the weapon based part. -#endif break; -#ifndef RENEWAL case HW_GRAVITATION: md.damage = 200 + 200 * skill_lv; md.dmotion = 0; //No flinch animation @@ -7251,8 +7230,11 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i sc = status_get_sc(bl); ssc = status_get_sc(src); - if (sc && sc->data[SC_WHITEIMPRISON]) - return 0; // White Imprison does not reflect any damage + if (sc) { // These statuses do not reflect any damage (off the target) + if (sc->data[SC_WHITEIMPRISON] || sc->data[SC_DARKCROW] || + (sc->data[SC_KYOMU] && (!ssc || !ssc->data[SC_SHIELDSPELL_DEF]))) // Nullify reflecting ability except for Shield Spell - Def + return 0; + } if (ssc && ssc->data[SC_REF_T_POTION]) return 0; @@ -7320,20 +7302,22 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i } } - if (ssc && ssc->data[SC_INSPIRATION]) { - rdamage += damage / 100; + if (ssc) { + if (ssc->data[SC_INSPIRATION]) { + rdamage += damage / 100; #ifdef RENEWAL - rdamage = cap_value(rdamage, 1, max_damage); + rdamage = cap_value(rdamage, 1, max_damage); #else - rdamage = i64max(rdamage,1); + rdamage = i64max(rdamage, 1); #endif + } + if (ssc->data[SC_VENOMBLEED] && ssc->data[SC_VENOMBLEED]->val3 == 0) + rdamage -= damage * ssc->data[SC_VENOMBLEED]->val2 / 100; } - if (sc && sc->data[SC_KYOMU] && (!ssc || !ssc->data[SC_SHIELDSPELL_DEF])) // Nullify reflecting ability except for Shield Spell - Def - rdamage = 0; - - if (sc && sc->data[SC_MAXPAIN]) { - rdamage = damage * sc->data[SC_MAXPAIN]->val1 * 10 / 100; + if (sc) { + if (sc->data[SC_MAXPAIN]) + rdamage = damage * sc->data[SC_MAXPAIN]->val1 * 10 / 100; } return cap_value(min(rdamage,max_damage),INT_MIN,INT_MAX); diff --git a/src/map/pc.cpp b/src/map/pc.cpp index be33c709d3..dfc661fb0e 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -8977,7 +8977,7 @@ int pc_itemheal(struct map_session_data *sd, int itemid, int hp, int sp) if (sd->sc.data[SC_CRITICALWOUND]) penalty += sd->sc.data[SC_CRITICALWOUND]->val2; - if (sd->sc.data[SC_DEATHHURT]) + if (sd->sc.data[SC_DEATHHURT] && sd->sc.data[SC_DEATHHURT]->val3 == 1) penalty += 20; if (sd->sc.data[SC_NORECOVER_STATE]) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 4e0ff08903..b369fc5e67 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -740,7 +740,7 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk if (tsc->data[SC_CRITICALWOUND]) penalty += tsc->data[SC_CRITICALWOUND]->val2; - if (tsc->data[SC_DEATHHURT]) + if (tsc->data[SC_DEATHHURT] && tsc->data[SC_DEATHHURT]->val3 == 1) penalty += 20; if (tsc->data[SC_NORECOVER_STATE]) penalty = 100; @@ -1233,7 +1233,11 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if( sd ) { // These statuses would be applied anyway even if the damage was blocked by some skills. [Inkfish] - if( skill_id != WS_CARTTERMINATION && skill_id != AM_DEMONSTRATION && skill_id != CR_REFLECTSHIELD && skill_id != MS_REFLECTSHIELD && skill_id != ASC_BREAKER ) { + if( skill_id != WS_CARTTERMINATION && skill_id != AM_DEMONSTRATION && skill_id != CR_REFLECTSHIELD && skill_id != MS_REFLECTSHIELD +#ifndef RENEWAL + && skill_id != ASC_BREAKER +#endif + ) { // Trigger status effects enum sc_type type; unsigned int time; @@ -4818,9 +4822,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case GS_FULLBUSTER: case NJ_SYURIKEN: case NJ_KUNAI: -#ifndef RENEWAL case ASC_BREAKER: -#endif case HFLI_MOON: //[orn] case HFLI_SBR44: //[orn] case NPC_BLEEDING: @@ -4834,7 +4836,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case NC_AXEBOOMERANG: case NC_POWERSWING: case NC_MAGMA_ERUPTION: - case GC_CROSSIMPACT: case GC_WEAPONCRUSH: case GC_VENOMPRESSURE: case SC_TRIANGLESHOT: @@ -5518,9 +5519,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case CR_ACIDDEMONSTRATION: #endif case TF_THROWSTONE: -#ifdef RENEWAL - case ASC_BREAKER: -#endif case NPC_SMOKING: case GS_FLING: case NJ_ZENYNAGE: @@ -5675,7 +5673,14 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint else { skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); - status_change_end(src,SC_ROLLINGCUTTER,INVALID_TIMER); + } + break; + case GC_CROSSIMPACT: { + uint8 dir = map_calc_dir(bl, src->x, src->y); + + if (skill_check_unit_movepos(5, src, bl->x, bl->y, 1, 1)) + skill_blown(src, src, 1, (dir + 4) % 8, BLOWN_NONE); // Target position is actually one cell next to the target + skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); } break; @@ -8301,7 +8306,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } if (tsc->data[SC_CRITICALWOUND]) penalty += tsc->data[SC_CRITICALWOUND]->val2; - if (tsc->data[SC_DEATHHURT]) + if (tsc->data[SC_DEATHHURT] && tsc->data[SC_DEATHHURT]->val3) penalty += 20; if (tsc->data[SC_NORECOVER_STATE]) penalty = 100; @@ -8532,6 +8537,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui #ifdef RENEWAL clif_blown(src); // Always blow, otherwise it shows a casting animation. [Lemongrass] #endif + status_change_end(src, SC_ROLLINGCUTTER, INVALID_TIMER); break; case TK_HIGHJUMP: @@ -9169,7 +9175,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } if (tsc->data[SC_CRITICALWOUND]) penalty += tsc->data[SC_CRITICALWOUND]->val2; - if (tsc->data[SC_DEATHHURT]) + if (tsc->data[SC_DEATHHURT] && tsc->data[SC_DEATHHURT]->val3 == 1) penalty += 20; if (tsc->data[SC_NORECOVER_STATE]) penalty = 100; @@ -17468,16 +17474,18 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv) } } - if (sc && sc->data[SC_SPIRIT]) { - switch (skill_id) { - case CR_SHIELDBOOMERANG: - if (sc->data[SC_SPIRIT]->val2 == SL_CRUSADER) - time /= 2; - break; - case AS_SONICBLOW: - if (!map_flag_gvg2(bl->m) && !map_getmapflag(bl->m, MF_BATTLEGROUND) && sc->data[SC_SPIRIT]->val2 == SL_ASSASIN) - time /= 2; - break; + if (sc && sc->count) { + if (sc->data[SC_SPIRIT]) { + switch (skill_id) { + case CR_SHIELDBOOMERANG: + if (sc->data[SC_SPIRIT]->val2 == SL_CRUSADER) + time /= 2; + break; + case AS_SONICBLOW: + if (!map_flag_gvg2(bl->m) && !map_getmapflag(bl->m, MF_BATTLEGROUND) && sc->data[SC_SPIRIT]->val2 == SL_ASSASIN) + time /= 2; + break; + } } } @@ -17487,6 +17495,8 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv) time -= time * sc->data[SC_POEMBRAGI]->val3 / 100; if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 3 && skill_get_type(skill_id) == BF_MAGIC && skill_get_ele(skill_id, skill_lv) == ELE_WIND) time /= 2; // After Delay of Wind element spells reduced by 50%. + if (sc->data[SC_MAGICMUSHROOM] && sc->data[SC_MAGICMUSHROOM]->val3 == 0) + time -= time * sc->data[SC_MAGICMUSHROOM]->val2 / 100; } } @@ -20477,27 +20487,27 @@ bool skill_arrow_create(struct map_session_data *sd, unsigned short nameid) */ int skill_poisoningweapon(struct map_session_data *sd, unsigned short nameid) { - sc_type type; - int chance, i, val4 = 0; - //uint16 msg = 1443; //Official is using msgstringtable.txt - char output[CHAT_SIZE_MAX]; - const char *msg; - nullpo_ret(sd); - if( !nameid || (i = pc_search_inventory(sd,nameid)) < 0 || pc_delitem(sd,i,1,0,0,LOG_TYPE_CONSUME) ) { + if( !nameid || pc_delitem(sd,pc_search_inventory(sd,nameid),1,0,0,LOG_TYPE_CONSUME) ) { clif_skill_fail(sd,GC_POISONINGWEAPON,USESKILL_FAIL_LEVEL,0); return 0; } - switch( nameid ) { // t_lv used to take duration from skill_get_time2 + sc_type type; + int chance; + //uint16 msg = 1443; //Official is using msgstringtable.txt + char output[CHAT_SIZE_MAX]; + const char *msg; + + switch( nameid ) { case ITEMID_PARALYSE: type = SC_PARALYSE; /*msg = 1444;*/ msg = "Paralyze"; break; case ITEMID_PYREXIA: type = SC_PYREXIA; /*msg = 1448;*/ msg = "Pyrexia"; break; case ITEMID_DEATHHURT: type = SC_DEATHHURT; /*msg = 1447;*/ msg = "Deathhurt"; break; - case ITEMID_LEECHESEND: type = SC_LEECHESEND; /*msg = 1450;*/ msg = "Leech End"; val4 = sd->bl.id; break; + case ITEMID_LEECHESEND: type = SC_LEECHESEND; /*msg = 1450;*/ msg = "Leech End"; break; case ITEMID_VENOMBLEED: type = SC_VENOMBLEED; /*msg = 1445;*/ msg = "Venom Bleed"; break; - case ITEMID_TOXIN: type = SC_TOXIN; /*msg = 1443;*/ msg = "Toxin"; val4 = sd->bl.id; break; - case ITEMID_MAGICMUSHROOM: type = SC_MAGICMUSHROOM; /*msg = 1446;*/ msg = "Magic Mushroom"; val4 = sd->bl.id; break; + case ITEMID_TOXIN: type = SC_TOXIN; /*msg = 1443;*/ msg = "Toxin"; break; + case ITEMID_MAGICMUSHROOM: type = SC_MAGICMUSHROOM; /*msg = 1446;*/ msg = "Magic Mushroom"; break; case ITEMID_OBLIVIONCURSE: type = SC_OBLIVIONCURSE; /*msg = 1449;*/ msg = "Oblivion Curse"; break; default: clif_skill_fail(sd,GC_POISONINGWEAPON,USESKILL_FAIL_LEVEL,0); @@ -20507,7 +20517,8 @@ int skill_poisoningweapon(struct map_session_data *sd, unsigned short nameid) status_change_end(&sd->bl, SC_POISONINGWEAPON, INVALID_TIMER); // End the status so a new poison can be applied (if changed) chance = 2 + 2 * sd->menuskill_val; // 2 + 2 * skill_lv sc_start4(&sd->bl,&sd->bl, SC_POISONINGWEAPON, 100, pc_checkskill(sd, GC_RESEARCHNEWPOISON), //in Aegis it store the level of GC_RESEARCHNEWPOISON in val1 - type, chance, val4, skill_get_time(GC_POISONINGWEAPON, sd->menuskill_val)); + type, chance, 0, skill_get_time(GC_POISONINGWEAPON, sd->menuskill_val)); + status_change_start(&sd->bl, &sd->bl, type, 10000, sd->menuskill_val, 0, 0, 0, skill_get_time(GC_POISONINGWEAPON, sd->menuskill_val), SCSTART_NOAVOID | SCSTART_NOICON); // Apply bonus to caster sprintf(output, msg_txt(sd,721), msg); clif_messagecolor(&sd->bl,color_table[COLOR_WHITE],output,false,SELF); diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 451697b659..06cccbffc0 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -2294,7 +2294,7 @@ public: } const std::string getDefaultLocation(); - uint64 parseBodyNode(const YAML::Node& node); + uint64 parseBodyNode(const YAML::Node &node); }; extern MagicMushroomDatabase magic_mushroom_db; diff --git a/src/map/status.cpp b/src/map/status.cpp index 551d6ec58e..c491497fe7 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -1469,7 +1469,7 @@ void initChangeTables(void) StatusChangeFlagTable[SC_DEATHHURT] |= SCB_REGEN; StatusChangeFlagTable[SC_VENOMBLEED] |= SCB_MAXHP; StatusChangeFlagTable[SC_MAGICMUSHROOM] |= SCB_REGEN; - StatusChangeFlagTable[SC_PYREXIA] |= SCB_HIT|SCB_FLEE; + StatusChangeFlagTable[SC_PYREXIA] |= SCB_ALL; StatusChangeFlagTable[SC_OBLIVIONCURSE] |= SCB_REGEN; StatusChangeFlagTable[SC_BANDING_DEFENCE] |= SCB_SPEED; StatusChangeFlagTable[SC_SHIELDSPELL_DEF] |= SCB_WATK; @@ -1694,7 +1694,7 @@ void initChangeTables(void) #endif StatusChangeStateTable[SC__BLOODYLUST] |= SCS_NOCAST; StatusChangeStateTable[SC_DEATHBOUND] |= SCS_NOCAST; - StatusChangeStateTable[SC_OBLIVIONCURSE] |= SCS_NOCAST; + StatusChangeStateTable[SC_OBLIVIONCURSE] |= SCS_NOCAST|SCS_NOCASTCOND; StatusChangeStateTable[SC_WHITEIMPRISON] |= SCS_NOCAST; StatusChangeStateTable[SC__SHADOWFORM] |= SCS_NOCAST; StatusChangeStateTable[SC__INVISIBILITY] |= SCS_NOCAST; @@ -3415,7 +3415,7 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += sc->data[SC_LUNARSTANCE]->val2; //Decreasing - if(sc->data[SC_VENOMBLEED]) + if (sc->data[SC_VENOMBLEED] && sc->data[SC_VENOMBLEED]->val3 == 1) bonus -= 15; if(sc->data[SC_BEYONDOFWARCRY]) bonus -= sc->data[SC_BEYONDOFWARCRY]->val3; @@ -4682,6 +4682,8 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) sd->subele[ELE_GHOST] += sc->data[SC_SYMPHONYOFLOVER]->val1 * 3; sd->subele[ELE_HOLY] += sc->data[SC_SYMPHONYOFLOVER]->val1 * 3; } + if (sc->data[SC_PYREXIA] && sc->data[SC_PYREXIA]->val3 == 0) + sd->bonus.crit_atk_rate += sc->data[SC_PYREXIA]->val2; } status_cpy(&sd->battle_status, base_status); @@ -5098,7 +5100,7 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str || sc->data[SC_BERSERK] || sc->data[SC_TRICKDEAD] || sc->data[SC_BLEEDING] - || sc->data[SC_MAGICMUSHROOM] + || (sc->data[SC_MAGICMUSHROOM] && sc->data[SC_MAGICMUSHROOM]->val3 == 1) || sc->data[SC_SATURDAYNIGHTFEVER] || sc->data[SC_REBOUND]) regen->flag = RGN_NONE; @@ -5115,7 +5117,7 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str (bl->type == BL_PC && (((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK && sc->data[SC_EXTREMITYFIST] && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) || #endif - sc->data[SC_OBLIVIONCURSE] || sc->data[SC_VITALITYACTIVATION]) + (sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 1) || sc->data[SC_VITALITYACTIVATION]) regen->flag &= ~RGN_SP; if (sc->data[SC_TENSIONRELAX]) { @@ -5233,6 +5235,8 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, enum sc if( flag&SCS_NOCAST ) { if( !(flag&SCS_NOCASTCOND) ) sc->cant.cast += ( start ? 1 : -1 ); + else if (sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 1) + sc->cant.cast += (start ? 1 : -1); } // Can't chat @@ -6931,7 +6935,7 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change flee -= flee * 25/100; if(sc->data[SC_FEAR]) flee -= flee * 20 / 100; - if(sc->data[SC_PARALYSE]) + if(sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 1) flee -= flee * 10 / 100; if(sc->data[SC_INFRAREDSCAN]) flee -= flee * 30 / 100; @@ -7409,6 +7413,8 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha val = max( val, 75 ); if( sc->data[SC_CLOAKINGEXCEED] ) val = max( val, sc->data[SC_CLOAKINGEXCEED]->val3); + if (sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 0) + val = max(val, 50); if( sc->data[SC_HOVERING] ) val = max( val, 10 ); if( sc->data[SC_GN_CARTBOOST] ) @@ -7441,7 +7447,7 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha // GetSpeed() if( sd && pc_iscarton(sd) ) speed += speed * (50 - 5 * pc_checkskill(sd,MC_PUSHCART)) / 100; - if( sc->data[SC_PARALYSE] ) + if( sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 1 ) speed += speed * 50 / 100; if( speed_rate != 100 ) speed = speed * speed_rate / 100; @@ -7542,7 +7548,7 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b bonus -= 30; if (sc->data[SC_HALLUCINATIONWALK_POSTDELAY]) bonus -= 50; - if (sc->data[SC_PARALYSE]) + if (sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 1) bonus -= 10; if (sc->data[SC__BODYPAINT]) bonus -= 5 * sc->data[SC__BODYPAINT]->val1; @@ -7742,7 +7748,7 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change * aspd_rate += 300; if( sc->data[SC_HALLUCINATIONWALK_POSTDELAY] ) aspd_rate += 500; - if( sc->data[SC_PARALYSE] ) + if( sc->data[SC_PARALYSE] && sc->data[SC_PARALYSE]->val3 == 1 ) aspd_rate += 100; if( sc->data[SC__BODYPAINT] ) aspd_rate += 50 * sc->data[SC__BODYPAINT]->val1; @@ -8549,8 +8555,9 @@ static int status_get_sc_interval(enum sc_type type) { switch (type) { case SC_POISON: - case SC_DPOISON: case SC_LEECHESEND: + case SC_DPOISON: + case SC_DEATHHURT: return 1000; case SC_BURNING: case SC_PYREXIA: @@ -8765,10 +8772,11 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_ tick_def2 = (status->vit + status->dex)*50; break; case SC_OBLIVIONCURSE: // 100% - (100 - 0.8 x INT) - sc_def = status->int_*80; + sc_def = status->int_ * 80; sc_def = max(sc_def, 500); // minimum of 5% resist tick_def = 0; - //Fall through + tick_def2 = (status->vit + status->luk) * 500; + break; case SC_TOXIN: case SC_PARALYSE: case SC_VENOMBLEED: @@ -8853,6 +8861,19 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_ #endif else if (sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 2) sc_def += sc->data[SC_SHIELDSPELL_REF]->val3*100; + else if (sc->data[SC_LEECHESEND] && sc->data[SC_LEECHESEND]->val3 == 0) { + switch (type) { + case SC_BLIND: + case SC_STUN: + return 0; // Immune + } + } else if (sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 0) { + switch (type) { + case SC_SILENCE: + case SC_CURSE: + return 0; // Immune + } + } } // When tick def not set, reduction is the same for both. @@ -9497,12 +9518,13 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_PYREXIA: case SC_OBLIVIONCURSE: case SC_LEECHESEND: - { // It doesn't stack or even renew - int i = SC_TOXIN; - for(; i<= SC_LEECHESEND; i++) - if(sc->data[i]) return 0; + for (int32 i = SC_TOXIN; i <= SC_LEECHESEND; i++) { + if (sc->data[i] && sc->data[i]->val3 == 1) // It doesn't stack or even renew on the target + return 0; + else if (sc->data[i] && sc->data[i]->val3 == 0) + status_change_end(bl, static_cast(i), INVALID_TIMER); // End the bonus part on the caster } - break; + break; case SC_SATURDAYNIGHTFEVER: if (sc->data[SC_BERSERK] || sc->data[SC_INSPIRATION]) return 0; @@ -10248,8 +10270,14 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty #ifndef RENEWAL val3 = 50*(val1+1); // Damage increase (+50 +50*lv%) #endif - if( sd )// [Ind] - iROwiki says each level increases its duration by 3 seconds - tick += pc_checkskill(sd,GC_RESEARCHNEWPOISON)*3000; + if (sd) { + uint16 poison_level = pc_checkskill(sd, GC_RESEARCHNEWPOISON); + + if (poison_level > 0) { + tick += 30000; // Base of 30 seconds + tick += poison_level * 15 * 1000; // Additional 15 seconds per level + } + } break; case SC_POISONREACT: val2=(val1+1)/2 + val1/10; // Number of counters [Skotlex] @@ -10522,18 +10550,46 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_POISON: case SC_BLEEDING: case SC_BURNING: - case SC_TOXIN: - case SC_MAGICMUSHROOM: - case SC_LEECHESEND: tick_time = status_get_sc_interval(type); - val4 = tick-tick_time; // Remaining time + val4 = tick - tick_time; // Remaining time break; - - case SC_PYREXIA: - //Causes blind for duration of pyrexia, unreducable and unavoidable, but can be healed with e.g. green potion - status_change_start(src,bl,SC_BLIND,10000,val1,0,0,0,tick,SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF); + case SC_TOXIN: + if (val3 == 1) // Target + tick_time = status_get_sc_interval(type); + else // Caster + tick_time = 1000; + val4 = tick - tick_time; // Remaining time + break; + case SC_DEATHHURT: + if (val3 == 1) + break; tick_time = status_get_sc_interval(type); - val4 = tick-tick_time; // Remaining time + val4 = tick - tick_time; // Remaining time + case SC_LEECHESEND: + if (val3 == 0) + break; + tick_time = status_get_sc_interval(type); + val4 = tick - tick_time; // Remaining time + break; + case SC_PYREXIA: + if (val3 == 1) { // Target + // Causes blind for duration of pyrexia, unreducable and unavoidable, but can be healed with e.g. green potion + status_change_start(src, bl, SC_BLIND, 10000, val1, 0, 0, 0, tick, SCSTART_NOAVOID | SCSTART_NOTICKDEF | SCSTART_NORATEDEF); + tick_time = status_get_sc_interval(type); + val4 = tick - tick_time; // Remaining time + } else // Caster + val2 = 15; // CRIT % and ATK % increase + break; + case SC_VENOMBLEED: + if (val3 == 0) // Caster + val2 = 30; // Reflect damage % reduction + break; + case SC_MAGICMUSHROOM: + if (val3 == 1) { // Target + tick_time = status_get_sc_interval(type); + val4 = tick - tick_time; // Remaining time + } else // Caster + val2 = 10; // After-cast delay % reduction break; case SC_CONFUSION: @@ -11175,6 +11231,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty tick_time = 5000; // [GodLesZ] tick time break; case SC_OBLIVIONCURSE: + if (val3 == 0) + break; val4 = tick / 3000; tick_time = 3000; // [GodLesZ] tick time break; @@ -11759,7 +11817,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val2 = 20 * val1 + 20; // atk bonus break; case SC_DARKCROW: - val2 = 30 * val1; + val2 = 30 * val1; // ATK bonus break; case SC_UNLIMIT: val2 = 50 * val1; @@ -12098,11 +12156,21 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_BLEEDING: case SC_BURNING: case SC_TOXIN: + tick_time = tick; + tick = tick_time + max(val4, 0); + break; + case SC_DEATHHURT: + if (val3 == 1) + break; + tick_time = tick; + tick = tick_time + max(val4, 0); case SC_MAGICMUSHROOM: case SC_PYREXIA: case SC_LEECHESEND: + if (val3 == 0) + break; tick_time = tick; - tick = tick_time + max(val4,0); + tick = tick_time + max(val4, 0); break; case SC_SWORDCLAN: case SC_ARCWANDCLAN: @@ -13861,12 +13929,19 @@ TIMER_FUNC(status_change_timer){ status_fix_damage(bl, bl, damage, clif_damage(bl, bl, tick, 0, 1, damage, 1, DMG_NORMAL, 0, false),0); } break; - + case SC_TOXIN: if (sce->val4 >= 0) { // Damage is every 10 seconds including 3%sp drain. - map_freeblock_lock(); - dounlock = true; - status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0); + if (sce->val3 == 1) { // Target + map_freeblock_lock(); + dounlock = true; + status_damage(bl, bl, 1, status->max_sp * 3 / 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 1, 1, DMG_NORMAL, 0, false), 0, 0); + } else { // Caster + interval = 1000; // Assign here since status_get_sc_internval() contains the target interval. + + if (status->sp < status->max_sp) + status_heal(bl, 0, (int)status->max_sp * 1 / 100, 1); + } } break; @@ -13914,7 +13989,7 @@ TIMER_FUNC(status_change_timer){ } } break; - + case SC_PYREXIA: if (sce->val4 >= 0) { map_freeblock_lock(); @@ -13922,7 +13997,7 @@ TIMER_FUNC(status_change_timer){ status_fix_damage(bl, bl, 100, clif_damage(bl, bl, tick, status->amotion, status->dmotion + 500, 100, 1, DMG_NORMAL, 0, false),0); } break; - + case SC_LEECHESEND: if (sce->val4 >= 0) { int64 damage = status->vit * (sce->val1 - 3) + (int)status->max_hp / 100; // {Target VIT x (New Poison Research Skill Level - 3)} + (Target HP/100) @@ -13933,6 +14008,13 @@ TIMER_FUNC(status_change_timer){ } break; + case SC_DEATHHURT: + if (sce->val4 >= 0) { + if (status->hp < status->max_hp) + status_heal(bl, (int)status->max_hp * 1 / 100, 0, 1); + } + break; + case SC_TENSIONRELAX: if(status->max_hp > status->hp && --(sce->val3) >= 0) { sc_timer_next(10000 + tick); @@ -14116,7 +14198,7 @@ TIMER_FUNC(status_change_timer){ sc_timer_next(10000+tick); } break; - + case SC_OBLIVIONCURSE: if( --(sce->val4) >= 0 ) { clif_emotion(bl,ET_QUESTION); diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index 34bef42aa8..729f891678 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -89,7 +89,7 @@ std::unordered_map skill_nearnpc; // Forward declaration of conversion functions static bool guild_read_guildskill_tree_db( char* split[], int columns, int current ); static bool pet_read_db( const char* file ); -static bool skill_parse_row_magicmushroomdb(char* split[], int column, int current); +static bool skill_parse_row_magicmushroomdb(char *split[], int column, int current); static bool skill_parse_row_abradb(char* split[], int columns, int current); static bool skill_parse_row_spellbookdb(char* split[], int columns, int current); static bool mob_readdb_mobavail(char *str[], int columns, int current); @@ -312,7 +312,7 @@ int do_init( int argc, char** argv ){ return 0; } - if (!process("MAGIC_MUSHROOM_DB", 1, root_paths, "magicmushroom_db", [](const std::string& path, const std::string& name_ext) -> bool { + if (!process("MAGIC_MUSHROOM_DB", 1, root_paths, "magicmushroom_db", [](const std::string &path, const std::string &name_ext) -> bool { return sv_readdb(path.c_str(), name_ext.c_str(), ',', 1, 1, -1, &skill_parse_row_magicmushroomdb, false); })) { return 0; @@ -865,7 +865,7 @@ static bool pet_read_db( const char* file ){ } // Copied and adjusted from skill.cpp -static bool skill_parse_row_magicmushroomdb(char* split[], int column, int current) +static bool skill_parse_row_magicmushroomdb(char *split[], int column, int current) { uint16 skill_id = atoi(split[0]); std::string *skill_name = util::umap_find(aegis_skillnames, skill_id); From d1e51277284628423a237ed28ad0c7e40f619dea Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Mon, 18 May 2020 18:52:08 +0200 Subject: [PATCH 118/212] Fixed getcharid error in Continental Guard quest (#4970) --- npc/quests/quests_morocc.txt | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/npc/quests/quests_morocc.txt b/npc/quests/quests_morocc.txt index 702ea24e8e..ae13d7154e 100644 --- a/npc/quests/quests_morocc.txt +++ b/npc/quests/quests_morocc.txt @@ -948,13 +948,11 @@ moc_fild20,354,183,3 script Continental Guard#01::MocConGuard 707,3,3,{ close; case 2: if ($@re_moc < 3) { - getpartymember(getcharid(1)); - set .@partymembercount,$@partymembercount; - copyarray .@partymembername$[0],$@partymembername$[0],.@partymembercount; - for(.@i = 0; .@i < .@partymembercount; .@i++) { - if (isloggedin(getcharid(3,.@partymembername$[.@i]))) { - set .@onlinemembers,.@onlinemembers + 1; - } + getpartymember getcharid(1), 1, .@partymembercid; + .@partymembercount = $@partymembercount; + for (.@i = 0; .@i < .@partymembercount; .@i++) { + if (convertpcinfo(.@partymembercid[.@i], CPC_ACCOUNT)) + .@onlinemembers++; } if ((.@onlinemembers > 1) && (countitem(7826) > 0)) { mes "[Continental Guard]"; @@ -1009,13 +1007,11 @@ moc_fild20,354,183,3 script Continental Guard#01::MocConGuard 707,3,3,{ mes "[Continental Guard]"; mes "Ah, you're an adventurer working for the Continental Guard. Nice to meet you. Feel free to ask me if you need my assistance."; next; - getpartymember(getcharid(1)); - set .@partymembercount,$@partymembercount; - copyarray .@partymembername$[0],$@partymembername$[0],.@partymembercount; - for(.@i = 0; .@i < .@partymembercount; .@i++) { - if (isloggedin(getcharid(3,.@partymembername$[.@i]))) { - set .@onlinemembers,.@onlinemembers + 1; - } + getpartymember getcharid(1), 1, .@partymembercid; + .@partymembercount = $@partymembercount; + for (.@i = 0; .@i < .@partymembercount; .@i++) { + if (convertpcinfo(.@partymembercid[.@i], CPC_ACCOUNT)) + .@onlinemembers++; } switch(select("Enter the First Field to Investigate:Enter the Second Field to Investigate:Return to Morocc's Accident Site:Cancel Conversation")) { case 1: From 44e5c5bcc7c19ab34dc284b18d4e9a40a96ebbbe Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 18 May 2020 13:35:07 -0400 Subject: [PATCH 119/212] Job Improvement Project - Rune Knight (Part 2) (#4709) * Fixes #4708. * kRO Changelog: http://ro.gnjoy.com/news/update/View.asp?seq=243&curpage=1 Thanks to @ecdarreola, @Litro, @Haydrich, and @LordWhiplash! --- db/re/item_db.txt | 30 ++++---- db/re/item_delay.txt | 2 + db/re/item_stack.txt | 9 --- db/re/skill_db.yml | 90 +++++++++++++++++------- doc/item_bonus.txt | 3 +- src/map/battle.cpp | 82 ++++++++++++++-------- src/map/map.hpp | 2 +- src/map/pc.cpp | 9 ++- src/map/pc.hpp | 1 + src/map/script_constants.hpp | 3 + src/map/skill.cpp | 130 +++++++++-------------------------- src/map/status.cpp | 28 ++++++-- src/map/status.hpp | 3 + 13 files changed, 205 insertions(+), 187 deletions(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 0400afa62e..1b35e114b2 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -7044,23 +7044,23 @@ //=================================================================== // Rune Knight's Rune Stones //=================================================================== -12725,Runstone_Nosiege,Nauthiz Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_REFRESH",1; },{},{} -12726,Runstone_Rhydo,Raido Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_CRUSHSTRIKE",1; },{},{} -12727,Runstone_Verkana,Berkana Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_MILLENNIUMSHIELD",1; },{},{} -12728,Runstone_Isia,Isa Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_VITALITYACTIVATION",1; },{},{} -12729,Runstone_Asir,Othila Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_FIGHTINGSPIRIT",1; },{},{} -12730,Runstone_Urj,Uruz Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_ABUNDANCE",1; },{},{} -12731,Runstone_Turisus,Thurisaz Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_GIANTGROWTH",1; },{},{} -12732,Runstone_Pertz,Wyrd Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STORMBLAST",1; },{},{} -12733,Runstone_Hagalas,Hagalaz Rune,2,100,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STONEHARDSKIN",1; },{},{} +12725,Runstone_Nosiege,Nauthiz Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_REFRESH",1; },{},{} +12726,Runstone_Rhydo,Raido Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_CRUSHSTRIKE",1; },{},{} +12727,Runstone_Verkana,Berkana Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_MILLENNIUMSHIELD",1; },{},{} +12728,Runstone_Isia,Isa Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_VITALITYACTIVATION",1; },{},{} +12729,Runstone_Asir,Othila Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_FIGHTINGSPIRIT",1; },{},{} +12730,Runstone_Urj,Uruz Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_ABUNDANCE",1; },{},{} +12731,Runstone_Turisus,Thurisaz Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_GIANTGROWTH",1; },{},{} +12732,Runstone_Pertz,Wyrd Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STORMBLAST",1; },{},{} +12733,Runstone_Hagalas,Hagalaz Rune,2,100,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STONEHARDSKIN",1; },{},{} //=================================================================== // Rune Knight Rune Ores //=================================================================== -12734,Runstone_Quality,Luxurious Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 5; },{},{} -12735,Runstone_Ancient,Ancient Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 11; },{},{} -12736,Runstone_Mystic,Mystic Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 14; },{},{} -12737,Runstone_Ordinary,General Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 2; },{},{} -12738,Runstone_Rare,Rare Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 8; },{},{} +12734,Runstone_Quality,Luxurious Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 8; },{},{} +12735,Runstone_Ancient,Ancient Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 30; },{},{} +12736,Runstone_Mystic,Mystic Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 60; },{},{} +12737,Runstone_Ordinary,General Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 4; },{},{} +12738,Runstone_Rare,Rare Rune,0,2,,100,,,,,0x00000080,56,2,,,,,,{ makerune 15; },{},{} //=================================================================== // More usable items //=================================================================== @@ -11371,7 +11371,7 @@ 22536,WorkerScroll_B,Scroll Summoning Workers(Female),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{} 22537,PrizeOfHero,Prize Of Hero,2,0,,100,,,,0,0xFFFFFFFF,63,2,,,1,,,{ getrandgroupitem(IG_PrizeOfHero,1); },{},{} 22538,Hanbok_bag,Hanbok bag,2,0,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_HANBOK,600000,0; },{},{} -22540,Runstone_Lux,Lux Anima Runestone,11,2,,100,,,,,0xFFFFFFFF,56,2,,,,,,{ itemskill "RK_LUXANIMA",1; },{},{} +22540,Runstone_Lux,Lux Anima Runestone,11,2,,10,,,,,0xFFFFFFFF,56,2,,,,,,{ itemskill "RK_LUXANIMA",1; },{},{} 22541,PC_Room_Coupon_Box_VI,PC Room Coupon Box VI,18,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{} 22542,Center_Potion_B,Concentration Potion,2,10,,100,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION0,1800000,4; },{},{} 22543,Berserk_Potion_B,Berserk Potion,2,10,,200,,,,0,0x6,63,2,,,,,,{ sc_start SC_ASPDPOTION2,1800000,9; },{},{} diff --git a/db/re/item_delay.txt b/db/re/item_delay.txt index 11d0ed0063..01fb16edc4 100644 --- a/db/re/item_delay.txt +++ b/db/re/item_delay.txt @@ -99,6 +99,8 @@ //12207,60000 //Vit_Dish10_ 22508,1200000 //Para_Team_Mark_ +22540,5000,SC_REUSE_LIMIT_LUXANIMA //Runstone_Lux + // Bed of Honor 22687,5000,SC_REUSE_LIMIT_F // Pieces_Of_Sentiment diff --git a/db/re/item_stack.txt b/db/re/item_stack.txt index 877bcb1454..e61f69b0cd 100644 --- a/db/re/item_stack.txt +++ b/db/re/item_stack.txt @@ -17,14 +17,5 @@ // Example: // 512,4,12 // Will not allow more than 4 Apples in storages. -// Rune Knight -12725,60,1 // Nauthiz Rune -12726,60,1 // Raido Rune -12727,60,1 // Berkana Rune -12728,60,1 // Isa Rune -12730,60,1 // Uruz Rune -12733,60,1 // Hagalaz Rune -22540,60,1 // Lux Anima Rune - // Arch Bishop 12333,3,1 // Ancilla diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 778145acee..d326054ac0 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -17392,6 +17392,8 @@ Body: MaxLevel: 10 Type: Weapon TargetType: Attack + DamageFlags: + Critical: true Range: - Level: 1 Size: 7 @@ -17488,10 +17490,33 @@ Body: MaxLevel: 10 Type: Weapon TargetType: Attack - Range: 5 + DamageFlags: + Splash: true + Range: 7 Hit: Multi_Hit HitCount: -5 Element: Weapon + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 1 + - Level: 4 + Area: 1 + - Level: 5 + Area: 2 + - Level: 6 + Area: 2 + - Level: 7 + Area: 2 + - Level: 8 + Area: 2 + - Level: 9 + Area: 3 + - Level: 10 + Area: 3 CastTime: - Level: 1 Time: 1000 @@ -17526,33 +17551,50 @@ Body: Description: Wind Cutter MaxLevel: 5 Type: Weapon - TargetType: Ground + TargetType: Self DamageFlags: Splash: true - Range: 1 Hit: Single HitCount: 1 - Element: Wind - SplashArea: 2 - Knockback: 3 + Element: Weapon + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 2 + - Level: 4 + Area: 2 + - Level: 5 + Area: 3 CopyFlags: Skill: Reproduce: true - Duration1: 15000 - Cooldown: 2000 - FixedCastTime: -1 + AfterCastActDelay: 1000 + Cooldown: + - Level: 1 + Time: 800 + - Level: 2 + Time: 650 + - Level: 3 + Time: 500 + - Level: 4 + Time: 350 + - Level: 5 + Time: 200 Requires: SpCost: - Level: 1 - Amount: 20 + Amount: 34 - Level: 2 - Amount: 24 + Amount: 38 - Level: 3 - Amount: 28 + Amount: 42 - Level: 4 - Amount: 32 + Amount: 46 - Level: 5 - Amount: 36 + Amount: 50 Weapon: Dagger: true 1hSword: true @@ -17567,6 +17609,7 @@ Body: TargetType: Self DamageFlags: Splash: true + Critical: true Hit: Single HitCount: 1 Element: Weapon @@ -17717,7 +17760,7 @@ Body: Hit: Single HitCount: 1 AfterCastActDelay: 1000 - Duration1: 180000 + Duration1: 900000 Duration2: 60000 FixedCastTime: -1 Requires: @@ -17770,7 +17813,7 @@ Body: Hit: Single HitCount: 1 CastCancel: true - Duration1: 180000 + Duration1: 900000 FixedCastTime: 1000 CastTimeFlags: IgnoreDex: true @@ -17788,7 +17831,7 @@ Body: Hit: Single HitCount: 1 CastCancel: true - Duration1: 180000 + Duration1: 900000 Duration2: 10000 FixedCastTime: 2000 CastTimeFlags: @@ -17807,7 +17850,7 @@ Body: Hit: Single HitCount: 1 CastCancel: true - Duration1: 180000 + Duration1: 900000 FixedCastTime: -1 Requires: SpCost: 1 @@ -17819,13 +17862,13 @@ Body: TargetType: Self DamageFlags: Splash: true + Critical: true Flags: TargetTrap: true Hit: Single HitCount: 1 Element: Weapon SplashArea: 3 - Knockback: 7 CastTime: 2000 FixedCastTime: -1 Requires: @@ -17840,9 +17883,8 @@ Body: Splash: true Hit: Single HitCount: 1 - SplashArea: -1 CastCancel: true - Duration1: 180000 + Duration1: 900000 FixedCastTime: -1 Requires: SpCost: 1 @@ -17858,7 +17900,7 @@ Body: HitCount: 1 Element: Holy CastCancel: true - Duration1: 180000 + Duration1: 900000 FixedCastTime: -1 Requires: SpCost: 1 @@ -31739,11 +31781,9 @@ Body: TargetType: Self DamageFlags: NoDamage: true - Splash: true Hit: Single HitCount: 1 - SplashArea: 3 - Duration1: 60000 + Duration1: 900000 FixedCastTime: -1 Requires: SpCost: 1 diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt index 36f10e9e64..7428fd900d 100644 --- a/doc/item_bonus.txt +++ b/doc/item_bonus.txt @@ -168,7 +168,8 @@ bonus2 bSkillUseSPrate,sk,n; Decreases SP consumption of skill sk by n% Atk/Def ------- bonus2 bSkillAtk,sk,n; Increases damage of skill sk by n% -bonus bLongAtkRate,n; Increases damage of ranged attacks by n% +bonus bShortAtkRate,n; Increases damage of short ranged attacks by n% +bonus bLongAtkRate,n; Increases damage of long ranged attacks by n% bonus bCritAtkRate,n; Increases critical damage by +n% bonus bCriticalDef,n; Decreases the chance of being hit by critical hits by n% bonus2 bWeaponAtk,w,n; Adds n ATK when weapon of type w is equipped diff --git a/src/map/battle.cpp b/src/map/battle.cpp index b9e3a0e25b..044f665c95 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -852,6 +852,8 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li } } #ifndef RENEWAL + if (flag & BF_SHORT) + cardfix = cardfix * (100 + sd->bonus.short_attack_atk_rate) / 100; if( flag&BF_LONG ) cardfix = cardfix * (100 + sd->bonus.long_attack_atk_rate) / 100; #endif @@ -2575,6 +2577,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct #ifdef RENEWAL case ASC_BREAKER: #endif + case RK_IGNITIONBREAK: case GC_CROSSIMPACT: cri /= 2; break; @@ -2865,7 +2868,8 @@ static bool attack_ignores_def(struct Damage* wd, struct block_list *src, struct } else if (weapon_position == EQI_HAND_L) return true; } - } + } else if (skill_id == RK_WINDCUTTER && sd && sd->status.weapon == W_2HSWORD) + return true; return nk[NK_IGNOREDEFENSE] != 0; } @@ -2957,6 +2961,22 @@ static int battle_get_weapon_element(struct Damage* wd, struct block_list *src, if (!sd) element = ELE_NEUTRAL; //forced neutral for monsters break; + case RK_DRAGONBREATH: + if (sc) { + if (sc->data[SC_LUXANIMA]) // Lux Anima has priority over Giant Growth + element = ELE_DARK; + else if (sc->data[SC_GIANTGROWTH]) + element = ELE_HOLY; + } + break; + case RK_DRAGONBREATH_WATER: + if (sc) { + if (sc->data[SC_LUXANIMA]) // Lux Anima has priority over Fighting Spirit + element = ELE_NEUTRAL; + else if (sc->data[SC_FIGHTINGSPIRIT]) + element = ELE_GHOST; + } + break; case LG_HESPERUSLIT: if (sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 4) element = ELE_HOLY; @@ -3541,6 +3561,10 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s } switch (skill_id) { + case RK_WINDCUTTER: + if (sd && sd->weapontype1 == W_2HSWORD) + wd->div_ = 2; + break; case RA_AIMEDBOLT: wd->div_ = 2 + tstatus->size + rnd()%2; break; @@ -4098,42 +4122,34 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += ((skill_lv - 1) % 5 + 1) * 100; break; case RK_SONICWAVE: - skillratio += -100 + (skill_lv + 7) * 100; // ATK = {((Skill Level + 7) x 100) x (1 + [(Caster's Base Level - 100) / 200])} % - skillratio = skillratio * (100 + (status_get_lv(src) - 100) / 2) / 100; + skillratio += -100 + 500 + 100 * skill_lv; + RE_LVL_DMOD(100); break; case RK_HUNDREDSPEAR: - skillratio += 500 + (80 * skill_lv); - if (sd) { - short index = sd->equip_index[EQI_HAND_R]; - - if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON) - skillratio += max(10000 - sd->inventory_data[index]->weight, 0) / 10; + skillratio += -100 + 600 + 200 * skill_lv; + if (sd) skillratio += 50 * pc_checkskill(sd,LK_SPIRALPIERCE); - } // (1 + [(Casters Base Level - 100) / 200]) - skillratio = skillratio * (100 + (status_get_lv(src) - 100) / 2) / 100; + RE_LVL_DMOD(100); break; case RK_WINDCUTTER: - skillratio += -100 + (skill_lv + 2) * 50; + if (sd) { + if (sd->weapontype1 == W_2HSWORD) + skillratio += -100 + 250 * skill_lv; + else if (sd->weapontype1 == W_1HSPEAR || sd->weapontype1 == W_2HSPEAR) + skillratio += -100 + 400 * skill_lv; + else + skillratio += -100 + 300 * skill_lv; + } else + skillratio += -100 + 300 * skill_lv; RE_LVL_DMOD(100); break; case RK_IGNITIONBREAK: - // 3x3 cell Damage = ATK [{(Skill Level x 300) x (1 + [(Caster's Base Level - 100) / 100])}] % - // 7x7 cell Damage = ATK [{(Skill Level x 250) x (1 + [(Caster's Base Level - 100) / 100])}] % - // 11x11 cell Damage = ATK [{(Skill Level x 200) x (1 + [(Caster's Base Level - 100) / 100])}] % - i = distance_bl(src,target); - if (i < 2) - skillratio += -100 + 300 * skill_lv; - else if (i < 4) - skillratio += -100 + 250 * skill_lv; - else - skillratio += -100 + 200 * skill_lv; - skillratio = skillratio * status_get_lv(src) / 100; - // Elemental check, 1.5x damage if your weapon element is fire. - if (sstatus->rhw.ele == ELE_FIRE) - skillratio += 100 * skill_lv; + skillratio += -100 + 400 * skill_lv; + RE_LVL_DMOD(100); break; case RK_STORMBLAST: skillratio += -100 + (((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : 0) + status_get_str(src) / 8) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's STR / 8)} x 100] % + RE_LVL_DMOD(100); break; case RK_PHANTOMTHRUST: // ATK = [{(Skill Level x 50) + (Spear Master Level x 10)} x Caster's Base Level / 150] % skillratio += -100 + 50 * skill_lv + 10 * (sd ? pc_checkskill(sd,KN_SPEARMASTERY) : 5); @@ -5570,6 +5586,9 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block case LK_SPIRALPIERCE: if (!sd) wd.flag = (wd.flag&~(BF_RANGEMASK|BF_WEAPONMASK))|BF_LONG|BF_MISC; break; + case RK_WINDCUTTER: + if (sd && (sd->status.weapon == W_1HSPEAR || sd->status.weapon == W_2HSPEAR)) + wd.flag |= BF_LONG; // The number of hits is set to 3 by default for use in Inspiration status. // When in Banding, the number of hits is equal to the number of Royal Guards in Banding. @@ -5615,7 +5634,10 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr rdamage = battle_calc_return_damage(target, src, &damage, wd->flag, skill_id,true); if( rdamage > 0 ) { struct block_list *d_bl = battle_check_devotion(src); + status_change *sc = status_get_sc(src); + if (sc && sc->data[SC_VITALITYACTIVATION]) + rdamage /= 2; if (tsc->data[SC_MAXPAIN]) { tsc->data[SC_MAXPAIN]->val2 = (int)rdamage; skill_castend_damage_id(target, src, NPC_MAXPAIN_ATK, tsc->data[SC_MAXPAIN]->val1, tick, wd->flag); @@ -5751,6 +5773,8 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl if (sd) { //monsters, homuns and pets have their damage computed directly wd.damage = wd.statusAtk + wd.weaponAtk + wd.equipAtk + wd.masteryAtk; wd.damage2 = wd.statusAtk2 + wd.weaponAtk2 + wd.equipAtk2 + wd.masteryAtk2; + if (wd.flag & BF_SHORT) + ATK_ADDRATE(wd.damage, wd.damage2, sd->bonus.short_attack_atk_rate); if(wd.flag&BF_LONG && (skill_id != RA_WUGBITE && skill_id != RA_WUGSTRIKE)) //Long damage rate addition doesn't use weapon + equip attack ATK_ADDRATE(wd.damage, wd.damage2, sd->bonus.long_attack_atk_rate); } @@ -7691,10 +7715,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } else status_change_end(src,SC_SPELLFIST,INVALID_TIMER); } - if (sc->data[SC_GIANTGROWTH] && (wd.flag&BF_SHORT) && rnd()%100 < sc->data[SC_GIANTGROWTH]->val2 && !is_infinite_defense(target, wd.flag) && !vellum_damage) { - wd.damage <<= 1; // Double Damage - skill_break_equip(src, src, EQP_WEAPON, 10, BCT_SELF); // Break chance happens on successful damage increase - } + if (sc->data[SC_GIANTGROWTH] && (wd.flag&BF_SHORT) && rnd()%100 < sc->data[SC_GIANTGROWTH]->val2 && !is_infinite_defense(target, wd.flag) && !vellum_damage) + wd.damage += wd.damage * 150 / 100; // 2.5 times damage if( sd && battle_config.arrow_decrement && sc->data[SC_FEARBREEZE] && sc->data[SC_FEARBREEZE]->val4 > 0) { short idx = sd->equip_index[EQI_AMMO]; diff --git a/src/map/map.hpp b/src/map/map.hpp index 7fa4a8b598..1026c0fc33 100644 --- a/src/map/map.hpp +++ b/src/map/map.hpp @@ -498,7 +498,7 @@ enum _sp { SP_STATE_NORECOVER_RACE, SP_CRITICAL_RANGEATK, SP_MAGIC_ADDRACE2, SP_IGNORE_MDEF_RACE2_RATE, // 2079-2082 SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087 SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2093 - SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE // 2094-2095 + SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE // 2094-2096 }; enum _look { diff --git a/src/map/pc.cpp b/src/map/pc.cpp index dfc661fb0e..6f25667997 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -3416,6 +3416,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val) if(sd->state.lr_flag !=2) sd->bonus.classchange=val; break; + case SP_SHORT_ATK_RATE: + if(sd->state.lr_flag != 2) //[Lupus] it should stack, too. As any other cards rate bonuses + sd->bonus.short_attack_atk_rate+=val; + break; case SP_LONG_ATK_RATE: if(sd->state.lr_flag != 2) //[Lupus] it should stack, too. As any other cards rate bonuses sd->bonus.long_attack_atk_rate+=val; @@ -8634,6 +8638,7 @@ int64 pc_readparam(struct map_session_data* sd,int64 type) case SP_UNBREAKABLE_GARMENT: val = (sd->bonus.unbreakable_equip&EQP_GARMENT)?1:0; break; case SP_UNBREAKABLE_SHOES: val = (sd->bonus.unbreakable_equip&EQP_SHOES)?1:0; break; case SP_CLASSCHANGE: val = sd->bonus.classchange; break; + case SP_SHORT_ATK_RATE: val = sd->bonus.short_attack_atk_rate; break; case SP_LONG_ATK_RATE: val = sd->bonus.long_attack_atk_rate; break; case SP_BREAK_WEAPON_RATE: val = sd->bonus.break_weapon_rate; break; case SP_BREAK_ARMOR_RATE: val = sd->bonus.break_armor_rate; break; @@ -8983,10 +8988,8 @@ int pc_itemheal(struct map_session_data *sd, int itemid, int hp, int sp) if (sd->sc.data[SC_NORECOVER_STATE]) penalty = 100; - if (sd->sc.data[SC_VITALITYACTIVATION]) { + if (sd->sc.data[SC_VITALITYACTIVATION]) hp += hp / 2; // 1.5 times - sp -= sp / 2; - } if (sd->sc.data[SC_WATER_INSIGNIA] && sd->sc.data[SC_WATER_INSIGNIA]->val1 == 2) { hp += hp / 10; diff --git a/src/map/pc.hpp b/src/map/pc.hpp index bf135dbb1a..148f640244 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -486,6 +486,7 @@ struct map_session_data { int arrow_atk,arrow_ele,arrow_cri,arrow_hit; int nsshealhp,nsshealsp; int critical_def,double_rate; + int short_attack_atk_rate; // Short range atk rate, not weapon based. int long_attack_atk_rate; //Long range atk rate, not weapon based. [Skotlex] int near_attack_def_rate,long_attack_def_rate,magic_def_rate,misc_def_rate; int ignore_mdef_ele; diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 77092b5f6a..83fb621c11 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -671,6 +671,7 @@ export_constant2("bUnbreakableArmor",SP_UNBREAKABLE_ARMOR); export_constant2("bUnbreakableHelm",SP_UNBREAKABLE_HELM); export_constant2("bUnbreakableShield",SP_UNBREAKABLE_SHIELD); + export_constant2("bShortAtkRate",SP_SHORT_ATK_RATE); export_constant2("bLongAtkRate",SP_LONG_ATK_RATE); export_constant2("bCritAtkRate",SP_CRIT_ATK_RATE); export_constant2("bCriticalAddRace",SP_CRITICAL_ADDRACE); @@ -1583,6 +1584,8 @@ export_constant(SC_ADD_ATK_DAMAGE); export_constant(SC_ADD_MATK_DAMAGE); export_constant(SC_SOUNDOFDESTRUCTION); + export_constant(SC_LUXANIMA); + export_constant(SC_REUSE_LIMIT_LUXANIMA); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); #endif diff --git a/src/map/skill.cpp b/src/map/skill.cpp index b369fc5e67..695c9dfb4c 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -1343,6 +1343,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if((sce=sc->data[SC_EDP])) sc_start4(src,bl,SC_DPOISON,sce->val2, sce->val1,src->id,0,0, skill_get_time2(ASC_EDP,sce->val1)); + + if ((sce = sc->data[SC_LUXANIMA]) && rnd() % 100 < sce->val2) + skill_castend_nodamage_id(src, bl, RK_STORMBLAST, 1, tick, 0); } } break; @@ -1692,9 +1695,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case NPC_CRITICALWOUND: sc_start(src,bl,SC_CRITICALWOUND,100,skill_lv,skill_get_time2(skill_id,skill_lv)); break; - case RK_WINDCUTTER: - sc_start(src,bl,SC_FEAR,3+2*skill_lv,skill_lv,skill_get_time(skill_id,skill_lv)); - break; case RK_DRAGONBREATH: sc_start4(src,bl,SC_BURNING,15,skill_lv,1000,src->id,0,skill_get_time(skill_id,skill_lv)); break; @@ -2033,6 +2033,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SC_DRESSUP: case SC_HANBOK: case SC_OKTOBERFEST: case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4: case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: + case SC_REUSE_LIMIT_LUXANIMA: continue; case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI: case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME: @@ -4862,7 +4863,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case MO_TRIPLEATTACK: - case RK_WINDCUTTER: skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag|SD_ANIMATION); break; @@ -5112,6 +5112,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case NPC_REVERBERATION_ATK: case NPC_ARROWSTORM: case RK_IGNITIONBREAK: + case RK_HUNDREDSPEAR: case AB_JUDEX: case AB_ADORAMUS: case WL_SOULEXPANSION: @@ -5560,8 +5561,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case RK_DRAGONBREATH: if( tsc && tsc->data[SC_HIDING] ) clif_skill_nodamage(src,src,skill_id,skill_lv,1); - else + else { skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); + } break; case NPC_SELFDESTRUCTION: @@ -5619,16 +5621,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint status_change_end(src, SC_HIDING, INVALID_TIMER); skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); break; - case RK_HUNDREDSPEAR: - skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); - if(rnd()%100 < (10 + 3*skill_lv)) { - int skill_req = ((sd) ? pc_checkskill(sd,KN_SPEARBOOMERANG) : skill_get_max(KN_SPEARBOOMERANG)); - if( !skill_req ) - break; // Spear Boomerang auto cast chance only works if you have Spear Boomerang. - skill_blown(src,bl,6,-1,BLOWN_NONE); - skill_castend_damage_id(src,bl,KN_SPEARBOOMERANG,skill_req,tick,0); - } - break; case RK_PHANTOMTHRUST: unit_setdir(src,map_calc_dir(src, bl->x, bl->y)); clif_skill_nodamage(src,bl,skill_id,skill_lv,1); @@ -5637,6 +5629,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if( battle_check_target(src,bl,BCT_ENEMY) > 0 ) skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); break; + case RK_WINDCUTTER: case RK_STORMBLAST: if( flag&1 ) skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); @@ -7516,6 +7509,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui //List of self skills that give damage around caster case ASC_METEORASSAULT: case GS_SPREADATTACK: + case RK_WINDCUTTER: case RK_STORMBLAST: case NC_AXETORNADO: case GC_COUNTERSLASH: @@ -7560,7 +7554,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(src,bl,skill_id,skill_lv,1); i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); - if( !i && ( skill_id == NC_AXETORNADO || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) ) + if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) ) clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); } break; @@ -8498,6 +8492,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_WEDDING: case SC_XMAS: case SC_SUMMER: case SC_DRESSUP: case SC_HANBOK: case SC_OKTOBERFEST: case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4: + case SC_REUSE_LIMIT_LUXANIMA: continue; case SC_WHISTLE: case SC_ASSNCROS: @@ -9632,7 +9627,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case RK_ENCHANTBLADE: clif_skill_nodamage(src,bl,skill_id,skill_lv, - sc_start2(src,bl,type,100,skill_lv,((100+20*skill_lv)*status_get_lv(src))/150+sstatus->int_,skill_get_time(skill_id,skill_lv))); + sc_start2(src,bl,type,100,skill_lv,((100+20*skill_lv)*status_get_lv(src))/100+sstatus->int_,skill_get_time(skill_id,skill_lv))); break; case RK_DRAGONHOWLING: if( flag&1) @@ -9657,6 +9652,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui map_foreachinrange(skill_area_sub, bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); } break; + case RK_LUXANIMA: + status_change_clear_buffs(bl, SCCB_LUXANIMA); // For bonus_script case RK_GIANTGROWTH: case RK_STONEHARDSKIN: case RK_VITALITYACTIVATION: @@ -9690,57 +9687,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case RK_FIGHTINGSPIRIT: { - // val1: ATKBonus: Caster: 70 + 7 * PartyMember. Member: (70 + 7 * PartyMember) / 2 + uint8 runemastery_skill_lv = (sd ? pc_checkskill(sd, RK_RUNEMASTERY) : skill_get_max(RK_RUNEMASTERY)); + + // val1: ATKBonus: ? // !TODO: Confirm new ATK formula // val2: ASPD boost: [RK_RUNEMASTERYlevel * 4 / 10] * 10 ==> RK_RUNEMASTERYlevel * 4 - if( flag&1 ) { - if( skill_area_temp[1] == bl->id ) - sc_start2(src,bl,type,100,70 + 7 * skill_area_temp[0],4 * ((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : skill_get_max(RK_RUNEMASTERY)),skill_area_temp[4]); - else - sc_start(src,bl,type,100,skill_area_temp[3],skill_area_temp[4]); - } else { - if( sd && sd->status.party_id ) { - skill_area_temp[0] = party_foreachsamemap(skill_area_sub,sd,skill_get_splash(skill_id,skill_lv),src,skill_id,skill_lv,tick,BCT_PARTY,skill_area_sub_count); - skill_area_temp[1] = src->id; - skill_area_temp[3] = (70 + 7 * skill_area_temp[0]) / 2; - skill_area_temp[4] = skill_get_time(skill_id,skill_lv); - party_foreachsamemap(skill_area_sub,sd,skill_get_splash(skill_id,skill_lv),src,skill_id,skill_lv,tick,flag|BCT_PARTY|1,skill_castend_nodamage_id); - } - else - sc_start2(src,bl,type,100,77,4 * ((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : skill_get_max(RK_RUNEMASTERY)),skill_get_time(skill_id,skill_lv)); - clif_skill_nodamage(src,bl,skill_id,1,1); - } + sc_start2(src,bl,type,100,70 + 7 * runemastery_skill_lv,4 * runemastery_skill_lv,skill_get_time(skill_id,skill_lv)); + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + break; } - break; - - case RK_LUXANIMA: - { - sc_type runes[] = { SC_MILLENNIUMSHIELD, SC_REFRESH, SC_GIANTGROWTH, SC_STONEHARDSKIN, SC_VITALITYACTIVATION, SC_ABUNDANCE }; - - if (sd == NULL || sd->status.party_id == 0 || flag&1) { - if (src->id == bl->id) // Don't give it back to the RK - break; - - sc_start(src, bl, runes[skill_area_temp[5]], 100, skill_lv, skill_get_time(skill_id, skill_lv)); - status_change_clear_buffs(bl, SCCB_LUXANIMA); // For bonus_script - } else if (sd) { // Find which SC is going to be given - int recent = 0, result = -1; - - for (i = 0; i < ARRAYLENGTH(runes); i++) { - if (sd->sc.data[runes[i]] && ((sd->sc.data[runes[i]]->timer * (runes[i] == SC_REFRESH? 3 : 1)) > recent || recent == 0)) { - recent = sd->sc.data[runes[i]]->timer; - result = i; - } - } - - if (result != -1) { - skill_area_temp[5] = result; - status_change_end(src, runes[result], INVALID_TIMER); - party_foreachsamemap(skill_area_sub, sd, skill_get_splash(skill_id, skill_lv), src, skill_id, skill_lv, tick, flag|BCT_PARTY|1, skill_castend_nodamage_id); - clif_skill_nodamage(src, src, skill_id, skill_lv, 1); - } - } - } - break; case GC_ROLLINGCUTTER: { @@ -10028,6 +9982,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_DRESSUP: case SC_HANBOK: case SC_OKTOBERFEST: case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4: case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: + case SC_REUSE_LIMIT_LUXANIMA: continue; case SC_ASSUMPTIO: if( bl->type == BL_MOB ) @@ -12722,11 +12677,8 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui } break; - case RK_WINDCUTTER: - clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); case AC_SHOWER: - if (skill_id == AC_SHOWER) - status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER); + status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER); case MA_SHOWER: case NC_COLDSLOWER: case RK_DRAGONBREATH: @@ -19821,7 +19773,6 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh int i, sc, ele, idx, equip, wlv, make_per = 0, flag = 0, skill_lv = 0; int num = -1; // exclude the recipe struct status_data *status; - struct item_data* data; nullpo_ret(sd); @@ -19870,32 +19821,6 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh } } - if (skill_id == RK_RUNEMASTERY) { - int temp_qty, runemastery_skill_lv = pc_checkskill(sd,skill_id); - data = itemdb_search(nameid); - - if (runemastery_skill_lv >= 10) temp_qty = 1 + rnd()%3; - else if (runemastery_skill_lv > 4) temp_qty = 1 + rnd()%2; - else temp_qty = 1; - - if (data->stack.inventory) { - for (i = 0; i < MAX_INVENTORY; i++) { - if (sd->inventory.u.items_inventory[i].nameid == nameid) { - if (sd->inventory.u.items_inventory[i].amount >= data->stack.amount) { - clif_msg(sd,RUNE_CANT_CREATE); - return 0; - } else { - // The amount fits, say we got temp_qty 4 and 19 runes, we trim temp_qty to 1. - if (temp_qty + sd->inventory.u.items_inventory[i].amount >= data->stack.amount) - temp_qty = data->stack.amount - sd->inventory.u.items_inventory[i].amount; - } - break; - } - } - } - qty = temp_qty; - } - for (i = 0; i < MAX_PRODUCE_RESOURCE; i++) { short id, x, j; @@ -20004,7 +19929,7 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh break; case RK_RUNEMASTERY: { - int A = 100 * (51 + 2 * pc_checkskill(sd, skill_id)); + int A = 100 * (30 + 2 * pc_checkskill(sd, skill_id)); int B = 100 * status->dex / 30 + 10 * (status->luk + sd->status.job_level); int C = 100 * cap_value(sd->itemid,0,100); //itemid depend on makerune() int D = 0; @@ -20032,6 +19957,15 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh break; //not specified =-15% } make_per = A + B + C + D; + + uint8 runemastery_skill_lv = pc_checkskill(sd,skill_id); + + if (runemastery_skill_lv > 9) + qty = 2 + rnd() % 5; // 2~6 + else if (runemastery_skill_lv > 4) + qty = 2 + rnd() % 3; // 2~4 + else + qty = 2; } break; diff --git a/src/map/status.cpp b/src/map/status.cpp index c491497fe7..7cd2e1f138 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -814,11 +814,12 @@ void initChangeTables(void) set_sc( RK_REFRESH , SC_REFRESH , EFST_REFRESH , SCB_NONE ); set_sc( RK_GIANTGROWTH , SC_GIANTGROWTH , EFST_GIANTGROWTH , SCB_STR ); set_sc( RK_STONEHARDSKIN , SC_STONEHARDSKIN , EFST_STONEHARDSKIN , SCB_DEF|SCB_MDEF ); - set_sc( RK_VITALITYACTIVATION , SC_VITALITYACTIVATION , EFST_VITALITYACTIVATION , SCB_REGEN ); + set_sc( RK_VITALITYACTIVATION , SC_VITALITYACTIVATION , EFST_VITALITYACTIVATION , SCB_NONE ); set_sc( RK_FIGHTINGSPIRIT , SC_FIGHTINGSPIRIT , EFST_FIGHTINGSPIRIT , SCB_WATK|SCB_ASPD ); set_sc( RK_ABUNDANCE , SC_ABUNDANCE , EFST_ABUNDANCE , SCB_NONE ); set_sc( RK_CRUSHSTRIKE , SC_CRUSHSTRIKE , EFST_CRUSHSTRIKE , SCB_NONE ); set_sc_with_vfx( RK_DRAGONBREATH_WATER , SC_FREEZING , EFST_FROSTMISTY , SCB_ASPD|SCB_SPEED|SCB_DEF ); + set_sc( RK_LUXANIMA , SC_LUXANIMA , EFST_LUXANIMA , SCB_ALL ); /* GC Guillotine Cross */ set_sc_with_vfx( GC_VENOMIMPRESS, SC_VENOMIMPRESS , EFST_VENOMIMPRESS , SCB_NONE ); @@ -3413,6 +3414,8 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { #endif if(sc->data[SC_LUNARSTANCE]) bonus += sc->data[SC_LUNARSTANCE]->val2; + if (sc->data[SC_LUXANIMA]) + bonus += sc->data[SC_LUXANIMA]->val3; //Decreasing if (sc->data[SC_VENOMBLEED] && sc->data[SC_VENOMBLEED]->val3 == 1) @@ -3554,6 +3557,8 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { bonus += sc->data[SC_SERVICE4U]->val2; if(sc->data[SC_MERC_SPUP]) bonus += sc->data[SC_MERC_SPUP]->val2; + if (sc->data[SC_LUXANIMA]) + bonus += sc->data[SC_LUXANIMA]->val3; //Decreasing if (sc->data[SC_MELODYOFSINK]) @@ -4684,6 +4689,12 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) } if (sc->data[SC_PYREXIA] && sc->data[SC_PYREXIA]->val3 == 0) sd->bonus.crit_atk_rate += sc->data[SC_PYREXIA]->val2; + if (sc->data[SC_LUXANIMA]) { + pc_bonus2(sd, SP_ADDSIZE, SZ_ALL, sc->data[SC_LUXANIMA]->val3); + sd->bonus.crit_atk_rate += sc->data[SC_LUXANIMA]->val3; + sd->bonus.short_attack_atk_rate += sc->data[SC_LUXANIMA]->val3; + sd->bonus.long_attack_atk_rate += sc->data[SC_LUXANIMA]->val3; + } } status_cpy(&sd->battle_status, base_status); @@ -5117,7 +5128,7 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str (bl->type == BL_PC && (((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK && sc->data[SC_EXTREMITYFIST] && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) || #endif - (sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 1) || sc->data[SC_VITALITYACTIVATION]) + (sc->data[SC_OBLIVIONCURSE] && sc->data[SC_OBLIVIONCURSE]->val3 == 1)) regen->flag &= ~RGN_SP; if (sc->data[SC_TENSIONRELAX]) { @@ -6010,7 +6021,7 @@ static unsigned short status_calc_str(struct block_list *bl, struct status_chang if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) str += ((sc->data[SC_SPIRIT]->val3)>>16)&0xFF; if(sc->data[SC_GIANTGROWTH]) - str += 30; + str += sc->data[SC_GIANTGROWTH]->val2; if(sc->data[SC_BEYONDOFWARCRY]) str -= sc->data[SC_BEYONDOFWARCRY]->val2; if(sc->data[SC_SAVAGE_STEAK]) @@ -7620,7 +7631,7 @@ static short status_calc_fix_aspd(struct block_list *bl, struct status_change *s if ((sc->data[SC_GUST_OPTION] || sc->data[SC_BLAST_OPTION] || sc->data[SC_WILD_STORM_OPTION])) aspd -= 50; // +5 ASPD - if (sc->data[SC_FIGHTINGSPIRIT] && sc->data[SC_FIGHTINGSPIRIT]->val2) + if (sc->data[SC_FIGHTINGSPIRIT]) aspd -= sc->data[SC_FIGHTINGSPIRIT]->val2; if (sc->data[SC_MTF_ASPD]) aspd -= sc->data[SC_MTF_ASPD]->val1; @@ -10124,6 +10135,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_REUSE_LIMIT_ASPD_POTION: case SC_DORAM_BUF_01: case SC_DORAM_BUF_02: + case SC_REUSE_LIMIT_LUXANIMA: return 0; case SC_PUSH_CART: case SC_COMBO: @@ -11211,7 +11223,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty tick_time = 10000; // [GodLesZ] tick time break; case SC_GIANTGROWTH: - val2 = 15; // Double damage success rate. + val2 = 30; // Damage success rate and STR increase + break; + case SC_LUXANIMA: + val2 = 15; // Storm Blast success % + val3 = 30; // Damage/HP/SP % increase break; /* Arch Bishop */ @@ -12854,6 +12870,7 @@ int status_change_clear(struct block_list* bl, int type) case SC_LHZ_DUN_N4: case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: + case SC_REUSE_LIMIT_LUXANIMA: // Costumes case SC_MOONSTAR: case SC_SUPER_STAR: @@ -14983,6 +15000,7 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type) case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4: + case SC_REUSE_LIMIT_LUXANIMA: // Clans case SC_CLAN_INFO: case SC_SWORDCLAN: diff --git a/src/map/status.hpp b/src/map/status.hpp index 2f53737b4e..bbe61a84d4 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -930,6 +930,9 @@ enum sc_type : int16 { SC_HELPANGEL, SC_SOUNDOFDESTRUCTION, + SC_LUXANIMA, + SC_REUSE_LIMIT_LUXANIMA, + #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled #endif From 1fe4e4f17f9f6df1d84748b332d8293a73e7cdb3 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Mon, 18 May 2020 19:35:16 +0200 Subject: [PATCH 120/212] SQL synchronization --- sql-files/item_db_re.sql | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 124e9efb4c..e03d351b56 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -7076,23 +7076,23 @@ REPLACE INTO `item_db_re` VALUES (12724,'Poison_Fatigue','Venom Bleed',2,2,NULL, #=================================================================== # Rune Knight's Rune Stones #=================================================================== -REPLACE INTO `item_db_re` VALUES (12725,'Runstone_Nosiege','Nauthiz Rune',2,100,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_REFRESH",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12726,'Runstone_Rhydo','Raido Rune',2,100,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_CRUSHSTRIKE",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12727,'Runstone_Verkana','Berkana Rune',2,100,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_MILLENNIUMSHIELD",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12728,'Runstone_Isia','Isa Rune',2,100,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_VITALITYACTIVATION",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12729,'Runstone_Asir','Othila Rune',2,100,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_FIGHTINGSPIRIT",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12730,'Runstone_Urj','Uruz Rune',2,100,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_ABUNDANCE",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12731,'Runstone_Turisus','Thurisaz Rune',2,100,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_GIANTGROWTH",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12732,'Runstone_Pertz','Wyrd Rune',2,100,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STORMBLAST",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12733,'Runstone_Hagalas','Hagalaz Rune',2,100,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STONEHARDSKIN",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12725,'Runstone_Nosiege','Nauthiz Rune',2,100,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_REFRESH",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12726,'Runstone_Rhydo','Raido Rune',2,100,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_CRUSHSTRIKE",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12727,'Runstone_Verkana','Berkana Rune',2,100,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_MILLENNIUMSHIELD",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12728,'Runstone_Isia','Isa Rune',2,100,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_VITALITYACTIVATION",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12729,'Runstone_Asir','Othila Rune',2,100,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_FIGHTINGSPIRIT",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12730,'Runstone_Urj','Uruz Rune',2,100,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_ABUNDANCE",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12731,'Runstone_Turisus','Thurisaz Rune',2,100,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_GIANTGROWTH",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12732,'Runstone_Pertz','Wyrd Rune',2,100,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STORMBLAST",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12733,'Runstone_Hagalas','Hagalaz Rune',2,100,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if ((eaclass()&EAJ_THIRDMASK) == EAJ_RUNE_KNIGHT) unitskilluseid getcharid(3),"RK_STONEHARDSKIN",1;',NULL,NULL); #=================================================================== # Rune Knight Rune Ores #=================================================================== -REPLACE INTO `item_db_re` VALUES (12734,'Runstone_Quality','Luxurious Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12735,'Runstone_Ancient','Ancient Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 11;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12736,'Runstone_Mystic','Mystic Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 14;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12737,'Runstone_Ordinary','General Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12738,'Runstone_Rare','Rare Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 8;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12734,'Runstone_Quality','Luxurious Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 8;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12735,'Runstone_Ancient','Ancient Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 30;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12736,'Runstone_Mystic','Mystic Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 60;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12737,'Runstone_Ordinary','General Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 4;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12738,'Runstone_Rare','Rare Rune',0,2,NULL,100,NULL,NULL,NULL,NULL,0x00000080,56,2,NULL,NULL,NULL,NULL,NULL,'makerune 15;',NULL,NULL); #=================================================================== # More usable items #=================================================================== @@ -11403,7 +11403,7 @@ REPLACE INTO `item_db_re` VALUES (22535,'WorkerScroll_A','Scroll Summoning Worke REPLACE INTO `item_db_re` VALUES (22536,'WorkerScroll_B','Scroll Summoning Workers(Female)',2,10,NULL,10,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (22537,'PrizeOfHero','Prize Of Hero',2,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,'1',NULL,NULL,'getrandgroupitem(IG_PrizeOfHero,1);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22538,'Hanbok_bag','Hanbok bag',2,0,NULL,10,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_HANBOK,600000,0;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22540,'Runstone_Lux','Lux Anima Runestone',11,2,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,56,2,NULL,NULL,NULL,NULL,NULL,'itemskill "RK_LUXANIMA",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22540,'Runstone_Lux','Lux Anima Runestone',11,2,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,56,2,NULL,NULL,NULL,NULL,NULL,'itemskill "RK_LUXANIMA",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22541,'PC_Room_Coupon_Box_VI','PC Room Coupon Box VI',18,10,NULL,10,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (22542,'Center_Potion_B','Concentration Potion',2,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_ASPDPOTION0,1800000,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22543,'Berserk_Potion_B','Berserk Potion',2,10,NULL,200,NULL,NULL,NULL,0,0x6,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_ASPDPOTION2,1800000,9;',NULL,NULL); From 4411ee4c4e8716f97ed8d805db564ec7c309d621 Mon Sep 17 00:00:00 2001 From: qwerty7vp <64515036+qwerty7vp@users.noreply.github.com> Date: Tue, 19 May 2020 02:13:24 +0700 Subject: [PATCH 121/212] Corrects Happy Balloon item script (#4976) * Fixes #4963. * Corrects Happy Balloon drop rate bonus and Aegis name. Co-authored-by: Atemo --- db/re/item_db.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 1b35e114b2..ef9150b717 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -10122,7 +10122,7 @@ 19092,Machoman_Glasses_,Machoman's Glasses,4,36000,,100,,1,,1,0xFFFFFFFE,63,2,512,,0,0,92,{},{},{} 19093,Spinning_Eyes_,Geek Glasses,4,20000,,100,,1,,1,0xFFFFFFFF,63,2,512,,0,0,27,{ bonus2 bResEff,Eff_Blind,800; },{},{} 19094,Mr_Smile_,Mr. Smile,4,60,,100,,1,,1,0xFFFFFFFF,63,2,513,,0,0,65,{},{},{} -19095,Happy_Balloon,Happy Balloon,4,0,,10,,0,,0,0xFFFFFFFF,63,2,1,,1,0,1289,{ bonus2 bDropAddRace,RC_All,5; bonus2 bExpAddRace,RC_All,5; },{},{} +19095,Happy_Balloon_K,Happy Balloon,4,0,,10,,0,,0,0xFFFFFFFF,63,2,1,,1,0,1289,{ bonus2 bDropAddRace,RC_All,10; bonus2 bExpAddRace,RC_All,5; },{},{} 19101,Glastheim_Observer,Glastheim Observer,4,20,,100,,0,,0,0xFFFFFFFF,63,2,1,,80,1,1041,{ bonus2 bAddClass,Class_All,2; bonus bDelayrate,-5; },{},{} 19102,Pale_Moon_Hat,Pale Moon Hat,4,20,,500,,2,,1,0xFFFFFFFF,63,2,256,,30,1,913,{ bonus bFlee,20; bonus2 bAddRace2,RC2_THANATOS,5; bonus2 bSubRace2,RC2_THANATOS,5; bonus2 bMagicAddRace2,RC2_THANATOS,5; if(getrefine()>4) { bonus2 bAddRace2,RC2_THANATOS,10; bonus2 bSubRace2,RC2_THANATOS,10; bonus2 bMagicAddRace2,RC2_THANATOS,10; } if(getrefine()>6) { bonus2 bAddRace2,RC2_THANATOS,15; bonus2 bSubRace2,RC2_THANATOS,15; bonus2 bMagicAddRace2,RC2_THANATOS,15; } if(getrefine()>8) { bonus2 bAddRace2,RC2_THANATOS,20; bonus2 bSubRace2,RC2_THANATOS,20; bonus2 bMagicAddRace2,RC2_THANATOS,20; } /* skill 3044,1; */ },{},{} 19109,Valhalla_Idol,Valhalla Idol,4,0,,300,,2,,0,0xFFFFFFFF,63,2,512,,70,0,1423,{ bonus bMaxSP,50; bonus4 bAutoSpellWhenHit,"MG_SAFETYWALL",10,50,0; hateffect(HAT_EF_VALHALLA_IDOL,true); },{},{ hateffect(HAT_EF_VALHALLA_IDOL,false); } From 936d5617b27d4faccf3f6aee836987f17624d0cb Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Mon, 18 May 2020 21:13:33 +0200 Subject: [PATCH 122/212] SQL synchronization --- sql-files/item_db_re.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index e03d351b56..b5c5cde2c6 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -10154,7 +10154,7 @@ REPLACE INTO `item_db_re` VALUES (19091,'Opera_Ghost_Mask_','Opera Phantom Mask' REPLACE INTO `item_db_re` VALUES (19092,'Machoman_Glasses_','Machoman\'s Glasses',4,36000,NULL,100,NULL,1,NULL,1,0xFFFFFFFE,63,2,512,NULL,'0',0,92,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (19093,'Spinning_Eyes_','Geek Glasses',4,20000,NULL,100,NULL,1,NULL,1,0xFFFFFFFF,63,2,512,NULL,'0',0,27,'bonus2 bResEff,Eff_Blind,800;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19094,'Mr_Smile_','Mr. Smile',4,60,NULL,100,NULL,1,NULL,1,0xFFFFFFFF,63,2,513,NULL,'0',0,65,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19095,'Happy_Balloon','Happy Balloon',4,0,NULL,10,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',0,1289,'bonus2 bDropAddRace,RC_All,5; bonus2 bExpAddRace,RC_All,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19095,'Happy_Balloon_K','Happy Balloon',4,0,NULL,10,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',0,1289,'bonus2 bDropAddRace,RC_All,10; bonus2 bExpAddRace,RC_All,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19101,'Glastheim_Observer','Glastheim Observer',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'80',1,1041,'bonus2 bAddClass,Class_All,2; bonus bDelayrate,-5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19102,'Pale_Moon_Hat','Pale Moon Hat',4,20,NULL,500,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'30',1,913,'bonus bFlee,20; bonus2 bAddRace2,RC2_THANATOS,5; bonus2 bSubRace2,RC2_THANATOS,5; bonus2 bMagicAddRace2,RC2_THANATOS,5; if(getrefine()>4) { bonus2 bAddRace2,RC2_THANATOS,10; bonus2 bSubRace2,RC2_THANATOS,10; bonus2 bMagicAddRace2,RC2_THANATOS,10; } if(getrefine()>6) { bonus2 bAddRace2,RC2_THANATOS,15; bonus2 bSubRace2,RC2_THANATOS,15; bonus2 bMagicAddRace2,RC2_THANATOS,15; } if(getrefine()>8) { bonus2 bAddRace2,RC2_THANATOS,20; bonus2 bSubRace2,RC2_THANATOS,20; bonus2 bMagicAddRace2,RC2_THANATOS,20; } /* skill 3044,1; */',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19109,'Valhalla_Idol','Valhalla Idol',4,0,NULL,300,NULL,2,NULL,0,0xFFFFFFFF,63,2,512,NULL,'70',0,1423,'bonus bMaxSP,50; bonus4 bAutoSpellWhenHit,"MG_SAFETYWALL",10,50,0; hateffect(HAT_EF_VALHALLA_IDOL,true);',NULL,'hateffect(HAT_EF_VALHALLA_IDOL,false);'); From d9f533165ea731a3b624d87b8bf95aa671b140fb Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 18 May 2020 16:51:46 -0400 Subject: [PATCH 123/212] Fixes Adoramus' interaction with Land Protector (#4920) * Fixes #4876. * Adoramus should not do damage to anyone inside the range of Adoramus. Thanks to @teededung and @Tokeiburu! --- src/map/skill.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 695c9dfb4c..361d8d71b0 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5168,6 +5168,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (tsc && tsc->data[SC_HOVERING] && inf2[INF2_IGNOREHOVERING]) break; // Under Hovering characters are immune to select trap and ground target skills. + if (skill_id == AB_ADORAMUS && map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR)) + break; // No damage should happen if the target is on Land Protector + if( flag&SD_LEVEL ) sflag |= SD_LEVEL; // -1 will be used in packets instead of the skill level if( skill_area_temp[1] != bl->id && !inf2[INF2_ISNPC] ) From 18b642c1740433a4002f28bf54dbc2849b7fea8a Mon Sep 17 00:00:00 2001 From: Aleos Date: Tue, 19 May 2020 15:32:57 -0400 Subject: [PATCH 124/212] Skill Database cleanups (#4902) * When reloading the skill_db clear out Abra, Magic Mushroom, and Reading Spell Book databases as well. * Fixes NC_SHAPESHIFT and NC_REPAIR checking an invalid ItemCost slot based on the old implementation. * Updated a lot of references to the old skill databases. --- conf/battle/skill.conf | 8 ++++---- doc/atcommands.txt | 2 +- doc/item_bonus.txt | 2 +- doc/mapflags.txt | 2 +- doc/script_commands.txt | 10 +++++----- src/map/skill.cpp | 25 ++++++++++++------------- 6 files changed, 24 insertions(+), 25 deletions(-) diff --git a/conf/battle/skill.conf b/conf/battle/skill.conf index d5b9e3b0fd..d124fba658 100644 --- a/conf/battle/skill.conf +++ b/conf/battle/skill.conf @@ -85,7 +85,7 @@ clear_skills_on_warp: 15 //Setting this to YES will override the target mode of ground-based skills with the flag 0x01 to "No Enemies" //The two skills affected by default are Pneuma and Safety Wall (if set to yes, those two skills will not protect everyone, but only allies) -//See db/skill_unit_db.txt for more info. +//See db/(pre-)re/skill_db.yml for more info. defunit_not_enemy: no // Should skills always do at least 'hits' damage when they don't miss/are blocked? @@ -107,11 +107,11 @@ auto_counter_type: 15 // Can ground skills be placed on top of each other? (Note 3) // By default, skills with UF_NOREITERATION set cannot be stacked on top of -// other skills, this setting will override that. (skill_unit_db) +// other skills, this setting will override that. skill_reiteration: 0 // Can ground skills NOT be placed underneath/near players/monsters? (Note 3) -// If set, only skills with UF_NOFOOTSET set will be affected (skill_unit_db) +// If set, only skills with UF_NOFOOTSET set will be affected. skill_nofootset: 1 // Should traps (hunter traps + quagmire) change their target to "all" inside gvg/pvp grounds? (Note 3) @@ -343,7 +343,7 @@ stormgust_knockback: yes // For RENEWAL_CAST (Note 2) // By default skill that has '0' value for Fixed Casting Time will use 20% of cast time // as Fixed Casting Time, and the rest (80%) as Variable Casting Time. -// Put it 0 to disable default Fixed Casting Time (just like -1 is the skill_cast_db.txt). +// Put it 0 to disable default Fixed Casting Time (just like -1 in the skill_db.yml). default_fixed_castrate: 20 // On official servers, skills that hit all targets on a path (e.g. Focused Arrow Strike and First Wind) first diff --git a/doc/atcommands.txt b/doc/atcommands.txt index abf2ba0266..54c2bcae13 100644 --- a/doc/atcommands.txt +++ b/doc/atcommands.txt @@ -1367,7 +1367,7 @@ Affected files: -- pcdb: statpoint.txt, job_exp.txt, skill_tree.txt, attr_fix.txt, job_db1.txt, job_db2.txt, job_basehpsp_db.txt, job_maxhpsp_db.txt, job_param_db.txt, level_penalty.txt -- questdb: quest_db.txt -- script: /npc/*.txt, /npc/*.conf --- skilldb: skill_db.txt, const.txt, skill_require_db.txt, skill_cast_db.txt, skill_castnodex_db.txt, skill_nocast_db.txt, skill_copyable_db.txt, skill_improvise_db.txt, skill_changematerial_db.txt, skill_nonearnpc_db.txt, skill_damage_db.txt, skill_unit_db.txt, abra_db.txt, create_arrow_db.txt, produce_db.txt, spellbook_db.txt, magicmushroom_db.txt +-- skilldb: skill_db.yml, const.txt, skill_nocast_db.txt, skill_changematerial_db.txt, skill_damage_db.txt, abra_db.yml, create_arrow_db.txt, produce_db.txt, spellbook_db.yml, magicmushroom_db.yml -- statusdb: attr_fix.txt, size_fix.txt, refine_db.txt -- achievementdb: achievement_db.conf diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt index 7428fd900d..21e030bd4d 100644 --- a/doc/item_bonus.txt +++ b/doc/item_bonus.txt @@ -65,7 +65,7 @@ This list contains all available constants referenced in the 'bonus' commands. ATF_MISC = Trigger on misc skills * Other values: - Skill (sk): see 'db/(pre-)re/skill_db.txt' (NOTE: Both skill IDs and names, in quotes, are supported.) + Skill (sk): see 'db/(pre-)re/skill_db.yml' (NOTE: Both skill IDs and names, in quotes, are supported.) Monster id (mid): see 'db/(pre-)re/mob_db.txt' Item id (iid): see 'db/(pre-)re/item_db.txt' Item group (ig): see 'db/(pre-)re/item_group_db.txt' and the constants in 'db/const.txt', prefixed with IG_* diff --git a/doc/mapflags.txt b/doc/mapflags.txt index aa6cb66554..bfcc9285f9 100644 --- a/doc/mapflags.txt +++ b/doc/mapflags.txt @@ -304,7 +304,7 @@ for 'Map' type 16 will be applied. This mapflag can also be used to adjust the damage of one skill by a percentage: - skill_name: - Name of the skill in 'db/(pre-)re/skill_db.txt' (ex. SM_BASH). + Name of the skill in 'db/(pre-)re/skill_db.yml' (ex. SM_BASH). To adjust all skill damage, write "all" (without quotes). - caster: the groups for which the adjustment takes effect. (bitmask) BL_PC = Player diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 60fd044798..a6b716f4d3 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -3426,7 +3426,7 @@ recalculating guardians' HP. This function returns the level of the skill of the guild . If the guild does not have that skill, 0 is returned. If the guild does not exist, -1 is returned. -Refer to 'db/(pre-)re/skill_db.txt' for the full list of skills. (GD_* are guild skills) +Refer to 'db/(pre-)re/skill_db.yml' for the full list of skills. (GD_* are guild skills) --------------------------------------- @@ -3459,7 +3459,7 @@ mes "You have " + getMapGuildUsers("prontera",getcharid(2)) + " guild members in This function returns the level of the specified skill that the invoking character has. If they don't have the skill, 0 will be returned. The full list -of character skills is available in 'db/(pre-)re/skill_db.txt'. +of character skills is available in 'db/(pre-)re/skill_db.yml'. There are two main uses for this function, it can check whether the character has a skill or not, and it can tell you if the level is high enough. @@ -5583,7 +5583,7 @@ levels. This refers to the invoking character and will only work if the invoking character is a member of a guild AND its guild master, otherwise no failure message will be given and no error will occur, but nothing will happen - same about the guild skill trying to exceed the possible maximum. The full list of -guild skills is available in 'db/(pre-)re/skill_db.txt', these are all the GD_ skills at +guild skills is available in 'db/(pre-)re/skill_db.yml', these are all the GD_ skills at the end. // This would give your character's guild one level of Approval (GD_APPROVAL ID @@ -5970,7 +5970,7 @@ These commands will give the invoking character a specified skill. This is also used for item scripts. Level is obvious. Skill id is the ID number of the skill in question as per -'db/(pre-)re/skill_db.txt'. It is not known for certain whether this can be used to give +'db/(pre-)re/skill_db.yml'. It is not known for certain whether this can be used to give a character a monster's skill, but you're welcome to try with the numbers given in 'db/(pre-)re/mob_skill_db.txt'. @@ -9702,7 +9702,7 @@ when pet performance is activated. This will make the pet use a specified support skill on the owner whenever the HP and SP are below the given percent values, with a specified delay time -between activations. The skill numbers are as per 'db/(pre-)re/skill_db.txt'. +between activations. The skill numbers are as per 'db/(pre-)re/skill_db.yml'. It's not quite certain who's stats will be used for the skills cast, the character's or the pets. Probably, Skotlex can answer that question. diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 361d8d71b0..645a951ec3 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -765,7 +765,7 @@ int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 sk /** * Making Plagiarism and Reproduce check their own function - * Previous prevention for NPC skills, Wedding skills, and INF3_DIS_PLAGIA are removed since we use skill_copyable_db.txt [Cydh] + * Previous prevention for NPC skills, Wedding skills, and INF3_DIS_PLAGIA are removed since we use skill_db.yml [Cydh] * @param sd: Player who will copy the skill * @param skill_id: Target skill * @return 0 - Cannot be copied; 1 - Can be copied by Plagiarism 2 - Can be copied by Reproduce @@ -1507,7 +1507,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 sc_start(src,bl,SC_STUN,(10+3*skill_lv),skill_lv,skill_get_time(skill_id,skill_lv)); sc_start(src,bl,SC_BLIND,(10+3*skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv)); #ifdef RENEWAL - sc_start(src, bl, SC_RAID, 100, skill_lv, 10000); // Hardcoded to 10 seconds since skill_cast_db is full + sc_start(src, bl, SC_RAID, 100, skill_lv, 10000); // Hardcoded to 10 seconds since Duration1 and Duration2 are used break; case RG_BACKSTAP: @@ -14148,7 +14148,7 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_ } /** - * Process skill unit each interval (sg->interval, see interval field of skill_unit_db.txt) + * Process skill unit each interval (sg->interval, see interval field of skill_db.yml) * @param unit Skill unit * @param bl Valid 'target' above the unit, that has been check in skill_unit_timer_sub_onplace * @param tick @@ -16892,10 +16892,10 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint switch( skill_id ) { /* Skill level-dependent checks */ - case NC_SHAPESHIFT: // NOTE: Please make sure Magic_Gear_Fuel in the last position in skill_require_db.txt - case NC_REPAIR: // NOTE: Please make sure Repair_Kit in the last position in skill_require_db.txt - req.itemid[1] = skill->require.itemid[MAX_SKILL_ITEM_REQUIRE-1]; - req.amount[1] = skill->require.amount[MAX_SKILL_ITEM_REQUIRE-1]; + case NC_SHAPESHIFT: // NOTE: Magic_Gear_Fuel must be last in the ItemCost list depending on the skill's max level + case NC_REPAIR: // NOTE: Repair_Kit must be last in the ItemCost list depending on the skill's max level + req.itemid[1] = skill->require.itemid[skill->max - 1]; + req.amount[1] = skill->require.amount[skill->max - 1]; case KO_MAKIBISHI: case GN_FIRE_EXPANSION: case SO_SUMMON_AGNI: @@ -18811,7 +18811,7 @@ static int skill_get_new_group_id(void) * @param count How many 'cells' used that needed. Related with skill layout * @param skill_id ID of used skill * @param skill_lv Skill level of used skill - * @param unit_id Unit ID (look at skill_unit_db.txt) + * @param unit_id Unit ID (see skill.hpp::e_skill_unit_id) * @param limit Lifetime for skill unit, uses skill_get_time(skill_id, skill_lv) * @param interval Time interval * @return skill_unit_group @@ -22995,12 +22995,8 @@ static bool skill_parse_row_skilldamage(char* split[], int columns, int current) /*=============================== * DB reading. - * skill_db.txt - * skill_require_db.txt - * skill_cast_db.txt - * skill_castnodex_db.txt + * skill_db.yml * skill_nocast_db.txt - * skill_unit_db.txt * produce_db.txt * create_arrow_db.txt *------------------------------*/ @@ -23054,6 +23050,9 @@ static void skill_readdb(void) void skill_reload (void) { skill_db.clear(); + abra_db.clear(); + magic_mushroom_db.clear(); + reading_spellbook_db.clear(); skill_readdb(); initChangeTables(); // Re-init Status Change tables From 5d4fd1d3b71e3e336add4709c27fc816d6819a46 Mon Sep 17 00:00:00 2001 From: Aleos Date: Tue, 19 May 2020 17:19:34 -0400 Subject: [PATCH 125/212] Resolves Autospell displaying errors to console (#4921) * Fixes #4883 * Fixes Autospell displaying invalid skill errors when clicking Ok or Cancel. Thanks to @admkakaroto! --- src/map/skill.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 645a951ec3..5489bd8eaa 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -17636,15 +17636,15 @@ int skill_autospell(struct map_session_data *sd, uint16 skill_id) { nullpo_ret(sd); - if (SKILL_CHK_GUILD(skill_id)) + if (skill_id == 0 || skill_get_index_(skill_id, true, __FUNCTION__, __FILE__, __LINE__) == 0 || SKILL_CHK_GUILD(skill_id)) return 0; uint16 lv = pc_checkskill(sd, skill_id), skill_lv = sd->menuskill_val; - - if(!skill_lv || !lv) return 0; // Player must learn the skill before doing auto-spell [Lance] - uint16 maxlv = 1; + if (skill_lv == 0 || lv == 0) + return 0; // Player must learn the skill before doing auto-spell [Lance] + #ifdef RENEWAL if ((skill_id == MG_COLDBOLT || skill_id == MG_FIREBOLT || skill_id == MG_LIGHTNINGBOLT) && sd->sc.data[SC_SPIRIT] && sd->sc.data[SC_SPIRIT]->val2 == SL_SAGE) maxlv = 10; //Soul Linker bonus. [Skotlex] From 92a466c758fe8cea800bbe8b1d55f5f63f089e13 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Wed, 20 May 2020 06:00:28 +0200 Subject: [PATCH 126/212] Mob and NPC Identity Update --- db/re/mob_db.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/db/re/mob_db.txt b/db/re/mob_db.txt index d237060a85..aece8b1699 100644 --- a/db/re/mob_db.txt +++ b/db/re/mob_db.txt @@ -3983,6 +3983,24 @@ //20884,G_ILL_STROUF //20885,G_ILL_PHEN +//20901,DISASTER_OMEN +//20902,DISASTER_WIND +//20903,CONQUER_INCARNATION +//20904,FAMINE_INCARNATION +//20905,APPETITE_INCARNATION +//20906,DISASTER_SYMBOL +//20907,DEVIL_EYE +//20908,WAR_INCARNATION +//20909,DEATH_INCARNATION +//20910,CARNIVOROUS +//20911,SINS_JUSTICE +//20912,SINS_BRAVE +//20913,SINS_MODERATION +//20914,SINS_WISDOM +//20915,G_SINS_JUSTICE +//20916,G_SINS_BRAVE +//20917,G_SINS_MODERATION +//20918,G_SINS_WISDOM //20919,CARAT_TWEVENT //31999,HUNTING_GID_DEFAULT From c3dda07180538755eb4a774ee64dddc91da4612d Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Wed, 20 May 2020 06:00:42 +0200 Subject: [PATCH 127/212] SQL synchronization --- sql-files/mob_db_re.sql | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/sql-files/mob_db_re.sql b/sql-files/mob_db_re.sql index 6161c5686a..1853b43ba7 100644 --- a/sql-files/mob_db_re.sql +++ b/sql-files/mob_db_re.sql @@ -4050,6 +4050,24 @@ REPLACE INTO `mob_db_re` VALUES (3790,'SWEETS_DROPS','Sweets Drops','Sweets Drop #20884,G_ILL_STROUF #20885,G_ILL_PHEN +#20901,DISASTER_OMEN +#20902,DISASTER_WIND +#20903,CONQUER_INCARNATION +#20904,FAMINE_INCARNATION +#20905,APPETITE_INCARNATION +#20906,DISASTER_SYMBOL +#20907,DEVIL_EYE +#20908,WAR_INCARNATION +#20909,DEATH_INCARNATION +#20910,CARNIVOROUS +#20911,SINS_JUSTICE +#20912,SINS_BRAVE +#20913,SINS_MODERATION +#20914,SINS_WISDOM +#20915,G_SINS_JUSTICE +#20916,G_SINS_BRAVE +#20917,G_SINS_MODERATION +#20918,G_SINS_WISDOM #20919,CARAT_TWEVENT #31999,HUNTING_GID_DEFAULT From bf4b41bd66b3d372b09ad0076216ebc834937e09 Mon Sep 17 00:00:00 2001 From: CairoLee Date: Wed, 20 May 2020 21:22:53 +0800 Subject: [PATCH 128/212] Fixes a crash caused by invalid skill ID (#4935) * Fixes #4934. * Fixes a potential crash when using atcommand useskill. Thanks to @Stingor and @CairoLee! --- src/map/atcommand.cpp | 8 ++++++++ src/map/unit.cpp | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index b5d04a12c4..d719469e11 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -5835,6 +5835,14 @@ ACMD_FUNC(useskill) return -1; } + if (!skill_id || !skill_db.find(skill_id)) { + clif_displaymessage(fd, msg_txt(sd, 198)); // This skill number doesn't exist. + return -1; + } + + if (!skill_lv) + skill_lv = 1; + if(!strcmp(atcmd_player_name,"self")) pl_sd = sd; //quick keyword else if ( (pl_sd = map_nick2sd(atcmd_player_name,true)) == NULL ){ diff --git a/src/map/unit.cpp b/src/map/unit.cpp index 6c8b6de35b..2d0a74cbff 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -1558,6 +1558,9 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui int inf = skill_get_inf(skill_id); std::shared_ptr skill = skill_db.find(skill_id); + if (!skill) + return 0; + // temp: used to signal combo-skills right now. if (sc && sc->data[SC_COMBO] && skill_is_combo(skill_id) && @@ -2035,6 +2038,9 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui if (sc && !sc->count) sc = NULL; + if (!skill_db.find(skill_id)) + return 0; + if( sd ) { if( skill_isNotOk(skill_id, sd) || !skill_check_condition_castbegin(sd, skill_id, skill_lv) ) return 0; From 746c1bdfa9d3eb71405a00ecc6bfe59a91e8a93a Mon Sep 17 00:00:00 2001 From: LordWhiplash <62680611+LordWhiplash@users.noreply.github.com> Date: Wed, 20 May 2020 17:18:31 -0300 Subject: [PATCH 129/212] Fixes MO_EXTREMITYFIST (#4886) --- src/map/battle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 044f665c95..831542a766 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -3846,11 +3846,11 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * #endif break; case MO_EXTREMITYFIST: + skillratio += 100 * (7 + sstatus->sp / 10); #ifdef RENEWAL if (wd->miscflag&1) - skillratio += 100; // More than 5 spirit balls active + skillratio *= 2; // More than 5 spirit balls active #endif - skillratio += 100 * (7 + sstatus->sp / 10); skillratio = min(500000,skillratio); //We stop at roughly 50k SP for overflow protection break; case MO_TRIPLEATTACK: From ab628b23690a45b6acce359178f4e39ff0876984 Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 20 May 2020 16:54:42 -0400 Subject: [PATCH 130/212] Remove Summoner Hide when changing maps (#4958) * Fixes #4953. * Remove Summoner Hide when changing maps to avoid equipment from being stripped due to the inability to change equipment while the status is active. Thanks to @Everade! --- src/map/pc.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 6f25667997..0184a56ffd 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -5865,6 +5865,7 @@ enum e_setpos pc_setpos(struct map_session_data* sd, unsigned short mapindex, in status_change_end(&sd->bl, SC_PROPERTYWALK, INVALID_TIMER); status_change_end(&sd->bl, SC_CLOAKING, INVALID_TIMER); status_change_end(&sd->bl, SC_CLOAKINGEXCEED, INVALID_TIMER); + status_change_end(&sd->bl, SC_SUHIDE, INVALID_TIMER); } for(int i = 0; i < EQI_MAX; i++ ) { if( sd->equip_index[i] >= 0 ) From a34a2f6de085132184cd270c400e7f2a830e3f93 Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 20 May 2020 17:20:37 -0400 Subject: [PATCH 131/212] Fixes Blood Sucker not being able to be recast (#4968) * Fixes #4964. * Fixes Blood Sucker not being able to be recast on another map if caster dies while active. * Minor cleanups and added safety checks. Thanks to @Everade! --- src/map/skill.cpp | 4 ++-- src/map/status.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 5489bd8eaa..8b4c49f591 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -10953,12 +10953,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if( sc && sc->bs_counter < skill_get_maxcount( skill_id , skill_lv) ) { if( tsc && tsc->data[type] ){ - (sc->bs_counter)--; + sc->bs_counter--; status_change_end(src, type, INVALID_TIMER); // the first one cancels and the last one will take effect resetting the timer } clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); sc_start2(src,bl, type, 100, skill_lv, src->id, skill_get_time(skill_id,skill_lv)); - (sc->bs_counter)++; + sc->bs_counter++; } else if( sd ) { clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); break; diff --git a/src/map/status.cpp b/src/map/status.cpp index 7cd2e1f138..cf25084fc7 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -13428,9 +13428,12 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const case SC_BLOODSUCKER: if( sce->val2 ) { struct block_list *src = map_id2bl(sce->val2); - if(src) { + + if (src && !status_isdead(src)) { struct status_change *sc2 = status_get_sc(src); - sc2->bs_counter--; + + if (sc2) + sc2->bs_counter--; } } break; From 20945d71db2f93909af751a10541837cef0a3edf Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 20 May 2020 18:09:44 -0400 Subject: [PATCH 132/212] Removes nullpo checks from CSV2YAML (#4979) * Fixes #4791. * Removes two nullpo checks from CSV2YAML. * Fixes undefined reference compile errors. Thanks to @ecdarreola! --- src/tool/csv2yaml.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index 729f891678..5aa379cafd 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -150,7 +150,8 @@ void script_set_constant_( const char* name, int64 value, const char* constant_n } const char* constant_lookup( int32 value, const char* prefix ){ - nullpo_retr( nullptr, prefix ); + if (prefix == nullptr) + return nullptr; for( auto const& pair : constants ){ // Same prefix group and same value @@ -163,7 +164,8 @@ const char* constant_lookup( int32 value, const char* prefix ){ } int64 constant_lookup_int(const char* constant) { - nullpo_retr(-100, constant); + if (constant == nullptr) + return -100; for (auto const &pair : constants) { if (strlen(pair.first) == strlen(constant) && strncasecmp(pair.first, constant, strlen(constant)) == 0) { From 70d6876494d958d37e024c1c0652c49c7d7c8206 Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 20 May 2020 18:50:04 -0400 Subject: [PATCH 133/212] Corrects NPC_DARKBREATH behavior (#4982) * Fixes #4864. * Adjusts damage formula to official. * Adjusts damage type from Misc to Magic. * Skill now has a 50% success chance to damage the target. * Removes Flee and Defense Card ignore flags. Thanks to @Masao87 and @mrjnumber1! --- db/pre-re/skill_db.yml | 5 +---- db/re/skill_db.yml | 5 +---- src/map/battle.cpp | 6 +++--- src/map/skill.cpp | 2 ++ 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index 66e834f131..22f97f1eed 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -5836,11 +5836,8 @@ Body: Name: NPC_DARKBREATH Description: Dark Breath MaxLevel: 5 - Type: Misc + Type: Magic TargetType: Attack - DamageFlags: - IgnoreFlee: true - IgnoreDefCard: true Flags: IsNpc: true Range: 9 diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index d326054ac0..85b8450c08 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -6121,11 +6121,8 @@ Body: Name: NPC_DARKBREATH Description: Dark Breath MaxLevel: 5 - Type: Misc + Type: Magic TargetType: Attack - DamageFlags: - IgnoreFlee: true - IgnoreDefCard: true Flags: IsNpc: true Range: 9 diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 831542a766..772581dd49 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -6164,6 +6164,9 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list #endif } break; + case NPC_DARKBREATH: + ad.damage = tstatus->hp * (skill_lv <= 5 ? 100 / (2 * 6 - skill_lv) : 50) / 100; + break; case PF_SOULBURN: ad.damage = tstatus->sp * 2; break; @@ -6907,9 +6910,6 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * case NPC_SMOKING: md.damage = 3; break; - case NPC_DARKBREATH: - md.damage = tstatus->max_hp * skill_lv * 10 / 100; - break; case NPC_EVILLAND: md.damage = skill_calc_heal(src,target,skill_id,skill_lv,false); break; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 8b4c49f591..81eb74496e 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5517,6 +5517,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case NPC_DARKBREATH: clif_emotion(src,ET_ANGER); + if (rnd() % 2 == 0) + break; // 50% chance case SN_FALCONASSAULT: #ifndef RENEWAL case PA_PRESSURE: From 0fba10c3246af7a6f4f3b1fa98f50656a5458413 Mon Sep 17 00:00:00 2001 From: Aleos Date: Wed, 20 May 2020 21:21:31 -0400 Subject: [PATCH 134/212] Fixes a potential crash with atcommand time (#4989) * Fixes #4960. * Adds a timer data validation check for atcommand time. Thanks to @marky291! --- src/map/atcommand.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index d719469e11..c518459e57 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -4851,18 +4851,22 @@ ACMD_FUNC(servertime) clif_displaymessage(fd, msg_txt(sd,232)); // Game time: The game is in permanent night. } else if (battle_config.night_duration == 0) if (night_flag == 1) { // we start with night - timer_data = get_timer(day_timer_tid); - sprintf(temp, msg_txt(sd,233), txt_time(DIFF_TICK(timer_data->tick,gettick())/1000)); // Game time: The game is in night for %s. - clif_displaymessage(fd, temp); - clif_displaymessage(fd, msg_txt(sd,234)); // Game time: After, the game will be in permanent daylight. + if ((timer_data = get_timer(day_timer_tid)) != nullptr) { + sprintf(temp, msg_txt(sd,233), txt_time(DIFF_TICK(timer_data->tick,gettick())/1000)); // Game time: The game is in night for %s. + clif_displaymessage(fd, temp); + clif_displaymessage(fd, msg_txt(sd,234)); // Game time: After, the game will be in permanent daylight. + } else + clif_displaymessage(fd, msg_txt(sd,232)); // Game time: The game is in permanent night. } else clif_displaymessage(fd, msg_txt(sd,231)); // Game time: The game is in permanent daylight. else if (battle_config.day_duration == 0) if (night_flag == 0) { // we start with day - timer_data = get_timer(night_timer_tid); - sprintf(temp, msg_txt(sd,235), txt_time(DIFF_TICK(timer_data->tick,gettick())/1000)); // Game time: The game is in daylight for %s. - clif_displaymessage(fd, temp); - clif_displaymessage(fd, msg_txt(sd,236)); // Game time: After, the game will be in permanent night. + if ((timer_data = get_timer(night_timer_tid)) != nullptr) { + sprintf(temp, msg_txt(sd,235), txt_time(DIFF_TICK(timer_data->tick,gettick())/1000)); // Game time: The game is in daylight for %s. + clif_displaymessage(fd, temp); + clif_displaymessage(fd, msg_txt(sd,236)); // Game time: After, the game will be in permanent night. + } else + clif_displaymessage(fd, msg_txt(sd,231)); // Game time: The game is in permanent daylight. } else clif_displaymessage(fd, msg_txt(sd,232)); // Game time: The game is in permanent night. else { From 43caf7cc0acde6cdb5ee9b040737b26c9ca6ec60 Mon Sep 17 00:00:00 2001 From: LordWhiplash <62680611+LordWhiplash@users.noreply.github.com> Date: Thu, 21 May 2020 10:02:23 -0300 Subject: [PATCH 135/212] SU_HISS Perfect dodge fix (#4991) * Fixes #4990. * Adds missing x10 rate for perfect dodge calculations. Thanks to @Balferian and @LordWhiplash! --- src/map/status.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/status.cpp b/src/map/status.cpp index cf25084fc7..776f2a6a85 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -6997,7 +6997,7 @@ static signed short status_calc_flee2(struct block_list *bl, struct status_chang if(sc->data[SC__UNLUCKY]) flee2 -= flee2 * sc->data[SC__UNLUCKY]->val2 / 100; if (sc->data[SC_HISS]) - flee2 += sc->data[SC_HISS]->val2; + flee2 += sc->data[SC_HISS]->val2*10; if (sc->data[SC_DORAM_FLEE2]) flee2 += sc->data[SC_DORAM_FLEE2]->val1; From b8ee97b6a15d453c6473bf898429ead14bb0a887 Mon Sep 17 00:00:00 2001 From: Atemo Date: Thu, 21 May 2020 21:13:45 +0200 Subject: [PATCH 136/212] Added rental_item_novalue config (#3749) * Added a config to always sell the rental items to NPC for 0 Thanks to @Lemongrass3110, @cydh, @aleos89, @Daegaladh for the review ! --- conf/battle/items.conf | 3 +++ src/map/battle.cpp | 1 + src/map/battle.hpp | 1 + src/map/clif.cpp | 10 +++++++--- src/map/npc.cpp | 5 ++++- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/conf/battle/items.conf b/conf/battle/items.conf index be5e6448d0..bc2c21ce5a 100644 --- a/conf/battle/items.conf +++ b/conf/battle/items.conf @@ -134,6 +134,9 @@ broadcast_hide_name: 2 // Enable to sell rental item to NPC shop? (Note 1) rental_transaction: yes +// Sell rental item for 0 to NPC shop regardless of the item value in item_db? (Note 1) +rental_item_novalue: no + // Minimum purchase price of items at a normal Shop // Officially items cannot be purchased for less than 1 Zeny min_shop_buy: 1 diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 772581dd49..712db7102c 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -8952,6 +8952,7 @@ static const struct _battle_data { { "devotion_standup_fix", &battle_config.devotion_standup_fix, 1, 0, 1, }, { "feature.bgqueue", &battle_config.feature_bgqueue, 1, 0, 1, }, { "homunculus_exp_gain", &battle_config.homunculus_exp_gain, 10, 0, 100, }, + { "rental_item_novalue", &battle_config.rental_item_novalue, 1, 0, 1, }, #include "../custom/battle_config_init.inc" }; diff --git a/src/map/battle.hpp b/src/map/battle.hpp index 17c53d4305..5c0938e9cc 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -676,6 +676,7 @@ struct Battle_Config int devotion_standup_fix; int feature_bgqueue; int homunculus_exp_gain; + int rental_item_novalue; #include "../custom/battle_config_struct.inc" }; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index d3a7adbd85..94a7291cbe 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -2038,9 +2038,13 @@ void clif_selllist(struct map_session_data *sd) if( !pc_can_sell_item(sd, &sd->inventory.u.items_inventory[i], nd->subtype)) continue; - val=sd->inventory_data[i]->value_sell; - if( val < 0 ) - continue; + if (battle_config.rental_item_novalue && sd->inventory.u.items_inventory[i].expire_time) + val = 0; + else { + val = sd->inventory_data[i]->value_sell; + if( val < 0 ) + continue; + } WFIFOW(fd,4+c*10)=i+2; WFIFOL(fd,6+c*10)=val; WFIFOL(fd,10+c*10)=pc_modifysellvalue(sd,val); diff --git a/src/map/npc.cpp b/src/map/npc.cpp index f65a3c5755..f86995f35e 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -2211,7 +2211,10 @@ uint8 npc_selllist(struct map_session_data* sd, int n, unsigned short *item_list return 1; // In official server, this illegal attempt the player will be disconnected } - value = pc_modifysellvalue(sd, sd->inventory_data[idx]->value_sell); + if (battle_config.rental_item_novalue && sd->inventory.u.items_inventory[idx].expire_time) + value = 0; + else + value = pc_modifysellvalue(sd, sd->inventory_data[idx]->value_sell); z+= (double)value*amount; } From 46aa15a1827aece8caa8547c80f8cd54f477de49 Mon Sep 17 00:00:00 2001 From: LordWhiplash <62680611+LordWhiplash@users.noreply.github.com> Date: Thu, 21 May 2020 23:24:29 -0300 Subject: [PATCH 137/212] Summoner corrections (#4993) * Fixes SU_POWEROFSEA max HP and max SP bonus when investing more than 20 skill points. * Fixes SU_SPIRITOFLAND and SU_CN_POWDERING combo's perfect dodge bonus. Thanks to @LordWhiplash, @qwerty7vp, and @Balferian! --- src/map/skill.cpp | 2 +- src/map/status.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 81eb74496e..2646dd40bb 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -12439,7 +12439,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case SU_NYANGGRASS: if (sd && pc_checkskill(sd, SU_SPIRITOFLAND)) { if (skill_id == SU_CN_POWDERING) - sc_start(src, src, SC_DORAM_FLEE2, 100, sd->status.base_level / 12, skill_get_time(SU_SPIRITOFLAND, 1)); + sc_start(src, src, SC_DORAM_FLEE2, 100, sd->status.base_level * 10 / 12, skill_get_time(SU_SPIRITOFLAND, 1)); else sc_start(src, src, SC_DORAM_MATK, 100, sd->status.base_level, skill_get_time(SU_SPIRITOFLAND, 1)); } diff --git a/src/map/status.cpp b/src/map/status.cpp index 776f2a6a85..b48a95e6ea 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -3321,7 +3321,7 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += 1000; if ((pc_checkskill(sd, SU_TUNABELLY) + pc_checkskill(sd, SU_TUNAPARTY) + pc_checkskill(sd, SU_BUNCHOFSHRIMP) + pc_checkskill(sd, SU_FRESHSHRIMP) + pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19) - bonus += 2000; + bonus += 3000; } if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0) bonus += 350 * skill_lv + (skill_lv > 4 ? 250 : 0); @@ -3499,7 +3499,7 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { bonus += 100; if ((pc_checkskill(sd, SU_TUNABELLY) + pc_checkskill(sd, SU_TUNAPARTY) + pc_checkskill(sd, SU_BUNCHOFSHRIMP) + pc_checkskill(sd, SU_FRESHSHRIMP) + pc_checkskill(sd, SU_GROOMING) + pc_checkskill(sd, SU_PURRING) + pc_checkskill(sd, SU_SHRIMPARTY)) > 19) - bonus += 200; + bonus += 300; } if ((skill_lv = pc_checkskill(sd, NV_BREAKTHROUGH)) > 0) bonus += 30 * skill_lv + (skill_lv > 4 ? 50 : 0); From e1aed76410f305014cd84373ca81b046ed39d3c7 Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 22 May 2020 15:10:26 +0200 Subject: [PATCH 138/212] Added enchant npc for temporal shoes slotted and ogh card exchange (#4985) --- npc/re/merchants/OldGlastHeim_merchants.txt | 257 ++++++++++++++++++++ 1 file changed, 257 insertions(+) diff --git a/npc/re/merchants/OldGlastHeim_merchants.txt b/npc/re/merchants/OldGlastHeim_merchants.txt index 01e8d47718..b9c2b5cd9c 100644 --- a/npc/re/merchants/OldGlastHeim_merchants.txt +++ b/npc/re/merchants/OldGlastHeim_merchants.txt @@ -339,3 +339,260 @@ S_Slot: } close; } + +// Temporal shoes slotted - npc enchant +glast_01,184,283,4 script Dark magic master#pa082 1_F_01,{ + disable_items; + if ((MaxWeight - Weight) < 1000) { + mes "Your bag is too heavy. Reduce some weight and come back."; + close; + } + if (checkweight(1201,1) == 0) { + mes "You seem to be carrying too many items. Put some items in storage and come back again."; + close; + } + // requirements + .@coagulated_id = 6608;// Coagulated_Spell + .@polluted_id = 6755;// Polluted_Spell + .@cost_zeny = 100000; + + mes "[Dark magic master]"; + mes "I deal with the Temporal Boots with socket only."; + next; + if (select( "How does the enchanting work?", "Give effect to my Temporal Boots" ) == 1) { + mes "[Dark magic master]"; + mes "You should ask Hugin's magic master all the basic things. I want deeper conversation about enchating work."; + next; + mes "[Dark magic master]"; + mes "I need 4 items. ^0000ff" + callfunc("F_InsertComma",.@cost_zeny) + ", " + getitemname(.@polluted_id) + ", " + getitemname(.@coagulated_id) + ", Temporal Boots(Socket) Series^000000. If you don't have any of these, I cannot help you."; + next; + mes "[Dark magic master]"; + mes "It's my small hobby.. To enchant Socketed Temporal Boots using polluted and coagulated spell."; + next; + mes "[Dark magic master]"; + mes "Of course, you must cope with bigger risk of destruction whenever you'd like to enchant again and again."; + next; + mes "[Dark magic master]"; + mes "The enchant order is same as Hugin's magic master's enchantment. Please refer to his explanation."; + close; + } + .@equip_id = getequipid(EQI_SHOES); + + switch(.@equip_id) { + case 22006: // Temporal_Str_Boots_ + case 22007: // Temporal_Vit_Boots_ + case 22008: // Temporal_Dex_Boots_ + case 22009: // Temporal_Int_Boots_ + case 22010: // Temporal_Agi_Boots_ + case 22011: // Temporal_Luk_Boots_ + case 22113: // Modified_Str_Boots_ + case 22114: // Modified_Int_Boots_ + case 22115: // Modified_Agi_Boots_ + case 22116: // Modified_Vit_Boots_ + case 22117: // Modified_Dex_Boots_ + case 22118: // Modified_Luk_Boots_ + break; + case -1: + mes "[Dark magic master]"; + mes "Are you wearing the item?"; + close; + default: + mes "[Dark magic master]"; + mes "This is not the right item for this enchant. Remember, only those 6 types of Temporal Boots with socket are available for hidden enchanting.."; + close; + } + // enchants ID + setarray .@enchant_1[0],4808,4832,4814,4741,4869,4752;// Fighting_Spirit4 Expert_Archer1 Spell2 Vitality2 DelayafterAttack1Lv Luck3 + setarray .@enchant_2[0],4820,4833,4813,4742,4872,4753;// Fighting_Spirit5 Expert_Archer2 Spell3 Vitality3 DelayafterAttack2Lv Luck4 + setarray .@enchant_3[0],4821,4834,4812,4861,4873,4754;// Fighting_Spirit6 Expert_Archer3 Spell4 MHP1 DelayafterAttack3Lv Luck5 + setarray .@enchant_4[0],4822,4835,4826,4862,4881,4755;// Fighting_Spirit7 Expert_Archer4 Spell5 MHP2 DelayafterAttack4Lv Luck6 + + // requirements amount + setarray .@en_amount_coag[0],3,10,20,40,50; + setarray .@en_amount_polluted[0],1,2,4,7,10; + + // (custom) chances of success (official value unknown) + setarray .@chances[0],100,70,70,70,70; + + // data of item equipped + .@equip_name$ = getequipname(EQI_SHOES); + setarray .@card[0], + getequipcardid(EQI_SHOES,0), + getequipcardid(EQI_SHOES,1), + getequipcardid(EQI_SHOES,2), + getequipcardid(EQI_SHOES,3); + copyarray .@equip_card[0], .@card[0], 4; + .@equip_refine = getequiprefinerycnt(EQI_SHOES); + + if (.@card[2] > 0) { + mes "[Dark magic master]"; + mes "These boots have already passed the enchanting limit. We can't enchant them any more."; + close; + } + if (.@card[3] == 0) {// 4th slot 1st try enchanting + .@amount_coag = .@en_amount_coag[0]; + .@amount_poll = .@en_amount_polluted[0]; + + mes "[Dark magic master]"; + mes "Want to enchant ^0000ff" + .@equip_name$ + " (Socket)^000000? For the 1st enchanting, you need ^0000ff" + .@amount_poll + " " + getitemname(.@polluted_id) + ", " + .@amount_coag + " " + getitemname(.@coagulated_id) + ", and " + callfunc("F_InsertComma",.@cost_zeny) + " zeny^000000."; + mes "It has some risk of failing.."; + next; + .@s = select( "Quit", "Fighting Spirit", "Archery", "Spell", "Vitality", "Attack Speed", "Lucky" ) - 2; + if (.@s == -1) { + mes "[Dark magic master]"; + mes "Ok, come back when you are ready."; + close; + } + .@card[3] = .@enchant_1[.@s]; + .@string$ = "enchant number ^6300001^000000."; + .@num = 0; + } + else { + for ( .@num = 1; .@num < 5; .@num++ ) { + for ( .@type = 0; .@type < 6 && .@card[3] != getd( ".@enchant_" + .@num + "[" + .@type + "]" ); .@type++ ) + continue; + if (.@type < 6) + break; + } + if (.@num == 5) { + mes "[Dark magic master]"; + mes "Something wrong happened."; + close; + } + .@amount_coag = .@en_amount_coag[.@num]; + .@amount_poll = .@en_amount_polluted[.@num]; + + mes "[Dark magic master]"; + if (.@num == 4) { + .@card[2] = callfunc("F_Rand",4875,4876,4877,4878,4879,4880);// Bear's_Power, Runaway_Magic, Speed_Of_Light, Muscle_Fool, Hawkeye, Lucky_Day + .@string$ = "^990000 Bonus effect ^000000 upgrade."; + mes "Would you like a random bonus effect for the 3rd slot? You need ^0000ff" + .@amount_poll + " " + getitemname(.@polluted_id) + ", " + .@amount_coag + " " + getitemname(.@coagulated_id) + ", and " + callfunc("F_InsertComma",.@cost_zeny) + " zeny^000000. But it has high risk of failing.."; + } + else { + .@level = .@num + 1; + .@card[3] = getd( ".@enchant_" + (.@num+1) + "[" + .@type + "]" ); + .@string$ = "enchant number ^990000" + .@level + "^000000."; + mes "Enchanting ^0000ff" + .@equip_name$ + " (Socket)^000000's 4th slot as ^0000ff" + .@level + "^000000 level effect. Requires ^0000ff" + .@amount_poll + " " + getitemname(.@polluted_id) + ", " + .@amount_coag + " " + getitemname(.@coagulated_id) + ", and " + callfunc("F_InsertComma",.@cost_zeny) + " z^000000. It has some risk of failing.."; + } + next; + if (select( "Quit", "Effect Upgrade!" ) == 1) { + mes "[Dark magic master]"; + mes "Ok, come back when you are ready."; + close; + } + } + if (countitem(.@coagulated_id) < .@amount_coag) { + mes "[Dark magic master]"; + mes "Hmm, you are missing " + (.@amount_coag - countitem(.@coagulated_id)) + " " + getitemname(.@coagulated_id) + " items. Go get more, and then we can talk about more enchants."; + close; + } + if (countitem(.@polluted_id) < .@amount_poll) { + mes "[Dark magic master]"; + mes "Hmm, you are missing " + (.@amount_poll - countitem(.@polluted_id)) + " " + getitemname(.@polluted_id) + " items. Go get more, and then we can talk about more enchants."; + close; + } + if (Zeny < .@cost_zeny) { + mes "[Dark magic master]"; + mes "You must bring ^0000ff" + callfunc("F_InsertComma",.@cost_zeny) + " zeny^000000. Nothing is free you know..."; + close; + } + delitem .@coagulated_id, .@amount_coag; + delitem .@polluted_id, .@amount_poll; + Zeny -= .@cost_zeny; + + // anti-hack + if (callfunc("F_IsEquipIDHack", EQI_SHOES, .@equip_id) || callfunc("F_IsEquipCardHack", EQI_SHOES, .@equip_card[0], .@equip_card[1], .@equip_card[2], .@equip_card[3]) || callfunc("F_IsEquipRefineHack", EQI_SHOES, .@equip_refine)) + close; + + delequip EQI_SHOES; + if (.@chances[.@num] < rand(1,100)) { + specialeffect2 EF_LORD; + mes "[Dark magic master]"; + mes "Arrggg, we failed. Better luck next time."; + close; + } + specialeffect2 EF_REPAIRWEAPON; + mes "[Hugin's Magician]"; + mes "Trying for " + .@string$; + getitem2 .@equip_id,1,1,.@equip_refine,0,0,0,.@card[2],.@card[3]; + close; +} + +// Items exchange for card +glast_01,216,292,5 script Portrait collector#0002 4_M_OILMAN,{ + disable_items; + if ((MaxWeight - Weight) < 1000) { + mes "Your bag is too heavy. Reduce some weight and come back."; + close; + } + if (checkweight(1201,1) == 0) { + mes "You seem to be carrying too many items. Put some items in storage and come back again."; + close; + } + .@coagulated_id = 6608; // Coagulated_Spell + .@polluted_id = 6755; // Polluted_Spell + .@white_card = 4608; // White_Knightage_Card + .@khalitzburg_card = 4609; // Khaliz_Knightage_Card + + mes "[Portrait collector]"; + mes "I have been collecting portraits for an year already. Now it's time to show people my collection."; + next; + mes "[Portrait collector]"; + mes "Hey, do you have a lot of " + getitemname(.@polluted_id) + " or " + getitemname(.@coagulated_id) + "? If so, why don't you trade a nice portrait that I have?"; + next; + switch( select( "Cancel", "Exchange for " + getitemname(.@white_card), "Exchange for " + getitemname(.@khalitzburg_card) ) ) { + case 1: + mes "[Portrait collector]"; + mes "Well, OK. Come back when you are ready."; + close; + case 2: + .@reward_id = .@white_card; + .@amount_coag = 3000; + .@amount_polluted = 70; + break; + case 3: + .@reward_id = .@khalitzburg_card; + .@amount_coag = 5000; + .@amount_polluted = 100; + break; + } + mes "[Portrait collector]"; + mes "What would you like in exchange for the " + getitemname(.@reward_id) + "?"; + next; + if (countitem(.@coagulated_id) < .@amount_coag) + .@color$[0] = "^666666"; + if (countitem(.@polluted_id) < .@amount_polluted) + .@color$[1] = "^666666"; + switch( select( "Cancel", sprintf("%s%s %s^000000", .@color$[0], callfunc("F_InsertComma",.@amount_coag), getitemname(.@coagulated_id)), sprintf("%s%s %s^000000", .@color$[1], callfunc("F_InsertComma",.@amount_polluted), getitemname(.@polluted_id)) ) ) { + case 1: + mes "[Portrait collector]"; + mes "Well, OK. Come back when you are ready."; + close; + case 2: + .@id = .@coagulated_id; + .@amount = .@amount_coag; + break; + case 3: + .@id = .@polluted_id; + .@amount = .@amount_polluted; + break; + } + if (countitem(.@id) < .@amount) { + mes "[Portrait collector]"; + mes "Hmm, you don't have enough Spell now. Go get more."; + close; + } + mes "[Portrait collector]"; + mes "Are you sure that you won't regret it?"; + next; + if (select( "Cancel", "Sure" ) == 1) { + mes "[Portrait collector]"; + mes "Well, OK. Come back when you are ready."; + close; + } + mes "[Portrait collector]"; + mes "Cool, let's make a deal."; + delitem .@id, .@amount; + getitem .@reward_id,1; + close; +} From 81a2b8c99571f56aac68ae0ede1e142d2c71bc65 Mon Sep 17 00:00:00 2001 From: aleos Date: Fri, 22 May 2020 09:18:52 -0400 Subject: [PATCH 139/212] Fixes NPC_DARKBREATH attack type * Follow up to 70d6876. * Fixes #4997. * The attack type for NPC_DARKBREATH will now properly read the database value. Thanks to @qwerty7vp! --- src/map/skill.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 2646dd40bb..dc5094104e 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -5530,7 +5530,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case NJ_ZENYNAGE: case GN_THORNS_TRAP: case RL_B_TRAP: - skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag); + skill_attack(skill_get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag); break; #ifdef RENEWAL case NJ_ISSEN: { From e6bffc11fe15f676873f4e4621e109a061732a17 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Sun, 24 May 2020 14:05:26 +0200 Subject: [PATCH 140/212] Effect State Update --- src/map/script_constants.hpp | 1 + src/map/status.hpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 83fb621c11..a75f75ff4e 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -3503,6 +3503,7 @@ export_constant(EFST_MAGIC_POISON); export_constant(EFST_KAUTE); export_constant(EFST_JPNONLY_TACTICS); + export_constant(EFST_MADOGEAR); export_constant(EFST_LUXANIMA); export_constant(EFST_BATH_FOAM_A); export_constant(EFST_BATH_FOAM_B); diff --git a/src/map/status.hpp b/src/map/status.hpp index bbe61a84d4..10e7d44f0d 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -2034,6 +2034,8 @@ enum efst_types : short{ EFST_JPNONLY_TACTICS = 1147, + EFST_MADOGEAR = 1149, + EFST_LUXANIMA = 1154, EFST_BATH_FOAM_A, EFST_BATH_FOAM_B, From 14c388b40186ca2045d7e6c325e492968cff0ad7 Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 25 May 2020 12:39:36 -0400 Subject: [PATCH 141/212] Resolves some Battleground issues (#4725) * Queue data will now be kept available until a Battleground event is over. * Players can now join an active Battleground. * Adds a more detailed queue state tracking feature. * When a battleground is being prepared and not enough players click accept, stop the battleground from beginning. * When a player logs off or leaves a queue they will now properly be removed from the queue. * Cleans up MinPlayers and MaxPlayers parsing to not accept values less than 1. * Resolves players not being able to join an active battleground (up to MaxPlayers) unless someone quit early. * Adds a team size priority check to avoid adding more players to a larger team. * Fixes battlechat messages. * Adds a battle_config to disable the ability for players on maps with MF_NOWARP to join Battlegrounds. * Adds a new optional ActiveEvent label to the database. * Fixes a typo in Flavius 2 during unbooking process. * Cleans up the behavior of the Battle Therapists to use areapercentheal and areawarp. * Fixes KVM score not properly set on the first Battleground. * Fixes the global timer checks not ending the main timers on Flavius and Tierra Gorge. * Added an extra bg_reserve on global timer checks in case someone tries to join the battleground just before it's ended. * Fixed OnReadyCheck being called on global timer checks, causing the battlegrounds to start when there were no players on the map. * Fixed a bug on Tierra Gorge where multiple barricade walls could be stacked. * Fixes Croix also receiving 9 badges when Guillaume wins. * Adjusts StartDelay default to 0. * Add a database setting to give the ability to enable or disable joining as an individual, party, or guild. * Add a database setting to restrict jobs from entering Battlegrounds. * Better documents script commands bg_reserve and bg_unbook. * Other fixes and cleanups. Thanks to @roSBK and @Daegaladh, @admkakaroto, @Artuvazro, and @Atemo! Co-authored-by: Daegaladh Co-authored-by: Atemo --- conf/battle/battleground.conf | 4 + conf/msg_conf/map_msg.conf | 3 +- db/battleground_db.yml | 145 +++--- db/import-tmpl/battleground_db.yml | 9 +- doc/script_commands.txt | 14 +- npc/battleground/flavius/flavius01.txt | 92 ++-- npc/battleground/flavius/flavius02.txt | 100 +++-- npc/battleground/kvm/kvm01.txt | 12 +- npc/battleground/kvm/kvm02.txt | 12 +- npc/battleground/kvm/kvm03.txt | 12 +- npc/battleground/tierra/tierra01.txt | 89 ++-- npc/battleground/tierra/tierra02.txt | 90 ++-- src/map/battle.cpp | 1 + src/map/battle.hpp | 1 + src/map/battleground.cpp | 587 +++++++++++++++++++------ src/map/battleground.hpp | 33 +- src/map/clif.cpp | 31 +- src/map/clif.hpp | 2 +- src/map/map.cpp | 2 +- src/map/pc.cpp | 55 ++- src/map/pc.hpp | 11 +- src/map/script.cpp | 11 +- 22 files changed, 940 insertions(+), 376 deletions(-) diff --git a/conf/battle/battleground.conf b/conf/battle/battleground.conf index f6ca66e30e..05537ea85f 100644 --- a/conf/battle/battleground.conf +++ b/conf/battle/battleground.conf @@ -30,3 +30,7 @@ bg_flee_penalty: 20 // Interval before updating the bg-member map mini-dots (milliseconds) bg_update_interval: 1000 + +// Before a player is warped into a Battleground from the Battleground Queue, +// check to see if the player's current map has MF_NOWARP. +bgqueue_nowarp_mapflag: no diff --git a/conf/msg_conf/map_msg.conf b/conf/msg_conf/map_msg.conf index 5cc08208ef..49ba23bfbe 100644 --- a/conf/msg_conf/map_msg.conf +++ b/conf/msg_conf/map_msg.conf @@ -354,9 +354,10 @@ 334: Total Domination // Battlegrounds Queue -337: You may not join a battleground queue when you're in a battleground map. +337: You can't apply to a battleground queue from this map. 338: You can't apply to a battleground queue due to recently deserting a battleground. Time remaining: %d minutes and %d seconds. 339: You can't apply to a battleground queue for %d seconds due to recently leaving one. +340: Participants were unable to join. Delaying entry for more participants. // Templates for @who output 343: Name: %s diff --git a/db/battleground_db.yml b/db/battleground_db.yml index 2dbed729ad..a86612801d 100644 --- a/db/battleground_db.yml +++ b/db/battleground_db.yml @@ -29,7 +29,12 @@ # MinLevel Minimum level required to join the battleground. (Default: 1) # MaxLevel Maximum level to join the battleground. (Default: MAX_LEVEL value) # Deserter Amount of time in seconds a player is marked deserter. (Default: 600) -# StartDelay Amount of time in seconds once a queue is filled before a start message is sent to players. (Default: 30) +# StartDelay Amount of time in seconds once a queue is filled before players are warped. (Default: 0) +# Join: Which application type is accepted. The entryqueuelist.lub can visually disable these options. +# Solo Able to join a queue as an individual. (Default: true) +# Party Able to join a queue as a party. (Default: true) +# Guild Able to join a queue as a guild. (Default: true) +# JobRestrictions List of jobs that are unable to join the battleground. # Locations: Battleground location settings. # - Map The map on which the battleground will be played. # StartEvent NPC event triggered when the battleground starts. @@ -38,12 +43,14 @@ # RespawnY Y coordinate for warping on death. # DeathEvent NPC event triggered when a player dies. # QuitEvent NPC event triggered when a player quits. +# ActiveEvent NPC event triggered when a player joints an active battleground. # Variable Name of BG ID variable used in the battleground script. # TeamB: TeamB settings. # RespawnX X coordinate for warping on death. # RespawnY Y coordinate for warping on death. # DeathEvent NPC event triggered when a player dies. # QuitEvent NPC event triggered when a player quits. +# ActiveEvent NPC event triggered when a player joints an active battleground. # Variable Name of BG ID variable used in the battleground script. ########################################################################### @@ -53,121 +60,151 @@ Header: Body: - Id: 1 - Name: "Tierra Gorge" + Name: Tierra Gorge MinPlayers: 6 MinLevel: 80 + JobRestrictions: + Novice: true + SuperNovice: true + Novice_High: true + Baby: true + Super_Baby: true + Super_Novice_E: true + Super_Baby_E: true Locations: - - Map: "bat_a01" - StartEvent: "start#bat_a01::OnReadyCheck" + - Map: bat_a01 + StartEvent: start#bat_a01::OnReadyCheck TeamA: RespawnX: 50 RespawnY: 374 - QuitEvent: "start#bat_a01::OnGuillaumeQuit" - Variable: "$@TierraBG1_id1" + QuitEvent: start#bat_a01::OnGuillaumeQuit + ActiveEvent: start#bat_a01::OnGuillaumeActive + Variable: $@TierraBG1_id1 TeamB: RespawnX: 42 RespawnY: 16 - QuitEvent: "start#bat_a01::OnCroixQuit" - Variable: "$@TierraBG1_id2" - - Map: "bat_a02" - StartEvent: "start#bat_a02::OnReadyCheck" + QuitEvent: start#bat_a01::OnCroixQuit + ActiveEvent: start#bat_a01::OnCroixActive + Variable: $@TierraBG1_id2 + - Map: bat_a02 + StartEvent: start#bat_a02::OnReadyCheck TeamA: RespawnX: 50 RespawnY: 374 - QuitEvent: "start#bat_a02::OnGuillaumeQuit" - Variable: "$@TierraBG2_id1" + QuitEvent: start#bat_a02::OnGuillaumeQuit + ActiveEvent: start#bat_a02::OnGuillaumeActive + Variable: $@TierraBG2_id1 TeamB: RespawnX: 42 RespawnY: 16 - QuitEvent: "start#bat_a02::OnCroixQuit" - Variable: "$@TierraBG2_id2" + QuitEvent: start#bat_a02::OnCroixQuit + ActiveEvent: start#bat_a02::OnCroixActive + Variable: $@TierraBG2_id2 - Id: 2 - Name: "Flavius" + Name: Flavius MinPlayers: 6 MinLevel: 80 + JobRestrictions: + Novice: true + SuperNovice: true + Novice_High: true + Baby: true + Super_Baby: true + Super_Novice_E: true + Super_Baby_E: true Locations: - - Map: "bat_b01" - StartEvent: "start#bat_b01::OnReadyCheck" + - Map: bat_b01 + StartEvent: start#bat_b01::OnReadyCheck TeamA: RespawnX: 10 RespawnY: 290 - QuitEvent: "start#bat_b01::OnGuillaumeQuit" - Variable: "$@FlaviusBG1_id1" + QuitEvent: start#bat_b01::OnGuillaumeQuit + ActiveEvent: start#bat_b01::OnGuillaumeActive + Variable: $@FlaviusBG1_id1 TeamB: RespawnX: 390 RespawnY: 10 - QuitEvent: "start#bat_b01::OnCroixQuit" - Variable: "$@FlaviusBG1_id2" - - Map: "bat_b02" - StartEvent: "start#bat_b02::OnReadyCheck" + QuitEvent: start#bat_b01::OnCroixQuit + ActiveEvent: start#bat_b01::OnCroixActive + Variable: $@FlaviusBG1_id2 + - Map: bat_b02 + StartEvent: start#bat_b02::OnReadyCheck TeamA: RespawnX: 10 RespawnY: 290 - QuitEvent: "start#bat_b02::OnGuillaumeQuit" - Variable: "$@FlaviusBG2_id1" + QuitEvent: start#bat_b02::OnGuillaumeQuit + ActiveEvent: start#bat_b02::OnGuillaumeActive + Variable: $@FlaviusBG2_id1 TeamB: RespawnX: 390 RespawnY: 10 - QuitEvent: "start#bat_b02::OnCroixQuit" - Variable: "$@FlaviusBG2_id2" + QuitEvent: start#bat_b02::OnCroixQuit + ActiveEvent: start#bat_b02::OnCroixActive + Variable: $@FlaviusBG2_id2 - Id: 3 - Name: "KVM (Level 80 and up)" + Name: KVM (Level 80 and up) MinPlayers: 5 MinLevel: 80 Locations: - - Map: "bat_c01" - StartEvent: "KvM01_BG::OnStart" + - Map: bat_c01 + StartEvent: KvM01_BG::OnStart TeamA: RespawnX: 52 RespawnY: 129 - DeathEvent: "KvM01_BG::OnGuillaumeDie" - QuitEvent: "KvM01_BG::OnGuillaumeQuit" - Variable: "$@KvM01BG_id1" + DeathEvent: KvM01_BG::OnGuillaumeDie + QuitEvent: KvM01_BG::OnGuillaumeQuit + ActiveEvent: KvM01_BG::OnGuillaumeActive + Variable: $@KvM01BG_id1 TeamB: RespawnX: 147 RespawnY: 55 - DeathEvent: "KvM01_BG::OnCroixDie" - QuitEvent: "KvM01_BG::OnCroixQuit" - Variable: "$@KvM01BG_id2" + DeathEvent: KvM01_BG::OnCroixDie + QuitEvent: KvM01_BG::OnCroixQuit + ActiveEvent: KvM01_BG::OnCroixActive + Variable: $@KvM01BG_id2 - Id: 4 - Name: "KVM (Level 60~79)" + Name: KVM (Level 60~79) MinPlayers: 5 MinLevel: 60 MaxLevel: 79 Locations: - - Map: "bat_c02" - StartEvent: "KvM02_BG::OnStart" + - Map: bat_c02 + StartEvent: KvM02_BG::OnStart TeamA: RespawnX: 52 RespawnY: 129 - DeathEvent: "KvM02_BG::OnGuillaumeDie" - QuitEvent: "KvM02_BG::OnGuillaumeQuit" - Variable: "$@KvM02BG_id1" + DeathEvent: KvM02_BG::OnGuillaumeDie + QuitEvent: KvM02_BG::OnGuillaumeQuit + ActiveEvent: KvM02_BG::OnGuillaumeActive + Variable: $@KvM02BG_id1 TeamB: RespawnX: 147 RespawnY: 55 - DeathEvent: "KvM02_BG::OnCroixDie" - QuitEvent: "KvM02_BG::OnCroixQuit" - Variable: "$@KvM02BG_id2" + DeathEvent: KvM02_BG::OnCroixDie + QuitEvent: KvM02_BG::OnCroixQuit + ActiveEvent: KvM02_BG::OnCroixActive + Variable: $@KvM02BG_id2 - Id: 5 - Name: "KVM (Level 59 and below" + Name: KVM (Level 59 and below MinPlayers: 5 MaxLevel: 59 Locations: - - Map: "bat_c03" - StartEvent: "KvM03_BG::OnStart" + - Map: bat_c03 + StartEvent: KvM03_BG::OnStart TeamA: RespawnX: 52 RespawnY: 129 - DeathEvent: "KvM03_BG::OnGuillaumeDie" - QuitEvent: "KvM03_BG::OnGuillaumeQuit" - Variable: "$@KvM03BG_id1" + DeathEvent: KvM03_BG::OnGuillaumeDie + QuitEvent: KvM03_BG::OnGuillaumeQuit + ActiveEvent: KvM03_BG::OnGuillaumeActive + Variable: $@KvM03BG_id1 TeamB: RespawnX: 147 RespawnY: 55 - DeathEvent: "KvM03_BG::OnCroixDie" - QuitEvent: "KvM03_BG::OnCroixQuit" - Variable: "$@KvM03BG_id2" + DeathEvent: KvM03_BG::OnCroixDie + QuitEvent: KvM03_BG::OnCroixQuit + ActiveEvent: KvM03_BG::OnCroixActive + Variable: $@KvM03BG_id2 Footer: Imports: diff --git a/db/import-tmpl/battleground_db.yml b/db/import-tmpl/battleground_db.yml index 9d7300bdd7..6b727c1ea2 100644 --- a/db/import-tmpl/battleground_db.yml +++ b/db/import-tmpl/battleground_db.yml @@ -29,7 +29,12 @@ # MinLevel Minimum level required to join the battleground. (Default: 1) # MaxLevel Maximum level to join the battleground. (Default: MAX_LEVEL value) # Deserter Amount of time in seconds a player is marked deserter. (Default: 600) -# StartDelay Amount of time in seconds once a queue is filled before a start message is sent to players. (Default: 30) +# StartDelay Amount of time in seconds once a queue is filled before players are warped. (Default: 0) +# Join: Which application type is accepted. The entryqueuelist.lub can visually disable these options. +# Solo Able to join a queue as an individual. (Default: true) +# Party Able to join a queue as a party. (Default: true) +# Guild Able to join a queue as a guild. (Default: true) +# JobRestrictions List of jobs that are unable to join the battleground. # Locations: Battleground location settings. # - Map The map on which the battleground will be played. # StartEvent NPC event triggered when the battleground starts. @@ -38,12 +43,14 @@ # RespawnY Y coordinate for warping on death. # DeathEvent NPC event triggered when a player dies. # QuitEvent NPC event triggered when a player quits. +# ActiveEvent NPC event triggered when a player joints an active battleground. # Variable Name of BG ID variable used in the battleground script. # TeamB: TeamB settings. # RespawnX X coordinate for warping on death. # RespawnY Y coordinate for warping on death. # DeathEvent NPC event triggered when a player dies. # QuitEvent NPC event triggered when a player quits. +# ActiveEvent NPC event triggered when a player joints an active battleground. # Variable Name of BG ID variable used in the battleground script. ########################################################################### diff --git a/doc/script_commands.txt b/doc/script_commands.txt index a6b716f4d3..ecd78cd2ee 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -9393,19 +9393,19 @@ Example: --------------------------------------- -*bg_reserve(""); +*bg_reserve(""{,}); -Reserves a slot for the given Battleground for the Battleground UI System. +Reserves a Battleground map for the Battleground UI System. When a map is booked it prevents another similar +queue from being created and will allow players to join an active Battlegrounds event. -Note: 'bg_reserve' and 'bg_unbook' prevent the Battlegrounds queue from joining players in an active Battleground. +If is true, then the Battleground is marked as over to prevent new players from joining. This state is meant +for the period where players can get their Badges. --------------------------------------- -*bg_unbook(""); +*bg_unbook(""); -Removes a spot for the given Battleground for the Battleground UI System. - -Note: 'bg_reserve' and 'bg_unbook' prevent the Battlegrounds queue from joining players in an active Battleground. +Removes a Battleground map for the Battleground UI System. When a map is unbooked it allows a queue to be created. --------------------------------------- diff --git a/npc/battleground/flavius/flavius01.txt b/npc/battleground/flavius/flavius01.txt index e4f7c93420..74a3be178a 100644 --- a/npc/battleground/flavius/flavius01.txt +++ b/npc/battleground/flavius/flavius01.txt @@ -58,25 +58,21 @@ OnStop: OnTimer1000: stopnpctimer; - if (!getbattleflag("feature.bgqueue")) - initnpctimer; - set .@chk_bat_a01,getmapusers("bat_b01"); - if (.@chk_bat_a01 < 1) { - set $@FlaviusBG1, 0; - if( $@FlaviusBG1_id1 ) { bg_destroy $@FlaviusBG1_id1; set $@FlaviusBG1_id1, 0; } - if( $@FlaviusBG1_id2 ) { bg_destroy $@FlaviusBG1_id2; set $@FlaviusBG1_id2, 0; } - if (getbattleflag("feature.bgqueue")) { + if (bg_get_data($@FlaviusBG1_id1, 0) == 0 && bg_get_data($@FlaviusBG1_id2, 0) == 0) { + donpcevent "countdown#bat_b01::OnStop"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_b01", true; + $@FlaviusBG1 = 0; + if( $@FlaviusBG1_id1 ) { bg_destroy $@FlaviusBG1_id1; $@FlaviusBG1_id1 = 0; } + if( $@FlaviusBG1_id2 ) { bg_destroy $@FlaviusBG1_id2; $@FlaviusBG1_id2 = 0; } + if (getbattleflag("feature.bgqueue")) bg_unbook "bat_b01"; - end; - } else - donpcevent "start#bat_b01::OnReadyCheck"; + end; } - if (getbattleflag("feature.bgqueue")) - initnpctimer; + initnpctimer; end; } - // Flavius Battleground Engine //============================================================ bat_b01,15,15,3 script start#bat_b01 844,{ @@ -139,13 +135,14 @@ OnReset: donpcevent "guardian#bat_b01_b::OnEnable"; donpcevent "cell#bat_b01_a::OnRed"; donpcevent "cell#bat_b01_b::OnRed"; - donpcevent "time#bat_b01::OnEnable"; - disablenpc "Guillaume Vintenar#b01_a"; - disablenpc "Croix Vintenar#b01_b"; - disablenpc "Vintenar#bat_b01_aover"; - disablenpc "Vintenar#bat_b01_bover"; - bg_warp $@FlaviusBG1_id1,"bat_b01",87,75; - bg_warp $@FlaviusBG1_id2,"bat_b01",311,224; + end; + +OnGuillaumeActive: + warp "bat_b01",87,75; + end; + +OnCroixActive: + warp "bat_b01",311,224; end; OnGuillaumeQuit: @@ -181,6 +178,8 @@ OnMyMobDead: enablenpc "Guillaume Vintenar#b01_a"; enablenpc "Croix Vintenar#b01_b"; donpcevent "time#bat_b01::OnStop"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_b01", true; } else { set $@Croix_ScoreBG1,1; @@ -215,6 +214,8 @@ OnMyMobDead: enablenpc "Guillaume Vintenar#b01_a"; enablenpc "Croix Vintenar#b01_b"; donpcevent "time#bat_b01::OnStop"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_b01", true; } else { set $@Guill_ScoreBG1,1; @@ -314,12 +315,14 @@ bat_b01,10,294,3 script Battle Therapist#b01_a 95,{ OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_b01_rp1_a_warp"; + // enablenpc "bat_b01_rp1_a_warp"; + areapercentheal "bat_b01",0,280,20,300,100,100; + areawarp "bat_b01",0,280,20,300,"bat_b01",87,73; end; -OnTimer26000: - disablenpc "bat_b01_rp1_a_warp"; - end; +// OnTimer26000: + // disablenpc "bat_b01_rp1_a_warp"; + // end; OnTimer26500: stopnpctimer; @@ -332,22 +335,25 @@ OnEnable: end; OnStop: - disablenpc "bat_b01_rp1_a_warp"; + // disablenpc "bat_b01_rp1_a_warp"; disablenpc "Battle Therapist#b01_a"; stopnpctimer; end; } +/* +// replaced by areapercentheal and areawarp to prevent enqueue issue bat_b01,10,290,0 script bat_b01_rp1_a_warp 45,10,10,{ OnInit: disablenpc "bat_b01_rp1_a_warp"; end; -OnTouch_: +OnTouch: percentheal 100,100; warp "bat_b01",87,73; end; } +*/ bat_b01,389,14,3 script Battle Therapist#b01_b 95,{ specialeffect2 EF_HEAL; @@ -359,12 +365,14 @@ bat_b01,389,14,3 script Battle Therapist#b01_b 95,{ OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_b01_rp1_b_warp"; + // enablenpc "bat_b01_rp1_b_warp"; + areapercentheal "bat_b01",379,0,399,20,100,100; + areawarp "bat_b01",379,0,399,20,"bat_b01",312,225; end; -OnTimer26000: - disablenpc "bat_b01_rp1_b_warp"; - end; +// OnTimer26000: + // disablenpc "bat_b01_rp1_b_warp"; + // end; OnTimer26500: stopnpctimer; @@ -377,15 +385,16 @@ OnEnable: end; OnStop: - disablenpc "bat_b01_rp1_b_warp"; + // disablenpc "bat_b01_rp1_b_warp"; disablenpc "Battle Therapist#b01_b"; stopnpctimer; end; } -bat_b01,389,10,0 script bat_b01_rp1_b_warp 45,9,9,{ +/* +bat_b01,389,10,0 script bat_b01_rp1_b_warp 45,10,10,{ OnInit: - disablenpc "bat_b01_rp1_a_warp"; + disablenpc "bat_b01_rp1_b_warp"; end; OnTouch: @@ -393,6 +402,7 @@ OnTouch: warp "bat_b01",312,225; end; } +*/ bat_b01,87,76,0 script A_CODE#bat_b01 -1,5,5,{ OnTouch: @@ -490,6 +500,8 @@ OnTimer1830000: bg_warp $@FlaviusBG1_id2,"bat_b01",390,10; enablenpc "Vintenar#bat_b01_aover"; enablenpc "Vintenar#bat_b01_bover"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_b01", true; end; OnTimer1900000: @@ -526,11 +538,11 @@ bat_b01,10,294,3 script Vintenar#bat_b01_aover 419,{ set .@A_B_gap,$@Guill_ScoreBG1 - $@Croix_ScoreBG1; if ($@FlaviusBG1_id1 == getcharid(4)) { if (.@A_B_gap > 0) - callfunc "F_BG_Badge",1,"Guillaume","Flavius"; + callfunc "F_BG_Badge",1,"Guillaume","Flavius"; //Guillaume wins else if (.@A_B_gap == 0) - callfunc "F_BG_Badge",0,"Guillaume","Flavius"; + callfunc "F_BG_Badge",0,"Guillaume","Flavius"; //Tie else - callfunc "F_BG_Badge",0,"Guillaume","Flavius"; + callfunc "F_BG_Badge",0,"Guillaume","Flavius"; //Croix wins } else { mes "[Axl Rose]"; @@ -551,11 +563,11 @@ bat_b01,389,14,3 script Vintenar#bat_b01_bover 415,{ set .@A_B_gap,$@Guill_ScoreBG1 - $@Croix_ScoreBG1; if ($@FlaviusBG1_id2 == getcharid(4)) { if (.@A_B_gap > 0) - callfunc "F_BG_Badge",1,"Croix","Flavius"; + callfunc "F_BG_Badge",0,"Croix","Flavius"; //Guillaume wins else if (.@A_B_gap == 0) - callfunc "F_BG_Badge",0,"Croix","Flavius"; + callfunc "F_BG_Badge",0,"Croix","Flavius"; //Tie else - callfunc "F_BG_Badge",1,"Croix","Flavius"; + callfunc "F_BG_Badge",1,"Croix","Flavius"; //Croix wins } else { mes "[Swandery]"; diff --git a/npc/battleground/flavius/flavius02.txt b/npc/battleground/flavius/flavius02.txt index c99bef9d34..875c0b60a1 100644 --- a/npc/battleground/flavius/flavius02.txt +++ b/npc/battleground/flavius/flavius02.txt @@ -59,21 +59,18 @@ OnStop: OnTimer1000: stopnpctimer; - if (!getbattleflag("feature.bgqueue")) - initnpctimer; - set .@chk_bat_a01,getmapusers("bat_b02"); - if (.@chk_bat_a01 < 1) { - set $@FlaviusBG2, 0; - if( $@FlaviusBG2_id1 ) { bg_destroy $@FlaviusBG2_id1; set $@FlaviusBG2_id1, 0; } - if( $@FlaviusBG2_id2 ) { bg_destroy $@FlaviusBG2_id2; set $@FlaviusBG2_id2, 0; } - if (getbattleflag("feature.bgqueue")) { - bg_unbook "bat_b01"; - end; - } else - donpcevent "start#bat_b01::OnReadyCheck"; + if (bg_get_data($@FlaviusBG2_id1, 0) == 0 && bg_get_data($@FlaviusBG2_id2, 0) == 0) { + donpcevent "countdown#bat_b02::OnStop"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_b02", true; + $@FlaviusBG2 = 0; + if( $@FlaviusBG2_id1 ) { bg_destroy $@FlaviusBG2_id1; $@FlaviusBG2_id1 = 0; } + if( $@FlaviusBG2_id2 ) { bg_destroy $@FlaviusBG2_id2; $@FlaviusBG2_id2 = 0; } + if (getbattleflag("feature.bgqueue")) + bg_unbook "bat_b02"; + end; } - if (getbattleflag("feature.bgqueue")) - initnpctimer; + initnpctimer; end; } @@ -89,7 +86,7 @@ OnReadyCheck: if( $@FlaviusBG2 ) end; if (!getbattleflag("feature.bgqueue")) { - set .@Guillaume, getwaitingroomstate(0,"Lieutenant Huvas"); + set .@Guillaume, getwaitingroomstate(0,"Lieutenant Huvas"); set .@Croix, getwaitingroomstate(0,"Lieutenant Yukon"); if( !.@Guillaume && !.@Croix ) { donpcevent "#bat_b02_timer::OnStop"; @@ -102,8 +99,8 @@ OnReadyCheck: set $@FlaviusBG2_Victory, 0; set $@Croix_ScoreBG2, 0; set $@Guill_ScoreBG2, 0; - bg_updatescore "bat_b02",$@Guill_ScoreBG2,$@Croix_ScoreBG2; + if (!getbattleflag("feature.bgqueue")) { donpcevent "Lieutenant Huvas::OnEnterBG"; donpcevent "Lieutenant Yukon::OnEnterBG"; @@ -140,13 +137,14 @@ OnReset: donpcevent "guardian#bat_b02_b::OnEnable"; donpcevent "cell#bat_b02_a::OnRed"; donpcevent "cell#bat_b02_b::OnRed"; - donpcevent "time#bat_b02::OnEnable"; - disablenpc "Guillaume Vintenar#b02_a"; - disablenpc "Croix Vintenar#b02_b"; - disablenpc "Vintenar#bat_b02_aover"; - disablenpc "Vintenar#bat_b02_bover"; - bg_warp $@FlaviusBG2_id1,"bat_b02",87,75; - bg_warp $@FlaviusBG2_id2,"bat_b02",311,224; + end; + +OnGuillaumeActive: + warp "bat_b02",87,75; + end; + +OnCroixActive: + warp "bat_b02",311,224; end; OnGuillaumeQuit: @@ -182,6 +180,8 @@ OnMyMobDead: enablenpc "Guillaume Vintenar#b02_a"; enablenpc "Croix Vintenar#b02_b"; donpcevent "time#bat_b02::OnStop"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_b02", true; } else { set $@Croix_ScoreBG2,1; @@ -216,6 +216,8 @@ OnMyMobDead: enablenpc "Guillaume Vintenar#b02_a"; enablenpc "Croix Vintenar#b02_b"; donpcevent "time#bat_b02::OnStop"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_b02", true; } else { set $@Guill_ScoreBG2,1; @@ -315,12 +317,14 @@ bat_b02,10,294,3 script Battle Therapist#b02_a 95,{ OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_b02_rp1_a_warp"; + // enablenpc "bat_b02_rp1_a_warp"; + areapercentheal "bat_b02",0,280,20,300,100,100; + areawarp "bat_b02",0,280,20,300,"bat_b02",87,73; end; -OnTimer26000: - disablenpc "bat_b02_rp1_a_warp"; - end; +// OnTimer26000: + // disablenpc "bat_b02_rp1_a_warp"; + // end; OnTimer26500: stopnpctimer; @@ -333,22 +337,24 @@ OnEnable: end; OnStop: - disablenpc "bat_b02_rp1_a_warp"; + // disablenpc "bat_b02_rp1_a_warp"; disablenpc "Battle Therapist#b02_a"; stopnpctimer; end; } +/* bat_b02,10,290,0 script bat_b02_rp1_a_warp 45,10,10,{ OnInit: disablenpc "bat_b02_rp1_a_warp"; end; -OnTouch_: +OnTouch: percentheal 100,100; warp "bat_b02",87,73; end; } +*/ bat_b02,389,14,3 script Battle Therapist#b02_b 95,{ specialeffect2 EF_HEAL; @@ -360,12 +366,14 @@ bat_b02,389,14,3 script Battle Therapist#b02_b 95,{ OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_b02_rp1_b_warp"; + areapercentheal "bat_b02",379,0,399,20,100,100; + areawarp "bat_b02",379,0,399,20,"bat_b02",312,225; + // enablenpc "bat_b02_rp1_b_warp"; end; -OnTimer26000: - disablenpc "bat_b02_rp1_b_warp"; - end; +// OnTimer26000: + // disablenpc "bat_b02_rp1_b_warp"; + // end; OnTimer26500: stopnpctimer; @@ -378,15 +386,16 @@ OnEnable: end; OnStop: - disablenpc "bat_b02_rp1_b_warp"; + // disablenpc "bat_b02_rp1_b_warp"; disablenpc "Battle Therapist#b02_b"; stopnpctimer; end; } -bat_b02,389,10,0 script bat_b02_rp1_b_warp 45,9,9,{ +/* +bat_b02,389,10,0 script bat_b02_rp1_b_warp 45,10,10,{ OnInit: - disablenpc "bat_b02_rp1_a_warp"; + disablenpc "bat_b02_rp1_b_warp"; end; OnTouch: @@ -394,18 +403,19 @@ OnTouch: warp "bat_b02",312,225; end; } +*/ bat_b02,87,76,0 script A_CODE#bat_b02 -1,5,5,{ OnTouch: if (checkquest(2070) < 0) - //setquest 2070; + setquest 2070; end; } bat_b02,312,224,0 script B_CODE#bat_b02 -1,5,5,{ OnTouch: if (checkquest(2070) < 0) - //setquest 2070; + setquest 2070; end; } @@ -491,6 +501,8 @@ OnTimer1830000: bg_warp $@FlaviusBG2_id2,"bat_b02",390,10; enablenpc "Vintenar#bat_b02_aover"; enablenpc "Vintenar#bat_b02_bover"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_b02", true; end; OnTimer1900000: @@ -527,11 +539,11 @@ bat_b02,10,294,3 script Vintenar#bat_b02_aover 419,{ set .@A_B_gap,$@Guill_ScoreBG2 - $@Croix_ScoreBG2; if ($@FlaviusBG2_id1 == getcharid(4)) { if (.@A_B_gap > 0) - callfunc "F_BG_Badge",1,"Guillaume","Flavius"; + callfunc "F_BG_Badge",1,"Guillaume","Flavius"; //Guillaume wins else if (.@A_B_gap == 0) - callfunc "F_BG_Badge",0,"Guillaume","Flavius"; + callfunc "F_BG_Badge",0,"Guillaume","Flavius"; //Tie else - callfunc "F_BG_Badge",0,"Guillaume","Flavius"; + callfunc "F_BG_Badge",0,"Guillaume","Flavius"; //Croix wins } else { mes "[Axl Rose]"; @@ -552,11 +564,11 @@ bat_b02,389,14,3 script Vintenar#bat_b02_bover 415,{ set .@A_B_gap,$@Guill_ScoreBG2 - $@Croix_ScoreBG2; if ($@FlaviusBG2_id2 == getcharid(4)) { if (.@A_B_gap > 0) - callfunc "F_BG_Badge",1,"Croix","Flavius"; + callfunc "F_BG_Badge",0,"Croix","Flavius"; //Guillaume wins else if (.@A_B_gap == 0) - callfunc "F_BG_Badge",0,"Croix","Flavius"; + callfunc "F_BG_Badge",0,"Croix","Flavius"; //Tie else - callfunc "F_BG_Badge",1,"Croix","Flavius"; + callfunc "F_BG_Badge",1,"Croix","Flavius"; //Croix wins } else { mes "[Swandery]"; diff --git a/npc/battleground/kvm/kvm01.txt b/npc/battleground/kvm/kvm01.txt index 0341aa465d..2c8e07aeb7 100644 --- a/npc/battleground/kvm/kvm01.txt +++ b/npc/battleground/kvm/kvm01.txt @@ -155,6 +155,14 @@ OnCroixDie: } end; +OnGuillaumeActive: + warp "bat_c01",61,120; + end; + +OnCroixActive: + warp "bat_c01",138,63; + end; + OnStart: disablenpc "KVM Officer#KVM01A"; disablenpc "KVM Officer#KVM01B"; @@ -224,6 +232,7 @@ OnTimer61000: end; } } + bg_updatescore "bat_c01",.Guillaume_Count,.Croix_Count; set $@KvM01BG, 2; // Playing bg_warp $@KvM01BG_id1,"bat_c01",61,120; bg_warp $@KvM01BG_id2,"bat_c01",138,63; @@ -292,6 +301,8 @@ OnStop: bg_warp $@KvM01BG_id1,"bat_c01",53,128; bg_warp $@KvM01BG_id2,"bat_c01",146,55; donpcevent "KvM01_BG_Out::OnBegin"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_c01", true; end; } @@ -333,7 +344,6 @@ OnTimer60000: disablenpc "KVM Officer#KVM01B"; mapwarp "bat_c01","bat_room",154,150; maprespawnguildid "bat_c01",0,3; // Just in case someone else - bg_updatescore "bat_c01",5,5; set $@KvM01BG, 0; OnGuillaumeJoin: diff --git a/npc/battleground/kvm/kvm02.txt b/npc/battleground/kvm/kvm02.txt index 97a15be08d..b2ec1d5cc8 100644 --- a/npc/battleground/kvm/kvm02.txt +++ b/npc/battleground/kvm/kvm02.txt @@ -155,6 +155,14 @@ OnCroixDie: } end; +OnGuillaumeActive: + warp "bat_c02",62,119; + end; + +OnCroixActive: + warp "bat_c02",137,64; + end; + OnStart: disablenpc "KVM Officer#KVM02A"; disablenpc "KVM Officer#KVM02B"; @@ -224,6 +232,7 @@ OnTimer61000: end; } } + bg_updatescore "bat_c02",.Guillaume_Count,.Croix_Count; set $@KvM02BG, 2; // Playing bg_warp $@KvM02BG_id1,"bat_c02",62,119; bg_warp $@KvM02BG_id2,"bat_c02",137,64; @@ -292,6 +301,8 @@ OnStop: bg_warp $@KvM02BG_id1,"bat_c02",53,128; bg_warp $@KvM02BG_id2,"bat_c02",146,55; donpcevent "KvM02_BG_Out::OnBegin"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_c02", true; end; } @@ -333,7 +344,6 @@ OnTimer60000: disablenpc "KVM Officer#KVM02B"; mapwarp "bat_c02","bat_room",154,150; maprespawnguildid "bat_c02",0,3; // Just in case someone else - bg_updatescore "bat_c02",5,5; set $@KvM02BG, 0; OnGuillaumeJoin: diff --git a/npc/battleground/kvm/kvm03.txt b/npc/battleground/kvm/kvm03.txt index 6e15648916..c27df35dc7 100644 --- a/npc/battleground/kvm/kvm03.txt +++ b/npc/battleground/kvm/kvm03.txt @@ -155,6 +155,14 @@ OnCroixDie: } end; +OnGuillaumeActive: + warp "bat_c03",62,119; + end; + +OnCroixActive: + warp "bat_c03",137,64; + end; + OnStart: disablenpc "KVM Officer#KVM03A"; disablenpc "KVM Officer#KVM03B"; @@ -224,6 +232,7 @@ OnTimer61000: end; } } + bg_updatescore "bat_c03",.Guillaume_Count,.Croix_Count; set $@KvM03BG, 2; // Playing bg_warp $@KvM03BG_id1,"bat_c03",62,119; bg_warp $@KvM03BG_id2,"bat_c03",137,64; @@ -292,6 +301,8 @@ OnStop: bg_warp $@KvM03BG_id1,"bat_c03",53,128; bg_warp $@KvM03BG_id2,"bat_c03",146,55; donpcevent "KvM03_BG_Out::OnBegin"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_c03", true; end; } @@ -333,7 +344,6 @@ OnTimer60000: disablenpc "KVM Officer#KVM03B"; mapwarp "bat_c03","bat_room",154,150; maprespawnguildid "bat_c03",0,3; // Just in case someone else - bg_updatescore "bat_c03",5,5; set $@KvM03BG, 0; OnGuillaumeJoin: diff --git a/npc/battleground/tierra/tierra01.txt b/npc/battleground/tierra/tierra01.txt index dd0282789e..ce61f0c641 100644 --- a/npc/battleground/tierra/tierra01.txt +++ b/npc/battleground/tierra/tierra01.txt @@ -58,21 +58,18 @@ OnStop: OnTimer1000: stopnpctimer; - if (!getbattleflag("feature.bgqueue")) - initnpctimer; - set .@chk_bat_a01,getmapusers("bat_a01"); - if (.@chk_bat_a01 < 1) { - set $@TierraBG1,0; set $@TierraBG1_Victory, 0; - if( $@TierraBG1_id1 ) { bg_destroy $@TierraBG1_id1; set $@TierraBG1_id1, 0; } - if( $@TierraBG1_id2 ) { bg_destroy $@TierraBG1_id2; set $@TierraBG1_id2, 0; } - if (getbattleflag("feature.bgqueue")) { + if (bg_get_data($@TierraBG1_id1, 0) == 0 && bg_get_data($@TierraBG1_id2, 0) == 0) { + donpcevent "countdown#bat_a01::OnStop"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_a01", true; + $@TierraBG1 = 0; $@TierraBG1_Victory = 0; + if( $@TierraBG1_id1 ) { bg_destroy $@TierraBG1_id1; $@TierraBG1_id1 = 0; } + if( $@TierraBG1_id2 ) { bg_destroy $@TierraBG1_id2; $@TierraBG1_id2 = 0; } + if (getbattleflag("feature.bgqueue")) bg_unbook "bat_a01"; - end; - } else - donpcevent "start#bat_a01::OnReadyCheck"; + end; } - if (getbattleflag("feature.bgqueue")) - initnpctimer; + initnpctimer; end; } @@ -126,6 +123,14 @@ OnEnable: disablenpc "Croix Vintenar#a01_b"; end; +OnGuillaumeActive: + warp "bat_a01",352,342; + end; + +OnCroixActive: + warp "bat_a01",353,52; + end; + OnGuillaumeQuit: OnCroixQuit: if (getbattleflag("feature.bgqueue")) @@ -183,6 +188,8 @@ OnMyMobDead: mapannounce "bat_a01", "Croix Vintenar Swandery: We destroyed Guillaume's Food Storage. We won that! Wow!",bc_map,"0xFFCE00"; bg_warp $@TierraBG1_id1,"bat_a01",50,374; bg_warp $@TierraBG1_id2,"bat_a01",42,16; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_a01", true; } end; } @@ -206,6 +213,8 @@ OnMyMobDead: mapannounce "bat_a01", "Guillaume Vintenar Axl Rose : We destroyed Croix's Food Storage. We won that! Wow!",bc_map,"0xFFCE00"; bg_warp $@TierraBG1_id1,"bat_a01",50,374; bg_warp $@TierraBG1_id2,"bat_a01",42,16; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_a01", true; } end; } @@ -364,8 +373,10 @@ bat_a01,185,270,1 script Guillaume Blacksmith#a01 851,{ mes "[Guillaume Blacksmith]"; mes "Wow! It's done."; mes "We are relieved."; - delitem 7049,50; //Stone - donpcevent "barricade#bat_a01_a::OnEnable"; + if (mobcount("bat_a01","barricade#bat_a01_a::OnMyMobDead") < 17) { + delitem 7049,50; //Stone + donpcevent "barricade#bat_a01_a::OnEnable"; + } close2; disablenpc "Guillaume Blacksmith#a01"; end; @@ -448,8 +459,10 @@ bat_a01,170,121,5 script Croix Blacksmith#bat_a01 851,{ mes "[Croix Blacksmith]"; mes "Wow! It's done."; mes "We are relieved."; - delitem 7049,50; //Stone - donpcevent "barricade#bat_a01_b::OnEnable"; + if (mobcount("bat_a01","barricade#bat_a01_b::OnMyMobDead") < 17) { + delitem 7049,50; //Stone + donpcevent "barricade#bat_a01_b::OnEnable"; + } close2; disablenpc "Croix Blacksmith#bat_a01"; end; @@ -500,35 +513,39 @@ OnEnable: end; OnStop: - disablenpc "bat_a01_rp1_a_warp"; + // disablenpc "bat_a01_rp1_a_warp"; disablenpc "Battle Therapist#a01_a"; stopnpctimer; end; OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_a01_rp1_a_warp"; + // enablenpc "bat_a01_rp1_a_warp"; + areapercentheal "bat_a01",41,365,61,385,100,100; + areawarp "bat_a01",41,365,61,385,"bat_a01",352,342; end; -OnTimer26000: - disablenpc "bat_a01_rp1_a_warp"; - end; +// OnTimer26000: + // disablenpc "bat_a01_rp1_a_warp"; + // end; OnTimer26500: donpcevent "Battle Therapist#a01_a::OnEnable"; end; } +/* bat_a01,51,375,0 script bat_a01_rp1_a_warp -1,10,10,{ OnInit: disablenpc "bat_a01_rp1_a_warp"; end; -OnTouch_: +OnTouch: percentheal 100,100; warp "bat_a01",352,342; end; } +*/ bat_a01,45,19,3 script Battle Therapist#a01_b 95,{ specialeffect2 EF_HEAL; @@ -550,25 +567,28 @@ OnEnable: end; OnStop: - disablenpc "bat_a01_rp1_b_warp"; + // disablenpc "bat_a01_rp1_b_warp"; disablenpc "Battle Therapist#a01_b"; stopnpctimer; end; OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_a01_rp1_b_warp"; + areapercentheal "bat_a01",33,7,53,27,100,100; + areawarp "bat_a01",33,7,53,27,"bat_a01",353,52; + // enablenpc "bat_a01_rp1_b_warp"; end; -OnTimer26000: - disablenpc "bat_a01_rp1_b_warp"; - end; +// OnTimer26000: + // disablenpc "bat_a01_rp1_b_warp"; + // end; OnTimer26500: donpcevent "Battle Therapist#a01_b::OnEnable"; end; } +/* bat_a01,43,17,0 script bat_a01_rp1_b_warp -1,10,10,{ OnInit: disablenpc "bat_a01_rp1_b_warp"; @@ -579,6 +599,7 @@ OnTouch: warp "bat_a01",353,52; end; } +*/ bat_a01,60,216,3 script Valley Ghost#bat_a01_n 950,{ specialeffect2 EF_HEAL; @@ -597,18 +618,21 @@ OnEnable: OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_a01_rp1_n_warp"; + areapercentheal "bat_a01",45,203,65,223,100,100; + areawarp "bat_a01",45,203,65,223,"bat_a01",301,209; + // enablenpc "bat_a01_rp1_n_warp"; end; -OnTimer26000: - disablenpc "bat_a01_rp1_n_warp"; - end; +// OnTimer26000: + // disablenpc "bat_a01_rp1_n_warp"; + // end; OnTimer26500: donpcevent "Valley Ghost#bat_a01_n::OnEnable"; end; } +/* bat_a01,55,213,0 script bat_a01_rp1_n_warp -1,10,10,{ OnInit: disablenpc "bat_a01_rp1_n_warp"; @@ -619,6 +643,7 @@ OnTouch: warp "bat_a01",301,209; end; } +*/ bat_a01,194,267,0 script barri_warp_up#bat_a01_a -1,7,0,{ OnTouch: diff --git a/npc/battleground/tierra/tierra02.txt b/npc/battleground/tierra/tierra02.txt index a7ebd1798e..04d01165ed 100644 --- a/npc/battleground/tierra/tierra02.txt +++ b/npc/battleground/tierra/tierra02.txt @@ -57,21 +57,19 @@ OnStop: OnTimer1000: stopnpctimer; - if (!getbattleflag("feature.bgqueue")) - initnpctimer; - set .@chk_bat_a02,getmapusers("bat_a02"); - if (.@chk_bat_a02 < 1) { - set $@TierraBG2,0; set $@TierraBG2_Victory, 0; - if( $@TierraBG2_id1 ) { bg_destroy $@TierraBG2_id1; set $@TierraBG2_id1, 0; } - if( $@TierraBG2_id2 ) { bg_destroy $@TierraBG2_id2; set $@TierraBG2_id2, 0; } - if (getbattleflag("feature.bgqueue")) { + if (!bg_get_data($@TierraBG2_id1, 0) && !bg_get_data($@TierraBG2_id2, 0)) { + donpcevent "countdown#bat_a02::OnStop"; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_a02", true; + mapwarp "bat_a02","bat_room",154,150; + $@TierraBG2 = 0; $@TierraBG2_Victory = 0; + if( $@TierraBG2_id1 ) { bg_destroy $@TierraBG2_id1; $@TierraBG2_id1 = 0; } + if( $@TierraBG2_id2 ) { bg_destroy $@TierraBG2_id2; $@TierraBG2_id2 = 0; } + if (getbattleflag("feature.bgqueue")) bg_unbook "bat_a02"; - end; - } else - donpcevent "start#bat_a02::OnReadyCheck"; + end; } - if (getbattleflag("feature.bgqueue")) - initnpctimer; + initnpctimer; end; } @@ -125,6 +123,14 @@ OnEnable: disablenpc "Croix Vintenar#a02_b"; end; +OnGuillaumeActive: + warp "bat_a02",352,342; + end; + +OnCroixActive: + warp "bat_a02",353,52; + end; + OnGuillaumeQuit: OnCroixQuit: if (getbattleflag("feature.bgqueue")) @@ -182,6 +188,8 @@ OnMyMobDead: mapannounce "bat_a02", "Croix Vintenar Swandery: We destroyed Guillaume's Food Storage. We won that! Wow!",bc_map,"0xFFCE00"; bg_warp $@TierraBG2_id1,"bat_a02",50,374; bg_warp $@TierraBG2_id2,"bat_a02",42,16; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_a02", true; } end; } @@ -205,6 +213,8 @@ OnMyMobDead: mapannounce "bat_a02", "Guillaume Vintenar Axl Rose : We destroyed Croix's Food Storage. We won that! Wow!",bc_map,"0xFFCE00"; bg_warp $@TierraBG2_id1,"bat_a02",50,374; bg_warp $@TierraBG2_id2,"bat_a02",42,16; + if (getbattleflag("feature.bgqueue")) + bg_reserve "bat_a02", true; } end; } @@ -363,8 +373,10 @@ bat_a02,185,270,1 script Guillaume Blacksmith#a02 851,{ mes "[Guillaume Blacksmith]"; mes "Wow! It's done."; mes "We are relieved."; - delitem 7049,50; //Stone - donpcevent "barricade#bat_a02_a::OnEnable"; + if (mobcount("bat_a02","barricade#bat_a02_a::OnMyMobDead") < 17) { + delitem 7049,50; //Stone + donpcevent "barricade#bat_a02_a::OnEnable"; + } close2; disablenpc "Guillaume Blacksmith#a02"; end; @@ -447,8 +459,10 @@ bat_a02,170,121,5 script Croix Blacksmith#bat_a02 851,{ mes "[Croix Blacksmith]"; mes "Wow! It's done."; mes "We are relieved."; - delitem 7049,50; //Stone - donpcevent "barricade#bat_a02_b::OnEnable"; + if (mobcount("bat_a02","barricade#bat_a02_b::OnMyMobDead") < 17) { + delitem 7049,50; //Stone + donpcevent "barricade#bat_a02_b::OnEnable"; + } close2; disablenpc "Croix Blacksmith#bat_a02"; end; @@ -499,35 +513,39 @@ OnEnable: end; OnStop: - disablenpc "bat_a02_rp1_a_warp"; + // disablenpc "bat_a02_rp1_a_warp"; disablenpc "Battle Therapist#a02_a"; stopnpctimer; end; OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_a02_rp1_a_warp"; + // enablenpc "bat_a02_rp1_a_warp"; + areapercentheal "bat_a02",41,365,61,385,100,100; + areawarp "bat_a02",41,365,61,385,"bat_a02",352,342; end; -OnTimer26000: - disablenpc "bat_a02_rp1_a_warp"; - end; +// OnTimer26000: + // disablenpc "bat_a02_rp1_a_warp"; + // end; OnTimer26500: donpcevent "Battle Therapist#a02_a::OnEnable"; end; } +/* bat_a02,51,375,0 script bat_a02_rp1_a_warp -1,10,10,{ OnInit: disablenpc "bat_a02_rp1_a_warp"; end; -OnTouch_: +OnTouch: percentheal 100,100; warp "bat_a02",352,342; end; } +*/ bat_a02,45,19,3 script Battle Therapist#a02_b 95,{ specialeffect2 EF_HEAL; @@ -549,25 +567,28 @@ OnEnable: end; OnStop: - disablenpc "bat_a02_rp1_b_warp"; + // disablenpc "bat_a02_rp1_b_warp"; disablenpc "Battle Therapist#a02_b"; stopnpctimer; end; OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_a02_rp1_b_warp"; + // enablenpc "bat_a02_rp1_b_warp"; + areapercentheal "bat_a02",33,7,53,27,100,100; + areawarp "bat_a02",33,7,53,27,"bat_a02",353,52; end; -OnTimer26000: - disablenpc "bat_a02_rp1_b_warp"; - end; +// OnTimer26000: + // disablenpc "bat_a02_rp1_b_warp"; + // end; OnTimer26500: donpcevent "Battle Therapist#a02_b::OnEnable"; end; } +/* bat_a02,43,17,0 script bat_a02_rp1_b_warp -1,10,10,{ OnInit: disablenpc "bat_a02_rp1_b_warp"; @@ -578,6 +599,7 @@ OnTouch: warp "bat_a02",353,52; end; } +*/ bat_a02,60,216,3 script Valley Ghost#bat_a02_n 950,{ specialeffect2 EF_HEAL; @@ -596,18 +618,21 @@ OnEnable: OnTimer25000: specialeffect EF_SANCTUARY; - enablenpc "bat_a02_rp1_n_warp"; + // enablenpc "bat_a02_rp1_n_warp"; + areapercentheal "bat_a02",45,203,65,223,100,100; + areawarp "bat_a02",45,203,65,223,"bat_a02",301,209; end; -OnTimer26000: - disablenpc "bat_a02_rp1_n_warp"; - end; +// OnTimer26000: + // disablenpc "bat_a02_rp1_n_warp"; + // end; OnTimer26500: donpcevent "Valley Ghost#bat_a02_n::OnEnable"; end; } +/* bat_a02,55,213,0 script bat_a02_rp1_n_warp -1,10,10,{ OnInit: disablenpc "bat_a02_rp1_n_warp"; @@ -618,6 +643,7 @@ OnTouch: warp "bat_a02",301,209; end; } +*/ bat_a02,194,267,0 script barri_warp_up#bat_a02_a -1,7,0,{ OnTouch: diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 712db7102c..c440f75992 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -8951,6 +8951,7 @@ static const struct _battle_data { { "idletime_hom_option", &battle_config.idletime_hom_option, 0x1F, 0x1, 0xFFF, }, { "devotion_standup_fix", &battle_config.devotion_standup_fix, 1, 0, 1, }, { "feature.bgqueue", &battle_config.feature_bgqueue, 1, 0, 1, }, + { "bgqueue_nowarp_mapflag", &battle_config.bgqueue_nowarp_mapflag, 0, 0, 1, }, { "homunculus_exp_gain", &battle_config.homunculus_exp_gain, 10, 0, 100, }, { "rental_item_novalue", &battle_config.rental_item_novalue, 1, 0, 1, }, diff --git a/src/map/battle.hpp b/src/map/battle.hpp index 5c0938e9cc..d9dae4b05d 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -675,6 +675,7 @@ struct Battle_Config int idletime_hom_option; int devotion_standup_fix; int feature_bgqueue; + int bgqueue_nowarp_mapflag; int homunculus_exp_gain; int rental_item_novalue; diff --git a/src/map/battleground.cpp b/src/map/battleground.cpp index 71bb9b236f..7c25a4370c 100644 --- a/src/map/battleground.cpp +++ b/src/map/battleground.cpp @@ -32,6 +32,7 @@ using namespace rathena; BattlegroundDatabase battleground_db; std::unordered_map> bg_team_db; std::vector> bg_queues; +int bg_queue_count = 1; const std::string BattlegroundDatabase::getDefaultLocation() { return std::string(db_path) + "/battleground_db.yml"; @@ -75,6 +76,11 @@ uint64 BattlegroundDatabase::parseBodyNode(const YAML::Node &node) { if (!this->asInt32(node, "MinPlayers", min)) return 0; + if (min < 1) { + this->invalidWarning(node["MinPlayers"], "Minimum players %d cannot be less than 1, capping to 1.\n", min); + min = 1; + } + if (min * 2 > MAX_BG_MEMBERS) { this->invalidWarning(node["MinPlayers"], "Minimum players %d exceeds MAX_BG_MEMBERS, capping to %d.\n", min, MAX_BG_MEMBERS / 2); min = MAX_BG_MEMBERS / 2; @@ -92,6 +98,11 @@ uint64 BattlegroundDatabase::parseBodyNode(const YAML::Node &node) { if (!this->asInt32(node, "MaxPlayers", max)) return 0; + if (max < 1) { + this->invalidWarning(node["MaxPlayers"], "Maximum players %d cannot be less than 1, capping to 1.\n", max); + max = 1; + } + if (max * 2 > MAX_BG_MEMBERS) { this->invalidWarning(node["MaxPlayers"], "Maximum players %d exceeds MAX_BG_MEMBERS, capping to %d.\n", max, MAX_BG_MEMBERS / 2); max = MAX_BG_MEMBERS / 2; @@ -158,7 +169,77 @@ uint64 BattlegroundDatabase::parseBodyNode(const YAML::Node &node) { bg->start_delay = delay; } else { if (!exists) - bg->start_delay = 30; + bg->start_delay = 0; + } + + if (this->nodeExists(node, "Join")) { + const YAML::Node &joinNode = node["Join"]; + + if (this->nodeExists(joinNode, "Solo")) { + bool active; + + if (!this->asBool(joinNode, "Solo", active)) + return 0; + + bg->solo = active; + } else { + if (!exists) + bg->solo = true; + } + + if (this->nodeExists(joinNode, "Party")) { + bool active; + + if (!this->asBool(joinNode, "Party", active)) + return 0; + + bg->party = active; + } else { + if (!exists) + bg->party = true; + } + + if (this->nodeExists(joinNode, "Guild")) { + bool active; + + if (!this->asBool(joinNode, "Guild", active)) + return 0; + + bg->guild = active; + } else { + if (!exists) + bg->guild = true; + } + } else { + if (!exists) { + bg->solo = true; + bg->party = true; + bg->guild = true; + } + } + + if (this->nodeExists(node, "JobRestrictions")) { + const YAML::Node &jobsNode = node["JobRestrictions"]; + + for (const auto &jobit : jobsNode) { + std::string job_name = jobit.first.as(), job_name_constant = "JOB_" + job_name; + int64 constant; + + if (!script_get_constant(job_name_constant.c_str(), &constant)) { + this->invalidWarning(node["JobRestrictions"], "Job %s does not exist.\n", job_name.c_str()); + continue; + } + + bool active; + + if (!this->asBool(jobsNode, job_name, active)) + return 0; + + if (active) + bg->job_restrictions.push_back(static_cast(constant)); + else + util::vector_erase_if_exists(bg->job_restrictions, static_cast(constant)); + } } if (this->nodeExists(node, "Locations")) { @@ -174,9 +255,9 @@ uint64 BattlegroundDatabase::parseBodyNode(const YAML::Node &node) { if (!this->asString(location, "Map", map_name)) return 0; - map_entry.mapid = map_mapname2mapid(map_name.c_str()); + map_entry.mapindex = mapindex_name2id(map_name.c_str()); - if (map_entry.mapid == -1) { + if (map_entry.mapindex == 0) { this->invalidWarning(location["Map"], "Invalid battleground map name %s, skipping.\n", map_name.c_str()); return 0; } @@ -245,6 +326,18 @@ uint64 BattlegroundDatabase::parseBodyNode(const YAML::Node &node) { } } + if (this->nodeExists(team[it], "ActiveEvent")) { + if (!this->asString(team[it], "ActiveEvent", team_ptr->active_event)) + return 0; + + team_ptr->active_event.resize(EVENT_NAME_LENGTH); + + if (team_ptr->active_event.find("::On") == std::string::npos) { + this->invalidWarning(team["ActiveEvent"], "Battleground ActiveEvent label %s should begin with '::On', skipping.\n", team_ptr->active_event.c_str()); + return 0; + } + } + if (this->nodeExists(team[it], "Variable")) { if (!this->asString(team[it], "Variable", team_ptr->bg_id_var)) return 0; @@ -284,6 +377,21 @@ std::shared_ptr bg_search_name(const char *name) return nullptr; } +/** + * Search for a Battleground queue based on the given queue ID + * @param queue_id: Queue ID + * @return s_battleground_queue on success or nullptr on failure + */ +std::shared_ptr bg_search_queue(int queue_id) +{ + for (const auto &queue : bg_queues) { + if (queue_id == queue->queue_id) + return queue; + } + + return nullptr; +} + /** * Search for an available player in Battleground * @param bg: Battleground data @@ -293,7 +401,12 @@ struct map_session_data* bg_getavailablesd(s_battleground_data *bg) { nullpo_retr(nullptr, bg); - return (bg->members.size() != 0) ? bg->members[0].sd : nullptr; + for (const auto &member : bg->members) { + if (member.sd != nullptr) + return member.sd; + } + + return nullptr; } /** @@ -514,7 +627,7 @@ int bg_create(uint16 mapindex, s_battleground_team* team) bg->cemetery.y = team->warp_y; bg->logout_event = team->quit_event.c_str(); bg->die_event = team->death_event.c_str(); - bg->members.clear(); + bg->active_event = team->active_event.c_str(); return bg->id; } @@ -569,7 +682,7 @@ void bg_send_message(struct map_session_data *sd, const char *mes, int len) { nullpo_retv(sd); - if (!sd->bg_id) + if (sd->bg_id == 0) return; std::shared_ptr bgteam = util::umap_find(bg_team_db, sd->bg_id); @@ -617,7 +730,7 @@ TIMER_FUNC(bg_send_xy_timer) } /** - * Mark a Battleground as ready to begin queuing + * Mark a Battleground as ready to begin queuing for a free map * @param tid: Timer ID * @param tick: Timer * @param id: ID @@ -625,14 +738,18 @@ TIMER_FUNC(bg_send_xy_timer) */ static TIMER_FUNC(bg_on_ready_loopback) { - s_battleground_queue *queue = (s_battleground_queue*)data; + int queue_id = (int)data; + std::shared_ptr queue = bg_search_queue(queue_id); - nullpo_retr(1, queue); + if (queue == nullptr) { + ShowError("bg_on_ready_loopback: Invalid battleground queue %d.\n", queue_id); + return 1; + } std::shared_ptr bg = battleground_db.find(queue->id); if (bg) { - bg_queue_on_ready(bg->name.c_str(), std::shared_ptr(queue)); + bg_queue_on_ready(bg->name.c_str(), queue); return 0; } else { ShowError("bg_on_ready_loopback: Can't find battleground %d in the battlegrounds database.\n", queue->id); @@ -641,7 +758,7 @@ static TIMER_FUNC(bg_on_ready_loopback) } /** - * Reset Battleground queue data + * Reset Battleground queue data if players don't accept in time * @param tid: Timer ID * @param tick: Timer * @param id: ID @@ -649,31 +766,32 @@ static TIMER_FUNC(bg_on_ready_loopback) */ static TIMER_FUNC(bg_on_ready_expire) { - s_battleground_queue *queue = (s_battleground_queue*)data; + int queue_id = (int)data; + std::shared_ptr queue = bg_search_queue(queue_id); - nullpo_retr(1, queue); - - queue->in_ready_state = false; - queue->map->isReserved = false; // Remove reservation to free up for future queue - queue->map = nullptr; - queue->accepted_players = 0; // Reset the queue count + if (queue == nullptr) { + ShowError("bg_on_ready_expire: Invalid battleground queue %d.\n", queue_id); + return 1; + } std::string bg_name = battleground_db.find(queue->id)->name; for (const auto &sd : queue->teama_members) { - sd->bg_queue_accept_state = false; clif_bg_queue_apply_result(BG_APPLY_QUEUE_FINISHED, bg_name.c_str(), sd); + clif_bg_queue_entry_init(sd); } for (const auto &sd : queue->teamb_members) { - sd->bg_queue_accept_state = false; clif_bg_queue_apply_result(BG_APPLY_QUEUE_FINISHED, bg_name.c_str(), sd); + clif_bg_queue_entry_init(sd); } + + bg_queue_clear(queue, true); return 0; } /** - * Start a Battleground + * Start a Battleground when all players have accepted * @param tid: Timer ID * @param tick: Timer * @param id: ID @@ -681,9 +799,13 @@ static TIMER_FUNC(bg_on_ready_expire) */ static TIMER_FUNC(bg_on_ready_start) { - s_battleground_queue *queue = (s_battleground_queue*)data; + int queue_id = (int)data; + std::shared_ptr queue = bg_search_queue(queue_id); - nullpo_retr(1, queue); + if (queue == nullptr) { + ShowError("bg_on_ready_start: Invalid battleground queue %d.\n", queue_id); + return 1; + } queue->tid_start = INVALID_TIMER; bg_queue_start_battleground(queue); @@ -702,7 +824,7 @@ bool bg_player_is_in_bg_map(struct map_session_data *sd) for (const auto &pair : battleground_db) { for (const auto &it : pair.second->maps) { - if (it.mapid == sd->bl.m) + if (it.mapindex == sd->mapindex) return true; } } @@ -724,7 +846,7 @@ static bool bg_queue_check_status(struct map_session_data* sd, const char *name) if (sd->sc.data[SC_ENTRY_QUEUE_APPLY_DELAY]) { // Exclude any player who's recently left a battleground queue char buf[CHAT_SIZE_MAX]; - sprintf(buf, msg_txt(sd, 339), (get_timer(sd->sc.data[SC_ENTRY_QUEUE_APPLY_DELAY]->timer)->tick - gettick()) / 1000); // You can't apply to a battleground queue for %d seconds due to recently leaving one. + sprintf(buf, msg_txt(sd, 339), static_cast((get_timer(sd->sc.data[SC_ENTRY_QUEUE_APPLY_DELAY]->timer)->tick - gettick()) / 1000)); // You can't apply to a battleground queue for %d seconds due to recently leaving one. clif_bg_queue_apply_result(BG_APPLY_NONE, name, sd); clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], buf, false, SELF); return false; @@ -732,9 +854,9 @@ static bool bg_queue_check_status(struct map_session_data* sd, const char *name) if (sd->sc.data[SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT]) { // Exclude any player who's recently deserted a battleground char buf[CHAT_SIZE_MAX]; - t_tick status_tick = get_timer(sd->sc.data[SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT]->timer)->tick, tick = gettick(); + int32 status_tick = static_cast(DIFF_TICK(get_timer(sd->sc.data[SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT]->timer)->tick, gettick()) / 1000); - sprintf(buf, msg_txt(sd, 338), ((status_tick - tick) / 1000) / 60, ((status_tick - tick) / 1000) % 60); // You can't apply to a battleground queue due to recently deserting a battleground. Time remaining: %d minutes and %d seconds. + sprintf(buf, msg_txt(sd, 338), status_tick / 60, status_tick % 60); // You can't apply to a battleground queue due to recently deserting a battleground. Time remaining: %d minutes and %d seconds. clif_bg_queue_apply_result(BG_APPLY_NONE, name, sd); clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], buf, false, SELF); return false; @@ -755,43 +877,64 @@ bool bg_queue_check_joinable(std::shared_ptr bg, struct map { nullpo_retr(false, sd); - if (bg->min_lvl && sd->status.base_level < bg->min_lvl) { // Check min level if min_lvl isn't 0 + for (const auto &job : bg->job_restrictions) { // Check class requirement + if (sd->class_ == job) { + clif_bg_queue_apply_result(BG_APPLY_PLAYER_CLASS, name, sd); + return false; + } + } + + if (bg->min_lvl > 0 && sd->status.base_level < bg->min_lvl) { // Check minimum level requirement clif_bg_queue_apply_result(BG_APPLY_PLAYER_LEVEL, name, sd); return false; } - if (bg->max_lvl && sd->status.base_level > bg->max_lvl) { // Check max level if max_lvl isn't 0 + if (bg->max_lvl > 0 && sd->status.base_level > bg->max_lvl) { // Check maximum level requirement clif_bg_queue_apply_result(BG_APPLY_PLAYER_LEVEL, name, sd); return false; } - if (!bg_queue_check_status(sd, name)) + if (!bg_queue_check_status(sd, name)) // Check status blocks return false; if (bg_player_is_in_bg_map(sd)) { // Is the player currently in a battleground map? Reject them. clif_bg_queue_apply_result(BG_APPLY_NONE, name, sd); - clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], msg_txt(sd, 337), false, SELF); // You may not join a battleground queue when you're in a battleground map. + clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], msg_txt(sd, 337), false, SELF); // You can't apply to a battleground queue from this map. return false; } - return true; // Return true if all conditions are met. + if (battle_config.bgqueue_nowarp_mapflag > 0 && map_getmapflag(sd->bl.m, MF_NOWARP)) { // Check player's current position for mapflag check + clif_bg_queue_apply_result(BG_APPLY_NONE, name, sd); + clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], msg_txt(sd, 337), false, SELF); // You can't apply to a battleground queue from this map. + return false; + } + + return true; } /** - * Sub function for reserving a slot in the Battleground if it's joinable + * Mark a map as reserved for a Battleground * @param name: Battleground map name * @param state: Whether to mark reserved or not + * @param ended: Whether the Battleground event is complete; players getting prize * @return True on success or false otherwise */ -bool bg_queue_reservation(const char *name, bool state) +bool bg_queue_reservation(const char *name, bool state, bool ended) { - int16 mapid = map_mapname2mapid(name); + uint16 mapindex = mapindex_name2id(name); - for (const auto &pair : battleground_db) { - // Bound checking isn't needed since we iterate within battleground_db's bound. - for (auto &it : pair.second->maps) { - if (it.mapid == mapid) { - it.isReserved = state; + for (auto &pair : battleground_db) { + for (auto &map : pair.second->maps) { + if (map.mapindex == mapindex) { + map.isReserved = state; + for (auto &queue : bg_queues) { + if (queue->map == &map) { + if (ended) // The ended flag is applied from bg_reserve (bg_unbook clears it for the next queue) + queue->state = QUEUE_STATE_ENDED; + if (!state) + bg_queue_clear(queue, true); + } + } return true; } } @@ -800,6 +943,33 @@ bool bg_queue_reservation(const char *name, bool state) return false; } +/** + * Join as an individual into a Battleground + * @param name: Battleground name + * @param sd: Player who requested to join the battlegrounds + */ +void bg_queue_join_solo(const char *name, struct map_session_data *sd) +{ + if (!sd) { + ShowError("bg_queue_join_solo: Tried to join non-existent player\n."); + return; + } + + std::shared_ptr bg = bg_search_name(name); + + if (!bg) { + ShowWarning("bq_queue_join_solo: Could not find battleground \"%s\" requested by %s (AID: %d / CID: %d)\n", name, sd->status.name, sd->status.account_id, sd->status.char_id); + return; + } + + if (!bg->solo) { + clif_bg_queue_apply_result(BG_APPLY_INVALID_APP, name, sd); + return; + } + + bg_queue_join_multi(name, sd, { sd }); // Join as solo +} + /** * Join a party onto the same side of a Battleground * @param name: Battleground name @@ -807,6 +977,11 @@ bool bg_queue_reservation(const char *name, bool state) */ void bg_queue_join_party(const char *name, struct map_session_data *sd) { + if (!sd) { + ShowError("bg_queue_join_party: Tried to join non-existent player\n."); + return; + } + struct party_data *p = party_search(sd->status.party_id); if (!p) { @@ -824,6 +999,11 @@ void bg_queue_join_party(const char *name, struct map_session_data *sd) std::shared_ptr bg = bg_search_name(name); if (bg) { + if (!bg->party) { + clif_bg_queue_apply_result(BG_APPLY_INVALID_APP, name, sd); + return; + } + int p_online = 0; for (const auto &it : p->party.member) { @@ -835,7 +1015,7 @@ void bg_queue_join_party(const char *name, struct map_session_data *sd) clif_bg_queue_apply_result(BG_APPLY_PLAYER_COUNT, name, sd); return; // Too many party members online } - + std::vector list; for (const auto &it : p->party.member) { @@ -865,6 +1045,11 @@ void bg_queue_join_party(const char *name, struct map_session_data *sd) */ void bg_queue_join_guild(const char *name, struct map_session_data *sd) { + if (!sd) { + ShowError("bg_queue_join_guild: Tried to join non-existent player\n."); + return; + } + if (!sd->guild) { clif_bg_queue_apply_result(BG_APPLY_INVALID_APP, name, sd); return; // Someone has bypassed the client check for being in a guild @@ -878,6 +1063,11 @@ void bg_queue_join_guild(const char *name, struct map_session_data *sd) std::shared_ptr bg = bg_search_name(name); if (bg) { + if (!bg->guild) { + clif_bg_queue_apply_result(BG_APPLY_INVALID_APP, name, sd); + return; + } + struct guild* g = sd->guild; if (g->connect_member > bg->max_players) { @@ -932,43 +1122,55 @@ void bg_queue_join_multi(const char *name, struct map_session_data *sd, std::vec } for (const auto &queue : bg_queues) { - if (queue->id != bg->id) - continue; - if (queue->in_ready_state) + if (queue->id != bg->id || queue->state == QUEUE_STATE_SETUP_DELAY || queue->state == QUEUE_STATE_ENDED) continue; // Make sure there's enough space on one side to join as a party/guild in this queue - if (queue->teama_members.size() + list.size() > bg->required_players && queue->teamb_members.size() + list.size() > bg->required_players) { + if (queue->teama_members.size() + list.size() > bg->max_players && queue->teamb_members.size() + list.size() > bg->max_players) { break; } bool r = rnd() % 2 != 0; - std::vector* team = r ? &queue->teamb_members : &queue->teama_members; + std::vector *team = r ? &queue->teamb_members : &queue->teama_members; - // If the designated team is full, put the player into the other team - if (team->size() + list.size() > bg->required_players) { - team = r ? &queue->teama_members : &queue->teamb_members; + if (queue->state == QUEUE_STATE_ACTIVE) { + // If one team has lesser members try to balance (on an active BG) + if (r && queue->teama_members.size() < queue->teamb_members.size()) + team = &queue->teama_members; + else if (!r && queue->teamb_members.size() < queue->teama_members.size()) + team = &queue->teamb_members; + } else { + // If the designated team is full, put the player into the other team + if (team->size() + list.size() > bg->required_players) + team = r ? &queue->teama_members : &queue->teamb_members; } - while (!list.empty() && team->size() < bg->required_players) { + while (!list.empty() && team->size() < bg->max_players) { struct map_session_data *sd2 = list.back(); list.pop_back(); - if (!sd2 || sd2->bg_queue) + if (!sd2 || sd2->bg_queue_id > 0) continue; if (!bg_queue_check_joinable(bg, sd2, name)) continue; - sd2->bg_queue = queue; + sd2->bg_queue_id = queue->queue_id; team->push_back(sd2); clif_bg_queue_apply_result(BG_APPLY_ACCEPT, name, sd2); clif_bg_queue_apply_notify(name, sd2); } - // Enough players have joined - if (queue->teamb_members.size() == bg->required_players && queue->teama_members.size() == bg->required_players) + if (queue->state == QUEUE_STATE_ACTIVE) { // Battleground is already active + for (auto &pl_sd : *team) { + if (queue->map->mapindex == pl_sd->mapindex) + continue; + + pc_set_bg_queue_timer(pl_sd); + clif_bg_queue_lobby_notify(name, pl_sd); + } + } else if (queue->state == QUEUE_STATE_SETUP && queue->teamb_members.size() >= bg->required_players && queue->teama_members.size() >= bg->required_players) // Enough players have joined bg_queue_on_ready(name, queue); return; @@ -981,10 +1183,11 @@ void bg_queue_join_multi(const char *name, struct map_session_data *sd, std::vec /** * Clear Battleground queue for next one * @param queue: Queue to clean up + * @param ended: If a Battleground has ended through normal means (by script command bg_unbook) */ -static void bg_queue_clear(s_battleground_queue *queue) +void bg_queue_clear(std::shared_ptr queue, bool ended) { - if (!queue) + if (queue == nullptr) return; if (queue->tid_requeue != INVALID_TIMER) { @@ -1002,49 +1205,47 @@ static void bg_queue_clear(s_battleground_queue *queue) queue->tid_start = INVALID_TIMER; } - if (queue->map != nullptr) { - queue->map->isReserved = false; // Remove reservation to free up for future queue - queue->map = nullptr; + if (ended) { + if (queue->map != nullptr) { + queue->map->isReserved = false; // Remove reservation to free up for future queue + queue->map = nullptr; + } + + for (const auto &sd : queue->teama_members) + sd->bg_queue_id = 0; + + for (const auto &sd : queue->teamb_members) + sd->bg_queue_id = 0; + + queue->teama_members.clear(); + queue->teamb_members.clear(); + queue->teama_members.shrink_to_fit(); + queue->teamb_members.shrink_to_fit(); + queue->accepted_players = 0; + queue->state = QUEUE_STATE_SETUP; } - queue->in_ready_state = false; - queue->accepted_players = 0; // Reset the queue count } /** * Sub function for leaving a Battleground queue * @param sd: Player leaving - * @param lista: List of players in queue data - * @param listb: List of players in second queue data + * @param members: List of players in queue data * @return True on success or false otherwise */ -static bool bg_queue_leave_sub(struct map_session_data *sd, std::vector lista, std::vector listb) +static bool bg_queue_leave_sub(struct map_session_data *sd, std::vector &members) { if (!sd) return false; - auto list_it = lista.begin(); + auto list_it = members.begin(); - while (list_it != lista.end()) { - struct map_session_data *player = *list_it; - - if (player == sd) { - if (sd->bg_queue->in_ready_state) { - sd->bg_queue->accepted_players = 0; - sd->bg_queue->in_ready_state = false; - sd->bg_queue_accept_state = false; - } - - lista.erase(list_it); - - if (lista.empty() && listb.empty()) { // If there are no players left in the queue, discard it - for (auto &queue : bg_queues) { - if (sd->bg_queue == queue) - bg_queue_clear(queue.get()); - } - } + while (list_it != members.end()) { + if (*list_it == sd) { + members.erase(list_it); sc_start(nullptr, &sd->bl, SC_ENTRY_QUEUE_APPLY_DELAY, 100, 1, 60000); - sd->bg_queue = nullptr; + sd->bg_queue_id = 0; + pc_delete_bg_queue_timer(sd); return true; } else { list_it++; @@ -1061,14 +1262,26 @@ static bool bg_queue_leave_sub(struct map_session_data *sd, std::vectorbg_queue) + if (!sd || sd->bg_queue_id == 0) return false; - if (!bg_queue_leave_sub(sd, sd->bg_queue->teama_members, sd->bg_queue->teamb_members) && !bg_queue_leave_sub(sd, sd->bg_queue->teamb_members, sd->bg_queue->teama_members)) { - ShowError("bg_queue_leave: Couldn't find player %s in battlegrounds queue.\n", sd->status.name); - return false; - } else - return true; + pc_delete_bg_queue_timer(sd); + + for (auto &queue : bg_queues) { + if (sd->bg_queue_id == queue->queue_id) { + if (!bg_queue_leave_sub(sd, queue->teama_members) && !bg_queue_leave_sub(sd, queue->teamb_members)) { + ShowError("bg_queue_leave: Couldn't find player %s in battlegrounds queue.\n", sd->status.name); + return false; + } else { + if ((queue->state == QUEUE_STATE_SETUP || queue->state == QUEUE_STATE_SETUP_DELAY) && queue->teama_members.empty() && queue->teamb_members.empty()) // If there are no players left in the queue (that hasn't started), discard it + bg_queue_clear(queue, true); + + return true; + } + } + } + + return false; } /** @@ -1086,29 +1299,27 @@ bool bg_queue_on_ready(const char *name, std::shared_ptr q return false; } - queue->accepted_players = 0; // Reset the counter just in case. - - if (queue->teama_members.size() != queue->required_players || queue->teamb_members.size() != queue->required_players) + if (queue->teama_members.size() < queue->required_players || queue->teamb_members.size() < queue->required_players) return false; // Return players to the queue and stop reapplying the timer - s_battleground_map *bgmap = nullptr; + bool map_reserved = false; - for (auto &it : bg->maps) { - if (!it.isReserved) { - it.isReserved = true; - bgmap = ⁢ - queue->map = ⁢ + for (auto &map : bg->maps) { + if (!map.isReserved) { + map.isReserved = true; + map_reserved = true; + queue->map = ↦ break; } } - if (!bgmap) { // All the battleground maps are reserved. Set a timer to check for an open battleground every 10 seconds. - queue->tid_requeue = add_timer(gettick() + 10000, bg_on_ready_loopback, 0, (intptr_t)queue.get()); + if (!map_reserved) { // All the battleground maps are reserved. Set a timer to check for an open battleground every 10 seconds. + queue->tid_requeue = add_timer(gettick() + 10000, bg_on_ready_loopback, 0, (intptr_t)queue->queue_id); return false; } - queue->in_ready_state = true; - queue->tid_expire = add_timer(gettick() + 20000, bg_on_ready_expire, 0, (intptr_t)queue.get()); + queue->state = QUEUE_STATE_SETUP_DELAY; + queue->tid_expire = add_timer(gettick() + 20000, bg_on_ready_expire, 0, (intptr_t)queue->queue_id); for (const auto &sd : queue->teama_members) clif_bg_queue_lobby_notify(name, sd); @@ -1119,25 +1330,150 @@ bool bg_queue_on_ready(const char *name, std::shared_ptr q return true; } +/** + * Send a player into an active Battleground + * @param sd: Player to send in + * @param queue: Queue data + */ +void bg_join_active(map_session_data *sd, std::shared_ptr queue) +{ + if (sd == nullptr || queue == nullptr) + return; + + // Check player's current position for mapflag check + if (battle_config.bgqueue_nowarp_mapflag > 0 && map_getmapflag(sd->bl.m, MF_NOWARP)) { + clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], msg_txt(sd, 337), false, SELF); // You can't apply to a battleground queue from this map. + bg_queue_leave(sd); + clif_bg_queue_entry_init(sd); + return; + } + + int bg_id_team_1 = static_cast(mapreg_readreg(add_str(queue->map->team1.bg_id_var.c_str()))); + std::shared_ptr bgteam_1 = util::umap_find(bg_team_db, bg_id_team_1); + + for (auto &pl_sd : queue->teama_members) { + if (sd != pl_sd) + continue; + + if (bgteam_1 == nullptr) { + bg_queue_leave(sd); + clif_bg_queue_apply_result(BG_APPLY_RECONNECT, battleground_db.find(queue->id)->name.c_str(), sd); + clif_bg_queue_entry_init(sd); + return; + } + + clif_bg_queue_entry_init(pl_sd); + bg_team_join(bg_id_team_1, pl_sd, true); + npc_event(pl_sd, bgteam_1->active_event.c_str(), 0); + return; + } + + int bg_id_team_2 = static_cast(mapreg_readreg(add_str(queue->map->team2.bg_id_var.c_str()))); + std::shared_ptr bgteam_2 = util::umap_find(bg_team_db, bg_id_team_2); + + for (auto &pl_sd : queue->teamb_members) { + if (sd != pl_sd) + continue; + + if (bgteam_2 == nullptr) { + bg_queue_leave(sd); + clif_bg_queue_apply_result(BG_APPLY_RECONNECT, battleground_db.find(queue->id)->name.c_str(), sd); + clif_bg_queue_entry_init(sd); + return; + } + + clif_bg_queue_entry_init(pl_sd); + bg_team_join(bg_id_team_2, pl_sd, true); + npc_event(pl_sd, bgteam_2->active_event.c_str(), 0); + return; + } + + return; +} + +/** + * Check to see if any players in the queue are on a map with MF_NOWARP and remove them from the queue + * @param queue: Queue data + * @return True if the player is on a map with MF_NOWARP or false otherwise + */ +bool bg_mapflag_check(std::shared_ptr queue) { + if (queue == nullptr || battle_config.bgqueue_nowarp_mapflag == 0) + return false; + + bool found = false; + + for (const auto &sd : queue->teama_members) { + if (map_getmapflag(sd->bl.m, MF_NOWARP)) { + clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], msg_txt(sd, 337), false, SELF); // You can't apply to a battleground queue from this map. + bg_queue_leave(sd); + clif_bg_queue_entry_init(sd); + found = true; + } + } + + for (const auto &sd : queue->teamb_members) { + if (map_getmapflag(sd->bl.m, MF_NOWARP)) { + clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], msg_txt(sd, 337), false, SELF); // You can't apply to a battleground queue from this map. + bg_queue_leave(sd); + clif_bg_queue_entry_init(sd); + found = true; + } + } + + if (found) { + queue->state = QUEUE_STATE_SETUP; // Set back to queueing state + queue->accepted_players = 0; // Reset acceptance count + + // Free map to avoid creating a reservation delay + if (queue->map != nullptr) { + queue->map->isReserved = false; + queue->map = nullptr; + } + + // Announce failure to remaining players + for (const auto &sd : queue->teama_members) + clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], msg_txt(sd, 340), false, SELF); // Participants were unable to join. Delaying entry for more participants. + + for (const auto &sd : queue->teamb_members) + clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], msg_txt(sd, 340), false, SELF); // Participants were unable to join. Delaying entry for more participants. + } + + return found; +} + /** * Update the Battleground queue when the player accepts the invite * @param queue: Battleground queue * @param sd: Player data */ -void bg_queue_on_accept_invite(std::shared_ptr queue, struct map_session_data *sd) +void bg_queue_on_accept_invite(struct map_session_data *sd) { nullpo_retv(sd); - sd->bg_queue_accept_state = true; + std::shared_ptr queue = bg_search_queue(sd->bg_queue_id); + + if (queue == nullptr) { + ShowError("bg_queue_on_accept_invite: Couldn't find player %s in battlegrounds queue.\n", sd->status.name); + return; + } + queue->accepted_players++; - clig_bg_queue_ack_lobby(true, map_mapid2mapname(queue->map->mapid), map_mapid2mapname(queue->map->mapid), sd); + clif_bg_queue_ack_lobby(true, mapindex_id2name(queue->map->mapindex), mapindex_id2name(queue->map->mapindex), sd); - if (queue->accepted_players == queue->required_players * 2) { - queue->tid_start = add_timer(gettick() + battleground_db.find(queue->id)->start_delay * 1000, bg_on_ready_start, 0, (intptr_t)queue.get()); + if (queue->state == QUEUE_STATE_ACTIVE) // Battleground is already active + bg_join_active(sd, queue); + else if (queue->state == QUEUE_STATE_SETUP_DELAY) { + if (queue->accepted_players == queue->required_players * 2) { + if (queue->tid_expire != INVALID_TIMER) { + delete_timer(queue->tid_expire, bg_on_ready_expire); + queue->tid_expire = INVALID_TIMER; + } - if (queue->tid_expire != INVALID_TIMER) { - delete_timer(queue->tid_expire, bg_on_ready_expire); - queue->tid_expire = INVALID_TIMER; + // Check player's current position for mapflag check + if (battle_config.bgqueue_nowarp_mapflag > 0 && bg_mapflag_check(queue)) + return; + + queue->tid_start = add_timer(gettick() + battleground_db.find(queue->id)->start_delay * 1000, bg_on_ready_start, 0, (intptr_t)queue->queue_id); } } } @@ -1146,31 +1482,33 @@ void bg_queue_on_accept_invite(std::shared_ptr queue, stru * Begin the Battleground from the given queue * @param queue: Battleground queue */ -void bg_queue_start_battleground(s_battleground_queue *queue) +void bg_queue_start_battleground(std::shared_ptr queue) { + if (queue == nullptr) + return; + std::shared_ptr bg = battleground_db.find(queue->id); if (!bg) { - queue->map->isReserved = false; // Remove reservation to free up for future queue - queue->map = nullptr; + bg_queue_clear(queue, true); ShowError("bg_queue_start_battleground: Could not find battleground ID %d in battlegrounds database.\n", queue->id); return; } - uint16 map_idx = map_id2index(queue->map->mapid); + // Check player's current position for mapflag check + if (battle_config.bgqueue_nowarp_mapflag > 0 && bg_mapflag_check(queue)) + return; + + uint16 map_idx = queue->map->mapindex; int bg_team_1 = bg_create(map_idx, &queue->map->team1); int bg_team_2 = bg_create(map_idx, &queue->map->team2); for (const auto &sd : queue->teama_members) { - sd->bg_queue = nullptr; - sd->bg_queue_accept_state = false; clif_bg_queue_entry_init(sd); bg_team_join(bg_team_1, sd, true); } for (const auto &sd : queue->teamb_members) { - sd->bg_queue = nullptr; - sd->bg_queue_accept_state = false; clif_bg_queue_entry_init(sd); bg_team_join(bg_team_2, sd, true); } @@ -1178,11 +1516,9 @@ void bg_queue_start_battleground(s_battleground_queue *queue) mapreg_setreg(add_str(queue->map->team1.bg_id_var.c_str()), bg_team_1); mapreg_setreg(add_str(queue->map->team2.bg_id_var.c_str()), bg_team_2); npc_event_do(queue->map->bgcallscript.c_str()); - queue->teama_members.clear(); - queue->teamb_members.clear(); - queue->teama_members.shrink_to_fit(); - queue->teamb_members.shrink_to_fit(); - bg_queue_clear(queue); + queue->state = QUEUE_STATE_ACTIVE; + + bg_queue_clear(queue, false); } /** @@ -1195,13 +1531,14 @@ static void bg_queue_create(int bg_id, int req_players) { auto queue = std::make_shared(); + queue->queue_id = bg_queue_count++; queue->id = bg_id; queue->required_players = req_players; queue->accepted_players = 0; queue->tid_expire = INVALID_TIMER; queue->tid_start = INVALID_TIMER; queue->tid_requeue = INVALID_TIMER; - queue->in_ready_state = false; + queue->state = QUEUE_STATE_SETUP; bg_queues.push_back(queue); } diff --git a/src/map/battleground.hpp b/src/map/battleground.hpp index e2377d69bf..cd68b2a380 100644 --- a/src/map/battleground.hpp +++ b/src/map/battleground.hpp @@ -27,32 +27,43 @@ struct s_battleground_data { struct point cemetery; ///< Respawn point for players who die std::string logout_event; ///< NPC Event to call on log out events std::string die_event; ///< NPC Event to call on death events + std::string active_event; ///< NPC Event to call on players joining an active battleground }; struct s_battleground_team { int16 warp_x, warp_y; ///< Team respawn coordinates std::string quit_event, ///< Team NPC Event to call on log out events death_event, ///< Team NPC Event to call on death events + active_event, ///< Team NPC Event to call on players joining an active battleground bg_id_var; ///< Team NPC variable name }; struct s_battleground_map { int id; ///< Battleground ID - int16 mapid; ///< ID of the map + uint16 mapindex; ///< Index of the map s_battleground_team team1, team2; ///< Team data std::string bgcallscript; ///< Script to be called when players join the battleground bool isReserved; ///< Reserve BG maps that are used so that the system won't create multiple BG instances on the same map }; +/// Enum for queue state tracking +enum e_queue_state : uint16 { + QUEUE_STATE_SETUP = 0, ///< The initial setup of a queue (a required amount of players hasn't been met) + QUEUE_STATE_SETUP_DELAY, ///< The initial setup of a queue but a required amount of players have accepted and the delay timer is active + QUEUE_STATE_ACTIVE, ///< The queue is active script side and more players can join (players may or may not be on the field) + QUEUE_STATE_ENDED, ///< The queue is no longer joinable (players are getting prizes) +}; + /// Battlegrounds client interface queue system [MasterOfMuppets] struct s_battleground_queue { + int queue_id; ///< Battlegrounds Queue ID int id; ///< Battlegrounds database ID std::vector teama_members; ///< List of members on team A std::vector teamb_members; ///< List of members on team B int required_players; ///< Amount of players required on each side to start int max_players; ///< Maximum amount of players on each side int accepted_players; ///< Amount of players who accepted the offer to enter the battleground - bool in_ready_state; ///< Is this BG queue waiting for players to enter the BG? + e_queue_state state; ///< See @e_queue_state int tid_expire; ///< Timer ID associated with the time out at the ready to enter window int tid_start; ///< Timer ID associated with the start delay int tid_requeue; ///< Timer ID associated with requeuing this group if all BG maps are reserved @@ -69,6 +80,10 @@ struct s_battleground_type { std::vector maps; ///< List of battleground locations uint32 deserter_time; ///< Amount of time a player is marked deserter (seconds) uint32 start_delay; ///< Amount of time before the start message is sent to players (seconds) + bool solo; ///< Ability to join a queue as an individual. + bool party; ///< Ability to join a queue as a party. + bool guild; ///< Ability to join a queue as a guild. + std::vector job_restrictions; ///< List of jobs that are unable to join. }; /// Enum of responses when applying for a Battleground @@ -109,15 +124,17 @@ public: extern BattlegroundDatabase battleground_db; extern std::unordered_map> bg_team_db; +extern std::vector> bg_queues; std::shared_ptr bg_search_name(const char *name); +std::shared_ptr bg_search_queue(int queue_id); void bg_send_dot_remove(struct map_session_data *sd); int bg_team_get_id(struct block_list *bl); struct map_session_data *bg_getavailablesd(s_battleground_data *bg); -bool bg_queue_reservation(const char *name, bool state); -#define bg_queue_reserve(name) (bg_queue_reservation(name, true)) -#define bg_queue_unbook(name) (bg_queue_reservation(name, false)) +bool bg_queue_reservation(const char *name, bool state, bool ended); +#define bg_queue_reserve(name, end) (bg_queue_reservation(name, true, end)) +#define bg_queue_unbook(name) (bg_queue_reservation(name, false, false)) int bg_create(uint16 mapindex, s_battleground_team* team); bool bg_team_join(int bg_id, struct map_session_data *sd, bool is_queue); @@ -126,13 +143,15 @@ int bg_team_leave(struct map_session_data *sd, bool quit, bool deserter); bool bg_team_warp(int bg_id, unsigned short mapindex, short x, short y); bool bg_player_is_in_bg_map(struct map_session_data *sd); bool bg_queue_check_joinable(std::shared_ptr bg, struct map_session_data *sd, const char *name); +void bg_queue_join_solo(const char *name, struct map_session_data *sd); void bg_queue_join_party(const char *name, struct map_session_data *sd); void bg_queue_join_guild(const char *name, struct map_session_data *sd); void bg_queue_join_multi(const char *name, struct map_session_data *sd, std::vector list); +void bg_queue_clear(std::shared_ptr queue, bool ended); bool bg_queue_leave(struct map_session_data *sd); bool bg_queue_on_ready(const char *name, std::shared_ptr queue); -void bg_queue_on_accept_invite(std::shared_ptr queue, struct map_session_data *sd); -void bg_queue_start_battleground(s_battleground_queue *queue); +void bg_queue_on_accept_invite(struct map_session_data *sd); +void bg_queue_start_battleground(std::shared_ptr queue); bool bg_member_respawn(struct map_session_data *sd); void bg_send_message(struct map_session_data *sd, const char *mes, int len); diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 94a7291cbe..d702311fac 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -609,13 +609,12 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target case BG_SAMEMAP_WOS: case BG: case BG_WOS: - if( sd && sd->bg_id && (bg = util::umap_find(bg_team_db, sd->bg_id))) + if( sd && sd->bg_id > 0 && (bg = util::umap_find(bg_team_db, sd->bg_id))) { - for( i = 0; i < bg->members.size(); i++ ) - { - if( (sd = bg->members[i].sd) == NULL || !(fd = sd->fd) ) + for (const auto &member : bg->members) { + if((sd = member.sd) == nullptr || (fd = sd->fd) == 0) continue; - if( sd->bl.id == bl->id && (type == BG_WOS || type == BG_SAMEMAP_WOS || type == BG_AREA_WOS) ) + if(sd->bl.id == bl->id && (type == BG_WOS || type == BG_SAMEMAP_WOS || type == BG_AREA_WOS) ) continue; if( type != BG && type != BG_WOS && sd->bl.m != bl->m ) continue; @@ -17630,12 +17629,12 @@ void clif_parse_bg_queue_apply_request(int fd, struct map_session_data *sd) safestrncpy(name, RFIFOCP(fd, 4), NAME_LENGTH); - if (sd->bg_queue) { - ShowWarning("clif_parse_bg_queue_apply_request: Received duplicate queue application: %d from player %s (AID:%d CID:%d).\n", type, sd->status.name, sd->status.account_id, sd->status.char_id); + if (sd->bg_queue_id > 0) { + //ShowWarning("clif_parse_bg_queue_apply_request: Received duplicate queue application: %d from player %s (AID:%d CID:%d).\n", type, sd->status.name, sd->status.account_id, sd->status.char_id); clif_bg_queue_apply_result(BG_APPLY_DUPLICATE, name, sd); // Duplicate application warning return; } else if (type == 1) // Solo - bg_queue_join_multi(name, sd, { sd }); + bg_queue_join_solo(name, sd); else if (type == 2) // Party bg_queue_join_party(name, sd); else if (type == 4) // Guild @@ -17670,9 +17669,9 @@ void clif_bg_queue_apply_notify(const char *name, struct map_session_data *sd) { nullpo_retv(sd); - std::shared_ptr queue = sd->bg_queue; + std::shared_ptr queue = bg_search_queue(sd->bg_queue_id); - if (!queue) { + if (queue == nullptr) { ShowError("clif_bg_queue_apply_notify: Player is not in a battleground queue.\n"); return; } @@ -17712,8 +17711,10 @@ void clif_parse_bg_queue_cancel_request(int fd, struct map_session_data *sd) bool success; - if (sd->bg_queue) { - if (sd->bg_queue->in_ready_state) + if (sd->bg_queue_id > 0) { + std::shared_ptr queue = bg_search_queue(sd->bg_queue_id); + + if (queue && queue->state == QUEUE_STATE_SETUP_DELAY) return; // Make the cancel button do nothing if the entry window is open. Otherwise it'll crash the game when you click on both the queue status and entry status window. else success = bg_queue_leave(sd); @@ -17751,11 +17752,11 @@ void clif_parse_bg_queue_lobby_reply(int fd, struct map_session_data *sd) { nullpo_retv(sd); - if(sd->bg_queue) { + if(sd->bg_queue_id > 0) { uint8 result = RFIFOB(fd, 2); if(result == 1) { // Accept - bg_queue_on_accept_invite(sd->bg_queue, sd); + bg_queue_on_accept_invite(sd); } else if(result == 2) { // Decline bg_queue_leave(sd); clif_bg_queue_entry_init(sd); @@ -17765,7 +17766,7 @@ void clif_parse_bg_queue_lobby_reply(int fd, struct map_session_data *sd) /// Plays a gong sound, signaling that someone has accepted the invite to enter a battleground. /// 0x8e1 .B .24B .24B (ZC_REPLY_ACK_LOBBY_ADMISSION) -void clig_bg_queue_ack_lobby(bool result, const char *name, const char *lobbyname, struct map_session_data *sd) +void clif_bg_queue_ack_lobby(bool result, const char *name, const char *lobbyname, struct map_session_data *sd) { nullpo_retv(sd); diff --git a/src/map/clif.hpp b/src/map/clif.hpp index a2bfdbdb5c..469082956f 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -833,7 +833,7 @@ void clif_bg_queue_apply_result(e_bg_queue_apply_ack result, const char *name, s void clif_bg_queue_apply_notify(const char *name, struct map_session_data *sd); void clif_bg_queue_entry_init(struct map_session_data *sd); void clif_bg_queue_lobby_notify(const char *name, struct map_session_data *sd); -void clig_bg_queue_ack_lobby(bool result, const char *name, const char *lobbyname, struct map_session_data *sd); +void clif_bg_queue_ack_lobby(bool result, const char *name, const char *lobbyname, struct map_session_data *sd); // Instancing void clif_instance_create(int instance_id, int num); diff --git a/src/map/map.cpp b/src/map/map.cpp index 6227ffb4ed..50bc1c1ab5 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -2063,7 +2063,7 @@ int map_quit(struct map_session_data *sd) { if (sd->bg_id) bg_team_leave(sd, true, true); - if (sd->bg_queue != nullptr) + if (sd->bg_queue_id > 0) bg_queue_leave(sd); if( sd->status.clan_id ) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 0184a56ffd..0c0f945aec 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -354,6 +354,54 @@ int pc_get_group_level(struct map_session_data *sd) { return sd->group_level; } +/** + * Remove a player from queue after timeout + * @param tid: Timer ID + * @param tick: Timer + * @param id: ID + * @return 0 on success or 1 otherwise + */ +static TIMER_FUNC(pc_on_expire_active) +{ + map_session_data *sd = (map_session_data *)data; + + nullpo_retr(1, sd); + + sd->tid_queue_active = INVALID_TIMER; + + bg_queue_leave(sd); + clif_bg_queue_entry_init(sd); + return 0; +} + +/** + * Function used to set timer externally + * @param sd: Player data + */ +void pc_set_bg_queue_timer(map_session_data *sd) { + nullpo_retv(sd); + + if (sd->tid_queue_active != INVALID_TIMER) { + delete_timer(sd->tid_queue_active, pc_on_expire_active); + sd->tid_queue_active = INVALID_TIMER; + } + + sd->tid_queue_active = add_timer(gettick() + 20000, pc_on_expire_active, 0, (intptr_t)sd); +} + +/** + * Function used to delete timer externally + * @param sd: Player data + */ +void pc_delete_bg_queue_timer(map_session_data *sd) { + nullpo_retv(sd); + + if (sd->tid_queue_active != INVALID_TIMER) { + delete_timer(sd->tid_queue_active, pc_on_expire_active); + sd->tid_queue_active = INVALID_TIMER; + } +} + static TIMER_FUNC(pc_invincible_timer){ struct map_session_data *sd; @@ -1471,6 +1519,7 @@ bool pc_authok(struct map_session_data *sd, uint32 login_id2, time_t expiration_ sd->expiration_tid = INVALID_TIMER; sd->autotrade_tid = INVALID_TIMER; sd->respawn_tid = INVALID_TIMER; + sd->tid_queue_active = INVALID_TIMER; #ifdef SECURE_NPCTIMEOUT // Initialize to defaults/expected @@ -1617,9 +1666,8 @@ bool pc_authok(struct map_session_data *sd, uint32 login_id2, time_t expiration_ sd->bonus_script.head = NULL; sd->bonus_script.count = 0; - // Initialize BG queue pointer - sd->bg_queue = nullptr; - sd->bg_queue_accept_state = false; + // Initialize BG queue + sd->bg_queue_id = 0; #if PACKETVER >= 20150513 sd->hatEffectIDs = NULL; @@ -13417,6 +13465,7 @@ void do_init_pc(void) { add_timer_func_list(pc_global_expiration_timer, "pc_global_expiration_timer"); add_timer_func_list(pc_expiration_timer, "pc_expiration_timer"); add_timer_func_list(pc_autotrade_timer, "pc_autotrade_timer"); + add_timer_func_list(pc_on_expire_active, "pc_on_expire_active"); add_timer(gettick() + autosave_interval, pc_autosave, 0, 0); diff --git a/src/map/pc.hpp b/src/map/pc.hpp index 148f640244..1f22c79296 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -634,10 +634,6 @@ struct map_session_data { bool changed; // if true, should sync with charserver on next mailbox request } mail; - // Battlegrounds queue system [MasterOfMuppets] - std::shared_ptr bg_queue; - bool bg_queue_accept_state; // Set this to true when someone has accepted the invite to join BGs - //Quest log system int num_quests; ///< Number of entries in quest_log int avail_quests; ///< Number of Q_ACTIVE and Q_INACTIVE entries in quest log (index of the first Q_COMPLETE entry) @@ -668,7 +664,9 @@ struct map_session_data { int debug_line; const char* debug_func; - int bg_id; + // Battlegrounds queue system [MasterOfMuppets] + int bg_id, bg_queue_id; + int tid_queue_active; ///< Timer ID associated with players joining an active BG #ifdef SECURE_NPCTIMEOUT /** @@ -1296,6 +1294,9 @@ struct sg_data { }; extern const struct sg_data sg_info[MAX_PC_FEELHATE]; +void pc_set_bg_queue_timer(map_session_data *sd); +void pc_delete_bg_queue_timer(map_session_data *sd); + void pc_setinvincibletimer(struct map_session_data* sd, int val); void pc_delinvincibletimer(struct map_session_data* sd); diff --git a/src/map/script.cpp b/src/map/script.cpp index 7ff47a67fd..c4a084a4f4 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -20016,20 +20016,21 @@ BUILDIN_FUNC(bg_get_data) /** * Reserves a slot for the given Battleground. - * bg_reserve(<"bg_name">); + * bg_reserve(""{,}); */ BUILDIN_FUNC(bg_reserve) { const char *str = script_getstr(st, 2); + bool ended = script_hasdata(st, 3) ? script_getnum(st, 3) != 0 : false; - if (!bg_queue_reserve(str)) + if (!bg_queue_reserve(str, ended)) ShowWarning("buildin_bg_reserve: Could not reserve battleground with name %s\n", str); return SCRIPT_CMD_SUCCESS; } /** * Removes a spot for the given Battleground. - * bg_unbook(<"bg_name">); + * bg_unbook(""); */ BUILDIN_FUNC(bg_unbook) { @@ -20075,7 +20076,7 @@ BUILDIN_FUNC(bg_info) size_t i; for (i = 0; i < bg->maps.size(); i++) - setd_sub_str(st, nullptr, ".@bgmaps$", i, map_mapid2mapname(bg->maps[i].mapid), nullptr); + setd_sub_str(st, nullptr, ".@bgmaps$", i, mapindex_id2name(bg->maps[i].mapindex), nullptr); setd_sub_num(st, nullptr, ".@bgmapscount", 0, i, nullptr); script_pushint(st, i); break; @@ -25143,7 +25144,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(bg_updatescore,"sii"), BUILDIN_DEF(bg_join,"i????"), BUILDIN_DEF(bg_create,"sii??"), - BUILDIN_DEF(bg_reserve,"s"), + BUILDIN_DEF(bg_reserve,"s?"), BUILDIN_DEF(bg_unbook,"s"), BUILDIN_DEF(bg_info,"si"), From 7cc59c670822695833e9ac812cd5b46c9146eff2 Mon Sep 17 00:00:00 2001 From: Aleos Date: Mon, 25 May 2020 20:28:11 -0400 Subject: [PATCH 142/212] Adjusts a few checks for item tradability (#4995) * Follow up to bfb6972. * Adds a new return array for script command inventorylist: `@inventorylist_tradable` * Adjusts script command countitem to not count rental items. --- doc/script_commands.txt | 4 +++- src/map/pc.cpp | 18 ++++++++++++++++++ src/map/pc.hpp | 1 + src/map/script.cpp | 15 ++++++--------- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index ecd78cd2ee..93693c3f7c 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -2910,6 +2910,7 @@ recreate these items perfectly if they are destroyed. Here's what you get: @inventorylist_option_id5[] - fifth array of random option IDs @inventorylist_option_value5[] - fifth array of random option values @inventorylist_option_parameter5[] - fifth array of random option parameters +@inventorylist_tradable - Returns if an item is tradable or not (Pass item_trade.txt, bound, and rental restrictions). This could be handy to save/restore a character's inventory, since no other command returns such a complete set of data, and could also be the only way to @@ -4798,8 +4799,9 @@ for special cases such as removing a status change or resetting a variable or st of the player. This command can not be used to rent stackable items. Rental items cannot be -dropped, traded, sold to NPCs, or placed in guild storage. (i.e. trade mask 75) +dropped, traded, or placed in guild storage. (i.e. trade mask 67) Note: 'delitem' in an NPC script can still remove rental items. +Note: 'countitem' will not count any item with a rental timer. --------------------------------------- diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 0c0f945aec..ed287c2522 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -916,6 +916,24 @@ bool pc_can_give_bounded_items(struct map_session_data *sd) return pc_has_permission(sd, PC_PERM_TRADE_BOUNDED); } +/** + * Determine if an item in a player's inventory is tradeable based on several merits. + * Checks for item_trade, bound, and rental restrictions. + * @param sd: Player data + * @param index: Item inventory index + * @return True if the item can be traded or false otherwise + */ +bool pc_can_trade_item(map_session_data *sd, int index) { + if (sd && index >= 0) { + return (sd->inventory.u.items_inventory[index].expire_time == 0 && + (sd->inventory.u.items_inventory[index].bound == 0 || pc_can_give_bounded_items(sd)) && + itemdb_cantrade(&sd->inventory.u.items_inventory[index], pc_get_group_level(sd), pc_get_group_level(sd)) + ); + } + + return false; +} + /*========================================== * Prepares character for saving. * @param sd diff --git a/src/map/pc.hpp b/src/map/pc.hpp index 1f22c79296..4df3e616bd 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -1051,6 +1051,7 @@ int pc_get_group_id(struct map_session_data *sd); bool pc_can_sell_item(struct map_session_data* sd, struct item * item, enum npc_subtype shoptype); bool pc_can_give_items(struct map_session_data *sd); bool pc_can_give_bounded_items(struct map_session_data *sd); +bool pc_can_trade_item(map_session_data *sd, int index); bool pc_can_use_command(struct map_session_data *sd, const char *command, AtCommandType type); #define pc_has_permission(sd, permission) ( ((sd)->permissions&permission) != 0 ) diff --git a/src/map/script.cpp b/src/map/script.cpp index c4a084a4f4..5dcfd74633 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -6935,7 +6935,7 @@ int script_countitem_sub(struct item *items, struct item_data *id, int size, boo unsigned short nameid = id->nameid; for (int i = 0; i < size; i++) { - if (&items[i] && items[i].nameid == nameid) + if (&items[i] && items[i].nameid == nameid && items[i].expire_time == 0) count += items[i].amount; } } else { // For expanded functions @@ -6967,7 +6967,7 @@ int script_countitem_sub(struct item *items, struct item_data *id, int size, boo for (int i = 0; i < size; i++) { struct item *itm = &items[i]; - if (!itm || !itm->nameid || itm->amount < 1) + if (!itm || !itm->nameid || itm->amount < 1 || items[i].expire_time > 0) continue; if (itm->nameid != it.nameid || itm->identify != it.identify || itm->refine != it.refine || itm->attribute != it.attribute) continue; @@ -7708,6 +7708,7 @@ BUILDIN_FUNC(rentitem2) { it.card[2] = (short)c3; it.card[3] = (short)c4; it.expire_time = (unsigned int)(time(NULL) + seconds); + it.bound = BOUND_NONE; if (funcname[strlen(funcname)-1] == '3') { int res = script_getitem_randomoption(st, sd, &it, funcname, 11); @@ -14058,6 +14059,7 @@ BUILDIN_FUNC(getinventorylist) sprintf(randopt_var, "@inventorylist_option_parameter%d",k+1); pc_setreg(sd,reference_uid(add_str(randopt_var), j),sd->inventory.u.items_inventory[i].option[k].param); } + pc_setreg(sd,reference_uid(add_str("@inventorylist_tradable"), j),pc_can_trade_item(sd, i)); j++; } } @@ -24062,13 +24064,8 @@ BUILDIN_FUNC(getequiptradability) { return SCRIPT_CMD_FAILURE; } - if (i >= 0) { - bool tradable = (sd->inventory.u.items_inventory[i].expire_time == 0 && - (!sd->inventory.u.items_inventory[i].bound || pc_can_give_bounded_items(sd)) && - itemdb_cantrade(&sd->inventory.u.items_inventory[i], pc_get_group_level(sd), pc_get_group_level(sd)) - ); - script_pushint(st, tradable); - } + if (i >= 0) + script_pushint(st, pc_can_trade_item(sd, i)); else script_pushint(st, false); From c81e6ffc092378448f958856951a9cd748790fb7 Mon Sep 17 00:00:00 2001 From: Aleos Date: Tue, 26 May 2020 09:41:08 -0400 Subject: [PATCH 143/212] Fixes Decorate Cart requirement (#5012) * Fixes #4980. * Decorate Cart requires a Cart be active. Thanks to @LordWhiplash! --- db/re/skill_db.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 85b8450c08..c70dc2f64f 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -28372,6 +28372,7 @@ Body: HitCount: 1 Requires: SpCost: 40 + State: Cart - Id: 2552 Name: RL_RICHS_COIN Description: Rich's Coin From 0e42b738c59be3330395e8c79c51500d534fcf55 Mon Sep 17 00:00:00 2001 From: Aleos Date: Tue, 26 May 2020 10:30:59 -0400 Subject: [PATCH 144/212] Fixes looter mobs getting stuck (#5000) * Follow up to b6b6b13. * Fixes #4941. * Fixes cases of monsters getting stuck when they lose sight of their target item that is looted by another monster. Thanks to @iraciz and @SeravySensei! --- src/map/mob.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 1a8f47c532..2d0420bfba 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -1723,8 +1723,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick) )) { //No valid target if (mob_warpchase(md, tbl)) return true; //Chasing this target. - if(md->ud.walktimer != INVALID_TIMER && (!can_move || md->ud.walkpath.path_pos <= battle_config.mob_chase_refresh) - && (tbl || md->ud.walkpath.path_pos == 0)) + if (tbl && md->ud.walktimer != INVALID_TIMER && (!can_move || md->ud.walkpath.path_pos <= battle_config.mob_chase_refresh)) return true; //Walk at least "mob_chase_refresh" cells before dropping the target unless target is non-existent mob_unlocktarget(md, tick); //Unlock target tbl = NULL; From 7efd696af7da0f46bf291a3ed25509dbb9e164d2 Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 27 May 2020 15:52:37 +0200 Subject: [PATCH 145/212] Added several check for OnTouch and OnTouch_ before running the event (#5009) * Check if the player is still in npc range * Check if the player is still able to interact with the npc * Check if the npc is cloaked --- src/map/npc.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/map/npc.cpp b/src/map/npc.cpp index f86995f35e..e4524f276a 100644 --- a/src/map/npc.cpp +++ b/src/map/npc.cpp @@ -989,6 +989,26 @@ int npc_event_sub(struct map_session_data* sd, struct event_data* ev, const char npc_event_dequeue(sd); return 2; } + + char ontouch_event_name[EVENT_NAME_LENGTH]; + char ontouch2_event_name[EVENT_NAME_LENGTH]; + + safesnprintf(ontouch_event_name, ARRAYLENGTH(ontouch_event_name), "%s::%s", ev->nd->exname, script_config.ontouch_event_name); + safesnprintf(ontouch2_event_name, ARRAYLENGTH(ontouch2_event_name), "%s::%s", ev->nd->exname, script_config.ontouch2_event_name); + + // recheck some conditions for OnTouch/OnTouch_ + if (strcmp(eventname, ontouch_event_name) == 0 || strcmp(eventname, ontouch2_event_name) == 0) { + int xs = ev->nd->u.scr.xs; + int ys = ev->nd->u.scr.ys; + int x = ev->nd->bl.x; + int y = ev->nd->bl.y; + + if (x > 0 && y > 0 && (xs > -1 && ys > -1) && ((sd->bl.x < x - xs) || (sd->bl.x > x + xs) || (sd->bl.y < y - ys) || (sd->bl.y > y + ys)) || + (sd->state.block_action & PCBLOCK_NPCCLICK) || npc_is_cloaked(ev->nd, sd)) { + npc_event_dequeue(sd); + return 2; + } + } run_script(ev->nd->u.scr.script,ev->pos,sd->bl.id,ev->nd->bl.id); return 0; } From 55e3d45fa12bbebba60b537996a0858730f94e28 Mon Sep 17 00:00:00 2001 From: LordWhiplash <62680611+LordWhiplash@users.noreply.github.com> Date: Wed, 27 May 2020 17:53:55 -0300 Subject: [PATCH 146/212] Fix Whikebain's Black Tail (#5016) * Fixes #5005. * Whikebain's Black Tail should not apply curse. Thanks to @reunite-ro and @LordWhiplash! Co-authored-by: LordWhiplash --- db/re/item_db.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index ef9150b717..9309251dc0 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -2077,7 +2077,7 @@ 2852,E_Rosary_C,Rosary,4,1,,0,,0,,0,0xFFFFFFFE,63,2,136,,1,0,0,{ bonus bLuk,4; bonus bMdef,5; },{},{} 2853,Telekinetic_Orb,Telekinetic Orb,4,20,,200,,2,,0,0xFFFFFFFE,63,2,136,,110,0,0,{ bonus bMdef,1; bonus bInt,3; bonus bMaxSP,30; bonus2 bSkillAtk,"WL_SOULEXPANSION",10; bonus2 bSkillAtk,"SO_PSYCHIC_WAVE",10; bonus2 bSkillUseSP,"WL_SOULEXPANSION",-50; bonus2 bSkillUseSP,"SO_PSYCHIC_WAVE",-50; },{},{} 2854,Alchemy_Glove,Alchemy Glove,4,20,,100,,1,,1,0xFFFFFFFE,63,2,136,,125,0,0,{ bonus bMdef,2; bonus bInt,1; bonus2 bMagicAtkEle,Ele_Fire,10; bonus2 bMagicAtkEle,Ele_Water,-20; bonus2 bSubEle,Ele_Water,-30; bonus3 bAutoSpell,"MG_FIREBALL",5,30; bonus5 bAutoSpell,"MG_FIREBOLT",5,30,BF_MAGIC,1; },{},{} -2855,Whike_Black_Tail,Whike Black Tail,4,20,,100,,0,,0,0xFFFFFFFF,63,2,136,,45,0,0,{ bonus bCritical,7; bonus bAspdRate,3; bonus2 bAddEff2,Eff_Curse,10; },{},{} +2855,Whike_Black_Tail,Whike Black Tail,4,20,,100,,0,,0,0xFFFFFFFF,63,2,136,,45,0,0,{ bonus bCritical,7; bonus bAspdRate,3; },{},{} 2856,Half_Megin,Half Megingjard,4,20,,0,,1,,0,0xFFFFFFFF,63,2,136,,47,0,0,{ bonus bMdef,3; bonus bStr,20; },{},{} 2857,Half_Brysing,Half Brisingamen,4,20,,0,,1,,0,0xFFFFFFFF,63,2,136,,47,0,0,{ bonus bStr,3; bonus bInt,5; bonus bVit,3; bonus bDex,3; bonus bAgi,3; bonus bLuk,5; bonus bMdef,2; },{},{} 2858,Pendant_Of_Guardian,Pendant Of Guardian,4,0,,0,,0,,0,0xFFFFFFFF,63,2,136,,70,0,0,{ skill "ALL_GUARDIAN_RECALL",1; },{},{} From 7e38cc6fa8658cf5b23a903a162b6cfb68c777a4 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Wed, 27 May 2020 22:54:02 +0200 Subject: [PATCH 147/212] SQL synchronization --- sql-files/item_db_re.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index b5c5cde2c6..067bc2ed2d 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -2109,7 +2109,7 @@ REPLACE INTO `item_db_re` VALUES (2851,'E_Necklace_C','Necklace',4,1,NULL,0,NULL REPLACE INTO `item_db_re` VALUES (2852,'E_Rosary_C','Rosary',4,1,NULL,0,NULL,0,NULL,0,0xFFFFFFFE,63,2,136,NULL,'1',0,0,'bonus bLuk,4; bonus bMdef,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2853,'Telekinetic_Orb','Telekinetic Orb',4,20,NULL,200,NULL,2,NULL,0,0xFFFFFFFE,63,2,136,NULL,'110',0,0,'bonus bMdef,1; bonus bInt,3; bonus bMaxSP,30; bonus2 bSkillAtk,"WL_SOULEXPANSION",10; bonus2 bSkillAtk,"SO_PSYCHIC_WAVE",10; bonus2 bSkillUseSP,"WL_SOULEXPANSION",-50; bonus2 bSkillUseSP,"SO_PSYCHIC_WAVE",-50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2854,'Alchemy_Glove','Alchemy Glove',4,20,NULL,100,NULL,1,NULL,1,0xFFFFFFFE,63,2,136,NULL,'125',0,0,'bonus bMdef,2; bonus bInt,1; bonus2 bMagicAtkEle,Ele_Fire,10; bonus2 bMagicAtkEle,Ele_Water,-20; bonus2 bSubEle,Ele_Water,-30; bonus3 bAutoSpell,"MG_FIREBALL",5,30; bonus5 bAutoSpell,"MG_FIREBOLT",5,30,BF_MAGIC,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2855,'Whike_Black_Tail','Whike Black Tail',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'45',0,0,'bonus bCritical,7; bonus bAspdRate,3; bonus2 bAddEff2,Eff_Curse,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2855,'Whike_Black_Tail','Whike Black Tail',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'45',0,0,'bonus bCritical,7; bonus bAspdRate,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2856,'Half_Megin','Half Megingjard',4,20,NULL,0,NULL,1,NULL,0,0xFFFFFFFF,63,2,136,NULL,'47',0,0,'bonus bMdef,3; bonus bStr,20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2857,'Half_Brysing','Half Brisingamen',4,20,NULL,0,NULL,1,NULL,0,0xFFFFFFFF,63,2,136,NULL,'47',0,0,'bonus bStr,3; bonus bInt,5; bonus bVit,3; bonus bDex,3; bonus bAgi,3; bonus bLuk,5; bonus bMdef,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2858,'Pendant_Of_Guardian','Pendant Of Guardian',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'70',0,0,'skill "ALL_GUARDIAN_RECALL",1;',NULL,NULL); From 023dcac49fd40ef6c9037ed4d713f394df6bac9e Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 28 May 2020 11:37:31 -0400 Subject: [PATCH 148/212] Adjusts Reverberation behavior (#5013) * Reverberation no longer uses any sub-attack skill. * Adjusts hit count to be split on each hit. Thanks to @attackjom! --- db/re/skill_db.yml | 7 ++++--- src/map/battle.cpp | 4 ++-- src/map/skill.cpp | 4 ++-- src/map/skill.hpp | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index c70dc2f64f..735bda1266 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -25089,14 +25089,15 @@ Body: Name: WM_REVERBERATION Description: Reverberation MaxLevel: 5 + Type: Magic TargetType: Attack DamageFlags: Splash: true Flags: IsTrap: true Range: 9 - Hit: Single - HitCount: 1 + Hit: Multi_Hit + HitCount: -10 SplashArea: - Level: 1 Area: 2 @@ -25148,7 +25149,7 @@ Body: Reproduce: true Requires: SpCost: 1 - - Id: 2416 + - Id: 2416 # Removed on kRO Name: WM_REVERBERATION_MAGIC Description: Reverberation Magic MaxLevel: 5 diff --git a/src/map/battle.cpp b/src/map/battle.cpp index c440f75992..0b1aa9fe47 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -6069,7 +6069,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list if (mflag&ELE_DARK) s_ele = ELE_DARK; break; - case WM_REVERBERATION_MAGIC: + case WM_REVERBERATION: if (sd) s_ele = sd->bonus.arrow_ele; break; @@ -6495,7 +6495,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += 100; // !TODO: Confirm target sleeping bonus RE_LVL_DMOD(100); break; - case WM_REVERBERATION_MAGIC: + case WM_REVERBERATION: // MATK [{(Skill Level x 300) + 400} x Casters Base Level / 100] % skillratio += -100 + 700 + 300 * skill_lv; RE_LVL_DMOD(100); diff --git a/src/map/skill.cpp b/src/map/skill.cpp index dc5094104e..ab78946f49 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -3645,7 +3645,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * if (!(flag&SD_ANIMATION)) clif_skill_nodamage(dsrc, bl, skill_id, skill_lv, 1); // Fall through - case WM_REVERBERATION_MAGIC: + case WM_REVERBERATION: dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, dmg_type); break; case SJ_FALLINGSTAR_ATK: @@ -6033,7 +6033,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case WM_REVERBERATION: if (flag & 1) - skill_attack(skill_get_type(WM_REVERBERATION_MAGIC), src, src, bl, WM_REVERBERATION_MAGIC, skill_lv, tick, flag); + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); else { clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); map_foreachinallrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 06cccbffc0..36a9f97472 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -1693,7 +1693,7 @@ enum e_skill { WM_METALICSOUND, WM_REVERBERATION, WM_REVERBERATION_MELEE, // Removed on kRO - WM_REVERBERATION_MAGIC, + WM_REVERBERATION_MAGIC, // Removed on kRO WM_DOMINION_IMPULSE, // Removed on kRO WM_SEVERE_RAINSTORM, WM_POEMOFNETHERWORLD, From 4f68d0c144603aebbacbb4748fcbde6e83fd4262 Mon Sep 17 00:00:00 2001 From: Aleos Date: Thu, 28 May 2020 13:22:31 -0400 Subject: [PATCH 149/212] Fixes Mercenary kill counter (#5010) * Fixes #4329. * The master or the Mercenary are able to increase the kill count. Thanks to @Indigo000! --- src/map/mob.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 2d0420bfba..56c914c67e 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -3009,7 +3009,8 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) if (achievement_db.mobexists(md->mob_id)) achievement_update_objective(sd, AG_BATTLE, 1, md->mob_id); - if (sd->md && src && src->type == BL_MER && mob_db(md->mob_id)->lv > sd->status.base_level / 2) + // The master or Mercenary can increase the kill count + if (sd->md && src && (src->type == BL_PC || src->type == BL_MER) && mob_db(md->mob_id)->lv > sd->status.base_level / 2) mercenary_kills(sd->md); } From d386d515a2813b215111cf73f7cd58cb604e2605 Mon Sep 17 00:00:00 2001 From: LordWhiplash <62680611+LordWhiplash@users.noreply.github.com> Date: Fri, 29 May 2020 14:40:20 -0300 Subject: [PATCH 150/212] Fix Racing Cap combo with Racing 3Lv (#5020) * Fixes #4998. * Adjusts Cart Boost bonus to level 3. * Adjusts duration to 120 seconds. Thanks to @Angelic234 and @LordWhiplash! --- db/re/item_combo_db.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/item_combo_db.txt b/db/re/item_combo_db.txt index 0ef4d3a414..3a78f2bdf5 100644 --- a/db/re/item_combo_db.txt +++ b/db/re/item_combo_db.txt @@ -843,7 +843,7 @@ 19203:29351,{ bonus bBaseAtk,20; bonus bMatk,20; if (getskilllv("OB_OBOROGENSOU") == 5) bonus bVariableCastrate,-15; autobonus3 "{ bonus bCritAtkRate,30; }",1000,60000,"KG_KAGEMUSYA"; autobonus "{ bonus bNoSizeFix; }",50,5000,BF_WEAPON; } 19204:29352,{ bonus bMaxHP,500; bonus bBaseAtk,10; } 19204:29353,{ bonus bMaxHP,1000; bonus bBaseAtk,20; skill "WS_CARTBOOST",1; autobonus3 "{ bonus bBaseAtk,30; }",1000,60000,"WS_CARTBOOST"; } -19204:29354,{ bonus bMaxHP,1500; bonus bBaseAtk,40; skill "WS_CARTBOOST",1; autobonus3 "{ bonus bBaseAtk,50; }",1000,60000,"WS_CARTBOOST"; } +19204:29354,{ bonus bMaxHP,1500; bonus bBaseAtk,40; skill "WS_CARTBOOST",3; autobonus3 "{ bonus bBaseAtk,50; }",1000,120000,"WS_CARTBOOST"; } 19205:29355,{ bonus2 bSkillAtk,"SU_CN_METEOR",10; bonus2 bSkillAtk,"SU_LUNATICCARROTBEAT",10; } 19205:29356,{ bonus2 bSkillAtk,"SU_CN_METEOR",20; bonus2 bSkillAtk,"SU_LUNATICCARROTBEAT",20; bonus bFixedCast,-200; } 19205:29357,{ bonus2 bSkillAtk,"SU_CN_METEOR",60; bonus2 bSkillAtk,"SU_LUNATICCARROTBEAT",60; bonus bFixedCast,-500; } From ec05f56ecb6003b26b796abd551315b710075864 Mon Sep 17 00:00:00 2001 From: qwerty7vp <64515036+qwerty7vp@users.noreply.github.com> Date: Sat, 30 May 2020 01:20:10 +0700 Subject: [PATCH 151/212] Whikebain Ears should Ignore 100% MDEF (#5025) * Fixes MDEF ignore to 100% for Normal and Boss class monsters only. * Fixes bonus for slotted version. Thanks to @qwerty7vp! --- db/re/item_db.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 9309251dc0..65ebc7f2f2 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -3549,7 +3549,7 @@ 5357,Wings_Of_Victory,Wings Of Victory,4,20,,200,,10,,0,0xFFFFFFFF,63,2,768,,0,0,365,{ bonus bMdef,10; bonus bUnbreakableHelm; },{},{} 5358,Pecopeco_Wing_Ears,Peco Ears,4,20,,100,,2,,0,0xFFFFFFFF,63,2,512,,70,0,366,{ bonus bAgi,1; bonus bMdef,2; bonus bUnbreakableHelm; },{},{} 5359,J_Captain_Hat,Ship Captain Hat,4,20,,300,,3,,1,0xFFFFFFFF,63,2,256,,60,1,367,{ bonus bDex,1; bonus bMaxHP,100; bonus bLongAtkRate,7; },{},{} -5360,Whikebain_Ears,Hyuke's Black Cat Ears,4,20,,200,,4,,0,0xFFFFFFFE,63,2,256,,45,1,368,{ bonus bFlee,10; bonus bCritAtkRate,10; autobonus "{ bonus2 bIgnoreMdefRaceRate,RC_ALL,25; }",50,5000,BF_MAGIC,"{ specialeffect2 EF_AGIUP; }"; },{},{} +5360,Whikebain_Ears,Hyuke's Black Cat Ears,4,20,,200,,4,,0,0xFFFFFFFE,63,2,256,,45,1,368,{ bonus bFlee,10; bonus bCritAtkRate,10; autobonus "{ bonus2 bIgnoreMdefClassRate,Class_Normal,100; bonus2 bIgnoreMdefClassRate,Class_Boss,100; }",50,5000,BF_MAGIC,"{ specialeffect2 EF_STEAL; }"; },{},{} 5361,Gang_Scarf,Gangster Scarf,4,20,,100,,0,,0,0xFFFFFFFF,63,2,1,,0,0,369,{ bonus bBaseAtk,5; if(BaseJob==Job_Rogue) skill "RG_GANGSTER",1; },{},{} 5362,Ninja_Scroll,Ninja Scroll,4,20,,200,,0,,0,0xFFFFFFFF,63,2,1,,0,0,370,{ bonus bMatkRate,1; },{},{} 5363,Helm_Of_Abyss,Helm Of Abyss,4,20,,1000,,9,,1,0x000654E2,63,2,256,,70,1,371,{ bonus2 bSubClass,Class_Normal,-5; bonus2 bSubClass,Class_Boss,10; },{},{} @@ -10141,7 +10141,7 @@ 19131,Radio_Antenna_,Radio Antenna,4,0,,1500,,2,,1,0xFFFFFFFF,63,2,256,,1,1,347,{ bonus bMdef,5; bonus bCritical,5; bonus bFlee,5; skill "MG_LIGHTNINGBOLT",1; bonus4 bAutoSpellWhenHit,"MG_THUNDERSTORM",5,30,1; },{},{} 19132,Masquerade_,Masquerade,4,20,,100,,0,,1,0xFFFFFFFE,63,2,512,,0,0,78,{ bonus2 bAddRace,RC_DemiHuman,3; bonus2 bAddRace,RC_Player,3; },{},{} 19133,Odin_Mask_,Odin's Mask,4,20,,100,,1,,1,0xFFFFFFFF,63,2,513,,1,0,480,{ bonus2 bSubClass,Class_Boss,2; },{},{} -19134,Wickebines_Black_Cat_Ears,Wickebine's Black Cat Ears,4,20,,200,,4,,1,0xFFFFFFFE,63,2,256,,45,1,368,{ bonus bFlee,10; bonus bCritAtkRate,10; autobonus "{ bonus2 bIgnoreMdefRaceRate,RC_ALL,25; }",50,5000,BF_MAGIC,"{ specialeffect2 EF_AGIUP; }"; },{},{} +19134,Wickebines_Black_Cat_Ears,Wickebine's Black Cat Ears,4,20,,200,,4,,1,0xFFFFFFFE,63,2,256,,45,1,368,{ bonus bFlee,10; bonus bCritAtkRate,10; autobonus "{ bonus2 bIgnoreMdefClassRate,Class_Normal,100; bonus2 bIgnoreMdefClassRate,Class_Boss,100; }",50,5000,BF_MAGIC,"{ specialeffect2 EF_STEAL; }"; },{},{} 19137,Strawberry_Mouth_Guard,Strawberry Mouth Guard,4,20,,100,,0,,0,0xFFFFFFFF,63,2,1,,80,0,861,{ bonus bVit,2; bonus bLongAtkDef,5; bonus bShortWeaponDamageReturn,5; if (Baselevel>=100) { bonus bMaxHP,2000; } else { bonus bMaxHP,200; } },{},{} 19138,Seraphim_Coronet,Seraphim Coronet,4,20,,300,,0,,0,0xFFFFFFFF,63,2,512,,70,0,1487,{ bonus bStr,2; .@int = readparam(bInt); bonus bBaseAtk,(.@int/8)*5; bonus bHealPower,.@int/8; bonus bVariableCastrate,.@int/8; if ((.@int>=108)) { bonus bBaseAtk,50; bonus bHealPower,5; bonus bVariableCastrate,4; } if ((.@int>=120)) { bonus bBaseAtk,125; bonus bHealPower,10; bonus bVariableCastrate,6; } },{},{} 19139,SurviveOrb,Survive Orb,4,0,,300,,,,0,0xFFFFFFFF,63,2,1,,50,0,1488,{ skill "TF_HIDING",1; bonus2 bAddClass,Class_All,2; bonus bMatkRate,2; bonus bVariableCastrate,-3; },{},{} From 0de5244c5694837e765946ca4b035cd63d7f8af3 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Fri, 29 May 2020 20:20:20 +0200 Subject: [PATCH 152/212] SQL synchronization --- sql-files/item_db_re.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 067bc2ed2d..3509c4b4b5 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -3581,7 +3581,7 @@ REPLACE INTO `item_db_re` VALUES (5356,'Pumpkin_Hat_H','Festival Pumpkin Hat',4, REPLACE INTO `item_db_re` VALUES (5357,'Wings_Of_Victory','Wings Of Victory',4,20,NULL,200,NULL,10,NULL,0,0xFFFFFFFF,63,2,768,NULL,'0',0,365,'bonus bMdef,10; bonus bUnbreakableHelm;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5358,'Pecopeco_Wing_Ears','Peco Ears',4,20,NULL,100,NULL,2,NULL,0,0xFFFFFFFF,63,2,512,NULL,'70',0,366,'bonus bAgi,1; bonus bMdef,2; bonus bUnbreakableHelm;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5359,'J_Captain_Hat','Ship Captain Hat',4,20,NULL,300,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'60',1,367,'bonus bDex,1; bonus bMaxHP,100; bonus bLongAtkRate,7;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5360,'Whikebain_Ears','Hyuke\'s Black Cat Ears',4,20,NULL,200,NULL,4,NULL,0,0xFFFFFFFE,63,2,256,NULL,'45',1,368,'bonus bFlee,10; bonus bCritAtkRate,10; autobonus "{ bonus2 bIgnoreMdefRaceRate,RC_ALL,25; }",50,5000,BF_MAGIC,"{ specialeffect2 EF_AGIUP; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5360,'Whikebain_Ears','Hyuke\'s Black Cat Ears',4,20,NULL,200,NULL,4,NULL,0,0xFFFFFFFE,63,2,256,NULL,'45',1,368,'bonus bFlee,10; bonus bCritAtkRate,10; autobonus "{ bonus2 bIgnoreMdefClassRate,Class_Normal,100; bonus2 bIgnoreMdefClassRate,Class_Boss,100; }",50,5000,BF_MAGIC,"{ specialeffect2 EF_STEAL; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5361,'Gang_Scarf','Gangster Scarf',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'0',0,369,'bonus bBaseAtk,5; if(BaseJob==Job_Rogue) skill "RG_GANGSTER",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5362,'Ninja_Scroll','Ninja Scroll',4,20,NULL,200,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'0',0,370,'bonus bMatkRate,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5363,'Helm_Of_Abyss','Helm Of Abyss',4,20,NULL,1000,NULL,9,NULL,1,0x000654E2,63,2,256,NULL,'70',1,371,'bonus2 bSubClass,Class_Normal,-5; bonus2 bSubClass,Class_Boss,10;',NULL,NULL); @@ -10173,7 +10173,7 @@ REPLACE INTO `item_db_re` VALUES (19130,'Magic_Eyes_','Magic Eyes',4,20,NULL,300 REPLACE INTO `item_db_re` VALUES (19131,'Radio_Antenna_','Radio Antenna',4,0,NULL,1500,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,347,'bonus bMdef,5; bonus bCritical,5; bonus bFlee,5; skill "MG_LIGHTNINGBOLT",1; bonus4 bAutoSpellWhenHit,"MG_THUNDERSTORM",5,30,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19132,'Masquerade_','Masquerade',4,20,NULL,100,NULL,0,NULL,1,0xFFFFFFFE,63,2,512,NULL,'0',0,78,'bonus2 bAddRace,RC_DemiHuman,3; bonus2 bAddRace,RC_Player,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19133,'Odin_Mask_','Odin\'s Mask',4,20,NULL,100,NULL,1,NULL,1,0xFFFFFFFF,63,2,513,NULL,'1',0,480,'bonus2 bSubClass,Class_Boss,2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19134,'Wickebines_Black_Cat_Ears','Wickebine\'s Black Cat Ears',4,20,NULL,200,NULL,4,NULL,1,0xFFFFFFFE,63,2,256,NULL,'45',1,368,'bonus bFlee,10; bonus bCritAtkRate,10; autobonus "{ bonus2 bIgnoreMdefRaceRate,RC_ALL,25; }",50,5000,BF_MAGIC,"{ specialeffect2 EF_AGIUP; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19134,'Wickebines_Black_Cat_Ears','Wickebine\'s Black Cat Ears',4,20,NULL,200,NULL,4,NULL,1,0xFFFFFFFE,63,2,256,NULL,'45',1,368,'bonus bFlee,10; bonus bCritAtkRate,10; autobonus "{ bonus2 bIgnoreMdefClassRate,Class_Normal,100; bonus2 bIgnoreMdefClassRate,Class_Boss,100; }",50,5000,BF_MAGIC,"{ specialeffect2 EF_STEAL; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19137,'Strawberry_Mouth_Guard','Strawberry Mouth Guard',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'80',0,861,'bonus bVit,2; bonus bLongAtkDef,5; bonus bShortWeaponDamageReturn,5; if (Baselevel>=100) { bonus bMaxHP,2000; } else { bonus bMaxHP,200; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19138,'Seraphim_Coronet','Seraphim Coronet',4,20,NULL,300,NULL,0,NULL,0,0xFFFFFFFF,63,2,512,NULL,'70',0,1487,'bonus bStr,2; .@int = readparam(bInt); bonus bBaseAtk,(.@int/8)*5; bonus bHealPower,.@int/8; bonus bVariableCastrate,.@int/8; if ((.@int>=108)) { bonus bBaseAtk,50; bonus bHealPower,5; bonus bVariableCastrate,4; } if ((.@int>=120)) { bonus bBaseAtk,125; bonus bHealPower,10; bonus bVariableCastrate,6; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19139,'SurviveOrb','Survive Orb',4,0,NULL,300,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,NULL,'50',0,1488,'skill "TF_HIDING",1; bonus2 bAddClass,Class_All,2; bonus bMatkRate,2; bonus bVariableCastrate,-3;',NULL,NULL); From bb5fd45d09a7f37f0a2879a76430320f599362c5 Mon Sep 17 00:00:00 2001 From: qwerty7vp <64515036+qwerty7vp@users.noreply.github.com> Date: Sat, 30 May 2020 02:08:35 +0700 Subject: [PATCH 153/212] Corrects Valkyrie Knife item script (#4948) * Adds missing Super Novice class bonuses. Thanks to @Questune09 and @qwerty7vp! --- db/re/item_db.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 65ebc7f2f2..f1efa6a485 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -12563,7 +12563,7 @@ 28703,Infinity_Dagger,Infinity Dagger,5,10,,500,125:100,,1,1,0x028F5EEF,56,2,2,4,100,1,1,{},{},{} 28705,Crimson_Dagger,Crimson Dagger,5,20,,550,55,,1,2,0x028F5EEF,63,2,2,3,70,1,1,{ .@r = getrefine(); bonus bBaseAtk,((BaseLevel/10)*5)+(.@r<=15?pow(.@r,2):225); bonus bMatk,(.@r<=15?(pow(.@r,2)/2):225); },{},{} 28706,Dagger_of_Vicious_Mind,Dagger of Vicious Mind,5,20,,1050,105:50,,1,1,0x028F5EEF,63,2,2,4,160,1,1,{ bonus bAtk,pow(min(getrefine(),15),2); bonus bMatk,pow(min(getrefine(),15),2)/2; },{},{} -28717,Valkyrie_Knife,Valkyrie Knife,5,50,,100,50:50,,1,4,0x228F5EEF,63,2,2,4,70,1,1,{ .@r = getrefine(); .@b = readparam(bDex)/10; if (.@r>7) { .@c = .@r-7; if (BaseClass==Job_Novice||BaseJob==Job_Mage) { bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10; } } if (BaseClass==Job_Novice) { bonus bMaxHP,300+(200*.@c); bonus bMaxSP,300+(20*.@c); bonus bBaseAtk,100; bonus bMatk,150+(15*.@c); bonus bUseSPrate,-5; bonus bUnbreakableWeapon; bonus bInt,2*.@c; bonus bDex,(2*.@c)-(.@c*.@b); bonus bCritical,7*.@c; bonus bAspdRate,10*.@c; bonus bCritAtkRate,1*.@c; } if (BaseClass==Job_Thief) { bonus bMaxSP,100; bonus bMatk,150; bonus bCritAtkRate,.@r; } if (BaseClass==Job_Mage && .@c) { bonus bMaxHP,200*.@c; bonus bMaxSP,20*.@c; } if (BaseJob==Job_Hunter) { bonus bMaxHP,200; bonus bUseSPrate,-5; bonus bInt,2*.@r; bonus bDex,2*.@r; } if (BaseJob==Job_Bard||BaseJob==Job_Dancer) { bonus bBaseAtk,100; bonus bAspdRate,10*.@r; bonus bUnbreakableWeapon; bonus bDex,-1*(.@c*.@b); } },{},{} +28717,Valkyrie_Knife,Valkyrie Knife,5,50,,100,50:50,,1,4,0x228F5EEF,63,2,2,4,70,1,1,{ .@r = getrefine(); .@b = readparam(bDex)/10; if (BaseClass==Job_Novice) { bonus bMaxHP,300+(200*.@r); bonus bMaxSP,300+(20*.@r); bonus bBaseAtk,100; bonus bMatk,150+(15*.@r); bonus bUseSPrate,-5; bonus bUnbreakableWeapon; bonus bInt,2*.@r; bonus bDex,(2*.@r)-(.@r*.@b); bonus bCritical,7*.@r; bonus bAspdRate,10*.@r; bonus bCritAtkRate,1*.@r; } if (BaseClass==Job_Thief) { bonus bMaxSP,100; bonus bMatk,150; bonus bCritAtkRate,.@r; } if (BaseClass==Job_Mage) { bonus bMaxHP,200*.@r; bonus bMaxSP,20*.@r; } if (BaseJob==Job_Hunter) { bonus bMaxHP,200; bonus bUseSPrate,-5; bonus bInt,2*.@r; bonus bDex,2*.@r; } if (BaseJob==Job_Bard||BaseJob==Job_Dancer) { bonus bBaseAtk,100; bonus bAspdRate,10*.@r; bonus bUnbreakableWeapon; bonus bDex,-1*(.@r*.@b); } if (.@r>=7) { if (BaseClass==Job_Novice||BaseJob==Job_Mage) { bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10; } }},{},{} 28721,Monokage,Monokage,5,10,,800,100,,1,2,0x20000000,63,2,2,3,100,1,1,{ .@r = getrefine(); bonus2 bSkillAtk,"KO_BAKURETSU",getskilllv("NJ_TOBIDOUGU"); if (.@r>=9) { bonus bLongAtkRate,5; } else if (.@r>=7) { bonus bLongAtkRate,2; } },{},{} 28725,Illusion_Moonlight_Dagger,Illusion Moonlight Dagger,5,20,,700,150,,1,1,0x028F5EEE,63,2,2,4,99,1,1,{ bonus bMaxSPrate,10; .@val = 3; if (getrefine() >= 10) { .@val += 4; } bonus bSPDrainValue,.@val; },{},{} 28745,Illusion_Counter_Dagger,Illusion Counter Dagger,5,0,,900,170,,1,2,0x00810204,63,2,2,4,120,0,1,{ .@r = getrefine(); bonus bCritical,90; bonus bCritAtkRate,(3*(.@r/2)); if (.@r >= 7) { bonus2 bAddClass,Class_All,5; if (.@r >= 9) { bonus2 bAddSize,Size_All,20; if (.@r >= 11) { bonus2 bAddEle,Ele_All,20; } } } },{},{} From 2c1477d4ce688d2e7994c0940a2bf7d7c36c10c2 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Fri, 29 May 2020 21:08:43 +0200 Subject: [PATCH 154/212] SQL synchronization --- sql-files/item_db_re.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 3509c4b4b5..aae03aab5e 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -12595,7 +12595,7 @@ REPLACE INTO `item_db_re` VALUES (28702,'Ru_Gold_Ashura','Ru Gold Ashura',5,0,NU REPLACE INTO `item_db_re` VALUES (28703,'Infinity_Dagger','Infinity Dagger',5,10,NULL,500,'125:100',NULL,1,1,0x028F5EEF,56,2,2,4,'100',1,1,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (28705,'Crimson_Dagger','Crimson Dagger',5,20,NULL,550,'55',NULL,1,2,0x028F5EEF,63,2,2,3,'70',1,1,'.@r = getrefine(); bonus bBaseAtk,((BaseLevel/10)*5)+(.@r<=15?pow(.@r,2):225); bonus bMatk,(.@r<=15?(pow(.@r,2)/2):225);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28706,'Dagger_of_Vicious_Mind','Dagger of Vicious Mind',5,20,NULL,1050,'105:50',NULL,1,1,0x028F5EEF,63,2,2,4,'160',1,1,'bonus bAtk,pow(min(getrefine(),15),2); bonus bMatk,pow(min(getrefine(),15),2)/2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28717,'Valkyrie_Knife','Valkyrie Knife',5,50,NULL,100,'50:50',NULL,1,4,0x228F5EEF,63,2,2,4,'70',1,1,'.@r = getrefine(); .@b = readparam(bDex)/10; if (.@r>7) { .@c = .@r-7; if (BaseClass==Job_Novice||BaseJob==Job_Mage) { bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10; } } if (BaseClass==Job_Novice) { bonus bMaxHP,300+(200*.@c); bonus bMaxSP,300+(20*.@c); bonus bBaseAtk,100; bonus bMatk,150+(15*.@c); bonus bUseSPrate,-5; bonus bUnbreakableWeapon; bonus bInt,2*.@c; bonus bDex,(2*.@c)-(.@c*.@b); bonus bCritical,7*.@c; bonus bAspdRate,10*.@c; bonus bCritAtkRate,1*.@c; } if (BaseClass==Job_Thief) { bonus bMaxSP,100; bonus bMatk,150; bonus bCritAtkRate,.@r; } if (BaseClass==Job_Mage && .@c) { bonus bMaxHP,200*.@c; bonus bMaxSP,20*.@c; } if (BaseJob==Job_Hunter) { bonus bMaxHP,200; bonus bUseSPrate,-5; bonus bInt,2*.@r; bonus bDex,2*.@r; } if (BaseJob==Job_Bard||BaseJob==Job_Dancer) { bonus bBaseAtk,100; bonus bAspdRate,10*.@r; bonus bUnbreakableWeapon; bonus bDex,-1*(.@c*.@b); }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28717,'Valkyrie_Knife','Valkyrie Knife',5,50,NULL,100,'50:50',NULL,1,4,0x228F5EEF,63,2,2,4,'70',1,1,'.@r = getrefine(); .@b = readparam(bDex)/10; if (BaseClass==Job_Novice) { bonus bMaxHP,300+(200*.@r); bonus bMaxSP,300+(20*.@r); bonus bBaseAtk,100; bonus bMatk,150+(15*.@r); bonus bUseSPrate,-5; bonus bUnbreakableWeapon; bonus bInt,2*.@r; bonus bDex,(2*.@r)-(.@r*.@b); bonus bCritical,7*.@r; bonus bAspdRate,10*.@r; bonus bCritAtkRate,1*.@r; } if (BaseClass==Job_Thief) { bonus bMaxSP,100; bonus bMatk,150; bonus bCritAtkRate,.@r; } if (BaseClass==Job_Mage) { bonus bMaxHP,200*.@r; bonus bMaxSP,20*.@r; } if (BaseJob==Job_Hunter) { bonus bMaxHP,200; bonus bUseSPrate,-5; bonus bInt,2*.@r; bonus bDex,2*.@r; } if (BaseJob==Job_Bard||BaseJob==Job_Dancer) { bonus bBaseAtk,100; bonus bAspdRate,10*.@r; bonus bUnbreakableWeapon; bonus bDex,-1*(.@r*.@b); } if (.@r>=7) { if (BaseClass==Job_Novice||BaseJob==Job_Mage) { bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10; } }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28721,'Monokage','Monokage',5,10,NULL,800,'100',NULL,1,2,0x20000000,63,2,2,3,'100',1,1,'.@r = getrefine(); bonus2 bSkillAtk,"KO_BAKURETSU",getskilllv("NJ_TOBIDOUGU"); if (.@r>=9) { bonus bLongAtkRate,5; } else if (.@r>=7) { bonus bLongAtkRate,2; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28725,'Illusion_Moonlight_Dagger','Illusion Moonlight Dagger',5,20,NULL,700,'150',NULL,1,1,0x028F5EEE,63,2,2,4,'99',1,1,'bonus bMaxSPrate,10; .@val = 3; if (getrefine() >= 10) { .@val += 4; } bonus bSPDrainValue,.@val;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28745,'Illusion_Counter_Dagger','Illusion Counter Dagger',5,0,NULL,900,'170',NULL,1,2,0x00810204,63,2,2,4,'120',0,1,'.@r = getrefine(); bonus bCritical,90; bonus bCritAtkRate,(3*(.@r/2)); if (.@r >= 7) { bonus2 bAddClass,Class_All,5; if (.@r >= 9) { bonus2 bAddSize,Size_All,20; if (.@r >= 11) { bonus2 bAddEle,Ele_All,20; } } }',NULL,NULL); From cd0937c4684304eb375869e2c80664d20750ebeb Mon Sep 17 00:00:00 2001 From: SeravySensei <47065845+SeravySensei@users.noreply.github.com> Date: Sun, 31 May 2020 16:11:01 +0200 Subject: [PATCH 155/212] Fix missing pet egg checks (#5029) Fixes #5024 --- src/map/clif.cpp | 2 +- src/map/skill.cpp | 3 +++ src/map/storage.cpp | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index d702311fac..a01f5d188c 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -6813,7 +6813,7 @@ void clif_item_repair_list(struct map_session_data *sd,struct map_session_data * WFIFOW(fd,0)=0x1fc; for(i=c=0;iinventory.u.items_inventory[i].nameid) > 0 && dstsd->inventory.u.items_inventory[i].attribute!=0){// && skill_can_repair(sd,nameid)){ + if((nameid=dstsd->inventory.u.items_inventory[i].nameid) > 0 && dstsd->inventory.u.items_inventory[i].attribute!=0 && (!itemdb_ishatched_egg(&dstsd->inventory.u.items_inventory[i]))) {// && skill_can_repair(sd,nameid)){ WFIFOW(fd,c*13+4) = i; WFIFOW(fd,c*13+6) = nameid; WFIFOB(fd,c*13+8) = dstsd->inventory.u.items_inventory[i].refine; diff --git a/src/map/skill.cpp b/src/map/skill.cpp index ab78946f49..e172b443c6 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -17500,6 +17500,9 @@ void skill_repairweapon(struct map_session_data *sd, int idx) { if( !item->nameid || !item->attribute ) return; //Again invalid item.... + if (itemdb_ishatched_egg(item)) + return; + if (sd != target_sd && !battle_check_range(&sd->bl, &target_sd->bl, skill_get_range2(&sd->bl, sd->menuskill_id, sd->menuskill_val2, true))) { clif_item_repaireffect(sd, idx, 1); return; diff --git a/src/map/storage.cpp b/src/map/storage.cpp index 328ddd99df..fcfdc3589e 100644 --- a/src/map/storage.cpp +++ b/src/map/storage.cpp @@ -920,6 +920,9 @@ void storage_guild_storageadd(struct map_session_data* sd, int index, int amount if( amount < 1 || amount > sd->inventory.u.items_inventory[index].amount ) return; + if (itemdb_ishatched_egg(&sd->inventory.u.items_inventory[index])) + return; + if( stor->lock ) { storage_guild_storageclose(sd); return; From 3691a21e3df4028f8aede18b16e47b735068b895 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Tue, 2 Jun 2020 04:00:28 +0200 Subject: [PATCH 156/212] Mob and NPC Identity Update --- db/re/mob_db.txt | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/db/re/mob_db.txt b/db/re/mob_db.txt index aece8b1699..b9470366d0 100644 --- a/db/re/mob_db.txt +++ b/db/re/mob_db.txt @@ -3946,7 +3946,33 @@ //20813,MD_EVENT_AMDARAIS //20814,G_PAYONSOLDIER //20815,G_PAYONSOLDIER2 - +//20816,EM_DILUVIO +//20817,EM_ARDOR +//20818,EM_PROCELLA +//20819,EM_TERREMOTUS +//20820,EM_SERPENS +//20821,4JOB_VOID +//20822,4JOB_WRAITH +//20823,4JOB_KINGS_NIGHT +//20824,4JOB_AGONY_NIGHT +//20825,4JOB_DEVOTION_NIGHT +//20826,4JOB_ARMED_NIGHT +//20827,4JOB_DOOMK +//20828,4JOB_VERKHASEL +//20829,4JOB_BAPHOMET +//20830,4JOB_H_FALCON +//20831,4JOB_S_FALCON +//20832,4JOB_R_FALCON +//20833,4JOB_WORG +//20834,MEISTER_ABR1 +//20835,MEISTER_ABR2 +//20836,MEISTER_ABR3 +//20837,MEISTER_ABR4 +//20838,ELEMETAL_MASTER_S1 +//20839,ELEMETAL_MASTER_S2 +//20840,ELEMETAL_MASTER_S3 +//20841,ELEMETAL_MASTER_S4 +//20842,ELEMETAL_MASTER_S5 //20843,ILL_ABYSMAL_WITCH //20844,PRAY_GIVER //20845,SMILE_GIVER From a956d407477b5a86cf0c0d0bbad16bb0d8cd641e Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Tue, 2 Jun 2020 04:00:41 +0200 Subject: [PATCH 157/212] SQL synchronization --- sql-files/mob_db_re.sql | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/sql-files/mob_db_re.sql b/sql-files/mob_db_re.sql index 1853b43ba7..b693516b54 100644 --- a/sql-files/mob_db_re.sql +++ b/sql-files/mob_db_re.sql @@ -4013,7 +4013,33 @@ REPLACE INTO `mob_db_re` VALUES (3790,'SWEETS_DROPS','Sweets Drops','Sweets Drop #20813,MD_EVENT_AMDARAIS #20814,G_PAYONSOLDIER #20815,G_PAYONSOLDIER2 - +#20816,EM_DILUVIO +#20817,EM_ARDOR +#20818,EM_PROCELLA +#20819,EM_TERREMOTUS +#20820,EM_SERPENS +#20821,4JOB_VOID +#20822,4JOB_WRAITH +#20823,4JOB_KINGS_NIGHT +#20824,4JOB_AGONY_NIGHT +#20825,4JOB_DEVOTION_NIGHT +#20826,4JOB_ARMED_NIGHT +#20827,4JOB_DOOMK +#20828,4JOB_VERKHASEL +#20829,4JOB_BAPHOMET +#20830,4JOB_H_FALCON +#20831,4JOB_S_FALCON +#20832,4JOB_R_FALCON +#20833,4JOB_WORG +#20834,MEISTER_ABR1 +#20835,MEISTER_ABR2 +#20836,MEISTER_ABR3 +#20837,MEISTER_ABR4 +#20838,ELEMETAL_MASTER_S1 +#20839,ELEMETAL_MASTER_S2 +#20840,ELEMETAL_MASTER_S3 +#20841,ELEMETAL_MASTER_S4 +#20842,ELEMETAL_MASTER_S5 #20843,ILL_ABYSMAL_WITCH #20844,PRAY_GIVER #20845,SMILE_GIVER From 6c5ed525724fd7cca23f9d07015bdfe3b5e88e62 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Tue, 2 Jun 2020 15:49:11 +0200 Subject: [PATCH 158/212] Added a missing percentheal (#5033) Fixes #5031 Thanks to @Masao87 --- npc/re/quests/quests_rockridge.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/npc/re/quests/quests_rockridge.txt b/npc/re/quests/quests_rockridge.txt index 0f7981b4dd..5c14aee6eb 100644 --- a/npc/re/quests/quests_rockridge.txt +++ b/npc/re/quests/quests_rockridge.txt @@ -5888,6 +5888,7 @@ harboro1,156,215,5 script Innkeeper#rockridge 1_ETC_01,{ mes "Enjoy your stay at the Lazy Owl's."; close2; Zeny = Zeny - 5000; + percentheal 100,100; warp "harboro1",157,210; end; case 3: From b10caa039b2faef0354d82d3b50552691fb8278d Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Tue, 2 Jun 2020 19:36:49 +0200 Subject: [PATCH 159/212] Fixed slave recalculation on reloadmobdb Slaves sometimes ended up with weird status calculations or insane speed, because their status got recalculated before their master and this way their speed could not be copied from the master. Thanks to @Daegaladh --- src/map/mob.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 56c914c67e..53be39c348 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -5647,6 +5647,20 @@ void mob_reload_itemmob_data(void) { * @return 0 */ static int mob_reload_sub( struct mob_data *md, va_list args ){ + bool slaves_only = va_arg( args, bool ); + + if( slaves_only ){ + if( md->master_id == 0 ){ + // Only slaves should be processed now + return 0; + } + }else{ + if( md->master_id != 0 ){ + // Slaves will be processed later + return 0; + } + } + // Relink the mob to the new database entry md->db = mob_db(md->mob_id); @@ -5695,7 +5709,10 @@ static int mob_reload_sub_npc( struct npc_data *nd, va_list args ){ void mob_reload(void) { do_final_mob(true); mob_db_load(true); - map_foreachmob(mob_reload_sub); + // First only normal monsters + map_foreachmob( mob_reload_sub, false ); + // Then slaves only + map_foreachmob( mob_reload_sub, true ); map_foreachnpc(mob_reload_sub_npc); } From b394b93100d6e9e201e459d7912840f9d6288766 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Tue, 2 Jun 2020 20:12:02 +0200 Subject: [PATCH 160/212] Fixed instance YAML conversion handling --- src/tool/csv2yaml.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tool/csv2yaml.cpp b/src/tool/csv2yaml.cpp index 5aa379cafd..b4c263f7c1 100644 --- a/src/tool/csv2yaml.cpp +++ b/src/tool/csv2yaml.cpp @@ -358,7 +358,7 @@ int do_init( int argc, char** argv ){ return 0; } - if (process("INSTANCE_DB", 1, root_paths, "instance_db", [](const std::string& path, const std::string& name_ext) -> bool { + if (!process("INSTANCE_DB", 1, root_paths, "instance_db", [](const std::string& path, const std::string& name_ext) -> bool { return sv_readdb(path.c_str(), name_ext.c_str(), ',', 7, 7 + MAX_MAP_PER_INSTANCE, -1, &instance_readdb_sub, false); })) { return 0; From 5784231946c76c4d50b9351bef21fcc56fc02b7b Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Tue, 2 Jun 2020 20:15:32 +0200 Subject: [PATCH 161/212] Removed a sample entry in item_avail.txt This should have never been enabled by default... --- db/item_avail.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/item_avail.txt b/db/item_avail.txt index c5de56ff41..02d7dd9f29 100644 --- a/db/item_avail.txt +++ b/db/item_avail.txt @@ -11,7 +11,7 @@ // Think of it as a way to disguise items. // Don't sell the item in same shop with the source. Example, don't put 2240 & 2241 in same place! -2240,2241 //Beard - Grampa Beard +//2240,2241 //Beard - Grampa Beard //Treasure Hunters Quest Items //use these aliases if your game client doesn't support them normally From 47ebf332ab155a0522a159af3f2de2f4edaa574e Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Tue, 2 Jun 2020 23:58:57 +0200 Subject: [PATCH 162/212] Follow up to b10caa0 --- src/map/mob.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 53be39c348..8f30e48437 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -5647,7 +5647,7 @@ void mob_reload_itemmob_data(void) { * @return 0 */ static int mob_reload_sub( struct mob_data *md, va_list args ){ - bool slaves_only = va_arg( args, bool ); + bool slaves_only = va_arg( args, int ) != 0; if( slaves_only ){ if( md->master_id == 0 ){ @@ -5710,9 +5710,9 @@ void mob_reload(void) { do_final_mob(true); mob_db_load(true); // First only normal monsters - map_foreachmob( mob_reload_sub, false ); + map_foreachmob( mob_reload_sub, 0 ); // Then slaves only - map_foreachmob( mob_reload_sub, true ); + map_foreachmob( mob_reload_sub, 1 ); map_foreachnpc(mob_reload_sub_npc); } From 929c30c4143dc78cb85bc70d022113e75f62d0cc Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Wed, 3 Jun 2020 04:46:33 +0200 Subject: [PATCH 163/212] Fixed death counter not updating properly Also fixes Super Novice bonus not being removed on death and a possible crash *Thanks to @aleos89 --- src/map/pc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index ed287c2522..ddbefa87aa 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -8277,7 +8277,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) clif_party_dead( sd ); - pc_setglobalreg(sd, add_str(PCDIECOUNTER_VAR), sd->die_counter+1); + pc_setparam(sd, SP_PCDIECOUNTER, sd->die_counter+1); pc_setparam(sd, SP_KILLERRID, src?src->id:0); //Reset menu skills/item skills @@ -8951,7 +8951,7 @@ bool pc_setparam(struct map_session_data *sd,int64 type,int64 val_tmp) if (sd->die_counter == val) return true; sd->die_counter = val; - if (!sd->die_counter && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE) + if (!sd->state.connect_new && sd->die_counter == 1 && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE) status_calc_pc(sd, SCO_NONE); // Lost the bonus. pc_setglobalreg(sd, add_str(PCDIECOUNTER_VAR), sd->die_counter); return true; From 45cd5808b7cb90f4549141d2f36fa1b20102dccf Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Wed, 3 Jun 2020 16:35:10 +0200 Subject: [PATCH 164/212] Initial support for newer packet versions (#4944) Basic support for packets up to April 2020 Changing the default packet version to 2020-04-01 Thanks to everyone involved! --- conf/battle/client.conf | 7 + sql-files/main.sql | 1 + sql-files/upgrades/upgrade_20200603.sql | 1 + src/char/char.cpp | 18 +- src/common/mmo.hpp | 9 +- src/common/socket.cpp | 4 + src/common/socket.hpp | 1 + src/config/packets.hpp | 19 +- src/login/loginclif.cpp | 18 + src/map/battle.cpp | 2 + src/map/battle.hpp | 2 + src/map/buyingstore.cpp | 198 +- src/map/buyingstore.hpp | 4 +- src/map/cashshop.cpp | 23 +- src/map/cashshop.hpp | 2 +- src/map/clif.cpp | 4785 ++++++++++++----------- src/map/clif.hpp | 35 +- src/map/clif_packetdb.hpp | 76 +- src/map/clif_shuffle.hpp | 310 +- src/map/map-server.vcxproj | 6 +- src/map/map-server.vcxproj.filters | 6 + src/map/map.hpp | 6 + src/map/npc.cpp | 16 +- src/map/npc.hpp | 18 +- src/map/packets.hpp | 178 + src/map/packets_struct.hpp | 3877 ++++++++++++++++++ src/map/pc.cpp | 27 +- src/map/pc.hpp | 7 + src/map/searchstore.cpp | 10 +- src/map/searchstore.hpp | 7 +- src/map/skill.cpp | 26 +- src/map/skill.hpp | 1 + src/map/storage.cpp | 5 +- src/map/vending.cpp | 6 +- 34 files changed, 6983 insertions(+), 2728 deletions(-) create mode 100644 sql-files/upgrades/upgrade_20200603.sql create mode 100644 src/map/packets.hpp create mode 100644 src/map/packets_struct.hpp diff --git a/conf/battle/client.conf b/conf/battle/client.conf index 3bb10b7cd6..c429287279 100644 --- a/conf/battle/client.conf +++ b/conf/battle/client.conf @@ -138,3 +138,10 @@ spawn_direction: no // kRO removed the packet and this re-enables the message. // Official: Disabled. mvp_exp_reward_message: no + +// Send ping timer +// Interval in seconds for each timer invoke. +ping_timer_inverval: 30 + +// Send packets timeout in seconds before ping packet can be sent. +ping_time: 20 diff --git a/sql-files/main.sql b/sql-files/main.sql index 9d7df5d633..21cdedf361 100644 --- a/sql-files/main.sql +++ b/sql-files/main.sql @@ -254,6 +254,7 @@ CREATE TABLE IF NOT EXISTS `char` ( `uniqueitem_counter` int(11) unsigned NOT NULL default '0', `sex` ENUM('M','F','U') NOT NULL default 'U', `hotkey_rowshift` tinyint(3) unsigned NOT NULL default '0', + `hotkey_rowshift2` tinyint(3) unsigned NOT NULL default '0', `clan_id` int(11) unsigned NOT NULL default '0', `last_login` datetime DEFAULT NULL, `title_id` INT(11) unsigned NOT NULL default '0', diff --git a/sql-files/upgrades/upgrade_20200603.sql b/sql-files/upgrades/upgrade_20200603.sql new file mode 100644 index 0000000000..8520c4532d --- /dev/null +++ b/sql-files/upgrades/upgrade_20200603.sql @@ -0,0 +1 @@ +ALTER TABLE `char` ADD COLUMN `hotkey_rowshift2` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `hotkey_rowshift`; diff --git a/src/char/char.cpp b/src/char/char.cpp index 721593acc5..ea37316645 100644 --- a/src/char/char.cpp +++ b/src/char/char.cpp @@ -299,7 +299,7 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){ (p->rename != cp->rename) || (p->robe != cp->robe) || (p->character_moves != cp->character_moves) || (p->unban_time != cp->unban_time) || (p->font != cp->font) || (p->uniqueitem_counter != cp->uniqueitem_counter) || (p->hotkey_rowshift != cp->hotkey_rowshift) || (p->clan_id != cp->clan_id ) || (p->title_id != cp->title_id) || - (p->show_equip != cp->show_equip) + (p->show_equip != cp->show_equip) || (p->hotkey_rowshift2 != cp->hotkey_rowshift2) ) { //Save status if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `base_level`='%d', `job_level`='%d'," @@ -310,7 +310,7 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){ "`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d'," "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `rename`='%d'," "`delete_date`='%lu',`robe`='%d',`moves`='%d',`font`='%u',`uniqueitem_counter`='%u'," - "`hotkey_rowshift`='%d', `clan_id`='%d', `title_id`='%lu', `show_equip`='%d'" + "`hotkey_rowshift`='%d', `clan_id`='%d', `title_id`='%lu', `show_equip`='%d', `hotkey_rowshift2`='%d'" " WHERE `account_id`='%d' AND `char_id` = '%d'", schema_config.char_db, p->base_level, p->job_level, p->base_exp, p->job_exp, p->zeny, @@ -322,7 +322,7 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){ mapindex_id2name(p->save_point.map), p->save_point.x, p->save_point.y, p->rename, (unsigned long)p->delete_date, // FIXME: platform-dependent size p->robe, p->character_moves, p->font, p->uniqueitem_counter, - p->hotkey_rowshift, p->clan_id, p->title_id, p->show_equip, + p->hotkey_rowshift, p->clan_id, p->title_id, p->show_equip, p->hotkey_rowshift2, p->account_id, p->char_id) ) { Sql_ShowDebug(sql_handle); @@ -924,7 +924,8 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* coun "`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`," "`status_point`,`skill_point`,`option`,`karma`,`manner`,`hair`,`hair_color`," "`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`rename`,`delete_date`," - "`robe`,`moves`,`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`title_id`,`show_equip`" + "`robe`,`moves`,`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`title_id`,`show_equip`," + "`hotkey_rowshift2`" " FROM `%s` WHERE `account_id`='%d' AND `char_num` < '%d'", schema_config.char_db, sd->account_id, MAX_CHARS) || SQL_ERROR == SqlStmt_Execute(stmt) || SQL_ERROR == SqlStmt_BindColumn(stmt, 0, SQLDT_INT, &p.char_id, 0, NULL, NULL) @@ -972,6 +973,7 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* coun || SQL_ERROR == SqlStmt_BindColumn(stmt, 42, SQLDT_UCHAR, &p.hotkey_rowshift, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 43, SQLDT_ULONG, &p.title_id, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 44, SQLDT_UINT16, &p.show_equip, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 45, SQLDT_UCHAR, &p.hotkey_rowshift2, 0, NULL, NULL) ) { SqlStmt_ShowDebug(stmt); @@ -1039,7 +1041,7 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev "`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`elemental_id`,`hair`," "`hair_color`,`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`," "`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,`robe`, `moves`," - "`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`title_id`,`show_equip`" + "`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`title_id`,`show_equip`,`hotkey_rowshift2`" " FROM `%s` WHERE `char_id`=? LIMIT 1", schema_config.char_db) || SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_INT, &char_id, 0) || SQL_ERROR == SqlStmt_Execute(stmt) @@ -1105,6 +1107,7 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev || SQL_ERROR == SqlStmt_BindColumn(stmt, 59, SQLDT_INT, &p->clan_id, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 60, SQLDT_ULONG, &p->title_id, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 61, SQLDT_UINT16, &p->show_equip, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 62, SQLDT_UCHAR, &p->hotkey_rowshift2, 0, NULL, NULL) ) { SqlStmt_ShowDebug(stmt); @@ -1211,7 +1214,7 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev while( SQL_SUCCESS == SqlStmt_NextRow(stmt) ) { - if( hotkey_num >= 0 && hotkey_num < MAX_HOTKEYS ) + if( hotkey_num >= 0 && hotkey_num < MAX_HOTKEYS_DB ) memcpy(&p->hotkeys[hotkey_num], &tmp_hotkey, sizeof(tmp_hotkey)); else ShowWarning("mmo_char_fromsql: ignoring invalid hotkey (hotkey=%d,type=%u,id=%u,lv=%u) of character %s (AID=%d,CID=%d)\n", hotkey_num, tmp_hotkey.type, tmp_hotkey.id, tmp_hotkey.lv, p->name, p->account_id, p->char_id); @@ -2318,7 +2321,8 @@ bool char_checkdb(void){ "`guild_id`,`pet_id`,`homun_id`,`elemental_id`,`hair`,`hair_color`,`clothes_color`,`weapon`," "`shield`,`head_top`,`head_mid`,`head_bottom`,`robe`,`last_map`,`last_x`,`last_y`,`save_map`," "`save_x`,`save_y`,`partner_id`,`online`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`," - "`moves`,`unban_time`,`font`,`sex`,`hotkey_rowshift`,`clan_id`,`last_login`,`title_id`,`show_equip`" + "`moves`,`unban_time`,`font`,`sex`,`hotkey_rowshift`,`clan_id`,`last_login`,`title_id`,`show_equip`," + "`hotkey_rowshift2`" " FROM `%s` LIMIT 1;", schema_config.char_db) ){ Sql_ShowDebug(sql_handle); return false; diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index d30158aff9..6a41312646 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -33,6 +33,12 @@ #define MAX_HOTKEYS 38 #endif +#if PACKETVER_MAIN_NUM >= 20190522 || PACKETVER_RE_NUM >= 20190508 || PACKETVER_ZERO_NUM >= 20190605 + #define MAX_HOTKEYS_DB ((MAX_HOTKEYS) * 2) +#else + #define MAX_HOTKEYS_DB MAX_HOTKEYS +#endif + #define MAX_MAP_PER_SERVER 1500 /// Maximum amount of maps available on a server #define MAX_INVENTORY 100 ///Maximum items in player inventory /** Max number of characters per account. Note that changing this setting alone is not enough if the client is not hexed to support more characters as well. @@ -518,7 +524,7 @@ struct mmo_charstatus { struct s_friend friends[MAX_FRIENDS]; //New friend system [Skotlex] #ifdef HOTKEY_SAVING - struct hotkey hotkeys[MAX_HOTKEYS]; + struct hotkey hotkeys[MAX_HOTKEYS_DB]; #endif bool show_equip,allow_party; short rename; @@ -536,6 +542,7 @@ struct mmo_charstatus { uint32 uniqueitem_counter; unsigned char hotkey_rowshift; + unsigned char hotkey_rowshift2; unsigned long title_id; }; diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 8638f5fc2b..0a4350763e 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -428,6 +428,8 @@ int send_from_fifo(int fd) if( len > 0 ) { + session[fd]->wdata_tick = last_tick; + // some data could not be transferred? // shift unsent data to the beginning of the queue if( (size_t)len < session[fd]->wdata_size ) @@ -587,6 +589,7 @@ int make_listen_bind(uint32 ip, uint16 port) create_session(fd, connect_client, null_send, null_parse); session[fd]->client_addr = 0; // just listens session[fd]->rdata_tick = 0; // disable timeouts on this socket + session[fd]->wdata_tick = 0; return fd; } @@ -727,6 +730,7 @@ static int create_session(int fd, RecvFunc func_recv, SendFunc func_send, ParseF session[fd]->func_send = func_send; session[fd]->func_parse = func_parse; session[fd]->rdata_tick = last_tick; + session[fd]->wdata_tick = last_tick; return 0; } diff --git a/src/common/socket.hpp b/src/common/socket.hpp index e5db4f4ec9..3a5eeeef65 100644 --- a/src/common/socket.hpp +++ b/src/common/socket.hpp @@ -98,6 +98,7 @@ struct socket_data size_t rdata_size, wdata_size; size_t rdata_pos; time_t rdata_tick; // time of last recv (for detecting timeouts); zero when timeout is disabled + time_t wdata_tick; // time of last send (for detecting timeouts); RecvFunc func_recv; SendFunc func_send; diff --git a/src/config/packets.hpp b/src/config/packets.hpp index 02c9687f49..91e6d37ee1 100644 --- a/src/config/packets.hpp +++ b/src/config/packets.hpp @@ -13,7 +13,7 @@ /// Do NOT edit this line! To set your client version, please do this instead: /// In Windows: Add this line in your src\custom\defines_pre.hpp file: #define PACKETVER YYYYMMDD /// In Linux: The same as above or run the following command: ./configure --enable-packetver=YYYYMMDD - #define PACKETVER 20180620 + #define PACKETVER 20200401 #endif #ifndef PACKETVER_RE @@ -24,6 +24,23 @@ #endif #endif +#ifndef PACKETVER_RE + #define PACKETVER_MAIN_NUM PACKETVER + + // Undefine all sakray server definitions + #undef PACKETVER_RE + #undef PACKETVER_RE_NUM +#else + // Undefine existing definition + #undef PACKETVER_RE + + #define PACKETVER_RE PACKETVER + #define PACKETVER_RE_NUM PACKETVER + + // Undefine all main server definitions + #undef PACKETVER_MAIN_NUM +#endif + #if PACKETVER >= 20110817 /// Comment to disable the official packet obfuscation support. /// This requires PACKETVER 2011-08-17 or newer. diff --git a/src/login/loginclif.cpp b/src/login/loginclif.cpp index 8672bf2cee..9d80fb309a 100644 --- a/src/login/loginclif.cpp +++ b/src/login/loginclif.cpp @@ -457,6 +457,20 @@ static int logclif_parse_reqcharconnec(int fd, struct login_session_data *sd, ch return 1; } +int logclif_parse_otp_login( int fd, struct login_session_data* sd ){ + RFIFOSKIP( fd, 68 ); + + WFIFOHEAD( fd, 34 ); + WFIFOW( fd, 0 ) = 0xae3; + WFIFOW( fd, 2 ) = 34; + WFIFOL( fd, 4 ) = 0; // normal login + safestrncpy( WFIFOCP( fd, 8 ), "S1000", 6 ); + safestrncpy( WFIFOCP( fd, 28 ), "token", 6 ); + WFIFOSET( fd, 34 ); + + return 1; +} + /** * Entry point from client to log-server. * Function that checks incoming command, then splits it to the correct handler. @@ -521,6 +535,10 @@ int logclif_parse(int fd) { break; // Sending request of the coding key case 0x01db: next = logclif_parse_reqkey(fd, sd); break; + // OTP token login + case 0x0acf: + next = logclif_parse_otp_login( fd, sd ); + break; // Connection request of a char-server case 0x2710: logclif_parse_reqcharconnec(fd,sd, ip); return 0; // processing will continue elsewhere default: diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 0b1aa9fe47..892f22c3ad 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -8954,6 +8954,8 @@ static const struct _battle_data { { "bgqueue_nowarp_mapflag", &battle_config.bgqueue_nowarp_mapflag, 0, 0, 1, }, { "homunculus_exp_gain", &battle_config.homunculus_exp_gain, 10, 0, 100, }, { "rental_item_novalue", &battle_config.rental_item_novalue, 1, 0, 1, }, + { "ping_timer_inverval", &battle_config.ping_timer_interval, 30, 0, 99999999, }, + { "ping_time", &battle_config.ping_time, 20, 0, 99999999, }, #include "../custom/battle_config_init.inc" }; diff --git a/src/map/battle.hpp b/src/map/battle.hpp index d9dae4b05d..15767c13b9 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -678,6 +678,8 @@ struct Battle_Config int bgqueue_nowarp_mapflag; int homunculus_exp_gain; int rental_item_novalue; + int ping_timer_interval; + int ping_time; #include "../custom/battle_config_struct.inc" }; diff --git a/src/map/buyingstore.cpp b/src/map/buyingstore.cpp index e79b4137be..7d4ccbf6a7 100644 --- a/src/map/buyingstore.cpp +++ b/src/map/buyingstore.cpp @@ -113,8 +113,7 @@ int8 buyingstore_setup(struct map_session_data* sd, unsigned char slots){ * @param at Autotrader info, or NULL if requetsed not from autotrade persistance * @return 0 If success, 1 - Cannot open, 2 - Manner penalty, 3 - Mapflag restiction, 4 - Cell restriction, 5 - Invalid count/result, 6 - Cannot give item, 7 - Will be overweight */ -int8 buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned char result, const char* storename, const uint8* itemlist, unsigned int count, struct s_autotrader *at) -{ +int8 buyingstore_create( struct map_session_data* sd, int zenylimit, unsigned char result, const char* storename, const struct PACKET_CZ_REQ_OPEN_BUYING_STORE_sub* itemlist, unsigned int count, struct s_autotrader *at ){ unsigned int i, weight, listidx; char message_sql[MESSAGE_SIZE*2]; StringBuf buf; @@ -161,50 +160,53 @@ int8 buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned cha weight = sd->weight; // check item list - for( i = 0; i < count; i++ ) - {// itemlist: .W .W .L - unsigned short nameid, amount; - int price, idx; - struct item_data* id; + for( i = 0; i < count; i++ ){ + const struct PACKET_CZ_REQ_OPEN_BUYING_STORE_sub *item = &itemlist[i]; - nameid = RBUFW(itemlist,i*8+0); - amount = RBUFW(itemlist,i*8+2); - price = RBUFL(itemlist,i*8+4); + struct item_data* id = itemdb_exists( item->itemId ); - if( ( id = itemdb_exists(nameid) ) == NULL || amount == 0 ) - {// invalid input + // invalid input + if( id == NULL || item->amount == 0 ){ break; } - if( price <= 0 || price > BUYINGSTORE_MAX_PRICE ) - {// invalid price: unlike vending, items cannot be bought at 0 Zeny + // invalid price: unlike vending, items cannot be bought at 0 Zeny + if( item->price <= 0 || item->price > BUYINGSTORE_MAX_PRICE ){ break; } - if( !id->flag.buyingstore || !itemdb_cantrade_sub(id, pc_get_group_level(sd), pc_get_group_level(sd)) || ( idx = pc_search_inventory(sd, nameid) ) == -1 ) - {// restrictions: allowed, no character-bound items and at least one must be owned + // restrictions: allowed and no character-bound items + if( !id->flag.buyingstore || !itemdb_cantrade_sub( id, pc_get_group_level( sd ), pc_get_group_level( sd ) ) ){ break; } - if( sd->inventory.u.items_inventory[idx].amount + amount > BUYINGSTORE_MAX_AMOUNT ) - {// too many items of same kind + int idx = pc_search_inventory( sd, item->itemId ); + + // At least one must be owned + if( idx < 0 ){ break; } - if( i ) - {// duplicate check. as the client does this too, only malicious intent should be caught here - ARR_FIND( 0, i, listidx, sd->buyingstore.items[listidx].nameid == nameid ); - if( listidx != i ) - {// duplicate - ShowWarning("buyingstore_create: Found duplicate item on buying list (nameid=%hu, amount=%hu, account_id=%d, char_id=%d).\n", nameid, amount, sd->status.account_id, sd->status.char_id); + // too many items of same kind + if( sd->inventory.u.items_inventory[idx].amount + item->amount > BUYINGSTORE_MAX_AMOUNT ){ + break; + } + + // duplicate check. as the client does this too, only malicious intent should be caught here + if( i ){ + ARR_FIND( 0, i, listidx, sd->buyingstore.items[listidx].nameid == item->itemId ); + + // duplicate + if( listidx != i ){ + ShowWarning( "buyingstore_create: Found duplicate item on buying list (nameid=%hu, amount=%hu, account_id=%d, char_id=%d).\n", item->itemId, item->amount, sd->status.account_id, sd->status.char_id ); break; } } - weight+= id->weight*amount; - sd->buyingstore.items[i].nameid = nameid; - sd->buyingstore.items[i].amount = amount; - sd->buyingstore.items[i].price = price; + weight+= id->weight*item->amount; + sd->buyingstore.items[i].nameid = item->itemId; + sd->buyingstore.items[i].amount = item->amount; + sd->buyingstore.items[i].price = item->price; } if( i != count ) @@ -322,10 +324,9 @@ void buyingstore_open(struct map_session_data* sd, uint32 account_id) * @param *itemlist List of sold items { .W, .W, .W }* * @param count Number of item on the itemlist */ -void buyingstore_trade(struct map_session_data* sd, uint32 account_id, unsigned int buyer_id, const uint8* itemlist, unsigned int count) -{ +void buyingstore_trade( struct map_session_data* sd, uint32 account_id, unsigned int buyer_id, const struct PACKET_CZ_REQ_TRADE_BUYING_STORE_sub* itemlist, unsigned int count ){ int zeny = 0; - unsigned int i, weight, listidx, k; + unsigned int weight; struct map_session_data* pl_sd; nullpo_retv(sd); @@ -362,98 +363,94 @@ void buyingstore_trade(struct map_session_data* sd, uint32 account_id, unsigned searchstore_clearremote(sd); - if( pl_sd->status.zeny < pl_sd->buyingstore.zenylimit ) - {// buyer lost zeny in the mean time? fix the limit + // buyer lost zeny in the mean time? fix the limit + if( pl_sd->status.zeny < pl_sd->buyingstore.zenylimit ){ pl_sd->buyingstore.zenylimit = pl_sd->status.zeny; } weight = pl_sd->weight; // check item list - for( i = 0; i < count; i++ ) - {// itemlist: .W .W .W - unsigned short nameid, amount; - int index; + for( int i = 0; i < count; i++ ){ + const struct PACKET_CZ_REQ_TRADE_BUYING_STORE_sub* item = &itemlist[i]; - index = RBUFW(itemlist,i*6+0)-2; - nameid = RBUFW(itemlist,i*6+2); - amount = RBUFW(itemlist,i*6+4); - - if( i ) - {// duplicate check. as the client does this too, only malicious intent should be caught here - ARR_FIND( 0, i, k, RBUFW(itemlist,k*6+0)-2 == index ); - if( k != i ) - {// duplicate - ShowWarning("buyingstore_trade: Found duplicate item on selling list (prevnameid=%hu, prevamount=%hu, nameid=%hu, amount=%hu, account_id=%d, char_id=%d).\n", - RBUFW(itemlist,k*6+2), RBUFW(itemlist,k*6+4), nameid, amount, sd->status.account_id, sd->status.char_id); - clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid); + // duplicate check. as the client does this too, only malicious intent should be caught here + for( int k = 0; k < i; k++ ){ + // duplicate + if( itemlist[k].index == item->index && k != i ){ + ShowWarning( "buyingstore_trade: Found duplicate item on selling list (prevnameid=%hu, prevamount=%hu, nameid=%hu, amount=%hu, account_id=%d, char_id=%d).\n", itemlist[k].itemId, itemlist[k].amount, item->itemId, item->amount, sd->status.account_id, sd->status.char_id ); + clif_buyingstore_trade_failed_seller( sd, BUYINGSTORE_TRADE_SELLER_FAILED, item->itemId ); return; } } - if( index < 0 || index >= ARRAYLENGTH(sd->inventory.u.items_inventory) || sd->inventory_data[index] == NULL || sd->inventory.u.items_inventory[index].nameid != nameid || sd->inventory.u.items_inventory[index].amount < amount ) - {// invalid input - clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid); + int index = item->index - 2; // TODO: clif::server_index + + // invalid input + if( index < 0 || index >= ARRAYLENGTH( sd->inventory.u.items_inventory ) || sd->inventory_data[index] == NULL || sd->inventory.u.items_inventory[index].nameid != item->itemId || sd->inventory.u.items_inventory[index].amount < item->amount ){ + clif_buyingstore_trade_failed_seller( sd, BUYINGSTORE_TRADE_SELLER_FAILED, item->itemId ); return; } - if( sd->inventory.u.items_inventory[index].expire_time || (sd->inventory.u.items_inventory[index].bound && !pc_can_give_bounded_items(sd)) || !itemdb_cantrade(&sd->inventory.u.items_inventory[index], pc_get_group_level(sd), pc_get_group_level(pl_sd)) || memcmp(sd->inventory.u.items_inventory[index].card, buyingstore_blankslots, sizeof(buyingstore_blankslots)) ) - {// non-tradable item - clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid); + // non-tradable item + if( sd->inventory.u.items_inventory[index].expire_time || ( sd->inventory.u.items_inventory[index].bound && !pc_can_give_bounded_items( sd ) ) || !itemdb_cantrade( &sd->inventory.u.items_inventory[index], pc_get_group_level( sd ), pc_get_group_level( pl_sd ) ) || memcmp( sd->inventory.u.items_inventory[index].card, buyingstore_blankslots, sizeof( buyingstore_blankslots ) ) ){ + clif_buyingstore_trade_failed_seller( sd, BUYINGSTORE_TRADE_SELLER_FAILED, item->itemId ); return; } - ARR_FIND( 0, pl_sd->buyingstore.slots, listidx, pl_sd->buyingstore.items[listidx].nameid == nameid ); - if( listidx == pl_sd->buyingstore.slots || pl_sd->buyingstore.items[listidx].amount == 0 ) - {// there is no such item or the buyer has already bought all of them - clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid); + int listidx; + + ARR_FIND( 0, pl_sd->buyingstore.slots, listidx, pl_sd->buyingstore.items[listidx].nameid == item->itemId ); + + // there is no such item or the buyer has already bought all of them + if( listidx == pl_sd->buyingstore.slots || pl_sd->buyingstore.items[listidx].amount == 0 ){ + clif_buyingstore_trade_failed_seller( sd, BUYINGSTORE_TRADE_SELLER_FAILED, item->itemId ); return; } - if( pl_sd->buyingstore.items[listidx].amount < amount ) - {// buyer does not need that much of the item - clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_COUNT, nameid); + // buyer does not need that much of the item + if( pl_sd->buyingstore.items[listidx].amount < item->amount ){ + clif_buyingstore_trade_failed_seller( sd, BUYINGSTORE_TRADE_SELLER_COUNT, item->itemId ); return; } - if( pc_checkadditem(pl_sd, nameid, amount) == CHKADDITEM_OVERAMOUNT ) - {// buyer does not have enough space for this item - clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid); + // buyer does not have enough space for this item + if( pc_checkadditem( pl_sd, item->itemId, item->amount ) == CHKADDITEM_OVERAMOUNT ){ + clif_buyingstore_trade_failed_seller( sd, BUYINGSTORE_TRADE_SELLER_FAILED, item->itemId ); return; } - if( amount*(unsigned int)sd->inventory_data[index]->weight > pl_sd->max_weight-weight ) - {// normally this is not supposed to happen, as the total weight is - // checked upon creation, but the buyer could have gained items - clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_FAILED, nameid); + // normally this is not supposed to happen, as the total weight is + // checked upon creation, but the buyer could have gained items + if( item->amount * (unsigned int)sd->inventory_data[index]->weight > pl_sd->max_weight - weight ){ + clif_buyingstore_trade_failed_seller( sd, BUYINGSTORE_TRADE_SELLER_FAILED, item->itemId ); return; } - weight+= amount*sd->inventory_data[index]->weight; - if( amount*pl_sd->buyingstore.items[listidx].price > pl_sd->buyingstore.zenylimit-zeny ) - {// buyer does not have enough zeny - clif_buyingstore_trade_failed_seller(sd, BUYINGSTORE_TRADE_SELLER_ZENY, nameid); + weight += item->amount * sd->inventory_data[index]->weight; + + // buyer does not have enough zeny + if( item->amount * pl_sd->buyingstore.items[listidx].price > pl_sd->buyingstore.zenylimit - zeny ){ + clif_buyingstore_trade_failed_seller( sd, BUYINGSTORE_TRADE_SELLER_ZENY, item->itemId ); return; } - zeny+= amount*pl_sd->buyingstore.items[listidx].price; + + zeny += item->amount * pl_sd->buyingstore.items[listidx].price; } // process item list - for( i = 0; i < count; i++ ) - {// itemlist: .W .W .W - unsigned short nameid, amount; - int index; + for( int i = 0; i < count; i++ ){ + const struct PACKET_CZ_REQ_TRADE_BUYING_STORE_sub* item = &itemlist[i]; + int listidx; - index = RBUFW(itemlist,i*6+0)-2; - nameid = RBUFW(itemlist,i*6+2); - amount = RBUFW(itemlist,i*6+4); + ARR_FIND( 0, pl_sd->buyingstore.slots, listidx, pl_sd->buyingstore.items[listidx].nameid == item->itemId ); + zeny = item->amount * pl_sd->buyingstore.items[listidx].price; - ARR_FIND( 0, pl_sd->buyingstore.slots, listidx, pl_sd->buyingstore.items[listidx].nameid == nameid ); - zeny = amount*pl_sd->buyingstore.items[listidx].price; + int index = item->index - 2; // TODO: clif::server_index // move item - pc_additem(pl_sd, &sd->inventory.u.items_inventory[index], amount, LOG_TYPE_BUYING_STORE); - pc_delitem(sd, index, amount, 1, 0, LOG_TYPE_BUYING_STORE); - pl_sd->buyingstore.items[listidx].amount-= amount; + pc_additem(pl_sd, &sd->inventory.u.items_inventory[index], item->amount, LOG_TYPE_BUYING_STORE); + pc_delitem(sd, index, item->amount, 1, 0, LOG_TYPE_BUYING_STORE); + pl_sd->buyingstore.items[listidx].amount -= item->amount; if( pl_sd->buyingstore.items[listidx].amount > 0 ){ if( Sql_Query( mmysql_handle, "UPDATE `%s` SET `amount` = %d WHERE `buyingstore_id` = %d AND `index` = %d;", buyingstore_items_table, pl_sd->buyingstore.items[listidx].amount, pl_sd->buyer_id, listidx ) != SQL_SUCCESS ){ @@ -471,8 +468,8 @@ void buyingstore_trade(struct map_session_data* sd, uint32 account_id, unsigned pl_sd->buyingstore.zenylimit-= zeny; // notify clients - clif_buyingstore_delete_item(sd, index, amount, pl_sd->buyingstore.items[listidx].price); - clif_buyingstore_update_item(pl_sd, nameid, amount, sd->status.char_id, zeny); + clif_buyingstore_delete_item(sd, index, item->amount, pl_sd->buyingstore.items[listidx].price); + clif_buyingstore_update_item(pl_sd, item->itemId, item->amount, sd->status.char_id, zeny); } if( save_settings&CHARSAVE_VENDING ) { @@ -481,6 +478,7 @@ void buyingstore_trade(struct map_session_data* sd, uint32 account_id, unsigned } // check whether or not there is still something to buy + int i; ARR_FIND( 0, pl_sd->buyingstore.slots, i, pl_sd->buyingstore.items[i].amount != 0 ); if( i == pl_sd->buyingstore.slots ) {// everything was bought @@ -548,7 +546,7 @@ bool buyingstore_searchall(struct map_session_data* sd, const struct s_search_st for( idx = 0; idx < s->item_count; idx++ ) { - ARR_FIND( 0, sd->buyingstore.slots, i, sd->buyingstore.items[i].nameid == s->itemlist[idx] && sd->buyingstore.items[i].amount ); + ARR_FIND( 0, sd->buyingstore.slots, i, sd->buyingstore.items[i].nameid == s->itemlist[idx].itemId && sd->buyingstore.items[i].amount ); if( i == sd->buyingstore.slots ) {// not found continue; @@ -591,23 +589,15 @@ void buyingstore_reopen( struct map_session_data* sd ){ // Ready to open buyingstore for this char if ((at = (struct s_autotrader *)uidb_get(buyingstore_autotrader_db, sd->status.char_id)) && at->count && at->entries) { - uint8 *data, *p; - uint16 j, count; + struct PACKET_CZ_REQ_OPEN_BUYING_STORE_sub* data; // Init buyingstore data for autotrader - CREATE(data, uint8, at->count * 8); + CREATE(data, struct PACKET_CZ_REQ_OPEN_BUYING_STORE_sub, at->count ); - for (j = 0, p = data, count = at->count; j < at->count; j++) { - struct s_autotrade_entry *entry = at->entries[j]; - unsigned short *item_id = (uint16*)(p + 0); - uint16 *amount = (uint16*)(p + 2); - uint32 *price = (uint32*)(p + 4); - - *item_id = entry->item_id; - *amount = entry->amount; - *price = entry->price; - - p += 8; + for( int j = 0; j < at->count; j++) { + data[j].itemId = at->entries[j]->item_id; + data[j].amount = at->entries[j]->amount; + data[j].price = at->entries[j]->price; } sd->state.autotrade = 1; @@ -633,7 +623,7 @@ void buyingstore_reopen( struct map_session_data* sd ){ chrif_save(sd, CSAVE_AUTOTRADE); ShowInfo("Buyingstore loaded for '" CL_WHITE "%s" CL_RESET "' with '" CL_WHITE "%d" CL_RESET "' items at " CL_WHITE "%s (%d,%d)" CL_RESET "\n", - sd->status.name, count, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y); + sd->status.name, at->count, mapindex_id2name(sd->mapindex), sd->bl.x, sd->bl.y); } aFree(data); } diff --git a/src/map/buyingstore.hpp b/src/map/buyingstore.hpp index 0c052d4722..eab26da3ac 100644 --- a/src/map/buyingstore.hpp +++ b/src/map/buyingstore.hpp @@ -56,10 +56,10 @@ struct s_autotrader { }; int8 buyingstore_setup(struct map_session_data* sd, unsigned char slots); -int8 buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned char result, const char* storename, const uint8* itemlist, unsigned int count, struct s_autotrader *at); +int8 buyingstore_create(struct map_session_data* sd, int zenylimit, unsigned char result, const char* storename, const struct PACKET_CZ_REQ_OPEN_BUYING_STORE_sub* itemlist, unsigned int count, struct s_autotrader *at); void buyingstore_close(struct map_session_data* sd); void buyingstore_open(struct map_session_data* sd, uint32 account_id); -void buyingstore_trade(struct map_session_data* sd, uint32 account_id, unsigned int buyer_id, const uint8* itemlist, unsigned int count); +void buyingstore_trade(struct map_session_data* sd, uint32 account_id, unsigned int buyer_id, const struct PACKET_CZ_REQ_TRADE_BUYING_STORE_sub* itemlist, unsigned int count); bool buyingstore_search(struct map_session_data* sd, unsigned short nameid); bool buyingstore_searchall(struct map_session_data* sd, const struct s_search_store_search* s); DBMap *buyingstore_getdb(void); diff --git a/src/map/cashshop.cpp b/src/map/cashshop.cpp index 862a02e59a..50d77d89c7 100644 --- a/src/map/cashshop.cpp +++ b/src/map/cashshop.cpp @@ -467,7 +467,7 @@ static void cashshop_read_db( void ){ * @param item_list Array of item ID * @return true: success, false: fail */ -bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, uint16* item_list ){ +bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, struct PACKET_CZ_SE_PC_BUY_CASHITEM_LIST_sub* item_list ){ uint32 totalcash = 0; uint32 totalweight = 0; int i,new_; @@ -487,9 +487,9 @@ bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, u new_ = 0; for( i = 0; i < n; ++i ){ - unsigned short nameid = *( item_list + i * 5 ); - uint32 quantity = *( item_list + i * 5 + 2 ); - uint8 tab = (uint8)*( item_list + i * 5 + 4 ); + unsigned short nameid = item_list[i].itemId; + uint32 quantity = item_list[i].amount; + uint16 tab = item_list[i].tab; int j; if( tab >= CASHSHOP_TAB_MAX ){ @@ -504,7 +504,7 @@ bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, u return false; } - nameid = *( item_list + i * 5 ) = cash_shop_items[tab].item[j]->nameid; //item_avail replacement + nameid = item_list[i].itemId = cash_shop_items[tab].item[j]->nameid; //item_avail replacement id = itemdb_exists(nameid); if( !id ){ @@ -569,10 +569,10 @@ bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, u } for( i = 0; i < n; ++i ){ - unsigned short nameid = *( item_list + i * 5 ); - uint32 quantity = *( item_list + i * 5 + 2 ); + unsigned short nameid = item_list[i].itemId; + uint32 quantity = item_list[i].amount; #if PACKETVER_SUPPORTS_SALES - uint16 tab = *(item_list + i * 5 + 4); + uint16 tab = item_list[i].tab; #endif struct item_data *id = itemdb_search(nameid); @@ -580,12 +580,12 @@ bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, u continue; if (!pet_create_egg(sd, nameid)) { - unsigned short get_amt = quantity, j; + unsigned short get_amt = quantity; if (id->flag.guid || !itemdb_isstackable2(id)) get_amt = 1; - for (j = 0; j < quantity; j += get_amt) { + for (uint32 j = 0; j < quantity; j += get_amt) { struct item item_tmp = { 0 }; item_tmp.nameid = nameid; @@ -606,6 +606,8 @@ bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, u return false; } + clif_cashshop_result( sd, nameid, CASHSHOP_RESULT_SUCCESS ); + #if PACKETVER_SUPPORTS_SALES if( tab == CASHSHOP_TAB_SALE ){ uint32 new_amount = sale->amount - get_amt; @@ -627,7 +629,6 @@ bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, u } } - clif_cashshop_result( sd, 0, CASHSHOP_RESULT_SUCCESS ); //Doesn't show any message? return true; } diff --git a/src/map/cashshop.hpp b/src/map/cashshop.hpp index a7c3530286..06636543fe 100644 --- a/src/map/cashshop.hpp +++ b/src/map/cashshop.hpp @@ -13,7 +13,7 @@ struct map_session_data; void do_init_cashshop( void ); void do_final_cashshop( void ); void cashshop_reloaddb( void ); -bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, uint16* item_list ); +bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, struct PACKET_CZ_SE_PC_BUY_CASHITEM_LIST_sub* item_list ); // Taken from AEGIS enum CASH_SHOP_TAB_CODE diff --git a/src/map/clif.cpp b/src/map/clif.cpp index a01f5d188c..05dee826bf 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -1,4 +1,5 @@ // Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// Copyright (c) Hercules Dev Team - Licensed under GNU GPL // For more information, see LICENCE in the main folder #include "clif.hpp" @@ -73,6 +74,7 @@ unsigned long color_table[COLOR_MAX]; #include "clif_obfuscation.hpp" static bool clif_session_isValid(struct map_session_data *sd); +static void clif_loadConfirm( struct map_session_data *sd ); #if PACKETVER >= 20150513 enum mail_type { @@ -83,6 +85,13 @@ enum mail_type { }; #endif +enum e_inventory_type{ + INVTYPE_INVENTORY = 0, + INVTYPE_CART = 1, + INVTYPE_STORAGE = 2, + INVTYPE_GUILD_STORAGE = 3, +}; + /** Converts item type to display it on client if necessary. * @param nameid: Item ID * @return item type. For IT_PETEGG will be displayed as IT_ARMOR. If Shadow Weapon of IT_SHADOWGEAR as IT_WEAPON and else as IT_ARMOR @@ -99,6 +108,44 @@ static inline int itemtype(unsigned short nameid) { return ( type == IT_PETEGG ) ? IT_ARMOR : type; } +// TODO: doc +static inline uint16 client_index( uint16 server_index ){ + return server_index + 2; +} + +static inline uint16 server_index( uint16 client_index ){ + return client_index - 2; +} + +static inline uint16 client_storage_index( uint16 server_index ){ + return server_index + 1; +} + +static inline uint16 server_storage_index( uint16 client_index ){ + return client_index - 1; +} + +#if PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114 +static inline uint32 client_nameid( uint32 server_nameid ){ + uint32 view = itemdb_viewid( server_nameid ); + + if( view > 0 ){ + return view; + }else{ + return server_nameid; + } +} +#else +static inline uint16 client_nameid( uint32 server_nameid ){ + uint32 view = itemdb_viewid( server_nameid ); + + if( view > 0 ){ + return (uint16)view; + }else{ + return (uint16)server_nameid; + } +} +#endif static inline void WBUFPOS(uint8* p, unsigned short pos, short x, short y, unsigned char dir) { p += pos; @@ -391,7 +438,7 @@ static int clif_send_sub(struct block_list *bl, va_list ap) * Packet Delegation (called on all packets that require data to be sent to more than one client) * functions that are sent solely to one use whose ID it posses use WFIFOSET *------------------------------------------*/ -int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target type) +int clif_send(const void* buf, int len, struct block_list* bl, enum send_target type) { int i; struct map_session_data *sd, *tsd; @@ -781,56 +828,46 @@ void clif_charselectok(int id, uint8 ok) /// 009E .L .W .B .W .W .B .B .W (ZC_ITEM_FALL_ENTRY) /// 084B .L .W .W .B .W .W .B .B .W (ZC_ITEM_FALL_ENTRY4) /// 0ADD .L .W .W .B .W .W .B .B .W .B .W (ZC_ITEM_FALL_ENTRY5) -void clif_dropflooritem(struct flooritem_data* fitem, bool canShowEffect) -{ -#if PACKETVER >= 20180418 - uint8 buf[22]; - uint32 header = 0xadd; -#elif PACKETVER >= 20130000 - uint8 buf[19]; - uint32 header=0x84b; -#else - uint8 buf[17]; - uint32 header=0x09e; -#endif - int view, offset=0; - +void clif_dropflooritem( struct flooritem_data* fitem, bool canShowEffect ){ nullpo_retv(fitem); - if (fitem->item.nameid == 0) + if( fitem->item.nameid <= 0 ){ return; + } - WBUFW(buf, offset+0) = header; - WBUFL(buf, offset+2) = fitem->bl.id; - WBUFW(buf, offset+6) = ((view = itemdb_viewid(fitem->item.nameid)) > 0) ? view : fitem->item.nameid; -#if PACKETVER >= 20130000 - WBUFW(buf, offset+8) = itemtype(fitem->item.nameid); - offset +=2; + int view = itemdb_viewid( fitem->item.nameid ); + + struct packet_dropflooritem p; + + p.PacketType = dropflooritemType; + p.ITAID = fitem->bl.id; + p.ITID = ( view > 0 ) ? view : fitem->item.nameid; +#if PACKETVER >= 20130000 /* not sure date */ + p.type = itemtype( fitem->item.nameid ); #endif - WBUFB(buf, offset+8) = fitem->item.identify; - WBUFW(buf, offset+9) = fitem->bl.x; - WBUFW(buf, offset+11) = fitem->bl.y; - WBUFB(buf, offset+13) = fitem->subx; - WBUFB(buf, offset+14) = fitem->suby; - WBUFW(buf, offset+15) = fitem->item.amount; -#if PACKETVER >= 20180418 + p.IsIdentified = fitem->item.identify ? 1 : 0; + p.xPos = fitem->bl.x; + p.yPos = fitem->bl.y; + p.subX = fitem->subx; + p.subY = fitem->suby; + p.count = fitem->item.amount; +#if defined(PACKETVER_ZERO) || PACKETVER >= 20180418 if( canShowEffect ){ - uint8 dropEffect = itemdb_dropeffect(fitem->item.nameid); + uint8 dropEffect = itemdb_dropeffect( fitem->item.nameid ); if( dropEffect > 0 ){ - WBUFB(buf, offset+17) = 1; - WBUFW(buf, offset+18) = dropEffect - 1; + p.showdropeffect = 1; + p.dropeffectmode = dropEffect - 1; }else{ - WBUFB(buf, offset+17) = 0; - WBUFW(buf, offset+18) = 0; + p.showdropeffect = 0; + p.dropeffectmode = 0; } }else{ - WBUFB(buf, offset+17) = 0; - WBUFW(buf, offset+18) = 0; + p.showdropeffect = 0; + p.dropeffectmode = 0; } #endif - - clif_send(buf, packet_len(header), &fitem->bl, AREA); + clif_send( &p, sizeof(p), &fitem->bl, AREA ); } @@ -982,349 +1019,398 @@ static int clif_setlevel(struct block_list* bl) { /*========================================== * Prepares 'unit standing/spawning' packet *------------------------------------------*/ -static int clif_set_unit_idle(struct block_list* bl, unsigned char* buffer, bool spawn, bool option, bool walking, unsigned int option_val) -{ - struct map_session_data* sd; - struct status_change* sc = status_get_sc(bl); - struct view_data* vd = status_get_viewdata(bl); +static void clif_set_unit_idle( struct block_list* bl, bool walking, send_target target, struct block_list* tbl ){ + nullpo_retv( bl ); - unsigned char *buf = WBUFP(buffer, 0); -#if PACKETVER < 20091103 - bool type = !pcdb_checkid(vd->class_); -#endif - unsigned short offset = 0; -#if PACKETVER >= 20091103 - const char *name; -#endif - sd = BL_CAST(BL_PC, bl); - - if (!option) - option_val = ((sc) ? sc->option : 0); + struct map_session_data* sd = BL_CAST( BL_PC, bl ); + struct status_change* sc = status_get_sc( bl ); + struct view_data* vd = status_get_viewdata( bl ); + int g_id = status_get_guild_id( bl ); #if PACKETVER < 20091103 - if(type) - WBUFW(buf,0) = spawn ? 0x7c : 0x78; - else -#endif -#if PACKETVER < 4 - WBUFW(buf,0) = spawn ? 0x79 : 0x78; -#elif PACKETVER < 7 - WBUFW(buf,0) = spawn ? 0x1d9 : 0x1d8; -#elif PACKETVER < 20080102 - WBUFW(buf,0) = spawn ? 0x22b : 0x22a; -#elif PACKETVER < 20091103 - WBUFW(buf,0) = spawn ? 0x2ed : 0x2ee; -#elif PACKETVER < 20101124 - WBUFW(buf,0) = spawn ? 0x7f8 : 0x7f9; -#elif PACKETVER < 20120221 - WBUFW(buf,0) = spawn ? 0x858 : 0x857; -#elif PACKETVER < 20131223 - WBUFW(buf,0) = spawn ? 0x90f : 0x915; -#elif PACKETVER < 20150513 - WBUFW(buf,0) = spawn ? 0x9dc : 0x9dd; -#else - WBUFW(buf,0) = spawn ? 0x9fe : 0x9ff; -#endif + if( !pcdb_checkid( vd->class_ ) ){ + struct packet_idle_unit2 p; -#if PACKETVER >= 20091103 - name = status_get_name(bl); -#if PACKETVER < 20110111 - WBUFW(buf,2) = (uint16)((spawn ? 62 : 63)+strlen(name)); -#elif PACKETVER < 20120221 - WBUFW(buf,2) = (uint16)((spawn ? 64 : 65)+strlen(name)); -#elif PACKETVER < 20130807 - WBUFW(buf,2) = (uint16)((spawn ? 77 : 78)+strlen(name)); -#else - WBUFW(buf,2) = (uint16)((spawn ? 79 : 80)+strlen(name)); + p.PacketType = idle_unit2Type; +#if PACKETVER >= 20071106 + p.objecttype = clif_bl_type( bl, walking ); #endif - WBUFB(buf,4) = clif_bl_type(bl,walking); - offset+=3; - buf = WBUFP(buffer,offset); -#elif PACKETVER >= 20071106 - if (type) { //Non-player packets - WBUFB(buf,2) = clif_bl_type(bl); - offset++; - buf = WBUFP(buffer,offset); + p.GID = bl->id; + p.speed = status_get_speed( bl ); + p.bodyState = ( sc ) ? sc->opt1 : 0; + p.healthState = ( sc ) ? sc->opt2 : 0; + p.effectState = ( sc ) ? sc->option : 0; + p.job = vd->class_; + p.head = vd->hair_style; + p.weapon = vd->weapon; + p.accessory = vd->head_bottom; + if( bl->type == BL_NPC && vd->class_ == JT_GUILD_FLAG ){ + // The hell, why flags work like this? + p.shield = status_get_emblem_id( bl ); + p.accessory2 = GetWord( g_id, 1 ); + p.accessory3 = GetWord( g_id, 0 ); + }else{ + p.shield = vd->shield; + p.accessory2 = vd->head_top; + p.accessory3 = vd->head_mid; + } + p.headpalette = vd->hair_color; + p.bodypalette = vd->cloth_color; + p.headDir = ( sd )? sd->head_dir : 0; + p.GUID = g_id; + p.GEmblemVer = status_get_emblem_id( bl ); + p.honor = ( sd ) ? sd->status.manner : 0; + p.virtue = ( sc ) ? sc->opt3 : 0; + p.isPKModeON = ( sd && sd->status.karma ) ? 1 : 0; + p.sex = vd->sex; + WBUFPOS( &p.PosDir[0], 0, bl->x, bl->y, unit_getdir( bl ) ); + p.xSize = p.ySize = ( sd ) ? 5 : 0; + p.state = vd->dead_sit; + p.clevel = clif_setlevel( bl ); + + clif_send( &p, sizeof( p ), tbl, target ); + + return; } #endif - WBUFL(buf, 2) = bl->id; + + struct packet_idle_unit p; + + p.PacketType = idle_unitType; +#if PACKETVER >= 20091103 + p.PacketLength = sizeof(p); + p.objecttype = clif_bl_type( bl, walking ); +#endif #if PACKETVER >= 20131223 - WBUFL(buf,6) = (sd) ? sd->status.char_id : 0; // GID/CCODE - offset+=4; - buf = WBUFP(buffer,offset); -#endif - WBUFW(buf, 6) = status_get_speed(bl); - WBUFW(buf, 8) = (sc)? sc->opt1 : 0; - WBUFW(buf,10) = (sc)? sc->opt2 : 0; -#if PACKETVER < 20091103 - if (type&&spawn) { //uses an older and different packet structure - WBUFW(buf,12) = option_val; - WBUFW(buf,14) = vd->hair_style; - WBUFW(buf,16) = vd->weapon; - WBUFW(buf,18) = vd->head_bottom; - WBUFW(buf,20) = vd->class_; //Pet armor (ignored by client) - WBUFW(buf,22) = vd->shield; - } else { -#endif -#if PACKETVER >= 20091103 - WBUFL(buf,12) = option_val; - offset+=2; - buf = WBUFP(buffer,offset); -#elif PACKETVER >= 7 - if (!type) { - WBUFL(buf,12) = option_val; - offset+=2; - buf = WBUFP(buffer,offset); - } else - WBUFW(buf,12) = option_val; + p.AID = bl->id; + p.GID = (sd) ? sd->status.char_id : 0; // CCODE #else - WBUFW(buf,12) = option_val; + p.GID = bl->id; #endif - WBUFW(buf,14) = vd->class_; - WBUFW(buf,16) = vd->hair_style; - WBUFW(buf,18) = vd->weapon; -#if PACKETVER < 4 - WBUFW(buf,20) = vd->head_bottom; - WBUFW(buf,22) = vd->shield; -#else - WBUFW(buf,20) = vd->shield; - WBUFW(buf,22) = vd->head_bottom; -#endif -#if PACKETVER < 20091103 - } -#endif - WBUFW(buf,24) = vd->head_top; - WBUFW(buf,26) = vd->head_mid; + p.speed = status_get_speed(bl); + p.bodyState = (sc) ? sc->opt1 : 0; + p.healthState = (sc) ? sc->opt2 : 0; - if( bl->type == BL_NPC && vd->class_ == JT_GUILD_FLAG ) - { //The hell, why flags work like this? - WBUFW(buf,22) = status_get_emblem_id(bl); - WBUFW(buf,24) = GetWord(status_get_guild_id(bl), 1); - WBUFW(buf,26) = GetWord(status_get_guild_id(bl), 0); - } + // npc option changed? + if( tbl && tbl->type == BL_PC && bl->type == BL_NPC ){ + struct map_session_data* sd = (struct map_session_data*)tbl; + struct npc_data* nd = (struct npc_data*)bl; + int option = (sc) ? sc->option : 0; - WBUFW(buf,28) = vd->hair_color; - WBUFW(buf,30) = vd->cloth_color; - WBUFW(buf,32) = (sd)? sd->head_dir : 0; -#if PACKETVER < 20091103 - if (type&&spawn) { //End of packet 0x7c - WBUFB(buf,34) = (sd) ? sd->status.karma : 0; // karma - WBUFB(buf,35) = vd->sex; - WBUFPOS(buf,36, bl->x, bl->y, unit_getdir(bl)); - WBUFB(buf,39) = 0; - WBUFB(buf,40) = 0; - return packet_len(0x7c); + if( !nd->vd.dead_sit ){ + if( std::find( sd->cloaked_npc.begin(), sd->cloaked_npc.end(), nd->bl.id ) != sd->cloaked_npc.end() ){ + option ^= OPTION_CLOAK; + } + } + + p.effectState = option; + }else{ + p.effectState = (sc) ? sc->option : 0; } + p.job = vd->class_; + p.head = vd->hair_style; + p.weapon = vd->weapon; +#if PACKETVER < 7 || PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114 + p.shield = vd->shield; #endif -#if PACKETVER >= 20110111 - WBUFW(buf,34) = vd->robe; - offset+= 2; - buf = WBUFP(buffer,offset); -#endif - WBUFL(buf,34) = status_get_guild_id(bl); - WBUFW(buf,38) = status_get_emblem_id(bl); - WBUFW(buf,40) = (sd)? sd->status.manner : 0; -#if PACKETVER >= 20091103 - WBUFL(buf,42) = (sc)? sc->opt3 : 0; - offset+=2; - buf = WBUFP(buffer,offset); -#elif PACKETVER >= 7 - if (!type) { - WBUFL(buf,42) = (sc)? sc->opt3 : 0; - offset+=2; - buf = WBUFP(buffer,offset); - } else - WBUFW(buf,42) = (sc)? sc->opt3 : 0; -#else - WBUFW(buf,42) = (sc)? sc->opt3 : 0; -#endif - WBUFB(buf,44) = (sd)? sd->status.karma : 0; - WBUFB(buf,45) = vd->sex; - WBUFPOS(buf,46,bl->x,bl->y,unit_getdir(bl)); - WBUFB(buf,49) = (sd)? 5 : 0; - WBUFB(buf,50) = (sd)? 5 : 0; - if (!spawn) { - WBUFB(buf,51) = vd->dead_sit; - offset++; - buf = WBUFP(buffer,offset); + if( bl->type == BL_NPC && vd->class_ == JT_GUILD_FLAG ){ + // The hell, why flags work like this? + p.accessory = status_get_emblem_id( bl ); + p.accessory2 = GetWord( g_id, 1 ); + p.accessory3 = GetWord( g_id, 0 ); + }else{ + p.accessory = vd->head_bottom; + p.accessory2 = vd->head_top; + p.accessory3 = vd->head_mid; } - WBUFW(buf,51) = clif_setlevel(bl); -#if PACKETVER < 20091103 - if (type) //End for non-player packet - return packet_len(WBUFW(buffer,0)); + p.headpalette = vd->hair_color; + p.bodypalette = vd->cloth_color; + p.headDir = (sd)? sd->head_dir : 0; +#if PACKETVER >= 20101124 + p.robe = vd->robe; #endif + p.GUID = g_id; + p.GEmblemVer = status_get_emblem_id( bl ); + p.honor = (sd) ? sd->status.manner : 0; + p.virtue = (sc) ? sc->opt3 : 0; + p.isPKModeON = (sd && sd->status.karma) ? 1 : 0; + p.sex = vd->sex; + WBUFPOS( &p.PosDir[0], 0, bl->x, bl->y, unit_getdir( bl ) ); + p.xSize = p.ySize = (sd) ? 5 : 0; + p.state = vd->dead_sit; + p.clevel = clif_setlevel( bl ); #if PACKETVER >= 20080102 - WBUFW(buf,53) = (sd ? sd->status.font : 0); + p.font = (sd) ? sd->status.font : 0; #endif #if PACKETVER >= 20120221 - if ( battle_config.monster_hp_bars_info && bl->type == BL_MOB && !map_getmapflag(bl->m, MF_HIDEMOBHPBAR) && (status_get_hp(bl) < status_get_max_hp(bl)) ) { - WBUFL(buf,55) = status_get_max_hp(bl); // maxHP - WBUFL(buf,59) = status_get_hp(bl); // HP - } else { - WBUFL(buf,55) = -1; // maxHP - WBUFL(buf,59) = -1; // HP + if( battle_config.monster_hp_bars_info && !map_getmapflag( bl->m, MF_HIDEMOBHPBAR ) && bl->type == BL_MOB && ( status_get_hp( bl ) < status_get_max_hp( bl ) ) ){ + p.maxHP = status_get_max_hp(bl); + p.HP = status_get_hp(bl); + }else{ + p.maxHP = -1; + p.HP = -1; } - - WBUFB(buf,63) = ( bl->type == BL_MOB && (((TBL_MOB*)bl)->db->mexp > 0) ) ? 1 : 0; // isBoss + p.isBoss = ( bl->type == BL_MOB && ( ( ( TBL_MOB *)bl )->db->mexp > 0 ) ) ? 1 : 0; #endif #if PACKETVER >= 20150513 - WBUFW(buf,64) = vd->body_style; // body - offset+= 2; - buf = WBUFP(buffer,offset); + p.body = vd->body_style; #endif +/* Might be earlier, this is when the named item bug began */ +#if PACKETVER >= 20131223 + safestrncpy(p.name, status_get_name( bl ), NAME_LENGTH); +#endif + + if( disguised( bl ) ){ #if PACKETVER >= 20091103 + p.objecttype = pcdb_checkid( status_get_viewdata( bl )->class_ ) ? 0x0 : 0x5; //PC_TYPE : NPC_MOB_TYPE +#if PACKETVER >= 20131223 + p.AID = -bl->id; +#else + p.GID = -bl->id; +#endif +#else + p.GID = -bl->id; +#endif + } + + clif_send( &p, sizeof( p ), tbl, target ); +} + +static void clif_spawn_unit( struct block_list *bl, enum send_target target ){ + nullpo_retv( bl ); + + struct map_session_data* sd = BL_CAST( BL_PC, bl ); + struct status_change* sc = status_get_sc( bl ); + struct view_data* vd = status_get_viewdata( bl ); + int g_id = status_get_guild_id( bl ); + +#if PACKETVER < 20091103 + if( !pcdb_checkid( vd->class_ ) ){ + struct packet_spawn_unit2 p; + + p.PacketType = spawn_unit2Type; +#if PACKETVER >= 20071106 + p.objecttype = clif_bl_type( bl, false ); +#endif + p.GID = bl->id; + p.speed = status_get_speed( bl ); + p.bodyState = ( sc ) ? sc->opt1 : 0; + p.healthState = ( sc ) ? sc->opt2 : 0; + p.effectState = ( sc ) ? sc->option : 0; + p.head = vd->hair_style; + p.weapon = vd->weapon; + p.accessory = vd->head_bottom; + p.job = vd->class_; + if( bl->type == BL_NPC && vd->class_ == JT_GUILD_FLAG ){ + // The hell, why flags work like this? + p.shield = status_get_emblem_id( bl ); + p.accessory2 = GetWord( g_id, 1 ); + p.accessory3 = GetWord( g_id, 0 ); + }else{ + p.shield = vd->shield; + p.accessory2 = vd->head_top; + p.accessory3 = vd->head_mid; + } + p.headpalette = vd->hair_color; + p.bodypalette = vd->cloth_color; + p.headDir = ( sd ) ? sd->head_dir : 0; + p.isPKModeON = ( sd && sd->status.karma ) ? 1 : 0; + p.sex = vd->sex; + WBUFPOS( &p.PosDir[0], 0, bl->x, bl->y, unit_getdir( bl ) ); + p.xSize = p.ySize = ( sd ) ? 5 : 0; + + clif_send( &p, sizeof( p ), bl, target ); + return; + } +#endif + + struct packet_spawn_unit p; + + p.PacketType = spawn_unitType; +#if PACKETVER >= 20091103 + p.PacketLength = sizeof(p); + p.objecttype = clif_bl_type( bl, false ); +#endif +#if PACKETVER >= 20131223 + p.AID = bl->id; + p.GID = (sd) ? sd->status.char_id : 0; // CCODE +#else + p.GID = bl->id; +#endif + p.speed = status_get_speed( bl ); + p.bodyState = (sc) ? sc->opt1 : 0; + p.healthState = (sc) ? sc->opt2 : 0; + p.effectState = (sc) ? sc->option : 0; + p.job = vd->class_; + p.head = vd->hair_style; + p.weapon = vd->weapon; +#if PACKETVER < 7 || PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114 + p.shield = vd->shield; +#endif + if( bl->type == BL_NPC && vd->class_ == JT_GUILD_FLAG ){ + // The hell, why flags work like this? + p.accessory = status_get_emblem_id( bl ); + p.accessory2 = GetWord( g_id, 1 ); + p.accessory3 = GetWord( g_id, 0 ); + }else{ + p.accessory = vd->head_bottom; + p.accessory2 = vd->head_top; + p.accessory3 = vd->head_mid; + } + p.headpalette = vd->hair_color; + p.bodypalette = vd->cloth_color; + p.headDir = (sd)? sd->head_dir : 0; +#if PACKETVER >= 20101124 + p.robe = vd->robe; +#endif + p.GUID = g_id; + p.GEmblemVer = status_get_emblem_id( bl ); + p.honor = (sd) ? sd->status.manner : 0; + p.virtue = (sc) ? sc->opt3 : 0; + p.isPKModeON = (sd && sd->status.karma) ? 1 : 0; + p.sex = vd->sex; + WBUFPOS( &p.PosDir[0], 0, bl->x, bl->y, unit_getdir( bl ) ); + p.xSize = p.ySize = (sd) ? 5 : 0; + p.clevel = clif_setlevel( bl ); +#if PACKETVER >= 20080102 + p.font = (sd) ? sd->status.font : 0; +#endif #if PACKETVER >= 20120221 - safestrncpy(WBUFCP(buf,64), name, NAME_LENGTH); -#else - safestrncpy(WBUFCP(buf,55), name, NAME_LENGTH); + if( battle_config.monster_hp_bars_info && bl->type == BL_MOB && !map_getmapflag( bl->m, MF_HIDEMOBHPBAR ) && ( status_get_hp( bl ) < status_get_max_hp( bl ) ) ){ + p.maxHP = status_get_max_hp( bl ); + p.HP = status_get_hp( bl ); + }else{ + p.maxHP = -1; + p.HP = -1; + } + + p.isBoss = ( bl->type == BL_MOB && ( ( ( TBL_MOB *)bl)->db->mexp > 0 ) ) ? 1 : 0; #endif - return WBUFW(buffer,2); -#else - return packet_len(WBUFW(buffer,0)); +#if PACKETVER >= 20150513 + p.body = vd->body_style; #endif +/* Might be earlier, this is when the named item bug began */ +#if PACKETVER >= 20131223 + safestrncpy( p.name, status_get_name( bl ), NAME_LENGTH ); +#endif + + if( disguised( bl ) ){ + nullpo_retv( sd ); + + if( sd->status.class_ != sd->disguise ){ + clif_send( &p, sizeof( p ), bl, target ); + } + +#if PACKETVER >= 20091103 + p.objecttype = pcdb_checkid( status_get_viewdata(bl)->class_ ) ? 0x0 : 0x5; //PC_TYPE : NPC_MOB_TYPE +#if PACKETVER >= 20131223 + p.AID = -bl->id; +#else + p.GID = -bl->id; +#endif +#else + p.GID = -bl->id; +#endif + clif_send( &p, sizeof( p ), bl, SELF ); + }else{ + clif_send( &p, sizeof( p ), bl, target ); + } } /*========================================== * Prepares 'unit walking' packet *------------------------------------------*/ -static int clif_set_unit_walking(struct block_list* bl, struct unit_data* ud, unsigned char* buffer) -{ - struct map_session_data* sd; - struct status_change* sc = status_get_sc(bl); - struct view_data* vd = status_get_viewdata(bl); +static void clif_set_unit_walking( struct block_list *bl, struct map_session_data *tsd, struct unit_data *ud, enum send_target target ){ + nullpo_retv( bl ); + nullpo_retv( ud ); - unsigned char* buf = WBUFP(buffer,0); -#if PACKETVER >= 7 - unsigned short offset = 0; -#endif -#if PACKETVER >= 20091103 - const char *name; -#endif + struct map_session_data* sd; + struct status_change* sc = status_get_sc( bl ); + struct view_data* vd = status_get_viewdata( bl ); + struct packet_unit_walking p; + int g_id = status_get_guild_id(bl); sd = BL_CAST(BL_PC, bl); -#if PACKETVER < 4 - WBUFW(buf, 0) = 0x7b; -#elif PACKETVER < 7 - WBUFW(buf, 0) = 0x1da; -#elif PACKETVER < 20080102 - WBUFW(buf, 0) = 0x22c; -#elif PACKETVER < 20091103 - WBUFW(buf, 0) = 0x2ec; -#elif PACKETVER < 20101124 - WBUFW(buf, 0) = 0x7f7; -#elif PACKETVER < 20120221 - WBUFW(buf, 0) = 0x856; -#elif PACKETVER < 20131223 - WBUFW(buf, 0) = 0x914; -#elif PACKETVER < 20150513 - WBUFW(buf, 0) = 0x9db; -#else - WBUFW(buf, 0) = 0x9fd; -#endif - + p.PacketType = unit_walkingType; #if PACKETVER >= 20091103 - name = status_get_name(bl); -#if PACKETVER < 20110111 - WBUFW(buf, 2) = (uint16)(69+strlen(name)); -#elif PACKETVER < 20120221 - WBUFW(buf, 2) = (uint16)(71+strlen(name)); -#elif PACKETVER < 20130807 - WBUFW(buf, 2) = (uint16)(84+strlen(name)); -#else - WBUFW(buf, 2) = (uint16)(86+strlen(name)); -#endif - offset+=2; - buf = WBUFP(buffer,offset); + p.PacketLength = sizeof(p); #endif #if PACKETVER >= 20071106 - WBUFB(buf, 2) = clif_bl_type(bl,true); - offset++; - buf = WBUFP(buffer,offset); + p.objecttype = clif_bl_type( bl, true ); #endif - WBUFL(buf, 2) = bl->id; #if PACKETVER >= 20131223 - WBUFL(buf,6) = (sd) ? sd->status.char_id : 0; // GID/CCODE - offset+=4; - buf = WBUFP(buffer,offset); -#endif - WBUFW(buf, 6) = status_get_speed(bl); - WBUFW(buf, 8) = (sc)? sc->opt1 : 0; - WBUFW(buf,10) = (sc)? sc->opt2 : 0; -#if PACKETVER < 7 - WBUFW(buf,12) = (sc)? sc->option : 0; + p.AID = bl->id; + p.GID = (sd) ? sd->status.char_id : 0; // CCODE #else - WBUFL(buf,12) = (sc)? sc->option : 0; - offset+=2; //Shift the rest of elements by 2 bytes. - buf = WBUFP(buffer,offset); + p.GID = bl->id; #endif - WBUFW(buf,14) = vd->class_; - WBUFW(buf,16) = vd->hair_style; - WBUFW(buf,18) = vd->weapon; -#if PACKETVER < 4 - WBUFW(buf,20) = vd->head_bottom; - WBUFL(buf,22) = client_tick(gettick()); - WBUFW(buf,26) = vd->shield; -#else - WBUFW(buf,20) = vd->shield; - WBUFW(buf,22) = vd->head_bottom; - WBUFL(buf,24) = client_tick(gettick()); + p.speed = status_get_speed(bl); + p.bodyState = (sc) ? sc->opt1 : 0; + p.healthState = (sc) ? sc->opt2 : 0; + p.effectState = (sc) ? sc->option : 0; + p.job = vd->class_; + p.head = vd->hair_style; + p.weapon = vd->weapon; + p.accessory = vd->head_bottom; + p.moveStartTime = client_tick(gettick()); +#if PACKETVER < 7 || PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114 + p.shield = vd->shield; #endif - WBUFW(buf,28) = vd->head_top; - WBUFW(buf,30) = vd->head_mid; - WBUFW(buf,32) = vd->hair_color; - WBUFW(buf,34) = vd->cloth_color; - WBUFW(buf,36) = (sd)? sd->head_dir : 0; -#if PACKETVER >= 20110111 - WBUFW(buf,38) = vd->robe; - offset+= 2; - buf = WBUFP(buffer,offset); + p.accessory2 = vd->head_top; + p.accessory3 = vd->head_mid; + p.headpalette = vd->hair_color; + p.bodypalette = vd->cloth_color; + p.headDir = (sd) ? sd->head_dir : 0; +#if PACKETVER >= 20101124 + p.robe = vd->robe; #endif - WBUFL(buf,38) = status_get_guild_id(bl); - WBUFW(buf,42) = status_get_emblem_id(bl); - WBUFW(buf,44) = (sd)? sd->status.manner : 0; -#if PACKETVER < 7 - WBUFW(buf,46) = (sc)? sc->opt3 : 0; -#else - WBUFL(buf,46) = (sc)? sc->opt3 : 0; - offset+=2; //Shift the rest of elements by 2 bytes. - buf = WBUFP(buffer,offset); -#endif - WBUFB(buf,48) = (sd)? sd->status.karma : 0; - WBUFB(buf,49) = vd->sex; - WBUFPOS2(buf,50,bl->x,bl->y,ud->to_x,ud->to_y,8,8); - WBUFB(buf,56) = (sd)? 5 : 0; - WBUFB(buf,57) = (sd)? 5 : 0; - WBUFW(buf,58) = clif_setlevel(bl); + p.GUID = g_id; + p.GEmblemVer = status_get_emblem_id(bl); + p.honor = (sd) ? sd->status.manner : 0; + p.virtue = (sc) ? sc->opt3 : 0; + p.isPKModeON = (sd && sd->status.karma) ? 1 : 0; + p.sex = vd->sex; + WBUFPOS2( &p.MoveData[0], 0, bl->x, bl->y, ud->to_x, ud->to_y, 8, 8 ); + p.xSize = p.ySize = (sd) ? 5 : 0; + p.clevel = clif_setlevel(bl); #if PACKETVER >= 20080102 - WBUFW(buf,60) = (sd ? sd->status.font : 0); + p.font = (sd) ? sd->status.font : 0; #endif #if PACKETVER >= 20120221 - if ( battle_config.monster_hp_bars_info && !map_getmapflag(bl->m, MF_HIDEMOBHPBAR) && bl->type == BL_MOB && (status_get_hp(bl) < status_get_max_hp(bl)) ) { - WBUFL(buf,62) = status_get_max_hp(bl); // maxHP - WBUFL(buf,66) = status_get_hp(bl); // HP + if( battle_config.monster_hp_bars_info && !map_getmapflag(bl->m, MF_HIDEMOBHPBAR) && bl->type == BL_MOB && (status_get_hp(bl) < status_get_max_hp( bl ) ) ){ + p.maxHP = status_get_max_hp(bl); + p.HP = status_get_hp(bl); } else { - WBUFL(buf,62) = -1; // maxHP - WBUFL(buf,66) = -1; // HP + p.maxHP = -1; + p.HP = -1; } - WBUFB(buf,70) = ( bl->type == BL_MOB && (((TBL_MOB*)bl)->db->mexp > 0) ) ? 1 : 0; // isBoss + p.isBoss = ( bl->type == BL_MOB && (((TBL_MOB*)bl)->db->mexp > 0) ) ? 1 : 0; #endif #if PACKETVER >= 20150513 - WBUFW(buf,71) = vd->body_style; // body - offset+= 2; - buf = WBUFP(buffer,offset); + p.body = vd->body_style; #endif +/* Might be earlier, this is when the named item bug began */ +#if PACKETVER >= 20131223 + safestrncpy(p.name, status_get_name(bl), NAME_LENGTH); +#endif + + clif_send( &p, sizeof(p), tsd ? &tsd->bl : bl, target ); + + if( disguised( bl ) ){ #if PACKETVER >= 20091103 -#if PACKETVER >= 20120221 - safestrncpy(WBUFCP(buf,71), name, NAME_LENGTH); + p.objecttype = pcdb_checkid( status_get_viewdata(bl)->class_ ) ? 0x0 : 0x5; //PC_TYPE : NPC_MOB_TYPE +#if PACKETVER >= 20131223 + p.AID = -bl->id; #else - safestrncpy(WBUFCP(buf,62), name, NAME_LENGTH); + p.GID = -bl->id; #endif - return WBUFW(buffer,2); #else - return packet_len(WBUFW(buffer,0)); + p.GID = -bl->id; #endif + clif_send(&p,sizeof(p),bl,SELF); + } } //Modifies the buffer for disguise characters and sends it to self. @@ -1467,11 +1553,8 @@ void clif_weather(int16 m) /** * Main function to spawn a unit on the client (player/mob/pet/etc) **/ -int clif_spawn(struct block_list *bl, bool walking) -{ - unsigned char buf[128]; +int clif_spawn( struct block_list *bl, bool walking ){ struct view_data *vd; - int len; vd = status_get_viewdata(bl); if( !vd || vd->class_ == JT_INVISIBLE ) @@ -1483,10 +1566,11 @@ int clif_spawn(struct block_list *bl, bool walking) if(bl->type == BL_NPC && !((TBL_NPC*)bl)->chat_id && (((TBL_NPC*)bl)->sc.option&OPTION_INVISIBLE)) return 0; - len = clif_set_unit_idle(bl, buf, (bl->type == BL_NPC && vd->dead_sit ? false : true), false, walking, 0); - clif_send(buf, len, bl, AREA_WOS); - if (disguised(bl)) - clif_setdisguise(bl, buf, len); + if( bl->type == BL_NPC && !vd->dead_sit ){ + clif_set_unit_idle( bl, walking, AREA_WOS, bl ); + }else{ + clif_spawn_unit( bl, AREA_WOS ); + } if (vd->cloth_color) clif_refreshlook(bl,bl->id,LOOK_CLOTHES_COLOR,vd->cloth_color,AREA_WOS); @@ -1548,95 +1632,87 @@ int clif_spawn(struct block_list *bl, bool walking) /// Sends information about owned homunculus to the client . [orn] /// 022e .24B .B .W .W .W .W .W .W .W .W .W .W .W .W .W .W .W .W .L .L .W .W (ZC_PROPERTY_HOMUN) /// 09f7 .24B .B .W .W .W .W .W .W .W .W .W .W .W .W .L .L .W .W .L .L .W .W (ZC_PROPERTY_HOMUN_2) -void clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag) -{ - struct status_data *status; - unsigned char buf[128]; - int offset; -#if PACKETVER < 20141016 - const int cmd = 0x22e; -#else - const int cmd = 0x9f7; -#endif - int htype; +void clif_hominfo( struct map_session_data *sd, struct homun_data *hd, int flag ){ +#if PACKETVER_MAIN_NUM >= 20101005 || PACKETVER_RE_NUM >= 20080827 || defined(PACKETVER_ZERO) + nullpo_retv( sd ); + nullpo_retv( hd ); - nullpo_retv(hd); + struct status_data *status = &hd->battle_status; + struct PACKET_ZC_PROPERTY_HOMUN p; - if (!clif_session_isValid(sd)) - return; - - status = &hd->battle_status; - htype = hom_class2type(hd->homunculus.class_); - - memset(buf,0,packet_len(cmd)); - WBUFW(buf,0) = cmd; - safestrncpy(WBUFCP(buf,2), hd->homunculus.name, NAME_LENGTH); + p.packetType = HEADER_ZC_PROPERTY_HOMUN; + safestrncpy( p.name, hd->homunculus.name, sizeof( p.name ) ); // Bit field, bit 0 : rename_flag (1 = already renamed), bit 1 : homunc vaporized (1 = true), bit 2 : homunc dead (1 = true) - WBUFB(buf,26) = (battle_config.hom_rename ? 0 : hd->homunculus.rename_flag) | (hd->homunculus.vaporize << 1) | (hd->homunculus.hp ? 0 : 4); - WBUFW(buf,27) = hd->homunculus.level; - WBUFW(buf,29) = hd->homunculus.hunger; - WBUFW(buf,31) = (unsigned short) (hd->homunculus.intimacy / 100) ; - WBUFW(buf,33) = 0; // equip id - WBUFW(buf,35) = cap_value(status->rhw.atk2 + status->batk, 0, INT16_MAX); - WBUFW(buf,37)=i16min(status->matk_max, INT16_MAX); //FIXME capping to INT16 here is too late - WBUFW(buf,39)=status->hit; - if (battle_config.hom_setting&HOMSET_DISPLAY_LUK) - WBUFW(buf,41) = status->luk/3 + 1; //crit is a +1 decimal value! Just display purpose.[Vicious] - else - WBUFW(buf,41) = status->cri/10; -#ifdef RENEWAL - WBUFW(buf,43) = status->def + status->def2; - WBUFW(buf,45) = status->mdef + status->mdef2; -#else - WBUFW(buf,43) = status->def + status->vit; - WBUFW(buf,45) = status->mdef; + p.flags = ( !battle_config.hom_rename && hd->homunculus.rename_flag ? 0x1 : 0x0 ) | ( hd->homunculus.vaporize == HOM_ST_REST ? 0x2 : 0 ) | ( hd->homunculus.hp > 0 ? 0x4 : 0 ); + p.level = hd->homunculus.level; + p.hunger = hd->homunculus.hunger; + p.intimacy = hd->homunculus.intimacy / 100; +#if !(PACKETVER_MAIN_NUM >= 20190619 || PACKETVER_RE_NUM >= 20190605 || PACKETVER_ZERO_NUM >= 20190626) + p.itemId = 0; // equip id #endif - WBUFW(buf,47) = status->flee; - WBUFW(buf,49) = (flag) ? 0 : status->amotion; + p.atk2 = cap_value( status->rhw.atk2 + status->batk, 0, INT16_MAX ); + p.matk = i16min( status->matk_max, INT16_MAX ); //FIXME capping to INT16 here is too late + p.hit = status->hit; + if( battle_config.hom_setting&HOMSET_DISPLAY_LUK ){ + p.crit = status->luk / 3 + 1; //crit is a +1 decimal value! Just display purpose.[Vicious] + }else{ + p.crit = status->cri / 10; + } +#ifdef RENEWAL + p.def = status->def + status->def2; + p.mdef = status->mdef + status->mdef2; +#else + p.def = status->def + status->vit; + p.mdef = status->mdef; +#endif + p.flee = status->flee; + p.amotion = (flag) ? 0 : status->amotion; #if PACKETVER >= 20141016 // Homunculus HP bar will screw up if the percentage calculation exceeds signed values // Tested maximum: 21474836(=INT32_MAX/100), any value above will screw up the HP bar - if (status->max_hp > (INT32_MAX/100)) { - WBUFL(buf,51) = status->hp/(status->max_hp/100); - WBUFL(buf,55) = 100; - } else { - WBUFL(buf,51) = status->hp; - WBUFL(buf,55) = status->max_hp; + if( status->max_hp > ( INT32_MAX / 100 ) ){ + p.hp = status->hp / ( status->max_hp / 100 ); + p.maxHp = 100; + }else{ + p.hp = status->hp; + p.maxHp = status->max_hp; } - offset = 4; #else - if (status->max_hp > INT16_MAX) { - WBUFW(buf,51) = status->hp/(status->max_hp/100); - WBUFW(buf,53) = 100; - } else { - WBUFW(buf,51) = status->hp; - WBUFW(buf,53) = status->max_hp; + if( status->max_hp > INT16_MAX ){ + p.hp = status->hp / ( status->max_hp / 100 ); + p.maxHp = 100; + }else{ + p.hp = status->hp; + p.maxHp = status->max_hp; } - offset = 0; #endif - if (status->max_sp > INT16_MAX) { - WBUFW(buf,55+offset) = status->sp/(status->max_sp/100); - WBUFW(buf,57+offset) = 100; - } else { - WBUFW(buf,55+offset) = status->sp; - WBUFW(buf,57+offset) = status->max_sp; + if( status->max_sp > INT16_MAX ){ + p.sp = status->sp / ( status->max_sp / 100 ); + p.maxSp = 100; + }else{ + p.sp = status->sp; + p.maxSp = status->max_sp; } - WBUFL(buf,59+offset) = hd->homunculus.exp; - WBUFL(buf,63+offset) = hd->exp_next; - switch( htype ) { + p.exp = hd->homunculus.exp; + p.expNext = hd->exp_next; + switch( hom_class2type( hd->homunculus.class_ ) ){ case HT_REG: case HT_EVO: - if( hd->homunculus.level >= battle_config.hom_max_level ) - WBUFL(buf,63+offset) = 0; + if( hd->homunculus.level >= battle_config.hom_max_level ){ + p.expNext = 0; + } break; case HT_S: - if( hd->homunculus.level >= battle_config.hom_S_max_level ) - WBUFL(buf,63+offset) = 0; + if( hd->homunculus.level >= battle_config.hom_S_max_level ){ + p.expNext = 0; + } break; } - WBUFW(buf,67+offset) = hd->homunculus.skillpts; - WBUFW(buf,69+offset) = status_get_range(&hd->bl); - clif_send(buf,packet_len(cmd),&sd->bl,SELF); + p.skillPoints = hd->homunculus.skillpts; + p.range = status_get_range( &hd->bl ); + + clif_send( &p, sizeof( p ), &sd->bl, SELF ); +#endif } @@ -1728,16 +1804,21 @@ void clif_homskillup(struct map_session_data *sd, uint16 skill_id) WFIFOSET(fd,packet_len(0x239)); } -int clif_hom_food(struct map_session_data *sd,int foodid,int fail) //[orn] -{ - int fd=sd->fd; - WFIFOHEAD(fd,packet_len(0x22f)); - WFIFOW(fd,0)=0x22f; - WFIFOB(fd,2)=fail; - WFIFOW(fd,3)=foodid; - WFIFOSET(fd,packet_len(0x22f)); +/// Result of request to feed a homun/merc. +/// 022f .B .W (ZC_FEED_MER) +/// result: +/// 0 = failure +/// 1 = success +void clif_hom_food( struct map_session_data *sd, int foodid, int fail ){ + nullpo_retv( sd ); - return 0; + struct PACKET_ZC_FEED_MER p; + + p.packetType = 0x22f; + p.result = fail; + p.itemId = client_nameid( foodid ); + + clif_send( &p, sizeof( p ), &sd->bl, SELF ); } @@ -1755,19 +1836,13 @@ void clif_walkok(struct map_session_data *sd) } -static void clif_move2(struct block_list *bl, struct view_data *vd, struct unit_data *ud) -{ - uint8 buf[128]; - int len; +static void clif_move2( struct block_list *bl, struct view_data *vd, struct unit_data *ud ){ struct status_change *sc = NULL; if ((sc = status_get_sc(bl)) && sc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_INVISIBLE|OPTION_CHASEWALK)) clif_ally_only = true; - len = clif_set_unit_walking(bl,ud,buf); - clif_send(buf,len,bl,AREA_WOS); - if (disguised(bl)) - clif_setdisguise(bl, buf, len); + clif_set_unit_walking( bl, nullptr, ud, AREA_WOS ); if(vd->cloth_color) clif_refreshlook(bl,bl->id,LOOK_CLOTHES_COLOR,vd->cloth_color,AREA_WOS); @@ -1982,37 +2057,36 @@ void clif_npcbuysell(struct map_session_data* sd, int id) } -/// Presents list of items, that can be bought in an NPC shop (ZC_PC_PURCHASE_ITEMLIST). -/// 00c6 .W { .L .L .B .W }* -void clif_buylist(struct map_session_data *sd, struct npc_data *nd) -{ - int fd,i,c; - bool discount; +/// Presents list of items, that can be bought in an NPC shop. +/// 00c6 .W { .L .L .B .W }* (ZC_PC_PURCHASE_ITEMLIST) +void clif_buylist( struct map_session_data *sd, struct npc_data *nd ){ + nullpo_retv( sd ); + nullpo_retv( nd ); - nullpo_retv(sd); - nullpo_retv(nd); + int fd = sd->fd; - fd = sd->fd; - WFIFOHEAD(fd, 4 + nd->u.shop.count * 11); - WFIFOW(fd,0) = 0xc6; - - c = 0; - discount = npc_shop_discount(nd); - for( i = 0; i < nd->u.shop.count; i++ ) - { - struct item_data* id = itemdb_exists(nd->u.shop.shop_item[i].nameid); - int val = nd->u.shop.shop_item[i].value; - if( id == NULL ) - continue; - WFIFOL(fd, 4+c*11) = val; - WFIFOL(fd, 8+c*11) = (discount) ? pc_modifybuyvalue(sd,val) : val; - WFIFOB(fd,12+c*11) = itemtype(id->nameid); - WFIFOW(fd,13+c*11) = ( id->view_id > 0 ) ? id->view_id : id->nameid; - c++; + if( !session_isActive( fd ) ){ + return; } - WFIFOW(fd,2) = 4 + c*11; - WFIFOSET(fd,WFIFOW(fd,2)); + uint16 len = sizeof( struct PACKET_ZC_PC_PURCHASE_ITEMLIST ) + nd->u.shop.count * sizeof( struct PACKET_ZC_PC_PURCHASE_ITEMLIST_sub ); + WFIFOHEAD( fd, len ); + struct PACKET_ZC_PC_PURCHASE_ITEMLIST *p = (struct PACKET_ZC_PC_PURCHASE_ITEMLIST *)WFIFOP( fd, 0 ); + p->packetType = 0xc6; + + int count = 0; + for( int i = 0, discount = npc_shop_discount( nd ); i < nd->u.shop.count; i++ ){ + int val = nd->u.shop.shop_item[i].value; + + p->items[count].price = val; + p->items[count].discountPrice = ( discount ) ? pc_modifybuyvalue( sd, val ) : val; + p->items[count].itemType = itemtype( nd->u.shop.shop_item[i].nameid ); + p->items[count].itemId = client_nameid( nd->u.shop.shop_item[i].nameid ); + count++; + } + + p->packetLength = sizeof( struct PACKET_ZC_PC_PURCHASE_ITEMLIST ) + count * sizeof( struct PACKET_ZC_PC_PURCHASE_ITEMLIST_sub ); + WFIFOSET( fd, p->packetLength ); } @@ -2067,39 +2141,44 @@ void clif_parse_NPCShopClosed(int fd, struct map_session_data *sd) { **/ void clif_npc_market_open(struct map_session_data *sd, struct npc_data *nd) { #if PACKETVER >= 20131223 - struct npc_item_list *shop = nd->u.shop.shop_item; - unsigned short shop_size = nd->u.shop.count, i, c, cmd = 0x9d5; - struct item_data *id = NULL; - struct s_packet_db *info; - int fd; + nullpo_retv( sd ); + nullpo_retv( nd ); - nullpo_retv(sd); - - if (sd->state.trading) + if( sd->state.trading ){ return; - - info = &packet_db[cmd]; - if (!info || info->len == 0) - return; - - fd = sd->fd; - - WFIFOHEAD(fd, 4 + shop_size * 13); - WFIFOW(fd,0) = cmd; - - for (i = 0, c = 0; i < shop_size; i++) { - if (shop[i].nameid && (id = itemdb_exists(shop[i].nameid))) { - WFIFOW(fd, 4+c*13) = shop[i].nameid; - WFIFOB(fd, 6+c*13) = itemtype(id->nameid); - WFIFOL(fd, 7+c*13) = shop[i].value; - WFIFOL(fd,11+c*13) = shop[i].qty; - WFIFOW(fd,15+c*13) = id->weight; - c++; - } } - WFIFOW(fd,2) = 4 + c*13; - WFIFOSET(fd,WFIFOW(fd,2)); + int fd = sd->fd; + + WFIFOHEAD( fd, sizeof( struct PACKET_ZC_NPC_MARKET_OPEN ) + nd->u.shop.count * sizeof( struct PACKET_ZC_NPC_MARKET_OPEN_sub ) ); + struct PACKET_ZC_NPC_MARKET_OPEN *p = (struct PACKET_ZC_NPC_MARKET_OPEN *)WFIFOP( fd, 0 ); + p->packetType = HEADER_ZC_NPC_MARKET_OPEN; + + int count = 0; + for( int i = 0; i < nd->u.shop.count; i++ ){ + struct npc_item_list *item = &nd->u.shop.shop_item[i]; + + if( !item->nameid ){ + continue; + } + + struct item_data *id = itemdb_exists( item->nameid ); + + if( !id ){ + continue; + } + + p->list[count].nameid = client_nameid( item->nameid ); + p->list[count].type = itemtype( item->nameid ); + p->list[count].price = item->value; + p->list[count].qty = item->qty; + p->list[count].weight = id->weight; + count++; + } + + p->packetLength = sizeof( struct PACKET_ZC_NPC_MARKET_OPEN ) + count * sizeof( struct PACKET_ZC_NPC_MARKET_OPEN_sub ); + WFIFOSET( fd, p->packetLength ); + sd->state.trading = 1; #endif } @@ -2116,42 +2195,45 @@ void clif_parse_NPCMarketClosed(int fd, struct map_session_data *sd) { /// Purchase item from Market shop. void clif_npc_market_purchase_ack(struct map_session_data *sd, uint8 res, uint8 n, struct s_npc_buy_list *list) { #if PACKETVER >= 20131223 - unsigned short cmd = 0x9d7, len = 0; - struct npc_data* nd; - uint8 result = (res == 0 ? 1 : 0); - int fd = 0; - struct s_packet_db *info; + nullpo_retv( sd ); + nullpo_retv( list ); - nullpo_retv(sd); - nullpo_retv((nd = map_id2nd(sd->npc_shopid))); + struct npc_data *nd = map_id2nd( sd->npc_shopid ); - info = &packet_db[cmd]; - if (!info || info->len == 0) - return; + nullpo_retv( nd ); - fd = sd->fd; - len = 5 + 8*n; + int fd = sd->fd; - WFIFOHEAD(fd, len); - WFIFOW(fd, 0) = cmd; - WFIFOW(fd, 2) = len; + WFIFOHEAD( fd, sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT ) + n * sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT_sub ) ); + struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *p = (struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT *)WFIFOP( fd, 0 ); + p->PacketType = HEADER_ZC_NPC_MARKET_PURCHASE_RESULT; - if (result) { - uint8 i, j; - struct npc_item_list *shop = nd->u.shop.shop_item; - unsigned short count = nd->u.shop.count; +#if PACKETVER_MAIN_NUM >= 20190807 || PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190814 + p->result = ( res == 0 ? 0 : -1 ); +#else + p->result = ( res == 0 ? 1 : 0 ); +#endif - for (i = 0; i < n; i++) { - WFIFOW(fd, 5+i*8) = list[i].nameid; - WFIFOW(fd, 7+i*8) = list[i].qty; + int count = 0; - ARR_FIND(0, count, j, list[i].nameid == shop[j].nameid); - WFIFOL(fd, 9+i*8) = (j != count) ? shop[j].value : 0; + if( p->result ){ + for( int i = 0, j; i < n; i++ ){ + ARR_FIND( 0, nd->u.shop.count, j, list[i].nameid == nd->u.shop.shop_item[j].nameid ); + + // Not found + if( j == nd->u.shop.count ){ + continue; + } + + p->list[count].ITID = client_nameid( list[i].nameid ); + p->list[count].qty = list[i].qty; + p->list[count].price = nd->u.shop.shop_item[j].value; + count++; } } - WFIFOB(fd, 4) = n; - WFIFOSET(fd, len); + p->PacketLength = sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT ) + count * sizeof( struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT_sub ); + WFIFOSET( fd, p->PacketLength ); #endif } @@ -2159,31 +2241,30 @@ void clif_npc_market_purchase_ack(struct map_session_data *sd, uint8 res, uint8 /// Purchase item from Market shop. void clif_parse_NPCMarketPurchase(int fd, struct map_session_data *sd) { #if PACKETVER >= 20131223 - struct s_packet_db* info; - struct s_npc_buy_list *item_list; - uint16 len = 0, i = 0; - uint8 res = 0, n = 0; + nullpo_retv( sd ); - nullpo_retv(sd); - - if (!sd->npc_shopid) + if( !sd->npc_shopid ){ return; - - info = &packet_db[RFIFOW(fd,0)]; - if (!info || info->len == 0) - return; - len = RFIFOW(fd,info->pos[0]); - n = (len-4) / 6; - - CREATE(item_list, struct s_npc_buy_list, n); - for (i = 0; i < n; i++) { - item_list[i].nameid = RFIFOW(fd,info->pos[1]+i*6); - item_list[i].qty = (uint16)min(RFIFOL(fd,info->pos[2]+i*6),USHRT_MAX); } - res = npc_buylist(sd, n, item_list); - clif_npc_market_purchase_ack(sd, res, n, item_list); - aFree(item_list); + const struct packet_npc_market_purchase *p = (struct packet_npc_market_purchase *)RFIFOP( fd, 0 ); + + int count = ( p->PacketLength - sizeof( struct packet_npc_market_purchase ) ) / sizeof( struct packet_npc_market_purchase_sub ); + + struct s_npc_buy_list *list; + + CREATE( list, struct s_npc_buy_list, count ); + + // Sadly order is reverse + for( int i = 0; i < count; i++ ){ + list[i].nameid = p->list[i].ITID; + list[i].qty = p->list[i].qty; + } + + uint8 res = npc_buylist( sd, count, list ); + clif_npc_market_purchase_ack( sd, res, count, list ); + + aFree( list ); #endif } @@ -2473,76 +2554,98 @@ void clif_cutin(struct map_session_data* sd, const char* image, int type) /*========================================== * Fills in card data from the given item and into the buffer. [Skotlex] *------------------------------------------*/ -static void clif_addcards(unsigned char* buf, struct item* item) -{ - int i=0,j; - if( item == NULL ) { //Blank data - WBUFW(buf,0) = 0; - WBUFW(buf,2) = 0; - WBUFW(buf,4) = 0; - WBUFW(buf,6) = 0; +static void clif_addcards( struct EQUIPSLOTINFO* buf, struct item* item ){ + nullpo_retv( buf ); + + // Blank data + if( item == nullptr ){ + buf->card[0] = 0; + buf->card[1] = 0; + buf->card[2] = 0; + buf->card[3] = 0; return; } - if( item->card[0] == CARD0_PET ) { //pet eggs - WBUFW(buf,0) = 0; - WBUFW(buf,2) = 0; - WBUFW(buf,4) = 0; - WBUFW(buf,6) = item->card[3]; //Pet renamed flag. + + // Pet eggs + if( item->card[0] == CARD0_PET ){ + buf->card[0] = 0; + buf->card[1] = 0; + buf->card[2] = 0; + buf->card[3] = item->card[3]; //Pet renamed flag. return; } - if( item->card[0] == CARD0_FORGE || item->card[0] == CARD0_CREATE ) { //Forged/created items - WBUFW(buf,0) = item->card[0]; - WBUFW(buf,2) = item->card[1]; - WBUFW(buf,4) = item->card[2]; - WBUFW(buf,6) = item->card[3]; + + // Forged/created items + if( item->card[0] == CARD0_FORGE || item->card[0] == CARD0_CREATE ){ + buf->card[0] = item->card[0]; + buf->card[1] = item->card[1]; + buf->card[2] = item->card[2]; + buf->card[3] = item->card[3]; return; } - //Client only receives four cards.. so randomly send them a set of cards. [Skotlex] - if( MAX_SLOTS > 4 && (j = itemdb_slot(item->nameid)) > 4 ) - i = rnd()%(j-3); //eg: 6 slots, possible i values: 0->3, 1->4, 2->5 => i = rnd()%3; - //Normal items. - if( item->card[i] > 0 && (j=itemdb_viewid(item->card[i])) > 0 ) - WBUFW(buf,0) = j; - else - WBUFW(buf,0) = item->card[i]; + int i = 0, j; - if( item->card[++i] > 0 && (j=itemdb_viewid(item->card[i])) > 0 ) - WBUFW(buf,2) = j; - else - WBUFW(buf,2) = item->card[i]; + // Client only receives four cards.. so randomly send them a set of cards. [Skotlex] + if( MAX_SLOTS > 4 && ( j = itemdb_slot( item->nameid ) ) > 4 ){ + i = rnd() % ( j - 3 ); //eg: 6 slots, possible i values: 0->3, 1->4, 2->5 => i = rnd()%3; + } - if( item->card[++i] > 0 && (j=itemdb_viewid(item->card[i])) > 0 ) - WBUFW(buf,4) = j; - else - WBUFW(buf,4) = item->card[i]; + // Normal items. + if( item->card[i] > 0 && ( j = itemdb_viewid( item->card[i] ) ) > 0 ){ + buf->card[0] = j; + }else{ + buf->card[0] = item->card[i]; + } - if( item->card[++i] > 0 && (j=itemdb_viewid(item->card[i])) > 0 ) - WBUFW(buf,6) = j; - else - WBUFW(buf,6) = item->card[i]; + if( item->card[++i] > 0 && ( j = itemdb_viewid( item->card[i] ) ) > 0 ){ + buf->card[1] = j; + }else{ + buf->card[1] = item->card[i]; + } + + if( item->card[++i] > 0 && ( j = itemdb_viewid( item->card[i] ) ) > 0 ){ + buf->card[2] = j; + }else{ + buf->card[2] = item->card[i]; + } + + if( item->card[++i] > 0 && ( j = itemdb_viewid( item->card[i] ) ) > 0 ){ + buf->card[3] = j; + }else{ + buf->card[3] = item->card[i]; + } } /// Fills in part of the item buffers that calls for variable bonuses data. [Napster] /// A maximum of 5 random options can be supported. -void clif_add_random_options(unsigned char* buf, struct item *it) { -#if PACKETVER >= 20150225 - int i; +static uint8 clif_add_random_options( struct ItemOptions buf[MAX_ITEM_RDM_OPT], struct item* it ){ + nullpo_retr( 0, it ); - for (i = 0; i < MAX_ITEM_RDM_OPT; i++) { - WBUFW(buf, i*5 + 0) = it->option[i].id; // OptIndex - WBUFW(buf, i*5 + 2) = it->option[i].value; // Value - WBUFB(buf, i*5 + 4) = it->option[i].param; // Param1 + uint8 count = 0; + + for( int i = 0; i < MAX_ITEM_RDM_OPT; i++ ){ + if( it->option[i].id ){ + buf[i].index = it->option[i].id; // OptIndex + buf[i].value = it->option[i].value; // Value + buf[i].param = it->option[i].param; // Param1 + count++; + }else{ + buf[i].index = 0; + buf[i].value = 0; + buf[i].param = 0; + } } #if MAX_ITEM_RDM_OPT < 5 - for ( ; i < 5; i++) { - WBUFW(buf, i*5 + 0) = 0; // OptIndex - WBUFW(buf, i*5 + 2) = 0; // Value - WBUFB(buf, i*5 + 4) = 0; // Param1 + for( ; i < 5; i++ ){ + buf[i].index = 0; // OptIndex + buf[i].value = 0; // Value + buf[i].param = 0; // Param1 } #endif -#endif + + return count; } /// Notifies the client, about a received inventory item or the result of a pick-up request. @@ -2552,105 +2655,55 @@ void clif_add_random_options(unsigned char* buf, struct item *it) { /// 0990 .W .W .W .B .B .B .W .W .W .W .L .B .B .L .W (ZC_ITEM_PICKUP_ACK_V5) /// 0a0c .W .W .W .B .B .B .W .W .W .W .L .B .B .L .W {