diff --git a/.travis.yml b/.travis.yml index 270132a191..963fe75d9b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,14 +27,15 @@ before_script: - mysql -u $DB_ROOT -e "GRANT ALL ON *.* TO '$DB_USER'@'$DB_HOST' IDENTIFIED BY '$DB_PASS';" - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - sudo apt-get update -q - - sudo apt-get install gcc-4.8 -y - - sudo apt-get install g++-4.8 -y + - sudo apt-get install gcc-5 -y + - sudo apt-get install g++-5 -y + - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 1 + - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 1 script: - ./configure $CONFIGURE_FLAGS - make clean - make server - - 'echo packet_db_ver: $PACKETDBVER >> db/import/packet_db.txt' - ./map-server --run-once env: @@ -44,7 +45,6 @@ env: - DB_NAME="ragnarok" - DB_USER="ragnarok" - DB_PASS="ragnarok" - - PACKETDBVER=45 matrix: - CONFIGURE_FLAGS="--enable-prere=no --enable-vip=no --enable-buildbot=yes" - CONFIGURE_FLAGS="--enable-prere=yes --enable-vip=no --enable-buildbot=yes" diff --git a/3rdparty/yaml-cpp/src/contrib/graphbuilderadapter.h b/3rdparty/yaml-cpp/src/contrib/graphbuilderadapter.h index 0d1e579208..726db89897 100644 --- a/3rdparty/yaml-cpp/src/contrib/graphbuilderadapter.h +++ b/3rdparty/yaml-cpp/src/contrib/graphbuilderadapter.h @@ -50,8 +50,8 @@ class GraphBuilderAdapter : public EventHandler { struct ContainerFrame { ContainerFrame(void* pSequence) : pContainer(pSequence), pPrevKeyNode(&sequenceMarker) {} - ContainerFrame(void* pMap, void* pPrevKeyNode) - : pContainer(pMap), pPrevKeyNode(pPrevKeyNode) {} + ContainerFrame(void* pMap, void* pPrevKeyNode_) + : pContainer(pMap), pPrevKeyNode(pPrevKeyNode_) {} void* pContainer; void* pPrevKeyNode; diff --git a/3rdparty/yaml-cpp/src/parse.cpp b/3rdparty/yaml-cpp/src/parse.cpp index 0b2ae4a4f6..d864907edb 100644 --- a/3rdparty/yaml-cpp/src/parse.cpp +++ b/3rdparty/yaml-cpp/src/parse.cpp @@ -31,7 +31,7 @@ Node Load(std::istream& input) { Node LoadFile(const std::string& filename) { std::ifstream fin(filename.c_str()); - if (!fin) { + if (!fin || fin.bad()) { throw BadFile(); } return Load(fin); diff --git a/3rdparty/yaml-cpp/src/singledocparser.cpp b/3rdparty/yaml-cpp/src/singledocparser.cpp index a27c1c3b04..752835822c 100644 --- a/3rdparty/yaml-cpp/src/singledocparser.cpp +++ b/3rdparty/yaml-cpp/src/singledocparser.cpp @@ -166,10 +166,10 @@ void SingleDocParser::HandleBlockSequence(EventHandler& eventHandler) { // check for null if (!m_scanner.empty()) { - const Token& token = m_scanner.peek(); - if (token.type == Token::BLOCK_ENTRY || - token.type == Token::BLOCK_SEQ_END) { - eventHandler.OnNull(token.mark, NullAnchor); + const Token& token_ = m_scanner.peek(); + if (token_.type == Token::BLOCK_ENTRY || + token_.type == Token::BLOCK_SEQ_END) { + eventHandler.OnNull(token_.mark, NullAnchor); continue; } } diff --git a/3rdparty/yaml-cpp/yaml-cpp.vcxproj b/3rdparty/yaml-cpp/yaml-cpp.vcxproj index fdf9f0ea1c..82af58f26c 100644 --- a/3rdparty/yaml-cpp/yaml-cpp.vcxproj +++ b/3rdparty/yaml-cpp/yaml-cpp.vcxproj @@ -96,7 +96,7 @@ ProgramDatabase Disabled $(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\; - WIN32;_WINDOWS;_DEBUG;WIN32;_WINDOWS;WIN32;_WINDOWS;CMAKE_INTDIR="Debug";%(PreprocessorDefinitions) + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) MultiThreadedDebug @@ -108,7 +108,7 @@ $(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\; Disabled - WIN32;_WINDOWS;_DEBUG;WIN32;_WINDOWS;WIN32;_WINDOWS;CMAKE_INTDIR="Debug";%(PreprocessorDefinitions) + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) MultiThreadedDebug @@ -121,7 +121,7 @@ $(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\; - WIN32;_WINDOWS;_DEBUG;WIN32;_WINDOWS;WIN32;_WINDOWS;CMAKE_INTDIR="Debug";%(PreprocessorDefinitions) + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) MultiThreaded @@ -138,7 +138,7 @@ $(SolutionDir)3rdparty\yaml-cpp\include\;$(SolutionDir)3rdparty\yaml-cpp\src\; - WIN32;_WINDOWS;_DEBUG;WIN32;_WINDOWS;WIN32;_WINDOWS;CMAKE_INTDIR="Debug";%(PreprocessorDefinitions) + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) MultiThreaded diff --git a/Makefile.in b/Makefile.in index 348034f51d..05e4d4e81e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -5,10 +5,10 @@ OMAP=@OMAP@ ifeq ($(HAVE_MYSQL),yes) ALL_DEPENDS=server tools SERVER_DEPENDS=common login char map import - COMMON_DEPENDS=mt19937ar libconfig + COMMON_DEPENDS=mt19937ar libconfig yaml-cpp LOGIN_DEPENDS=mt19937ar libconfig common - CHAR_DEPENDS=mt19937ar libconfig common - MAP_DEPENDS=mt19937ar libconfig common + CHAR_DEPENDS=mt19937ar libconfig common yaml-cpp + MAP_DEPENDS=mt19937ar libconfig common yaml-cpp else ALL_DEPENDS=needs_mysql SERVER_DEPENDS=needs_mysql @@ -93,7 +93,7 @@ help: @echo "'common' - builds object files used for the three servers" @echo "'mt19937ar' - builds object file of Mersenne Twister MT19937" @echo "'libconfig' - builds object files of libconfig" - @echo "'libconfig' - builds object files of yaml-cpp" + @echo "'yaml-cpp' - builds object files of yaml-cpp" @echo "'login' - builds login server" @echo "'char' - builds char server" @echo "'map' - builds map server" diff --git a/README.md b/README.md index 12b637bb30..d09a414db4 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,9 @@ relevant to your Operation System, please refer to the Wiki (links at the end of * Configure and compile: ./configure && make clean && make server + * Configure and compile (for Centos 64 bit with Maria DB): + + ./configure --enable-64bit --with-MYSQL_LIBS=/usr/lib64/libmysqlclient.so && make clean && make server * When you're ready, start the servers: ./athena-start start diff --git a/conf/battle/client.conf b/conf/battle/client.conf index f2e5e1be51..65b7eda241 100644 --- a/conf/battle/client.conf +++ b/conf/battle/client.conf @@ -9,58 +9,6 @@ // assume unit types (1: Pc, 2: Mob, 4: Pet, 8: Homun, 16: Mercenary) //-------------------------------------------------------------- -// Set here which client version do you accept. Add all values of clients: -// Clients older than accepted versions, and versions not set to 'accepted' -// here will be rejected when logging in -// 0x00000001: Clients older than 2004-09-06aSakray (packet versions 5-9) -// 0x00000002: 2004-09-06 aSakexe (version 10) -// 0x00000004: 2004-09-20 aSakexe (version 11) -// 0x00000008: 2004-10-05 aSakexe (version 12) -// 0x00000010: 2004-10-25 aSakexe (version 13) -// 0x00000020: 2004-11-29 aSakexe (version 14) -// 0x00000040: 2005-01-10 bSakexe (version 15) -// 0x00000080: 2005-05-09 aSakexe (version 16) -// 0x00000100: 2005-06-28 aSakexe (version 17) -// 0x00000200: 2005-07-18 aSakexe (version 18) -// 0x00000400: 2005-07-19 bSakexe (version 19) -// 0x00000800: 2006-03-27 aSakexe (version 20) -// 0x00001000: 2007-01-08 aSakexe (version 21) -// 0x00002000: 2007-02-12 aSakexe (version 22) -// 0x00004000: 2008-09-10 aSakexe (version 23) -// 0x00008000: 2008-08-27 aRagexeRE (version 24) -// 0x00010000: 2008-09-10 aRagexeRE (version 25) -// 0x00020000: 2010-11-24 aRagexeRE (version 26) -// 0x00040000: 2011-10-05 aRagexeRE (version 27) -// 0x00080000: 2011-11-02 aRagexe (version 28) -// 0x00100000: 2012-03-07 fRagexeRE (version 29) -// 0x00200000: 2012-04-10 aRagexeRE (version 30) -// 0x00400000: 2012-04-18 aRagexeRE (version 31) -// 0x00800000: 2012-06-18 unknow (version 32) -// 0x01000000: 2012-07-02 aRagexeRE (version 33) -// 0x02000000: 2013-03-20 Ragexe (version 34) -// 0x04000000: 2013-05-15 aRagexe (version 35) -// 0x08000000: 2013-05-22 Ragexe (version 36) -// 0x10000000: 2013-05-29 Ragexe (version 37) -// 0x20000000: 2013-06-05 Ragexe (version 38) -// 0x40000000: 2013-06-12 Ragexe (version 39) -// default value: 0x7FFFFFFF (all clients/versions [5;39]) -packet_ver_flag: 0x7FFFFFFF - -// 0x00000001: 2013-06-18 Ragexe (version 40) -// 0x00000002: 2013-06-26 Ragexe (version 41) -// 0x00000004: 2013-07-03 Ragexe (version 42) -// 0x00000008: 2013-07-10 Ragexe (version 43) -// 0x00000010: 2013-07-17 Ragexe (version 44) -// 0x00000020: 2013-08-07 Ragexe (version 45) -// 0x00000040: 2013-12-23 Ragexe (version 46) -// 0x00000080: ???? -// 0x00000100: ???? -// 0x00000200: ???? -// 0x00000400: 2014-10-16 Ragexe (version 50) -// 0x00000800: 2014-10-22 Ragexe (version 51) -// default value: 0x7FFFFFFF (all clients/versions [41;72]) -packet_ver_flag2: 0x7FFFFFFF - // Minimum delay between whisper/global/party/guild messages (in ms) // Messages that break this threshold are silently omitted. min_chat_delay: 0 diff --git a/conf/battle/feature.conf b/conf/battle/feature.conf index a2af2d184e..cd31321d41 100644 --- a/conf/battle/feature.conf +++ b/conf/battle/feature.conf @@ -63,3 +63,7 @@ feature.autotrade_open_delay: 5000 // Requires: 2014-10-22bRagexe or later // Off by default while test version is out; enable at your own risk. feature.roulette: off + +// Achievement (Note 1) +// Requires: 2015-05-13aRagexe or later +feature.achievement: on diff --git a/conf/battle/guild.conf b/conf/battle/guild.conf index 2ef751b68e..9a89b03d5b 100644 --- a/conf/battle/guild.conf +++ b/conf/battle/guild.conf @@ -70,3 +70,7 @@ guild_leaderchange_delay: 1440 // Is changing the guild leader allowed during WoE? // Default: no guild_leaderchange_woe: no + +// Only guild master can accept alliance? +// Default: no +guild_alliance_onlygm: no diff --git a/conf/help.txt b/conf/help.txt index 8817223885..8bcb8e3250 100644 --- a/conf/help.txt +++ b/conf/help.txt @@ -42,7 +42,7 @@ go: "Params: \n" "Warps you to a city.\n" " -1: (Memo point 0) 16: prison/jail 33: malangdo island\n" " 0: prontera 17: jawaii 34: malaya port\n" " 1: morocc 18: ayothaya 35: eclage\n" - " 2: geffen 19: einbroch\n" + " 2: geffen 19: einbroch 36: lasagna\n" " 3: payon 20: lighthalzen\n" " 4: alberta 21: einbech\n" " 5: izlude 22: hugel\n" @@ -310,7 +310,6 @@ reloaditemdb: "Reload item database." reloadmobdb: "Reload monster database." reloadmotd: "Reload Message of the Day." reloadmsgconf: "Reload message configuration." -reloadpacketdb: "Reload packet database." reloadpcdb: "Reload player settings." reloadquestdb: "Reload quest database." reloadscript: "Reload all scripts." diff --git a/conf/import-tmpl/inter_server.conf b/conf/import-tmpl/inter_server.conf deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/conf/import-tmpl/inter_server.yml b/conf/import-tmpl/inter_server.yml new file mode 100644 index 0000000000..85e71fe78e --- /dev/null +++ b/conf/import-tmpl/inter_server.yml @@ -0,0 +1,17 @@ +# Config for Storages +# +# To access the premium storage, use script command 'openstorage2'. +# If premium storages are added, copy the structure of the storage table and match the table name in this config. +# The 'max' of premium storages are not adjusted by 'vip_storage_increase' config nor MIN_STORAGE. +# +# Structure: +# - ID: // (int) Storage ID will be used for script command 'openstorage2'. +# Name: "" // (string) Storage name will be sent to the client to display on the title bar. +# Table: "" // (string) Name of table where storage is saved. The table stucture is the same as the default storage table. +# Max: // (int) *optional* Maximum number of items in storage. MAX_STORAGE will be used if no value is defined. +############################################################################################################################################### +#Storages: +# - ID: 1 +# Name: "VIP Storage" +# Table: "vip_storage" +# Max: 300 diff --git a/conf/inter_athena.conf b/conf/inter_athena.conf index 8328e5ca50..5938f2e20e 100644 --- a/conf/inter_athena.conf +++ b/conf/inter_athena.conf @@ -153,6 +153,6 @@ roulette_table: db_roulette // Use SQL item_db, mob_db and mob_skill_db for the map server? (yes/no) use_sql_db: no -inter_server_conf: conf/inter_server.conf +inter_server_conf: inter_server.yml import: conf/import/inter_conf.txt diff --git a/conf/inter_server.conf b/conf/inter_server.conf deleted file mode 100644 index 3f0bc2f852..0000000000 --- a/conf/inter_server.conf +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Config for Storages - * - * To access the premium storage, use script command 'openstorage2'. - * If premium storages are added, copy the structure of the storage table and match the table name in this config. - * The 'max' of premium storages are not adjusted by 'vip_storage_increase' config nor MIN_STORAGE. - * - * Structure: -{ - id: // (int) Storage ID will be used for script command 'openstorage2'. - name: "" // (string) Storage name will be sent to the client to display on the title bar. - table: "" // (string) Name of table where storage is saved. The table stucture is the same as the default storage table. - max: // (int) *optional* Maximum number of items in storage. MAX_STORAGE will be used if no value is defined. -}, // Use comma to add more storages - **/ - -storages: ( -{ - // Default Storage - // DO NOT CHANGE THIS UNLESS YOU KNOW WHAT YOU ARE DOING - id: 0 - name: "Storage" - table: "storage" - //max: 600 -} -) diff --git a/conf/inter_server.yml b/conf/inter_server.yml new file mode 100644 index 0000000000..70cd3d09c7 --- /dev/null +++ b/conf/inter_server.yml @@ -0,0 +1,34 @@ +# This file is a part of rAthena. +# Copyright(C) 2017 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 . +# +########################################################################### +# Config for Storages +# +# To access the premium storage, use script command 'openstorage2'. +# If premium storages are added, copy the structure of the storage table and match the table name in this config. +# The 'max' of premium storages are not adjusted by 'vip_storage_increase' config nor MIN_STORAGE. +# +# Structure: +# - ID: // (int) Storage ID will be used for script command 'openstorage2'. +# Name: "" // (string) Storage name will be sent to the client to display on the title bar. +# Table: "" // (string) Name of table where storage is saved. The table stucture is the same as the default storage table. +# Max: // (int) *optional* Maximum number of items in storage. MAX_STORAGE will be used if no value is defined. + +Storages: + - ID: 0 + Name: "Storage" + Table: "storage" diff --git a/conf/login_athena.conf b/conf/login_athena.conf index 08c7a31d91..ddd5ddd890 100644 --- a/conf/login_athena.conf +++ b/conf/login_athena.conf @@ -106,12 +106,6 @@ vip_char_increase: -1 // 0 or more: new accounts automatically expire after the given value, in seconds start_limited_time: -1 -// Check the clientversion field set in clientinfo.xml? -check_client_version: no - -// What version is allowed to connect? (if the option above is enabled) -client_version_to_connect: 20 - // Store passwords as MD5 hashes instead of plain text? // NOTE: Will not work with clients that use use_MD5_passwords: no diff --git a/conf/msg_conf/char_msg.conf b/conf/msg_conf/char_msg.conf index 181b29b6a9..687a524371 100644 --- a/conf/msg_conf/char_msg.conf +++ b/conf/msg_conf/char_msg.conf @@ -157,3 +157,8 @@ 224: -- Character Details -- 225: [Slot/CID: %d/%d] %s | %s | Level: %d/%d | %s 226: This account doesn't have characters. + +// Achievements +227: GM +228: Achievement Reward Mail +229: [%s] Achievement Reward. diff --git a/conf/msg_conf/map_msg.conf b/conf/msg_conf/map_msg.conf index 1eefc87487..50306ef970 100644 --- a/conf/msg_conf/map_msg.conf +++ b/conf/msg_conf/map_msg.conf @@ -825,7 +825,13 @@ 769: %s %s has been banned. 770: %s %s has been unbanned. -//771-899 free +//@reloadachievementdb +771: Achievement database has been reloaded. + +// Achievements +772: Achievements are disabled. + +//773-899 free //------------------------------------ // More atcommands message @@ -1615,8 +1621,7 @@ 1475: ---- My Channels ---- 1476: You have not joined any channels. -// @reloadpacketdb -1477: Packet database has been reloaded. +//1477 free // @partysharelvl 1478: Party share level range has been changed successfully. diff --git a/conf/msg_conf/map_msg_chn.conf b/conf/msg_conf/map_msg_chn.conf index 0825d8724e..76c5420bb0 100644 --- a/conf/msg_conf/map_msg_chn.conf +++ b/conf/msg_conf/map_msg_chn.conf @@ -1469,8 +1469,7 @@ 1475: ---- 我的頻道 ---- 1476: 你沒有加入任何的頻道 -// @reloadpacketdb -1477: 完成重載封包數據庫. +//1477 free // @partysharelvl 1478: 隊伍經驗均分的等級間距已成功變更。 diff --git a/conf/msg_conf/map_msg_frn.conf b/conf/msg_conf/map_msg_frn.conf index ef24eaddca..fe94892bc0 100644 --- a/conf/msg_conf/map_msg_frn.conf +++ b/conf/msg_conf/map_msg_frn.conf @@ -1480,8 +1480,7 @@ 1475: ---- Canaux rejoins ---- 1476: Vous n'avez rejoins aucun canal. -// @reloadpacketdb -1477: Base de donne des 'Packets' recharge. +//1477 free // @partysharelvl 1478: Diffrence de niveau pour le partage en quipe chang. diff --git a/conf/msg_conf/map_msg_idn.conf b/conf/msg_conf/map_msg_idn.conf index 3ea211e779..feee972a27 100644 --- a/conf/msg_conf/map_msg_idn.conf +++ b/conf/msg_conf/map_msg_idn.conf @@ -1571,8 +1571,7 @@ 1475: ---- Channel yang diikuti ---- 1476: Kamu tidak bergabung ke channel manapun saat ini. -// @reloadpacketdb -1477: Database paket telah dimuat ulang. +//1477 free // @partysharelvl 1478: Jarak level dalam party share telah diubah dengan sukses. diff --git a/conf/msg_conf/map_msg_rus.conf b/conf/msg_conf/map_msg_rus.conf index ae78d70d30..ad1e3a06f8 100644 --- a/conf/msg_conf/map_msg_rus.conf +++ b/conf/msg_conf/map_msg_rus.conf @@ -1480,8 +1480,7 @@ 1475: ---- ---- 1476: . -// @reloadpacketdb -1477: . +//1477 free // @partysharelvl 1478: . diff --git a/conf/msg_conf/map_msg_tha.conf b/conf/msg_conf/map_msg_tha.conf index 5b6ce2cbb0..c34d07c0a4 100644 --- a/conf/msg_conf/map_msg_tha.conf +++ b/conf/msg_conf/map_msg_tha.conf @@ -1473,8 +1473,7 @@ 1475: ---- Channels ѹ ---- 1476: س channels . -// @reloadpacketdb -1477: ҹ Packet ١Ŵº. +//1477 free // @partysharelvl 1478: дѺ Level Ѻ ١Ѻ¹º. diff --git a/conf/readme.md b/conf/readme.md new file mode 100644 index 0000000000..3bfa45acd6 --- /dev/null +++ b/conf/readme.md @@ -0,0 +1,118 @@ +# Import Directories + +## What is the import directory for? + +The `import/` directory provides a way for you to change your config settings without the need to even touch the main `/conf/` and `/db/` files. + +By placing your custom entries into the `import/` directory within these two locations, your core files will not need to have any conflicts resolved when you update your server. You store your changes, and the rest is updated with rAthena. + +## How does this work? + +Think of "import" as in "override". Place only the settings you have changed in the import files, or settings you are "overriding". + +For example, when setting up a server there are always a few config settings that users would like to change in order for rAthena to suit their needs. The following example will show you how to use the `/conf/import/` directory correctly. (for `/db/import/` examples, see [/db/readme.md](/db/readme.md)) + +### Login Server +--- +We want to use MD5 passwords and disable `_m/f` account creation methods. + +#### /conf/import/login_conf.txt + + new_account: no + use_MD5_passwords: yes + + +### Char Server +--- +We want to change the server name to "Odin". + +#### /conf/import/char_conf.txt + + server_name: Odin + + +### Map Server +--- +We want to hide all error messages and add a few custom maps. + +#### /conf/import/map_conf.txt + + //Makes server output more silent by omitting certain types of messages: + //16: Hide Error and SQL Error messages. + console_silent: 16 + map: 1@toy + map: 1@valley + map: shops + + +### Inter Server +--- +We want to use MySQL tables instead of .txt files. + +#### /conf/import/inter_conf.txt + + use_sql_db: yes + + +### Logging Settings +--- +We want to log all items and all chat messages. + +#### /conf/import/log_conf.txt + + log_filter: 1 + // Log CHAT (Global, Whisper, Party, Guild, Main chat, Clan) (Note 3) + // log_chat: 63 = logs everything + log_chat: 63 + + +### Battle Configs +--- +We want to change the way various mechanics work. For anything that would be configured in the `/conf/battle/` directory, it will go into `import/battle_conf.txt`. To help you find which configs came from where, it's generally a good idea to comment out the name of the file that specific collection of configs came from. + +#### /conf/import/battle_conf.txt + + // guild.conf + guild_exp_limit: 90 + + // items.conf + vending_over_max: no + vending_tax: 100 + weapon_produce_rate: 200 + potion_produce_rate: 200 + produce_item_name_input: 0x03 + + // misc.conf + duel_time_interval: 2 + at_mapflag: yes + at_monsterignore: yes + cashshop_show_points: yes + hide_fav_sell: yes + // Whether or not mail box status is displayed upon login. + // Default: 0 + // 0 = No + // 1 = Yes + // 2 = Yes, when there are unread mails + mail_show_status: 2 + + // monster.conf + show_mob_info: 3 + + // party.conf + party_hp_mode: 1 + display_party_name: yes + + // pet.conf + pet_rename: yes + + // player.conf + max_aspd: 196 + max_third_aspd: 196 + max_extended_aspd: 196 + vip_disp_rate: no + + // status.conf + debuff_on_logout: 3 + + +We cannot stress enough how helpful this system is for everyone. The majority of git conflicts will simply go away if users make use of the `import/` system. diff --git a/conf/readme.txt b/conf/readme.txt deleted file mode 100644 index 7acc986564..0000000000 --- a/conf/readme.txt +++ /dev/null @@ -1,22 +0,0 @@ -What is the import folder for? -------------------------------------------------------------------------------- - -The folder provides a way for you to change your config settings without having -to update the files every time you update your server. You store your changes, -and the rest is updated with rAthena. - -How does this work? -------------------------------------------------------------------------------- - -Place only the settings you have changed in the import files. -For example, if you want to change a value in /battle/exp.conf: - - // Rate at which exp. is given. (Note 2) - base_exp_rate: 700 - -You could instead copy the setting into /import/battle_conf.txt, -and you'll eliminate any problems updating in the future. - -Neat, isn't it? - -- Semi-guide by Ajarn / Euphy diff --git a/configure b/configure index ffd6e161eb..53ab81fe6c 100755 --- a/configure +++ b/configure @@ -4951,7 +4951,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CFLAGS="$CFLAGS -pipe -ffast-math -Wall" CPPFLAGS="$CPPFLAGS -I../common" - +CXXFLAGS="$CXXFLAGS -std=c++11" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 diff --git a/configure.in b/configure.in index 6d527190af..1f22fdb709 100644 --- a/configure.in +++ b/configure.in @@ -440,6 +440,7 @@ AC_LANG([C++]) CFLAGS="$CFLAGS -pipe -ffast-math -Wall" CPPFLAGS="$CPPFLAGS -I../common" +CXXFLAGS="$CXXFLAGS -std=c++11" AC_C_BIGENDIAN( diff --git a/db/const.txt b/db/const.txt index ad6fb083a2..a10cc018bc 100644 --- a/db/const.txt +++ b/db/const.txt @@ -2298,6 +2298,16 @@ JP_NPC01 10236 4_PCCOUNT 10253 4_LAVAGOLEM 10254 +JP_NPC02 10261 +JP_NPC03 10262 +JP_NPC04 10263 +JP_NPC05 10264 +JP_NPC06 10265 +JP_NPC07 10266 +JP_NPC08 10267 +JP_NPC09 10268 +JP_NPC10 10269 + SWORDCLAN 1 ARCWANDCLAN 2 GOLDENMACECLAN 3 diff --git a/db/import-tmpl/achievement_db.yml b/db/import-tmpl/achievement_db.yml new file mode 100644 index 0000000000..eb8448ccd6 --- /dev/null +++ b/db/import-tmpl/achievement_db.yml @@ -0,0 +1,80 @@ +# This file is a part of rAthena. +# Copyright(C) 2017 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 . +# +########################################################################### +# Custom Achievement Database +########################################################################### +# +# Achievement Settings +# +########################################################################### +# ID - Unique achievement ID. +########################################################################### +# Group - Achievement group type. Each achievement type calls a specific +# objective check. +# Valid groups: +# AG_ADD_FRIEND +# AG_ADVENTURE +# AG_BABY +# AG_BATTLE +# AG_CHATTING +# AG_CHATTING_COUNT +# AG_CHATTING_CREATE +# AG_CHATTING_DYING +# AG_EAT +# AG_GET_ITEM +# AG_GET_ZENY +# AG_GOAL_ACHIEVE +# AG_GOAL_LEVEL +# AG_GOAL_STATUS +# AG_HEAR +# AG_JOB_CHANGE +# AG_MARRY +# AG_PARTY +# AG_ENCHANT_FAIL +# AG_ENCHANT_SUCCESS +# AG_SEE +# AG_SPEND_ZENY +# AG_TAMING +########################################################################### +# Name - Achievement name. Used when sending rewards through RODEX. +########################################################################### +# Target - A list of monster ID and count values that the achievement +# requires. The target count can also be used for achievements that keep +# a counter while not being related to monster kills. +# Capped at MAX_ACHIEVEMENT_OBJECTIVES. +########################################################################### +# Condition - A conditional statement that must be met for the achievement +# to be considered complete. +########################################################################### +# Map - A map name that is used for the AG_CHATTING type which increments +# the counter based on the player's map. +########################################################################### +# Dependent: - A list of achievement IDs that need to be completed before +# this achievement is considered complete. +########################################################################### +# Reward - A list of rewards that are given on completion. All fields are +# optional. +# ItemID: Item ID +# Amount: Amount of Item ID (default 1) +# Script: Bonus Script +# TitleID: Title ID +########################################################################### +# Score - Achievement points that are given on completion. +########################################################################### + +Achievements: diff --git a/db/import-tmpl/item_flag.txt b/db/import-tmpl/item_flag.txt index a4419df723..b86479885f 100644 --- a/db/import-tmpl/item_flag.txt +++ b/db/import-tmpl/item_flag.txt @@ -2,8 +2,10 @@ // , // // : -// 1 - As Dead Branch item (will be logged at `branchlog` table and cannot be used at 'nobranch' mapflag) -// 2 - As item group container, check player's inventory and weight before consumed -// 4 - GUID item, cannot be stacked even same or stackable item -// 8 - Item will be bound item when equipped +// 1 - As Dead Branch item (will be logged at `branchlog` table and cannot be used at 'nobranch' mapflag) +// 2 - As item group container, check player's inventory and weight before consumed +// 4 - GUID item, cannot be stacked even same or stackable item +// 8 - Item will be bound item when equipped +// 16 - Special Broadcast: When item dropped by monster and player loot it, will be broadcasted! +// 32 - Item will not be removed on consumption. Also supports 'itemskill' // NOTE: For removing flag by import file, use "-" to remove the flag. Example, 604,-1 will removes flag 1 from Branch_Of_Dead_Tree diff --git a/db/import-tmpl/packet_db.txt b/db/import-tmpl/packet_db.txt deleted file mode 100644 index de90db50e0..0000000000 --- a/db/import-tmpl/packet_db.txt +++ /dev/null @@ -1,35 +0,0 @@ -// Client<->Map Packet Database -// -// Structure of Database: -// PacketType,PacketLength[,Name,FieldIndex1:FieldIndex2:FieldIndex3:...] -// -// 01. PacketType ID of the packet. -// 02. PacketLength Length of the packet. If 0, packet is disabled in current packet version. If -1, packet has variable size. -// 03. Name Name of the packet parser function (optional, for incoming packets only). -// 04. FieldIndex Specifies the offset of a packet field in bytes from the begin of the packet (only specified when Name is given). -// Can be 0, when the layout is not known. -// ... -// -// NOTE: Up to MAX_PACKET_POS (typically 20) field indexes may be used. -// -// The packet database allows you to add support for new clients, -// because packets change every release. -// -// Note: Every packet version needs a wanttoconnection specification, since -// that is the packet used to identify a client's version. -// If multiple versions have the same connection packet, the higher version -// will be used (unless the lower one is specified as the default) -// -// Incoming packets have their parser function and layout specified, which enables -// them for the current and all higher versions, unless explicitely disabled. -// -// Outgoing packets must be specified in order to enable them for the current -// and all higher versions, unless explicitely disabled. Packets that are not -// enabled for a packet version are silently discarded when sent as multicast. -// -// Every packet version inherits packet definitions from the previous (lower) -// packet version. -// -// Main packet version of the DB to use (default = max available version) -// Client detection is faster when all clients use this version. -// Version 23 is the latest Sakexe (above versions are for Renewal clients) diff --git a/db/packet_db.txt b/db/packet_db.txt deleted file mode 100644 index d79a306ef1..0000000000 --- a/db/packet_db.txt +++ /dev/null @@ -1,2675 +0,0 @@ -// Client<->Map Packet Database -// -// Structure of Database: -// PacketType,PacketLength[,Name,FieldIndex1:FieldIndex2:FieldIndex3:...] -// -// 01. PacketType ID of the packet. -// 02. PacketLength Length of the packet. If 0, packet is disabled in current packet version. If -1, packet has variable size. -// 03. Name Name of the packet parser function (optional, for incoming packets only). -// 04. FieldIndex Specifies the offset of a packet field in bytes from the begin of the packet (only specified when Name is given). -// Can be 0, when the layout is not known. -// ... -// -// NOTE: Up to MAX_PACKET_POS (typically 20) field indexes may be used. -// -// The packet database allows you to add support for new clients, -// because packets change every release. -// -// Note: Every packet version needs a wanttoconnection specification, since -// that is the packet used to identify a client's version. -// If multiple versions have the same connection packet, the higher version -// will be used (unless the lower one is specified as the default) -// -// Incoming packets have their parser function and layout specified, which enables -// them for the current and all higher versions, unless explicitely disabled. -// -// Outgoing packets must be specified in order to enable them for the current -// and all higher versions, unless explicitely disabled. Packets that are not -// enabled for a packet version are silently discarded when sent as multicast. -// -// Every packet version inherits packet definitions from the previous (lower) -// packet version. -// -// Main packet version of the DB to use (default = max available version) -// Client detection is faster when all clients use this version. -// Version 23 is the latest Sakexe (above versions are for Renewal clients) -// -// packet_keys values are default value for each packet version, if no value -// or value is 'default' in packet_keys_use, server will uses default keys -// according to used packet_db_ver. packet_keys_use is user-defined keys. -// Maximum key value is 0x7FFFFFFF. -// NOTE: Keys won't be reloaded, initialized on first load only. -// -//packet_db_ver: 46 -packet_db_ver: default -packet_keys_use: default - -packet_ver: 5 -0x0064,55 -0x0065,17 -0x0066,6 -0x0067,37 -0x0068,46 -0x0069,-1 -0x006a,23 -0x006b,-1 -0x006c,3 -0x006d,108 -0x006e,3 -0x006f,2 -0x0070,6 -0x0071,28 -0x0072,19,wanttoconnection,2:6:10:14:18 -0x0073,11 -0x0074,3 -0x0075,-1 -0x0076,9 -0x0077,5 -0x0078,54 -0x0079,53 -0x007a,58 -0x007b,60 -0x007c,41 -0x007d,2,loadendack,0 -0x007e,6,ticksend,2 -0x007f,6 -0x0080,7 -0x0081,3 -0x0082,2 -0x0083,2 -0x0084,2 -0x0085,5,walktoxy,2 -0x0086,16 -0x0087,12 -0x0088,10 -0x0089,7,actionrequest,2:6 -0x008a,29 -0x008b,2 -0x008c,-1,globalmessage,2:4 -0x008d,-1 -0x008e,-1 -//0x008f,-1 -0x0090,7,npcclicked,2:6 -0x0091,22 -0x0092,28 -0x0093,2 -0x0094,6,getcharnamerequest,2 -0x0095,30 -0x0096,-1,wis,2:4:28 -0x0097,-1 -0x0098,3 -0x0099,-1,broadcast,2:4 -0x009a,-1 -0x009b,5,changedir,2:4 -0x009c,9 -0x009d,17 -0x009e,17 -0x009f,6,takeitem,2 -0x00a0,23 -0x00a1,6 -0x00a2,6,dropitem,2:4 -0x00a3,-1 -0x00a4,-1 -0x00a5,-1 -0x00a6,-1 -0x00a7,8,useitem,2:4 -0x00a8,7 -0x00a9,6,equipitem,2:4 -0x00aa,7,ZC_WEAR_EQUIP_ACK,2:4:6 -0x00ab,4,unequipitem,2 -0x00ac,7 -//0x00ad,-1 -0x00ae,-1 -0x00af,6 -0x00b0,8 -0x00b1,8 -0x00b2,3,restart,2 -0x00b3,3 -0x00b4,-1 -0x00b5,6 -0x00b6,6 -0x00b7,-1 -0x00b8,7,npcselectmenu,2:6 -0x00b9,6,npcnextclicked,2 -0x00ba,2 -0x00bb,5,statusup,2:4 -0x00bc,6 -0x00bd,44 -0x00be,5 -0x00bf,3,emotion,2 -0x00c0,7 -0x00c1,2,howmanyconnections,0 -0x00c2,6 -0x00c3,8 -0x00c4,6 -0x00c5,7,npcbuysellselected,2:6 -0x00c6,-1 -0x00c7,-1 -0x00c8,-1,npcbuylistsend,2:4 -0x00c9,-1,npcselllistsend,2:4 -0x00ca,3 -0x00cb,3 -0x00cc,6,gmkick,2 -0x00cd,3 -0x00ce,2,killall,0 -0x00cf,27,wisexin,2:26 -0x00d0,3,wisall,2 -0x00d1,4 -0x00d2,4 -0x00d3,2,wisexlist,0 -0x00d4,-1 -0x00d5,-1,createchatroom,2:4:6:7:15 -0x00d6,3 -0x00d7,-1 -0x00d8,6 -0x00d9,14,chataddmember,2:6 -0x00da,3 -0x00db,-1 -0x00dc,28 -0x00dd,29 -0x00de,-1,chatroomstatuschange,2:4:6:7:15 -0x00df,-1 -0x00e0,30,changechatowner,2:6 -0x00e1,30 -0x00e2,26,kickfromchat,2 -0x00e3,2,chatleave,0 -0x00e4,6,traderequest,2 -0x00e5,26 -0x00e6,3,tradeack,2 -0x00e7,3 -0x00e8,8,tradeadditem,2:4 -0x00e9,19 -0x00ea,5 -0x00eb,2,tradeok,0 -0x00ec,3 -0x00ed,2,tradecancel,0 -0x00ee,2 -0x00ef,2,tradecommit,0 -0x00f0,3 -0x00f1,2 -0x00f2,6 -0x00f3,8,movetokafra,2:4 -0x00f4,21 -0x00f5,8,movefromkafra,2:4 -0x00f6,8 -0x00f7,2,closekafra,0 -0x00f8,2 -0x00f9,26,createparty,2 -0x00fa,3 -0x00fb,-1 -0x00fc,6,partyinvite,2 -0x00fd,27 -0x00fe,30 -0x00ff,10,replypartyinvite,2:6 -0x0100,2,leaveparty,0 -0x0101,6 -0x0102,6,partychangeoption,2 -0x0103,30,removepartymember,2:6 -0x0104,79 -0x0105,31 -0x0106,10 -0x0107,10 -0x0108,-1,partymessage,2:4 -0x0109,-1 -0x010a,4 -0x010b,6 -0x010c,6 -0x010d,2 -0x010e,11 -0x010f,-1 -0x0110,10 -0x0111,39 -0x0112,4,skillup,2 -0x0113,10,useskilltoid,2:4:6 -0x0114,31 -0x0115,35 -0x0116,10,useskilltopos,2:4:6:8 -0x0117,18 -0x0118,2,stopattack,0 -0x0119,13 -0x011a,15 -0x011b,20,useskillmap,2:4 -0x011c,68 -0x011d,2,requestmemo,0 -0x011e,3 -0x011f,16 -0x0120,6 -0x0121,14 -0x0122,-1 -0x0123,-1 -0x0124,21 -0x0125,8 -0x0126,8,putitemtocart,2:4 -0x0127,8,getitemfromcart,2:4 -0x0128,8,movefromkafratocart,2:4 -0x0129,8,movetokafrafromcart,2:4 -0x012a,2,removeoption,0 -0x012b,2 -0x012c,3 -0x012d,4 -0x012e,2,closevending,0 -0x012f,-1,openvending,2:4:0:84 -0x0130,6,vendinglistreq,2 -0x0131,86 -0x0132,6 -0x0133,-1 -0x0134,-1,purchasereq,2:4:8 -0x0135,7 -0x0136,-1 -0x0137,6 -0x0138,3 -0x0139,16 -0x013a,4 -0x013b,4 -0x013c,4 -0x013d,6 -0x013e,24 -0x013f,26,itemmonster,2 -0x0140,22,mapmove,2:18:20 -0x0141,14 -0x0142,6 -0x0143,10,npcamountinput,2:6 -0x0144,23 -0x0145,19 -0x0146,6,npccloseclicked,2 -0x0147,39 -0x0148,8 -0x0149,9,gmreqnochat,2:6:7 -0x014a,6 -0x014b,27 -0x014c,-1 -0x014d,2,guildcheckmaster,0 -0x014e,6 -0x014f,6,guildrequestinfo,2 -0x0150,110 -0x0151,6,guildrequestemblem,2 -0x0152,-1 -0x0153,-1,guildchangeemblem,2:4 -0x0154,-1 -0x0155,-1,guildchangememberposition,2:4 -0x0156,-1 -0x0157,6 -0x0158,-1 -0x0159,54,guildleave,2:6:10:14 -0x015a,66 -0x015b,54,guildexpulsion,2:6:10:14 -0x015c,90 -0x015d,42,guildbreak,2 -0x015e,6 -0x015f,42 -0x0160,-1 -0x0161,-1,guildchangepositioninfo,2:4 -0x0162,-1 -0x0163,-1 -0x0164,-1 -0x0165,30,createguild,2:6 -0x0166,-1 -0x0167,3 -0x0168,14,guildinvite,2:6:10 -0x0169,3 -0x016a,30 -0x016b,10,guildreplyinvite,2:6 -0x016c,43 -0x016d,14 -0x016e,186,guildchangenotice,2:6:66 -0x016f,182 -0x0170,14,guildrequestalliance,2:6:10 -0x0171,30 -0x0172,10,guildreplyalliance,2:6 -0x0173,3 -0x0174,-1 -0x0175,6 -0x0176,106 -0x0177,-1 -0x0178,4,itemidentify,2 -0x0179,5 -0x017a,4,usecard,2 -0x017b,-1 -0x017c,6,insertcard,2:4 -0x017d,7 -0x017e,-1,guildmessage,2:4 -0x017f,-1 -0x0180,6,guildopposition,2 -0x0181,3 -0x0182,106 -0x0183,10,guilddelalliance,2:6 -0x0184,10 -0x0185,34 -//0x0186,-1 -0x0187,6 -0x0188,8 -0x0189,4 -0x018a,4,quitgame,2 -0x018b,4 -0x018c,29 -0x018d,-1 -0x018e,10,producemix,2:4:6:8 -0x018f,6 -0x0190,90,useskilltoposinfo,2:4:6:8:10 -0x0191,86 -0x0192,24 -0x0193,6,solvecharname,2 -0x0194,30 -0x0195,102 -0x0196,9 -0x0197,4,resetchar,2 -0x0198,8,changemaptype,2:4:6 -0x0199,4 -0x019a,14 -0x019b,10 -0x019c,-1,localbroadcast,2:4 -0x019d,6,gmhide,2 -0x019e,2 -0x019f,6,catchpet,2 -0x01a0,3 -0x01a1,3,petmenu,2 -0x01a2,35 -0x01a3,5 -0x01a4,11 -0x01a5,26,changepetname,2 -0x01a6,-1 -0x01a7,4,selectegg,2 -0x01a8,4 -0x01a9,6,sendemotion,2 -0x01aa,10 -0x01ab,12 -0x01ac,6 -0x01ad,-1 -0x01ae,4,selectarrow,2 -0x01af,4,changecart,2 -0x01b0,11 -0x01b1,7 -0x01b2,-1,openvending,2:4:84:85 -0x01b3,67 -0x01b4,12 -0x01b5,18 -0x01b6,114 -0x01b7,6 -0x01b8,3 -0x01b9,6 -0x01ba,26,remove,2 -0x01bb,26,shift,2 -0x01bc,26,recall,2 -0x01bd,26,summon,2 -0x01be,2 -0x01bf,3 -0x01c0,2 -0x01c1,14 -0x01c2,10 -0x01c3,-1 -0x01c4,22 -0x01c5,22 -0x01c6,4 -0x01c7,2 -0x01c8,13 -0x01c9,97 -//0x01ca,-1 -0x01cb,9 -0x01cc,9 -0x01cd,30 -0x01ce,6,autospell,2 -0x01cf,28 -0x01d0,8 -0x01d1,14 -0x01d2,10 -0x01d3,35 -0x01d4,6 -0x01d5,-1,npcstringinput,2:4:8 -0x01d6,4 -0x01d7,11 -0x01d8,54 -0x01d9,53 -0x01da,60 -0x01db,2 -0x01dc,-1 -0x01dd,47 -0x01de,33 -0x01df,6,gmreqaccname,2 -0x01e0,30 -0x01e1,8 -0x01e2,34 -0x01e3,14 -0x01e4,2 -0x01e5,6 -0x01e6,26 -0x01e7,2,sndoridori,0 -0x01e8,28,createparty2,2:26:27 -0x01e9,81 -0x01ea,6 -0x01eb,10 -0x01ec,26 -0x01ed,2,snexplosionspirits,0 -0x01ee,-1 -0x01ef,-1 -0x01f0,-1 -0x01f1,-1 -0x01f2,20 -0x01f3,10 -0x01f4,32 -0x01f5,9 -0x01f6,34 -0x01f7,14,adoptreply,2:6:10 -0x01f8,2 -0x01f9,6,adoptrequest,2 -0x01fa,48 -0x01fb,56 -0x01fc,-1 -0x01fd,4,repairitem,2 -0x01fe,5 -0x01ff,10 -0x0200,26 -0x0201,-1 -0x0202,26,friendslistadd,2 -0x0203,10,friendslistremove,2:6 -0x0204,18 -0x0205,26 -0x0206,11 -0x0207,34 -0x0208,11,friendslistreply,2:6:10 -0x0209,36 -0x020a,10 -//0x020b,-1 -//0x020c,-1 -0x020d,-1 -0x8b3,-1 -0x8d6,6,ZC_CLEAR_DIALOG,2 - -//2004-07-05aSakexe -packet_ver: 6 -0x0072,22,wanttoconnection,5:9:13:17:21 -0x0085,8,walktoxy,5 -0x00a7,13,useitem,5:9 -0x0113,15,useskilltoid,4:9:11 -0x0116,15,useskilltopos,4:9:11:13 -0x0190,95,useskilltoposinfo,4:9:11:13:15 -0x0208,14,friendslistreply,2:6:10 -0x020e,24 - -//2004-07-13aSakexe -packet_ver: 7 -0x0072,39,wanttoconnection,12:22:30:34:38 -0x0085,9,walktoxy,6 -0x009b,13,changedir,5:12 -0x009f,10,takeitem,6 -0x00a7,17,useitem,6:13 -0x0113,19,useskilltoid,7:9:15 -0x0116,19,useskilltopos,7:9:15:17 -0x0190,99,useskilltoposinfo,7:9:15:17:19 - -//2004-07-26aSakexe -packet_ver: 8 -0x0072,14,dropitem,5:12 -0x007e,33,wanttoconnection,12:18:24:28:32 -0x0085,20,useskilltoid,7:12:16 -0x0089,15,getcharnamerequest,11 -0x008c,23,useskilltopos,3:6:17:21 -0x0094,10,takeitem,6 -0x009b,6,walktoxy,3 -0x009f,13,changedir,5:12 -0x00a2,103,useskilltoposinfo,3:6:17:21:23 -0x00a7,12,solvecharname,8 -0x00f3,-1,globalmessage,2:4 -0x00f5,17,useitem,6:12 -0x00f7,10,ticksend,6 -0x0113,16,movetokafra,5:12 -0x0116,2,closekafra,0 -0x0190,26,movefromkafra,10:22 -0x0193,9,actionrequest,3:8 - -//2004-08-09aSakexe -packet_ver: 9 -0x0072,17,dropitem,8:15 -0x007e,37,wanttoconnection,9:21:28:32:36 -0x0085,26,useskilltoid,11:18:22 -0x0089,12,getcharnamerequest,8 -0x008c,40,useskilltopos,5:15:29:38 -0x0094,13,takeitem,9 -0x009b,15,walktoxy,12 -0x009f,12,changedir,7:11 -0x00a2,120,useskilltoposinfo,5:15:29:38:40 -0x00a7,11,solvecharname,7 -0x00f5,24,useitem,9:20 -0x00f7,13,ticksend,9 -0x0113,23,movetokafra,5:19 -0x0190,26,movefromkafra,11:22 -0x0193,18,actionrequest,7:17 - -//2004-08-16aSakexe -0x0212,26,rc,2 -0x0213,26,check,2 -0x0214,42 - -//2004-08-17aSakexe -0x020f,10,pvpinfo,2:6 -0x0210,22 - -//2004-09-06aSakexe -packet_ver: 10 -0x0072,20,useitem,9:20 -0x007e,19,movetokafra,3:15 -0x0085,23,actionrequest,9:22 -0x0089,9,walktoxy,6 -0x008c,105,useskilltoposinfo,10:14:18:23:25 -0x0094,17,dropitem,6:15 -0x009b,14,getcharnamerequest,10 -0x009f,-1,globalmessage,2:4 -0x00a2,14,solvecharname,10 -0x00a7,25,useskilltopos,10:14:18:23 -0x00f3,10,changedir,4:9 -0x00f5,34,wanttoconnection,7:15:25:29:33 -0x00f7,2,closekafra,0 -0x0113,11,takeitem,7 -0x0116,11,ticksend,7 -0x0190,22,useskilltoid,9:15:18 -0x0193,17,movefromkafra,3:13 - -//2004-09-20aSakexe -packet_ver: 11 -0x0072,18,useitem,10:14 -0x007e,25,movetokafra,6:21 -0x0085,9,actionrequest,3:8 -0x0089,14,walktoxy,11 -0x008c,109,useskilltoposinfo,16:20:23:27:29 -0x0094,19,dropitem,12:17 -0x009b,10,getcharnamerequest,6 -0x00a2,10,solvecharname,6 -0x00a7,29,useskilltopos,6:20:23:27 -0x00f3,18,changedir,8:17 -0x00f5,32,wanttoconnection,10:17:23:27:31 -0x0113,14,takeitem,10 -0x0116,14,ticksend,10 -0x0190,14,useskilltoid,4:7:10 -0x0193,12,movefromkafra,4:8 - -//2004-10-05aSakexe -packet_ver: 12 -0x0072,17,useitem,6:13 -0x007e,16,movetokafra,5:12 -0x0089,6,walktoxy,3 -0x008c,103,useskilltoposinfo,2:6:17:21:23 -0x0094,14,dropitem,5:12 -0x009b,15,getcharnamerequest,11 -0x00a2,12,solvecharname,8 -0x00a7,23,useskilltopos,3:6:17:21 -0x00f3,13,changedir,5:12 -0x00f5,33,wanttoconnection,12:18:24:28:32 -0x0113,10,takeitem,6 -0x0116,10,ticksend,6 -0x0190,20,useskilltoid,7:12:16 -0x0193,26,movefromkafra,10:22 - -//2004-10-25aSakexe -packet_ver: 13 -0x0072,13,useitem,5:9 -0x007e,13,movetokafra,6:9 -0x0085,15,actionrequest,4:14 -0x008c,108,useskilltoposinfo,6:9:23:26:28 -0x0094,12,dropitem,6:10 -0x009b,10,getcharnamerequest,6 -0x00a2,16,solvecharname,12 -0x00a7,28,useskilltopos,6:9:23:26 -0x00f3,15,changedir,6:14 -0x00f5,29,wanttoconnection,5:14:20:24:28 -0x0113,9,takeitem,5 -0x0116,9,ticksend,5 -0x0190,26,useskilltoid,4:10:22 -0x0193,22,movefromkafra,12:18 - -//2004-11-01aSakexe -0x0084,-1 -0x0215,6 - -//2004-11-08aSakexe -0x0084,2 -0x0216,6 -0x0217,2,blacksmith,0 -0x0218,2,alchemist,0 -0x0219,282 -0x021a,282 -0x021b,10 -0x021c,10 - -//2004-11-15aSakexe -0x021d,6,lesseffect,2 - -//2004-11-29aSakexe -packet_ver: 14 -0x0072,22,useskilltoid,8:12:18 -0x007e,30,useskilltopos,4:9:22:28 -0x0085,-1,globalmessage,2:4 -0x0089,7,ticksend,3 -0x008c,13,getcharnamerequest,9 -0x0094,14,movetokafra,4:10 -0x009b,2,closekafra,0 -0x009f,18,actionrequest,6:17 -0x00a2,7,takeitem,3 -0x00a7,7,walktoxy,4 -0x00f3,8,changedir,3:7 -0x00f5,29,wanttoconnection,3:10:20:24:28 -0x00f7,14,solvecharname,10 -0x0113,110,useskilltoposinfo,4:9:22:28:30 -0x0116,12,dropitem,4:10 -0x0190,15,useitem,3:11 -0x0193,21,movefromkafra,4:17 -0x0221,-1 -0x0222,6,weaponrefine,2 -0x0223,8 - -//2004-12-13aSakexe -//skipped: many packets being set to -1 -0x0066,3 -0x0070,3 -0x01ca,3 -0x021e,6 -0x021f,66 -0x0220,10 - -//2005-01-10bSakexe -packet_ver: 15 -0x0072,26,useskilltoid,8:16:22 -0x007e,114,useskilltoposinfo,10:18:22:32:34 -0x0085,23,changedir,12:22 -0x0089,9,ticksend,5 -0x008c,8,getcharnamerequest,4 -0x0094,20,movetokafra,10:16 -0x009b,32,wanttoconnection,3:12:23:27:31 -0x009f,17,useitem,5:13 -0x00a2,11,solvecharname,7 -0x00a7,13,walktoxy,10 -0x00f3,-1,globalmessage,2:4 -0x00f5,9,takeitem,5 -0x00f7,21,movefromkafra,11:17 -0x0113,34,useskilltopos,10:18:22:32 -0x0116,20,dropitem,15:18 -0x0190,20,actionrequest,9:19 -0x0193,2,closekafra,0 - -//2005-03-28aSakexe -0x0224,10 -0x0225,2,taekwon,0 -0x0226,282 - -//2005-04-04aSakexe -0x0227,18 -0x0228,18 - -//2005-04-11aSakexe -0x0229,15 -0x022a,58 -0x022b,57 -0x022c,64 - -//2005-04-25aSakexe -0x022d,5,hommenu,2:4 -0x0232,9,hommoveto,2:6 -0x0233,11,homattack,2:6:10 -0x0234,6,hommovetomaster,2 - -//2005-05-09aSakexe -packet_ver: 16 -0x0072,25,useskilltoid,6:10:21 -0x007e,102,useskilltoposinfo,5:9:12:20:22 -0x0085,11,changedir,7:10 -0x0089,8,ticksend,4 -0x008c,11,getcharnamerequest,7 -0x0094,14,movetokafra,7:10 -0x009b,26,wanttoconnection,4:9:17:21:25 -0x009f,14,useitem,4:10 -0x00a2,15,solvecharname,11 -0x00a7,8,walktoxy,5 -0x00f5,8,takeitem,4 -0x00f7,22,movefromkafra,14:18 -0x0113,22,useskilltopos,5:9:12:20 -0x0116,10,dropitem,5:8 -0x0190,19,actionrequest,5:18 - -//2005-05-23aSakexe -0x022e,69 -0x0230,12 - -//2005-05-30aSakexe -0x022e,71 -0x0235,-1 -0x0236,10 -0x0237,2,rankingpk,0 -0x0238,282 - -//2005-05-31aSakexe -0x0216,2 -0x0239,11 - -//2005-06-08aSakexe -0x0216,6 -0x0217,2,blacksmith,0 -0x022f,5 -0x0231,26,changehomunculusname,2 -0x023a,4 -0x023b,36,storagepassword,2:4:20 -0x023c,6 - -//2005-06-22aSakexe -0x022e,71 - -//2005-06-28aSakexe -packet_ver: 17 -0x0072,34,useskilltoid,6:17:30 -0x007e,113,useskilltoposinfo,12:15:18:31:33 -0x0085,17,changedir,8:16 -0x0089,13,ticksend,9 -0x008c,8,getcharnamerequest,4 -0x0094,31,movetokafra,16:27 -0x009b,32,wanttoconnection,9:15:23:27:31 -0x009f,19,useitem,9:15 -0x00a2,9,solvecharname,5 -0x00a7,11,walktoxy,8 -0x00f5,13,takeitem,9 -0x00f7,18,movefromkafra,11:14 -0x0113,33,useskilltopos,12:15:18:31 -0x0116,12,dropitem,3:10 -0x0190,24,actionrequest,11:23 -0x0216,-1 -0x023d,-1 -0x023e,4 - -//2005-07-18aSakexe -packet_ver: 18 -0x0072,19,useskilltoid,5:11:15 -0x007e,110,useskilltoposinfo,9:15:23:28:30 -0x0085,11,changedir,6:10 -0x0089,7,ticksend,3 -0x008c,11,getcharnamerequest,7 -0x0094,21,movetokafra,12:17 -0x009b,31,wanttoconnection,3:13:22:26:30 -0x009f,12,useitem,3:8 -0x00a2,18,solvecharname,14 -0x00a7,15,walktoxy,12 -0x00f5,7,takeitem,3 -0x00f7,13,movefromkafra,5:9 -0x0113,30,useskilltopos,9:15:23:28 -0x0116,12,dropitem,6:10 -0x0190,21,actionrequest,5:20 -0x0216,6 -0x023f,2,mailrefresh,0 -0x0240,8 -0x0241,6,mailread,2 -0x0242,-1 -0x0243,6,maildelete,2 -0x0244,6,mailgetattach,2 -0x0245,7 -0x0246,4,mailwinopen,2 -0x0247,8,mailsetattach,2:4 -0x0248,68 -0x0249,3 -0x024a,70 -0x024b,4,auctioncancelreg,2 -0x024c,8,auctionsetitem,2:4 -0x024d,14 -0x024e,6,auctioncancel,2 -0x024f,10,auctionbid,2:6 -0x0250,3 -0x0251,2 -0x0252,-1 - -//2005-07-19bSakexe -packet_ver: 19 -0x0072,34,useskilltoid,6:17:30 -0x007e,113,useskilltoposinfo,12:15:18:31:33 -0x0085,17,changedir,8:16 -0x0089,13,ticksend,9 -0x008c,8,getcharnamerequest,4 -0x0094,31,movetokafra,16:27 -0x009b,32,wanttoconnection,9:15:23:27:31 -0x009f,19,useitem,9:15 -0x00a2,9,solvecharname,5 -0x00a7,11,walktoxy,8 -0x00f5,13,takeitem,9 -0x00f7,18,movefromkafra,11:14 -0x0113,33,useskilltopos,12:15:18:31 -0x0116,12,dropitem,3:10 -0x0190,24,actionrequest,11:23 - -//2005-08-01aSakexe -0x0245,3 -0x0251,4 - -//2005-08-08aSakexe -0x024d,12,auctionregister,2:6:10 -0x024e,4 - -//2005-08-17aSakexe -0x0253,3 -0x0254,3,feelsaveok,2 - -//2005-08-29aSakexe -0x0240,-1 -0x0248,-1,mailsend,2:4:28:68:69 -0x0255,5 -0x0256,-1 -0x0257,8 - -//2005-09-12bSakexe -0x0256,5 -0x0258,2 -0x0259,3 - -//2005-10-10aSakexe -0x020e,32 -0x025a,-1 -0x025b,6,cooking,2:4 - -//2005-10-13aSakexe -0x007a,6 -0x0251,32 -0x025c,4,auctionbuysell,2 - -//2005-10-17aSakexe -0x007a,58 -0x025d,6,auctionclose,2 -0x025e,4 - -//2005-10-24aSakexe -0x025f,6 -0x0260,6 - -//2005-11-07aSakexe -0x024e,6,auctioncancel,2 -0x0251,34,auctionsearch,2:4:8:32 - -//2006-01-09aSakexe -0x0261,11 -0x0262,11 -0x0263,11 -0x0264,20 -0x0265,20 -0x0266,30 -0x0267,4 -0x0268,4 -0x0269,4 -0x026a,4 -0x026b,4 -0x026c,4 -0x026d,4 -0x026f,2 -0x0270,2 -0x0271,38 -0x0272,44 - -//2006-01-26aSakexe -0x0271,40 - -//2006-03-06aSakexe -0x0273,6 -0x0274,8 - -//2006-03-13aSakexe -0x0273,30,mailreturn,2:6 - -//2006-03-27aSakexe -packet_ver: 20 -0x0072,26,useskilltoid,11:18:22 -0x007e,120,useskilltoposinfo,5:15:29:38:40 -0x0085,12,changedir,7:11 -//0x0089,13,ticksend,9 -0x008c,12,getcharnamerequest,8 -0x0094,23,movetokafra,5:19 -0x009b,37,wanttoconnection,9:21:28:32:36 -0x009f,24,useitem,9:20 -0x00a2,11,solvecharname,7 -0x00a7,15,walktoxy,12 -0x00f5,13,takeitem,9 -0x00f7,26,movefromkafra,11:22 -0x0113,40,useskilltopos,5:15:29:38 -0x0116,17,dropitem,8:15 -0x0190,18,actionrequest,7:17 - -//2006-10-23aSakexe -0x006d,110 - -//2006-04-24aSakexe to 2007-01-02aSakexe -0x023e,8 -0x0277,84 -0x0278,2 -0x0279,2 -0x027a,-1 -0x027b,14 -0x027c,60 -0x027d,62 -0x027e,-1 -0x027f,8 -0x0280,12 -0x0281,4 -0x0282,284 -0x0283,6 -0x0284,14 -0x0285,6 -0x0286,4 -0x0287,-1 -0x0288,6 -0x0289,8 -0x028a,18 -0x028b,-1 -0x028c,46 -0x028d,34 -0x028e,4 -0x028f,6 -0x0290,4 -0x0291,4 -0x0292,2,autorevive,0 -0x0293,70 -0x0294,10 -0x0295,-1 -0x0296,-1 -0x0297,-1 -0x0298,8 -0x0299,6 -0x029a,27 -0x029c,66 -0x029d,-1 -0x029e,11 -0x029f,3,mermenu,2 -0x02a0,-1 -0x02a1,-1 -0x02a2,8 - -//2007-01-08aSakexe -packet_ver: 21 -0x0072,30,useskilltoid,10:14:26 -0x007e,120,useskilltoposinfo,10:19:23:38:40 -0x0085,14,changedir,10:13 -0x0089,11,ticksend,7 -0x008c,17,getcharnamerequest,13 -0x0094,17,movetokafra,4:13 -0x009b,35,wanttoconnection,7:21:26:30:34 -0x009f,21,useitem,7:17 -0x00a2,10,solvecharname,6 -0x00a7,8,walktoxy,5 -0x00f5,11,takeitem,7 -0x00f7,15,movefromkafra,3:11 -0x0113,40,useskilltopos,10:19:23:38 -0x0116,19,dropitem,11:17 -0x0190,10,actionrequest,4:9 - -//2007-01-22aSakexe -0x02a3,18 -0x02a4,2 - -//2007-01-29aSakexe -0x029b,72 -0x02a3,-1 -0x02a4,-1 -0x02a5,8 - -// 2007-02-05aSakexe -0x02aa,4 -0x02ab,36 -0x02ac,6 - -//2007-02-12aSakexe -packet_ver: 22 -0x0072,25,useskilltoid,6:10:21 -0x007e,102,useskilltoposinfo,5:9:12:20:22 -0x0085,11,changedir,7:10 -0x0089,8,ticksend,4 -0x008c,11,getcharnamerequest,7 -0x0094,14,movetokafra,7:10 -0x009b,26,wanttoconnection,4:9:17:21:25 -0x009f,14,useitem,4:10 -0x00a2,15,solvecharname,11 -//0x00a7,8,walktoxy,5 -0x00f5,8,takeitem,4 -0x00f7,22,movefromkafra,14:18 -0x0113,22,useskilltopos,5:9:12:20 -0x0116,10,dropitem,5:8 -0x0190,19,actionrequest,5:18 - -//2007-05-07aSakexe -0x01fd,15,repairitem,2:4:6:7:9:11:13 - -//2007-02-27aSakexe to 2007-10-02aSakexe -0x0288,10,cashshopbuy,2:4:6 -0x0289,12 -0x02a6,22 -0x02a7,22 -0x02a8,162 -0x02a9,58 -0x02ad,8 -0x02b0,85 -0x02b1,-1 -0x02b2,-1 -0x02b3,107 -0x02b4,6 -0x02b5,-1 -0x02b6,7,queststate,2:6 -0x02b7,7 -0x02b8,22 -0x02b9,191 -0x02ba,11,hotkey,2:4:5:9 -0x02bb,8 -0x02bc,6 -0x02bf,10 -0x02c0,2 -0x02c1,-1 -0x02c2,-1 -0x02c4,26,partyinvite2,2 -0x02c5,30 -0x02c6,30 -0x02c7,7,replypartyinvite2,2:6 -0x02c8,3,partytick,2 -0x02c9,3 -0x02ca,3 -0x02cb,20 -0x02cc,4 -0x02cd,26 -0x02ce,10 -0x02cf,6 -0x02d0,-1 -0x02d1,-1 -0x02d2,-1 -0x02d3,4,ZC_NOTIFY_BIND_ON_EQUIP,2 -0x02d4,29 -0x02d5,2 -0x02d6,6,viewplayerequip,2 -0x02d7,-1 -0x02d8,10,equiptickbox,2:6 -0x02d9,10 -0x02da,3 -0x02db,-1,battlechat,2:4 -0x02dc,-1 -0x02dd,32 -0x02de,6 -0x02df,36 -0x02e0,34 - -//2007-10-23aSakexe -0x02cb,65 -0x02cd,71 - -//2007-11-06aSakexe -0x0078,55 -0x007c,42 -0x022c,65 -0x029b,80 - -//2007-11-13aSakexe -0x02e1,33 - -//2007-11-20aSakexe -//0x01df,10 <- ??? -0x02e2,14 -0x02e3,25 -0x02e4,8 -0x02e5,8 -0x02e6,6 - -//2007-11-27aSakexe -0x02e7,-1 - -//2008-01-02aSakexe -0x01df,6,gmreqaccname,2 -0x02e8,-1 -0x02e9,-1 -0x02ea,-1 -0x02eb,13 -0x02ec,67 -0x02ed,59 -0x02ee,60 -0x02ef,8 - -//2008-03-18aSakexe -0x02bf,-1 -0x02c0,-1 -0x02f0,10 -0x02f1,2,progressbar,0 -0x02f2,2 - -//2008-03-25bSakexe -0x02f3,-1 -0x02f4,-1 -0x02f5,-1 -0x02f6,-1 -0x02f7,-1 -0x02f8,-1 -0x02f9,-1 -0x02fa,-1 -0x02fb,-1 -0x02fc,-1 -0x02fd,-1 -0x02fe,-1 -0x02ff,-1 -0x0300,-1 - -//2008-04-01aSakexe -0x0301,-1 -0x0302,-1 -0x0303,-1 -0x0304,-1 -0x0305,-1 -0x0306,-1 -0x0307,-1 -0x0308,-1 -0x0309,-1 -0x030a,-1 -0x030b,-1 -0x030c,-1 -0x030d,-1 -0x030e,-1 -0x030f,-1 -0x0310,-1 -0x0311,-1 -0x0312,-1 -0x0313,-1 -0x0314,-1 -0x0315,-1 -0x0316,-1 -0x0317,-1 -0x0318,-1 -0x0319,-1 -0x031a,-1 -0x031b,-1 -0x031c,-1 -0x031d,-1 -0x031e,-1 -0x031f,-1 -0x0320,-1 -0x0321,-1 -0x0322,-1 -0x0323,-1 -0x0324,-1 -0x0325,-1 -0x0326,-1 -0x0327,-1 -0x0328,-1 -0x0329,-1 -0x032a,-1 -0x032b,-1 -0x032c,-1 -0x032d,-1 -0x032e,-1 -0x032f,-1 -0x0330,-1 -0x0331,-1 -0x0332,-1 -0x0333,-1 -0x0334,-1 -0x0335,-1 -0x0336,-1 -0x0337,-1 -0x0338,-1 -0x0339,-1 -0x033a,-1 -0x033b,-1 -0x033c,-1 -0x033d,-1 -0x033e,-1 -0x033f,-1 -0x0340,-1 -0x0341,-1 -0x0342,-1 -0x0343,-1 -0x0344,-1 -0x0345,-1 -0x0346,-1 -0x0347,-1 -0x0348,-1 -0x0349,-1 -0x034a,-1 -0x034b,-1 -0x034c,-1 -0x034d,-1 -0x034e,-1 -0x034f,-1 -0x0350,-1 -0x0351,-1 -0x0352,-1 -0x0353,-1 -0x0354,-1 -0x0355,-1 -0x0356,-1 -0x0357,-1 -0x0358,-1 -0x0359,-1 -0x035a,-1 - -//2008-05-27aSakexe -0x035b,-1 -0x035c,2 -0x035d,-1 -0x035e,2 -0x035f,-1 -0x0389,-1 - -//2008-08-20aSakexe -0x040c,-1 -0x040d,-1 -0x040e,-1 -0x040f,-1 -0x0410,-1 -0x0411,-1 -0x0412,-1 -0x0413,-1 -0x0414,-1 -0x0415,-1 -0x0416,-1 -0x0417,-1 -0x0418,-1 -0x0419,-1 -0x041a,-1 -0x041b,-1 -0x041c,-1 -0x041d,-1 -0x041e,-1 -0x041f,-1 -0x0420,-1 -0x0421,-1 -0x0422,-1 -0x0423,-1 -0x0424,-1 -0x0425,-1 -0x0426,-1 -0x0427,-1 -0x0428,-1 -0x0429,-1 -0x042a,-1 -0x042b,-1 -0x042c,-1 -0x042d,-1 -0x042e,-1 -0x042f,-1 -0x0430,-1 -0x0431,-1 -0x0432,-1 -0x0433,-1 -0x0434,-1 -0x0435,-1 - -//2008-09-10aSakexe -packet_ver: 23 -0x0436,19,wanttoconnection,2:6:10:14:18 -0x0437,7,actionrequest,2:6 -0x0438,10,useskilltoid,2:4:6 -0x0439,8,useitem,2:4 - -//2008-11-13aSakexe -0x043d,8 -0x043e,-1 -0x043f,8 - -//2008-11-26aSakexe -0x01a2,37 -0x0440,10 -0x0441,4 - -//2008-12-10aSakexe -0x0442,-1 -0x0443,8,skillselectmenu,2:6 - -//2009-01-14aSakexe -0x043f,25 -0x0444,-1 -0x0445,10 - -//2009-02-18aSakexe -0x0446,14 - -//2009-02-25aSakexe -0x0448,-1 - -//2009-03-30aSakexe -0x0449,4 - -//2009-04-08aSakexe -0x02a6,-1 -0x02a7,-1 -0x044a,6,clientversion,2 - -//Renewal Clients -//2008-08-27aRagexeRE -packet_ver: 24 -0x0072,22,useskilltoid,9:15:18 -0x007c,44 -0x007e,105,useskilltoposinfo,10:14:18:23:25 -0x0085,10,changedir,4:9 -0x0089,11,ticksend,7 -0x008c,14,getcharnamerequest,10 -0x0094,19,movetokafra,3:15 -0x009b,34,wanttoconnection,7:15:25:29:33 -0x009f,20,useitem,7:20 -0x00a2,14,solvecharname,10 -0x00a7,9,walktoxy,6 -0x00f5,11,takeitem,7 -0x00f7,17,movefromkafra,3:13 -0x0113,25,useskilltopos,10:14:18:23 -0x0116,17,dropitem,6:15 -0x0190,23,actionrequest,9:22 -0x02e2,20 -0x02e3,22 -0x02e4,11 -0x02e5,9 - -//2008-09-10aRagexeRE -packet_ver: 25 -0x0436,19,wanttoconnection,2:6:10:14:18 -0x0437,7,actionrequest,2:6 -0x0438,10,useskilltoid,2:4:6 -0x0439,8,useitem,2:4 - -//2008-11-12aRagexeRE -0x043d,8 -//0x043e,-1 -0x043f,8 - -//2008-12-17aRagexeRE -0x01a2,37 -//0x0440,10 -//0x0441,4 -//0x0442,8 -//0x0443,8 - -//2008-12-17bRagexeRE -0x006d,114 - -//2009-01-21aRagexeRE -0x043f,25 -//0x0444,-1 -//0x0445,10 - -//2009-02-18aRagexeRE -//0x0446,14 - -//2009-02-26cRagexeRE -//0x0448,-1 - -//2009-04-01aRagexeRE -//0x0449,4 - -//2009-05-14aRagexeRE -//0x044b,2 - -//2009-05-20aRagexeRE -//0x07d0,6 -//0x07d1,2 -//0x07d2,-1 -//0x07d3,4 -//0x07d4,4 -//0x07d5,4 -//0x07d6,4 -//0x0447,2 - -//2009-06-03aRagexeRE -0x07d7,8,partychangeoption,2:6:7 -0x07d8,8 -0x07d9,254 -0x07da,6,partychangeleader,2 - -//2009-06-10aRagexeRE -//0x07db,8 - -//2009-06-17aRagexeRE -0x07d9,268 -//0x07dc,6 -//0x07dd,54 -//0x07de,30 -//0x07df,54 - -//2009-07-01aRagexeRE -//0x0275,37 -//0x0276,-1 - -//2009-07-08aRagexeRE -//0x07e0,58 - -//2009-07-15aRagexeRE -0x07e1,15 - -//2009-08-05aRagexeRE -0x07e2,8 - -//2009-08-18aRagexeRE -0x07e3,6 -0x07e4,-1,itemlistwindowselected,2:4:8:12 -0x07e6,8 - -//2009-08-25aRagexeRE -//0x07e6,28 -0x07e7,5 - -//2009-09-22aRagexeRE -0x07e5,8 -0x07e6,8 -0x07e7,32 -0x07e8,-1 -0x07e9,5 - -//2009-09-29aRagexeRE -//0x07ea,2 -//0x07eb,-1 -//0x07ec,6 -//0x07ed,8 -//0x07ee,6 -//0x07ef,8 -//0x07f0,4 -//0x07f2,4 -//0x07f3,3 - -//2009-10-06aRagexeRE -//0x07ec,8 -//0x07ed,10 -//0x07f0,8 -//0x07f1,15 -//0x07f2,6 -//0x07f3,4 -//0x07f4,3 - -//2009-10-27aRagexeRE -0x07f5,6,gmfullstrip,2 -0x07f6,14 - -//2009-11-03aRagexeRE -0x07f7,-1 -0x07f8,-1 -0x07f9,-1 - -//2009-11-17aRagexeRE -0x07fa,8 - -//2009-11-24aRagexeRE -0x07fb,25 - -//2009-12-01aRagexeRE -0x07fc,10 -0x07fd,-1,ZC_BROADCASTING_SPECIAL_ITEM_OBTAIN,0 -0x07fe,26 -//0x07ff,-1 - -//2009-12-15aRagexeRE -0x0800,-1 -//0x0801,-1 - -//2009-12-22aRagexeRE -0x0802,18,bookingregreq,2:4:6 // Booking System -0x0803,4 -0x0804,8 // Booking System -0x0805,-1 -0x0806,4,bookingdelreq,2 // Booking System -//0x0807,2 -0x0808,4 // Booking System -//0x0809,14 -//0x080A,50 -//0x080B,18 -//0x080C,6 - -//2009-12-29aRagexeRE -0x0804,14,bookingsearchreq,2:4:6:8:12 // Booking System -0x0806,2,bookingdelreq,0 // Booking System -0x0807,4 -0x0808,14,bookingupdatereq,2 // Booking System -0x0809,50 -0x080A,18 -0x080B,6 // Booking System - -//2010-01-05aRagexeRE -0x0801,-1,purchasereq2,2:4:8:12 - -//2010-01-26aRagexeRE -//0x080C,2 -//0x080D,3 -0x080E,14 - -//2010-02-09aRagexeRE -//0x07F0,6 - -//2010-02-23aRagexeRE -0x080F,20 - -//2010-03-03aRagexeRE -0x0810,3 -0x0811,-1,reqopenbuyingstore,2:4:8:9:89 -//0x0812,86 -//0x0813,6 -//0x0814,6 -//0x0815,-1 -//0x0817,-1 -//0x0818,6 -//0x0819,4 - -//2010-03-09aRagexeRE -0x0813,-1 -//0x0814,2 -//0x0815,6 -0x0816,6 -0x0818,-1 -//0x0819,10 -//0x081A,4 -//0x081B,4 -//0x081C,6 -0x081d,22 -0x081e,8 - -//2010-03-23aRagexeRE -//0x081F,-1 - -//2010-04-06aRagexeRE -//0x081A,6 - -//2010-04-13aRagexeRE -//0x081A,10 -0x0820,11 -//0x0821,2 -//0x0822,9 -//0x0823,-1 - -//2010-04-14dRagexeRE -//0x081B,8 - -//2010-04-20aRagexeRE -0x0812,8 -0x0814,86 -0x0815,2,reqclosebuyingstore,0 -0x0817,6,reqclickbuyingstore,2 -0x0819,-1,reqtradebuyingstore,2:4:8:12 -0x081a,4 -0x081b,10 -0x081c,10 -0x0824,6 - -//2010-06-01aRagexeRE -//0x0825,-1 -//0x0826,4 -0x0835,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0836,-1 -0x0837,3 -//0x0838,3 - -//2010-06-08aRagexeRE -0x0838,2,searchstoreinfonextpage,0 -0x083A,4 // Search Stalls Feature -0x083B,2,closesearchstoreinfo,0 -0x083C,12,searchstoreinfolistitemclick,2:6:10 -0x083D,6 - -//2010-06-15aRagexeRE -//0x083E,26 - -//2010-06-22aRagexeRE -//0x083F,22 - -//2010-06-29aRagexeRE -0x00AA,9,ZC_WEAR_EQUIP_ACK,2:4:6:8 -//0x07F1,18 -//0x07F2,8 -//0x07F3,6 - -//2010-07-01aRagexeRE -0x083A,5 // Search Stalls Feature - -//2010-07-13aRagexeRE -//0x0827,6 -//0x0828,14 -//0x0829,6 -//0x082A,10 -//0x082B,6 -//0x082C,14 -//0x0840,-1 -//0x0841,19 - -//2010-07-14aRagexeRE -//0x0841,4 - -//2010-08-03aRagexeRE -0x0839,66 -0x0842,6,recall2,2 -0x0843,6,remove2,2 - -//2010-11-24aRagexeRE -packet_ver: 26 -0x0288,-1,cashshopbuy,2:4:8:10 -0x0436,19,wanttoconnection,2:6:10:14:18 -0x035f,5,walktoxy,2 -0x0360,6,ticksend,2 -0x0361,5,changedir,2:4 -0x0362,6,takeitem,2 -0x0363,6,dropitem,2:4 -0x0364,8,movetokafra,2:4 -0x0365,8,movefromkafra,2:4 -0x0366,10,useskilltopos,2:4:6:8 -0x0367,90,useskilltoposinfo,2:4:6:8:10 -0x0368,6,getcharnamerequest,2 -0x0369,6,solvecharname,2 -0x0856,-1 -0x0857,-1 -0x0858,-1 -0x0859,-1 -0x08d0,9,ZC_WEAR_EQUIP_ACK,2:4:6:8 - -//2011-10-05aRagexeRE -packet_ver: 27 -packet_keys: 0x291E6762,0x77CD391A,0x60AC2F16 // [Shakto] -0x0364,5,walktoxy,2 -0x0817,6,ticksend,2 -0x0366,5,changedir,2:4 -0x0815,6,takeitem,2 -0x0885,6,dropitem,2:4 -0x0893,8,movetokafra,2:4 -0x0897,8,movefromkafra,2:4 -0x0369,10,useskilltopos,2:4:6:8 -0x08ad,90,useskilltoposinfo,2:4:6:8:10 -0x088a,6,getcharnamerequest,2 -0x0838,6,solvecharname,2 -0x0439,8,useitem,2:4 -0x08d2,10 -0x08d1,7 -0x0846,4,cashshopreqtab,2 //2011-07-18 - -// 2011-11-02aRagexe -packet_ver: 28 -packet_keys: 0x5324329D,0x5D545D52,0x06137269 // [Shakto] -0x0436,26,friendslistadd,2 -0x0898,5,hommenu,2:4 -0x0281,36,storagepassword,2:4:20 -0x088d,26,partyinvite2,2 -0x083c,19,wanttoconnection,2:6:10:14:18 -0x08aa,7,actionrequest,2:6 -0x02c4,10,useskilltoid,2:4:6 -0x0811,-1,itemlistwindowselected,2:4:8:12 -0x0890,8 -0x08a5,18,bookingregreq,2:4:6 -0x0835,-1,reqopenbuyingstore,2:4:8:9:89 -0x089b,2,reqclosebuyingstore,0 -0x08a1,6,reqclickbuyingstore,2 -0x089e,-1,reqtradebuyingstore,2:4:8:12 -0x08ab,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x088b,2,searchstoreinfonextpage,0 -0x08a2,12,searchstoreinfolistitemclick,2:6:10 -0x08cf,10 //Amulet spirits - -//2012-03-07fRagexeRE -packet_ver:29 -packet_keys: 0x382A6DEF,0x5CBE7202,0x61F46637 // [Shakto] -0x086A,19,wanttoconnection,2:6:10:14:18 -0x0437,5,walktoxy,2 -0x0887,6,ticksend,2 -0x0890,5,changedir,2:4 -0x0865,6,takeitem,2 -0x02C4,6,dropitem,2:4 -0x093B,8,movetokafra,2:4 -0x0963,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0369,26,friendslistadd,2 -0x0863,5,hommenu,2:4 -0x0861,36,storagepassword,2:4:20 -0x0929,26,partyinvite2,2 -0x0885,7,actionrequest,2:6 -0x0889,10,useskilltoid,2:4:6 -0x0870,-1,itemlistwindowselected,2:4:8:12 -//0x0926,41,bookingregreq,2:4:6 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0817,2,reqclosebuyingstore,0 -0x0360,6,reqclickbuyingstore,2 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0884,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0835,2,searchstoreinfonextpage,0 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0439,8,useitem,2:4 -0x0365,41,bookingregreq,2:4:6 - -// New Packet -0x090F,-1 // ZC_NOTIFY_NEWENTRY7 -0x0914,-1 // ZC_NOTIFY_MOVEENTRY8 -0x0915,-1 // ZC_NOTIFY_STANDENTRY9 - -//2012-04-10aRagexeRE -packet_ver: 30 -packet_keys: 0x01581359,0x452D6FFA,0x6AFB6E2E // [Shakto] -0x01fd,15,repairitem,2:4:6:7:9:11:13 -0x089c,26,friendslistadd,2 -0x0885,5,hommenu,2:4 -0x0961,36,storagepassword,2:4:20 -0x0288,-1,cashshopbuy,2:4:8:10 -0x091c,26,partyinvite2,2 -0x094b,19,wanttoconnection,2:6:10:14:18 -0x0369,7,actionrequest,2:6 -0x083c,10,useskilltoid,2:4:6 -0x0439,8,useitem,2:4 -0x0945,-1,itemlistwindowselected,2:4:8:12 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0817,2,reqclosebuyingstore,0 -0x0360,6,reqclickbuyingstore,2 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0835,2,searchstoreinfonextpage,0 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0437,5,walktoxy,2 -0x0886,6,ticksend,2 -0x0871,5,changedir,2:4 -0x0938,6,takeitem,2 -0x0891,6,dropitem,2:4 -0x086c,8,movetokafra,2:4 -0x08a6,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x0889,6,getcharnamerequest,2 -0x0884,6,solvecharname,2 -0x08e6,4 -0x08e7,10,bookingsearchreq,2:4:6:8:12 -0x08e8,-1 -0x08e9,2,bookingdelreq,0 -0x08ea,4 -0x08eb,39,bookingupdatereq,2 -0x08ec,73 -0x08ed,43 -0x08ee,6 -0x08ef,6,bookingignorereq,2 -0x08f0,6 -0x08f1,6,bookingjoinpartyreq,2 -0x08f2,36 -0x08f3,-1 -0x08f4,6 -0x08f5,-1,bookingsummonmember,2:4 -0x08f6,22 -0x08f7,3 -0x08f8,7 -0x08f9,6 -0x08fa,6 -0x08fb,6,bookingcanceljoinparty,2 -0x0907,5,moveitem,2:4 -0x0908,5 -0x08d7,28,battlegroundreg,2:4 -0x0977,14 //Monster HP Bar -0x0916,26,guildinvite2,2 -0x091d,41,bookingregreq,2:4:6 -0x08cb,10,ZC_PERSONAL_INFOMATION,2:4:6:8:10:11:13:15 //Still need further information -// Merge Item -0x096D,-1,ZC_MERGE_ITEM_OPEN,2:4 // ZC_MERGE_ITEM_OPEN -0x096E,-1,mergeitem_req,2:4 // CZ_REQ_MERGE_ITEM -0x096F,7,ZC_ACK_MERGE_ITEM,2:4:6 // ZC_ACK_MERGE_ITEM -0x0974,2,mergeitem_cancel,0 // CZ_CANCEL_MERGE_ITEM -0x0844,2,cashshopopen,0 -0x0849,16 //clif_cashshop_result -0x0848,-1,cashshopbuy,2:6:4:10 -0x084a,2,cashshopclose,0 -0x08c9,2,cashshopitemlist,0 - -//2012-04-18aRagexeRE [Special Thanks to Judas!] -packet_ver: 31 -packet_keys: 0x01540E48,0x13041224,0x31247924 // [Shakto] -0x023B,26,friendslistadd,2 -0x0361,5,hommenu,2:4 -0x08A8,36,storagepassword,2:4:20 -0x0802,26,partyinvite2,2 -0x022D,19,wanttoconnection,2:6:10:14:18 -0x0281,-1,itemlistwindowselected,2:4:8:12 -0x035F,6,ticksend,2 -0x0202,5,changedir,2:4 -0x07E4,6,takeitem,2 -0x0362,6,dropitem,2:4 -0x07EC,8,movetokafra,2:4 -0x0364,8,movefromkafra,2:4 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x08E5,41,bookingregreq,2:4:6 //Added to prevent disconnections -0x08d2,10 - -//2012-06-18 -packet_ver: 32 -packet_keys: 0x261F261F,0x261F261F,0x261F261F // [Shakto] -0x0983,29 // ZC_MSG_STATE_CHANGE3 -0x0861,41,bookingregreq,2:4:6 //actually 12-05-03 - -//2012-07-02aRagexeRE (unstable) -packet_ver: 33 -packet_keys: 0x25733B31,0x53486CFD,0x398649BD // [Shakto] -0x0363,19,wanttoconnection,2:6:10:14:18 -0x0364,6,ticksend,2 -0x085a,7,actionrequest,2:6 -0x0861,8,movefromkafra,2:4 -0x0862,10,useskilltoid,2:4:6 -0x0863,10,useskilltopos,2:4:6:8 -0x0886,6,solvecharname,2 -0x0889,90,useskilltoposinfo,2:4:6:8:10 -0x089e,6,dropitem,2:4 -0x089f,6,takeitem,2 -0x08a0,8,movetokafra,2:4 -0x094a,6,getcharnamerequest,2 -0x0953,5,walktoxy,2 -0x0960,5,changedir,2:4 -0x0879,41,bookingregreq,2:4:6 - -//2013-03-20Ragexe (Judas) -packet_ver: 34 -packet_keys: 0x3F094C49,0x55F86C1E,0x58AA359A // [Shakto] -0x014f,6,guildrequestinfo,2 -0x01fd,15,repairitem,2:4:6:7:9:11:13 -//0x0281,-1,itemlistwindowselected,2:4:8:12 -0x035f,6,reqclickbuyingstore,2 -0x0363,6,ticksend,2 -0x0365,12,searchstoreinfolistitemclick,2:6:10 -0x0438,6,dropitem,2:4 -0x0447,2,booking_playcancel,0 // CZ_BLOCKING_PLAY_CANCEL -0x044A,6,clientversion,2 -0x0844,2,cashshopopen,0 -0x0849,16 //clif_cashshop_result -0x0848,-1,cashshopbuy,2:6:4:10 -0x084a,2,cashshopclose,0 -0x084b,19 //fallitem4 -0x085a,90,useskilltoposinfo,2:4:6:8:10 -0x085d,18,bookingregreq,2:4:6 -0x0868,-1,itemlistwindowselected,2:4:8:12 -0x086d,26,partyinvite2,2 -0x086f,26,friendslistadd,2 -0x0874,8,movefromkafra,2:4 -0x0881,5,walktoxy,2 -0x0886,2,reqclosebuyingstore,0 -0x0888,19,wanttoconnection,2:6:10:14:18 -0x088e,7,actionrequest,2:6 -0x0897,5,changedir,2:4 -0x0898,6,getcharnamerequest,2 -0x089b,10,useskilltoid,2:4:6 -0x08ac,8,movetokafra,2:4 -0x08c9,2,cashshopitemlist,0 -0x08cf,10 //Amulet spirits -0x08d2,10 -0x0907,5,moveitem,2:4 -0x0908,5 -0x0922,-1,reqtradebuyingstore,2:4:8:12 -//0x092e,2,searchstoreinfonextpage,0 -0x0933,6,takeitem,2 -0x0938,-1,reqopenbuyingstore,2:4:8:9:89 -0x093f,5,hommenu,2:4 -0x0947,36,storagepassword,2:4:20 -0x094c,6,solvecharname,2 -0x094e,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0959,10,useskilltopos,2:4:6:8 -//0x095a,8,mailsetattach,2:4 -0x0977,14 //Monster HP Bar -0x0978,6,reqworldinfo,2 -0x0979,50 //ackworldinfo -0x097b,16,ZC_PERSONAL_INFOMATION,2:4:8:12:16:17:21:25 //Still need further information -//0x0981,12,ZC_PERSONAL_INFOMATION_CHN,2:4:6:8:12:13:15:17:10 // Disabled until further information is found. -0x0990,31 //additem -0x0991,-1 //inv itemlist normal -0x0992,-1 //inv itemlist equip -0x0993,-1 //cart itemlist normal -0x0994,-1 //cart itemlist equip -0x0995,-1 //store itemlist normal -0x0996,-1 //store itemlist equip -0x0997,-1 //ZC_EQUIPWIN_MICROSCOPE_V5 -0x0998,8,equipitem,2:4 // CZ_REQ_WEAR_EQUIP_V5 -0x0999,11,ZC_WEAR_EQUIP_ACK,2:4:8:10 // cz_wear_equipv5 -0x099a,9 // take_off_equipv5 -0x099b,8 //maptypeproperty2 - -// New Packets -0x08C8,34 // ZC_NOTIFY_ACT3 -0x08ff,24 // ZC_EFST_SET_ENTER -0x0984,28 // ZC_EFST_SET_ENTER2 -0x099f,22 // ZC_SKILL_ENTRY4 - -//2013-05-15aRagexe (Yommy) -packet_ver: 35 -packet_keys: 0x75794A38,0x58A96BC1,0x296E6FB8 // [Shakto] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x0362,5,changedir,2:4 -0x08A1,6,takeitem,2 -0x0944,6,dropitem,2:4 -0x0887,8,movetokafra,2:4 -0x08AC,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x092D,18,bookingregreq,2:4:6 -//0x08AA,8 CZ_JOIN_BATTLE_FIELD -0x0963,-1,itemlistwindowselected,2:4:8:12 -0x0943,19,wanttoconnection,2:6:10:14:18 -0x0947,26,partyinvite2,2 -//0x0862,4 CZ_GANGSI_RANK -0x0962,26,friendslistadd,2 -0x0931,5,hommenu,2:4 -0x093e,36,storagepassword,2:4:20 - -//2013-05-22Ragexe (Yommy) -packet_ver: 36 -packet_keys: 0x6948050B,0x06511D9D,0x725D4DF1 // [Shakto] -0x08A2,7,actionrequest,2:6 -0x095C,10,useskilltoid,2:4:6 -0x0360,5,walktoxy,2 -0x07EC,6,ticksend,2 -0x0925,5,changedir,2:4 -0x095E,6,takeitem,2 -0x089C,6,dropitem,2:4 -0x08a3,8,movetokafra,2:4 -0x087E,8,movefromkafra,2:4 -0x0811,10,useskilltopos,2:4:6:8 -0x0964,90,useskilltoposinfo,2:4:6:8:10 -0x08a6,6,getcharnamerequest,2 -0x0369,6,solvecharname,2 -0x093e,12,searchstoreinfolistitemclick,2:6:10 -0x08aa,2,searchstoreinfonextpage,0 -0x095b,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0952,-1,reqtradebuyingstore,2:4:8:12 -0x0368,6,reqclickbuyingstore,2 -0x086E,2,reqclosebuyingstore,0 -0x0874,-1,reqopenbuyingstore,2:4:8:9:89 -0x089B,18,bookingregreq,2:4:6 -//0x0965,8 CZ_JOIN_BATTLE_FIELD -0x086A,-1,itemlistwindowselected,2:4:8:12 -0x08A9,19,wanttoconnection,2:6:10:14:18 -0x0950,26,partyinvite2,2 -//0x08AC,4 CZ_GANGSI_RANK -0x0362,26,friendslistadd,2 -0x0926,5,hommenu,2:4 -0x088e,36,storagepassword,2:4:20 - -//2013-05-29Ragexe (Shakto) -packet_ver: 37 -packet_keys: 0x023A6C87,0x14BF1F1E,0x5CC70CC9 // [Shakto] -0x0890,7,actionrequest,2:6 -0x0438,10,useskilltoid,2:4:6 -0x0876,5,walktoxy,2 -0x0897,6,ticksend,2 -0x0951,5,changedir,2:4 -0x0895,6,takeitem,2 -0x08A7,6,dropitem,2:4 -0x0938,8,movetokafra,2:4 -0x0957,8,movefromkafra,2:4 -0x0917,10,useskilltopos,2:4:6:8 -0x085E,90,useskilltoposinfo,2:4:6:8:10 -0x0863,6,getcharnamerequest,2 -0x0937,6,solvecharname,2 -0x085A,12,searchstoreinfolistitemclick,2:6:10 -0x0941,2,searchstoreinfonextpage,0 -0x0918,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0936,-1,reqtradebuyingstore,2:4:8:12 -0x0892,6,reqclickbuyingstore,2 -0x0964,2,reqclosebuyingstore,0 -0x0869,-1,reqopenbuyingstore,2:4:8:9:89 -0x0874,18,bookingregreq,2,4:6 -//0x088E,8 // CZ_JOIN_BATTLE_FIELD -0x0958,-1,itemlistwindowselected,2:4:8:12 -0x0919,19,wanttoconnection,2:6:10:14:18 -0x08A8,26,partyinvite2,2 -//0x0888,4 // CZ_GANGSI_RANK -0x0877,26,friendslistadd,2 -0x023B,5,hommenu,2:4 -0x0956,36,storagepassword,2:4:20 - -//2013-06-05Ragexe (Shakto) -packet_ver: 38 -packet_keys: 0x646E08D9,0x5F153AB5,0x61B509B5 // [Shakto] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x0202,5,changedir,2:4 -0x07E4,6,takeitem,2 -0x0362,6,dropitem,2:4 -0x07EC,8,movetokafra,2:4 -0x0364,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0365,18,bookingregreq,2:4:6 -//0x0363,8 // CZ_JOIN_BATTLE_FIELD -0x0281,-1,itemlistwindowselected,2:4:8:12 -0x022D,19,wanttoconnection,2:6:10:14:18 -0x0802,26,partyinvite2,2 -//0x0436,4 // CZ_GANGSI_RANK -0x023B,26,friendslistadd,2 -0x0361,5,hommenu,2,4 -0x0883,36,storagepassword,2:4:20 -0x097C,4,ranklist,2 - -//2013-06-12Ragexe (Shakto) -packet_ver: 39 -packet_keys: 0x6D166F66,0x3C000FCF,0x295B0FCB // [Shakto] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x087E,5,changedir,2:4 -0x07E4,6,takeitem,2 -0x0362,6,dropitem,2:4 -0x07EC,8,movetokafra,2:4 -0x0364,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0365,18,bookingregreq,2:4:6 -//0x0363,8 // CZ_JOIN_BATTLE_FIELD -0x0281,-1,itemlistwindowselected,2:4:8:12 -0x0919,19,wanttoconnection,2:6:10:14:18 -0x0802,26,partyinvite2,2 -//0x0436,4 // CZ_GANGSI_RANK -0x0940,26,friendslistadd,2 -0x093A,5,hommenu,2:4 -0x0964,36,storagepassword,2:4:20 - -//2013-06-18Ragexe (Shakto) -packet_ver: 40 -packet_keys: 0x434115DE,0x34A10FE9,0x6791428E // [Shakto] -0x0889,7,actionrequest,2:6 -0x0951,10,useskilltoid,2:4:6 -0x088E,5,walktoxy,2 -0x0930,6,ticksend,2 -0x08A6,5,changedir,2:4 -0x0962,6,takeitem,2 -0x0917,6,dropitem,2:4 -0x0885,8,movetokafra,2:4 -0x0936,8,movefromkafra,2:4 -0x096A,10,useskilltopos,2:4:6:8 -0x094F,90,useskilltoposinfo,2:4:6:8:10 -0x0944,6,getcharnamerequest,2 -0x0945,6,solvecharname,2 -0x0890,12,searchstoreinfolistitemclick,2:6:10 -0x0363,2,searchstoreinfonextpage,0 -0x0281,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0891,-1,reqtradebuyingstore,2:4:8:12 -0x0862,6,reqclickbuyingstore,2 -0x085A,2,reqclosebuyingstore,0 -0x0932,-1,reqopenbuyingstore,2:4:8:9:89 -0x08A7,18,bookingregreq,2:4:6 -//0x087A,8 // CZ_JOIN_BATTLE_FIELD -0x0942,-1,itemlistwindowselected,2:4:8:12 -0x095B,19,wanttoconnection,2:6:10:14:18 -0x0887,26,partyinvite2,2 -//0x0878,4 // CZ_GANGSI_RANK -0x0953,26,friendslistadd,2 -0x02C4,5,hommenu,2:4 -0x0864,36,storagepassword,2:4:20 - -//2013-06-26Ragexe -packet_ver: 41 -packet_keys: 0x38F453EF,0x6A040FD8,0X65BD6668 // [Shakto] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x094D,5,changedir,2:4 -0x088B,6,takeitem,2 -0x0952,6,dropitem,2:4 -0x0921,8,movetokafra,2:4 -0x0817,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x0365,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0894,18,bookingregreq,2:4:6 -//0x0860,8 // CZ_JOIN_BATTLE_FIELD -0x08A5,-1,itemlistwindowselected,2:4:8:12 -0x088C,19,wanttoconnection,2:6:10:14:18 -0x0895,26,partyinvite2,2 -//0x088F,4 // CZ_GANGSI_RANK -0x08AB,26,friendslistadd,2 -0x0960,5,hommenu,2:4 -0x0930,36,storagepassword,2:4:20 - -//2013-07-03Ragexe -packet_ver: 42 -packet_keys: 0x4FF90E23,0x0F1432F2,0x4CFA1EDA // [Shakto] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x0930,5,changedir,2:4 -0x07E4,6,takeitem,2 -0x0362,6,dropitem,2:4 -0x07EC,8,movetokafra,2:4 -0x0364,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0202,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0365,18,bookingregreq,2:4:6 -//0x0363,8 // CZ_JOIN_BATTLE_FIELD -0x0281,-1,itemlistwindowselected,2:4:8:12 -0x022D,19,wanttoconnection,2:6:10:14:18 -0x0802,26,partyinvite2,2 -//0x0436,4 // CZ_GANGSI_RANK -0x0360,26,friendslistadd,2 -0x094A,5,hommenu,2:4 -0x0873,36,storagepassword,2:4:20 - -//2013-07-10Ragexe -packet_ver: 43 -packet_keys: 0x458F758F,0x4CCF3F8F,0x4A9C4237 -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x0202,5,changedir,2:4 -0x07E4,6,takeitem,2 -0x0362,6,dropitem,2:4 -0x07EC,8,movetokafra,2:4 -0x0364,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0365,18,bookingregreq,2:4:6 -//0x0363,8 // CZ_JOIN_BATTLE_FIELD -0x0281,-1,itemlistwindowselected,2:4:8:12 -0x022D,19,wanttoconnection,2:6:10:14:18 -0x0802,26,partyinvite2,2 -//0x0436,4 // CZ_GANGSI_RANK -0x023B,26,friendslistadd,2 -0x0361,5,hommenu,2:4 -0x0880,36,storagepassword,2:4:20 -0x0848,-1,cashshopbuy,2:6:4:10 -0x097D,288 //ZC_ACK_RANKING - -//2013-07-17Ragexe -packet_ver: 44 -packet_keys: 0x2BED4F91,0x5F9E00CF,0x5EE5520C -0x0918,7,actionrequest,2:6 -0x091E,10,useskilltoid,2:4:6 -0x083C,5,walktoxy,2 -0x02C4,6,ticksend,2 -0x088C,5,changedir,2:4 -0x08A9,6,takeitem,2 -0x0917,6,dropitem,2:4 -0x089B,8,movetokafra,2:4 -0x0956,8,movefromkafra,2:4 -0x0882,10,useskilltopos,2:4:6:8 -0x0952,90,useskilltoposinfo,2:4:6:8:10 -0x0958,6,getcharnamerequest,2 -0x0967,6,solvecharname,2 -0x0960,12,searchstoreinfolistitemclick,2:6:10 -0x0819,2,searchstoreinfonextpage,0 -0x086B,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x093B,-1,reqtradebuyingstore,2:4:8:12 -0x0898,6,reqclickbuyingstore,2 -0x096A,2,reqclosebuyingstore,0 -0x08AA,-1,reqopenbuyingstore,2:4:8:9:89 -0x0862,18,bookingregreq,2:4:6 -//0x08A6,8 // CZ_JOIN_BATTLE_FIELD -0x0897,-1,itemlistwindowselected,2:4:8:12 -0x091D,19,wanttoconnection,2:6:10:14:18 -0x092F,26,partyinvite2,2 -//0x086C,4 // CZ_GANGSI_RANK -0x0863,26,friendslistadd,2 -0x088A,5,hommenu,2:4 -0x095B,36,storagepassword,2:4:20 -0x09A6,12,ZC_BANKING_CHECK,2:10 -0x09A7,10,bankdeposit,2:6 -0x09A8,16,ZC_ACK_BANKING_DEPOSIT,2:4:12 -0x09A9,10,bankwithdrawal,2:6 -0x09AA,16,ZC_ACK_BANKING_WITHDRAW,2:4:12 -0x09AB,6,bankcheck,2 -0x09B6,6,bankopen,2 -0x09B7,4,ZC_ACK_OPEN_BANKING,2 -0x09B8,6,bankclose,2 -0x09B9,4,ZC_ACK_CLOSE_BANKING,2 - -//2013-07-31cRagexe -0x09ca,23 // ZC_SKILL_ENTRY5 -0x09cb,17 // ZC_USE_SKILL2 - -//2013-08-07Ragexe -packet_ver: 45 -packet_keys: 0x7E241DE0,0x5E805580,0x3D807D80 // [Shakto] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x0202,5,changedir,2:4 -0x07E4,6,takeitem,2 -0x0362,6,dropitem,2:4 -0x07EC,8,movetokafra,2:4 -0x0364,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0365,18,bookingregreq,2:4:6 -//0x363,8 // CZ_JOIN_BATTLE_FIELD -0x0281,-1,itemlistwindowselected,2:4:8:12 -0x022D,19,wanttoconnection,2:6:10:14:18 -0x0802,26,partyinvite2,2 -//0x436,4 // CZ_GANGSI_RANK -0x023B,26,friendslistadd,2 -0x0361,5,hommenu,2:4 -0x0887,36,storagepassword,2:4:20 -0x09C1,10,ZC_C_MARKERINFO,2:6:8 -// Merge Item -0x096D,-1,ZC_MERGE_ITEM_OPEN,2:4 // ZC_MERGE_ITEM_OPEN -0x096E,-1,mergeitem_req,2:4 // CZ_REQ_MERGE_ITEM -0x096F,7,ZC_ACK_MERGE_ITEM,2:4:6:7 // ZC_ACK_MERGE_ITEM -0x0974,2,mergeitem_cancel,0 // CZ_CANCEL_MERGE_ITEM - -//2013-12-23Ragexe -packet_ver: 46 -packet_keys: 0x631C511C,0x111C111C,0x111C111C // [Shakto] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x0202,5,changedir,2:4 -0x07E4,6,takeitem,2 -0x0362,6,dropitem,2:4 -0x07EC,8,movetokafra,2:4 -0x0364,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0365,18,bookingregreq,2:4:6 -//0x363,8 // CZ_JOIN_BATTLE_FIELD -0x0281,-1,itemlistwindowselected,2:4:8:12 -0x022D,19,wanttoconnection,2:6:10:14:18 -0x0802,26,partyinvite2,2 -//0x436,4 // CZ_GANGSI_RANK -0x023B,26,friendslistadd,2 -0x0361,5,hommenu,2:4 -0x08A4,36,storagepassword,2:4:20 -//New Packets -//0x097E,12 //ZC_UPDATE_RANKING_POINT -0x09CE,102,itemmonster,2 -0x09D4,2,npcshopclosed,0 -//NPC Market -0x09D5,-1 -0x09D6,-1,npcmarketpurchase,2:4:6 -0x09D7,-1 -0x09D8,2,npcmarketclosed,0 -// Clan System -0x0988,6 -0x0989,2 -0x098A,-1 -0x098D,-1,clanchat,2:4 -0x098E,-1 -// Sale -0x09AC,-1,salesearch,2:4:8 -0x09AD,8 -0x09AE,17,saleadd,2:6:8:12:16 -0x09AF,4 -0x09B0,8,saleremove,2:6 -0x09B1,4 -0x09B2,8 -0x09B3,4 -0x09B4,6,saleopen,2 -0x09BC,6,saleclose,2 -0x09C3,8,salerefresh,2:6 -0x09C4,8 - -// New Packet -0x097A,-1 // ZC_ALL_QUEST_LIST2 -0x09DB,-1 // ZC_NOTIFY_MOVEENTRY10 -0x09DC,-1 // ZC_NOTIFY_NEWENTRY10 -0x09DD,-1 // ZC_NOTIFY_STANDENTRY10 -0x09DF,7 // ZC_ACK_WHISPER02 - -//2014-10-16Ragexe -packet_ver: 50 -packet_keys: 0x2DFF467C,0x444B37EE,0x2C1B634F // [YomRawr] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x0967,5,changedir,2:4 -0x07E4,6,takeitem,2 -0x0362,6,dropitem,2:4 -0x07EC,8,movetokafra,2:4 -0x022D,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0365,18,bookingregreq,2:4 -// 0x0363,8 // CZ_JOIN_BATTLE_FIELD -0x0281,-1,itemlistwindowselected,2:4:8 -0x086E,19,wanttoconnection,2:6:10:14:18 -0x0802,26,partyinvite,2 -// 0x0922,4 // CZ_GANGSI_RANK -0x094B,26,friendslistadd,2 -0x0364,5,hommenu,2:4 -0x0936,36,storagepassword,0 -0x09DF,7 - -// New packet -0x0A00,269 // ZC_SHORTCUT_KEY_LIST_V3 -0x0A01,3,hotkeyrowshift,2 // CZ_SHORTCUTKEYBAR_ROTATE -0x0A02,4 // ZC_DRESSROOM_OPEN -0x0A0E,14 // ZC_BATTLEFIELD_NOTIFY_HP2 -0x09F7,75 // ZC_PROPERTY_HOMUN_2 -0x09E5,18 // ZC_DELETEITEM_FROM_MCSTORE2 -0x09E6,22 // ZC_UPDATE_ITEM_FROM_BUYING_STORE2 - -// Roulette System [Yommy] -0x0A19,2,rouletteopen,0 // CZ_REQ_OPEN_ROULETTE -0x0A1A,23 // ZC_ACK_OPEN_ROULETTE -0x0A1B,2,rouletteinfo,0 // CZ_REQ_ROULETTE_INFO -0x0A1C,-1 // ZC_ACK_ROULETTE_INFO -0x0A1D,2,rouletteclose,0 // CZ_REQ_CLOSE_ROULETTE -0x0A1E,3 // ZC_ACK_CLOSE_ROULETTE -0x0A1F,2,roulettegenerate,0 // CZ_REQ_GENERATE_ROULETTE -0x0A20,21 // ZC_ACK_GENERATE_ROULETTE -0x0A21,3,rouletterecvitem,2 // CZ_RECV_ROULETTE_ITEM -0x0A22,5 // ZC_RECV_ROULETTE_ITEM - -//2014-10-22bRagexe -packet_ver: 51 -packet_keys: 0x290551EA,0x2B952C75,0x2D67669B // [YomRawr] -0x006d,149 -0x023b,10,useskilltopos,2:4:6:8 -0x0281,-1,itemlistwindowselected,2:4:8:12 -0x035f,6,ticksend,2 -0x0360,6,reqclickbuyingstore,2 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x0368,6,solvecharname,2 -0x0369,7,actionrequest,2:6 -0x0437,5,walktoxy,2 -0x0438,36,storagepassword,2:4:20 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0817,2,reqclosebuyingstore,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0835,12,searchstoreinfolistitemclick,2:6:10 -0x083c,10,useskilltoid,2:4:6 -0x0878,8,movetokafra,2:4 -0x087d,6,dropitem,2:4 -0x0896,26,partyinvite2,2 -0x0899,5,hommenu,2:4 -0x08aa,8,movefromkafra,2:4 -//0x08ab,4 // CZ_GANGSI_RANK -0x08ad,5,changedir,2:4 -0x08e3,149 -0x091a,26,friendslistadd,2 -//0x092b,8 // CZ_JOIN_BATTLE_FIELD -0x093b,19,wanttoconnection,2:6:10:14:18 -0x0940,2,searchstoreinfonextpage,0 -0x094e,6,takeitem,2 -0x0955,18,bookingregreq,2:4:6 -0x096a,6,getcharnamerequest,2 - -// New Packet -0x0A18,14 // ZC_ACCEPT_ENTER3 -0x0A28,3 // ZC_ACK_OPENSTORE2 -0x09FD,-1 // ZC_NOTIFY_MOVEENTRY11 -0x09FE,-1 // ZC_NOTIFY_NEWENTRY11 -0x09FF,-1 // ZC_NOTIFY_STANDENTRY11 -//0x09F8,-1 // ZC_ALL_QUEST_LIST3 - -//2015-05-13aRagexe -packet_ver: 52 -packet_keys: 0x62C86D09,0x75944F17,0x112C133D // [YomRawr] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035F,6,ticksend,2 -0x0924,5,changedir,2:4 -0x0958,6,takeitem,2 -0x0885,6,dropitem,2:4 -0x0879,8,movetokafra,2:4 -0x0864,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x096A,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x022D,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0883,18,bookingregreq,2:4:6 -// 0x02C4,8 CZ_JOIN_BATTLE_FIELD -0x0960,-1,itemlistwindowselected,2:4:8:12 -0x0363,19,wanttoconnection,2:6:10:14:18 -0x094A,26,partyinvite2,2 -// 0x0927,4 CZ_GANGSI_RANK -0x08A8,26,friendslistadd,2 -0x0817,5,hommenu,2:4 -0x0923,36,storagepassword,2:4:20 - -// New Packets -0xA3B,-1 // ZC_HAT_EFFECT - -// RODEX Mail system -0x09E7,3 // ZC_NOTIFY_UNREADMAIL -0x09E8,11,mailrefresh,2:3 // CZ_OPEN_MAILBOX -0x09E9,2,dull,0 // CZ_CLOSE_MAILBOX -0x09EA,11,mailread,2:3 // CZ_REQ_READ_MAIL -0x09EB,-1 // ZC_ACK_READ_MAIL -0x09EC,-1,mailsend,2:4:28:52:60:62:64 // CZ_REQ_WRITE_MAIL -0x09ED,3 // ZC_ACK_WRITE_MAIL -0x09EE,11,mailrefresh,2:3 // CZ_REQ_NEXT_MAIL_LIST -0x09EF,11,mailrefresh,2:3 // CZ_REQ_REFRESH_MAIL_LIST -0x09F0,-1 // ZC_ACK_MAIL_LIST -0x09F1,11,mailgetattach,0 // CZ_REQ_ZENY_FROM_MAIL -0x09F2,12 // ZC_ACK_ZENY_FROM_MAIL -0x09F3,11,mailgetattach,0 // CZ_REQ_ITEM_FROM_MAIL -0x09F4,12 // ZC_ACK_ITEM_FROM_MAIL -0x09F5,11,maildelete,0 // CZ_REQ_DELETE_MAIL -0x09F6,11 // ZC_ACK_DELETE_MAIL -0x0A03,2,mailcancel,0 // CZ_REQ_CANCEL_WRITE_MAIL -0x0A04,6,mailsetattach,2:4 // CZ_REQ_ADD_ITEM_TO_MAIL -0x0A05,53 // ZC_ACK_ADD_ITEM_TO_MAIL -0x0A06,6,mailwinopen,2:4 // CZ_REQ_REMOVE_ITEM_MAIL -0x0A07,9 // ZC_ACK_REMOVE_ITEM_MAIL -0x0A08,26,mailbegin,0 // CZ_REQ_OPEN_WRITE_MAIL -0x0A12,27 // ZC_ACK_OPEN_WRITE_MAIL -0x0A13,26,mailreceiver,2 // CZ_CHECK_RECEIVE_CHARACTER_NAME -0x0A14,10 // ZC_CHECK_RECEIVE_CHARACTER_NAME -0x0A32,2 // ZC_OPEN_RODEX_THROUGH_NPC_ONLY - -// New EquipPackets Support -0x0A09,45 // ZC_ADD_EXCHANGE_ITEM3 -0x0A0A,47 // ZC_ADD_ITEM_TO_STORE3 -0x0A0B,47 // ZC_ADD_ITEM_TO_CART3 -0x0A0C,56 // ZC_ITEM_PICKUP_ACK_V6 -0x0A0D,-1 // ZC_INVENTORY_ITEMLIST_EQUIP_V6 -0x0A0F,-1 // ZC_CART_ITEMLIST_EQUIP_V6 -0x0A10,-1 // ZC_STORE_ITEMLIST_EQUIP_V6 -0x0A2D,-1 // ZC_EQUIPWIN_MICROSCOPE_V6 - -// OneClick Itemidentify -0x0A35,4,oneclick_itemidentify,2 // CZ_REQ_ONECLICK_ITEMIDENTIFY - -// Achievement System -0x0A23,-1 // ZC_ALL_ACH_LIST -0x0A24,66 // ZC_ACH_UPDATE -0x0A25,6,dull,0 // CZ_REQ_ACH_REWARD -0x0A26,7 // ZC_REQ_ACH_REWARD_ACK - -// Title System -0x0A2E,6,dull,0 // CZ_REQ_CHANGE_TITLE -0x0A2F,7 // ZC_ACK_CHANGE_TITLE -0x0A30,106 // ZC_ACK_REQNAMEALL2 - -// Pet Evolution System -0x09FB,-1,dull,0 // CZ_PET_EVOLUTION -0x09FC,6 // ZC_PET_EVOLUTION_RESULT - -//2015-05-20aRagexe -0x0A3D,18,saleadd,2:6:8:12:16 - -//2015-09-16Ragexe -packet_ver: 53 -packet_keys: 0x17F83A19,0x116944F4,0x1CC541E9 // [Napster] -0x0869,7,actionrequest,2:6 -0x093E,10,useskilltoid,2:4:6 -0x0877,5,walktoxy,2 -0x08AC,6,ticksend,2 -0x0936,5,changedir,2:4 -0x089C,6,takeitem,2 -0x092F,6,dropitem,2:4 -0x0934,8,movetokafra,2:4 -0x085E,8,movefromkafra,2:4 -0x022D,10,useskilltopos,2:4:6:8 -0x0873,90,useskilltoposinfo,2:4:6:8:10 -0x095A,6,getcharnamerequest,2 -0x0942,6,solvecharname,2 -0x087F,12,searchstoreinfolistitemclick,2:6:10 -0x0817,2,searchstoreinfonextpage,0 -0x0920,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0881,-1,reqtradebuyingstore,2:4:8:12 -0x0835,6,reqclickbuyingstore,2 -0x092E,2,reqclosebuyingstore,0 -0x0948,-1,reqopenbuyingstore,2:4:8:9:89 -0x089B,18,bookingregreq,2:4:6 -// 0x094F,8 CZ_JOIN_BATTLE_FIELD -0x0961,-1,itemlistwindowselected,2:4:8:12 -0x0969,19,wanttoconnection,2:6:10:14:18 -0x0924,26,partyinvite2,2 -// 0x0938,4 CZ_GANGSI_RANK -0x089E,26,friendslistadd,2 -0x0960,5,hommenu,2:4 -0x0941,36,storagepassword,2:4:20 - -// New Packet -0x097F,-1 // ZC_SELECTCART -0x0980,7,selectcart,2:6 // CZ_SELECTCART - -//2015-10-01bRagexeRE -packet_ver: 54 -packet_keys: 0x45B945B9,0x45B945B9,0x45B945B9 // [Dastgir] -0x0369,7,actionrequest,2:6 -0x083c,10,useskilltoid,2:4:6 -0x0437,5,walktoxy,2 -0x035f,6,ticksend,2 -0x0202,5,changedir,2:4 -0x07e4,6,takeitem,2 -0x0362,6,dropitem,2:4 -0x07ec,8,movetokafra,2:4 -0x0364,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposmoreinfo,2:4:6:8:10 -0x096a,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0811,-1,reqtradebuyingstore,2:4:8:12 -0x0360,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x0815,-1,reqopenbuyingstore,2:4:8:9:89 -0x0365,18,partybookingregisterreq,2:4:6 -//0x0363,8 // CZ_JOIN_BATTLE_FIELD -0x0281,-1,itemlistwindowselected,2:4:8:12 -0x022d,19,wanttoconnection,2:6:10:14:18 -0x0802,26,partyinvite2,2 -//0x0436,4 // CZ_GANGSI_RANK -0x023b,26,friendslistadd,2 -0x0361,5,hommenu,2:4 -0x0860,36,storagepassword,2:4:20 - -//2015-11-04aRagexe -packet_ver: 55 -packet_keys: 0x4C17382A,0x7ED174C9,0x29961E4F // [Winnie] -0x0369,7,actionrequest,2:6 -0x083C,10,useskilltoid,2:4:6 -0x0363,5,walktoxy,2 -0x0886,6,ticksend,2 -0x0928,5,changedir,2:4 -0x0964,6,takeitem,2 -0x0437,6,dropitem,2:4 -0x088B,8,movetokafra,2:4 -0x0364,8,movefromkafra,2:4 -0x0438,10,useskilltopos,2:4:6:8 -0x0366,90,useskilltoposinfo,2:4:6:8:10 -0x0887,6,getcharnamerequest,2 -0x0368,6,solvecharname,2 -0x0838,12,searchstoreinfolistitemclick,2:6:10 -0x0835,2,searchstoreinfonextpage,0 -0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 -0x0815,-1,reqtradebuyingstore,2:4:8:12 -0x0436,6,reqclickbuyingstore,2 -0x0817,2,reqclosebuyingstore,0 -0x023B,-1,reqopenbuyingstore,2:4:8:9:89 -0x0811,18,bookingregreq,2:4:6 -//0x0939,8 CZ_JOIN_BATTLE_FIELD -0x093A,-1,itemlistwindowselected,2:4:8:12 -0x0360,19,wanttoconnection,2:6:10:14:18 -0x08A5,26,partyinvite2,2 -//0x08A3,4 CZ_GANGSI_RANK -0x07EC,26,friendslistadd,2 -0x088D,5,hommenu,2:4 -0x0940,36,storagepassword,2:4:20 - -// 2016-03-02bRagexe -0x0A51,34 - -// 2016-03-30aRagexe -0x0A6E,-1,mailsend,2:4:28:52:60:62:64:68 // CZ_REQ_WRITE_MAIL2 - -// 2016-06-01aRagexe -0x0A7D,-1 - -// 2017-05-02dRagexeRE -0x0A43,85 -0x0A44,-1 -0x0ABD,10 - -//Add new packets here -//packet_ver: 56 diff --git a/db/pre-re/achievement_db.yml b/db/pre-re/achievement_db.yml new file mode 100644 index 0000000000..24e7173607 --- /dev/null +++ b/db/pre-re/achievement_db.yml @@ -0,0 +1,2407 @@ +# This file is a part of rAthena. +# Copyright(C) 2017 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 . +# +########################################################################### +# Custom Achievement Database +########################################################################### +# +# Achievement Settings +# +########################################################################### +# ID - Unique achievement ID. +########################################################################### +# Group - Achievement group type. Each achievement type calls a specific +# objective check. +# Valid groups: +# AG_ADD_FRIEND +# AG_ADVENTURE +# AG_BABY +# AG_BATTLE +# AG_CHATTING +# AG_CHATTING_COUNT +# AG_CHATTING_CREATE +# AG_CHATTING_DYING +# AG_EAT +# AG_GET_ITEM +# AG_GET_ZENY +# AG_GOAL_ACHIEVE +# AG_GOAL_LEVEL +# AG_GOAL_STATUS +# AG_HEAR +# AG_JOB_CHANGE +# AG_MARRY +# AG_PARTY +# AG_ENCHANT_FAIL +# AG_ENCHANT_SUCCESS +# AG_SEE +# AG_SPEND_ZENY +# AG_TAMING +########################################################################### +# Name - Achievement name. Used when sending rewards through RODEX. +########################################################################### +# Target - A list of monster ID and count values that the achievement +# requires. The target count can also be used for achievements that keep +# a counter while not being related to monster kills. +# Capped at MAX_ACHIEVEMENT_OBJECTIVES. +########################################################################### +# Condition - A conditional statement that must be met for the achievement +# to be considered complete. +########################################################################### +# Map - A map name that is used for the AG_CHATTING type which increments +# the counter based on the player's map. +########################################################################### +# Dependent: - A list of achievement IDs that need to be completed before +# this achievement is considered complete. +########################################################################### +# Reward - A list of rewards that are given on completion. All fields are +# optional. +# ItemID: Item ID +# Amount: Amount of Item ID (default 1) +# Script: Bonus Script +# TitleID: Title ID +########################################################################### +# Score - Achievement points that are given on completion. +########################################################################### + +Achievements: + - ID: 110000 + Group: "AG_EAT" + Name: "At this time I live to eat" + Score: 10 + - ID: 110001 + Group: "AG_SEE" + Name: "A fan of this polarity" + Score: 10 + - ID: 120001 + Group: "AG_ADVENTURE" + Name: "North Prontera Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120002 + Group: "AG_ADVENTURE" + Name: "North Prontera Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120003 + Group: "AG_ADVENTURE" + Name: "North Prontera Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120004 + Group: "AG_ADVENTURE" + Name: "West Prontera Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120005 + Group: "AG_ADVENTURE" + Name: "West Prontera Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120006 + Group: "AG_ADVENTURE" + Name: "East Prontera Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120007 + Group: "AG_ADVENTURE" + Name: "South Prontera Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120008 + Group: "AG_ADVENTURE" + Name: "South Prontera Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120009 + Group: "AG_ADVENTURE" + Name: "South Prontera Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120010 + Group: "AG_ADVENTURE" + Name: "South Prontera Field Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120011 + Group: "AG_ADVENTURE" + Name: "East Geffen Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120012 + Group: "AG_ADVENTURE" + Name: "Southeast Geffen Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120013 + Group: "AG_ADVENTURE" + Name: "Northwest Geffen Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120014 + Group: "AG_ADVENTURE" + Name: "Northwest Geffen Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120015 + Group: "AG_ADVENTURE" + Name: "Northwest Geffen Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120016 + Group: "AG_ADVENTURE" + Name: "South Geffen Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120017 + Group: "AG_ADVENTURE" + Name: "South Geffen Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120018 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120019 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120020 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120021 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120022 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(5)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120023 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(6)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120024 + Group: "AG_ADVENTURE" + Name: "Southwest Payon Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120025 + Group: "AG_ADVENTURE" + Name: "Southwest Payon Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120026 + Group: "AG_ADVENTURE" + Name: "Southwest Payon Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120027 + Group: "AG_ADVENTURE" + Name: "Southwest Payon Field Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120028 + Group: "AG_ADVENTURE" + Name: "East Payon Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120029 + Group: "AG_ADVENTURE" + Name: "East Payon Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120030 + Group: "AG_ADVENTURE" + Name: "East Payon Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120031 + Group: "AG_ADVENTURE" + Name: "East Payon Field Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120032 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120033 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120034 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120035 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120036 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(5)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120037 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120038 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120039 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120040 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120041 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(5)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120042 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(6)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120043 + Group: "AG_ADVENTURE" + Name: "South Aldebaran Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120044 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120045 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120046 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120047 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120048 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(5)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120049 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(6)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120050 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(7)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120051 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(8)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120052 + Group: "AG_ADVENTURE" + Name: "Border Checkpoint Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120053 + Group: "AG_ADVENTURE" + Name: "Border Checkpoint Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120054 + Group: "AG_ADVENTURE" + Name: "Kiel Hyre Mansion Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120055 + Group: "AG_ADVENTURE" + Name: "El Mes Plateau Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120056 + Group: "AG_ADVENTURE" + Name: "El Mes Plateau Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120057 + Group: "AG_ADVENTURE" + Name: "El Mes Plateau Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120058 + Group: "AG_ADVENTURE" + Name: "El Mes Gorge Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120059 + Group: "AG_ADVENTURE" + Name: "Kiel Hyre Academy Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120060 + Group: "AG_ADVENTURE" + Name: "Guard Camp Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120061 + Group: "AG_ADVENTURE" + Name: "Yuno Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120062 + Group: "AG_ADVENTURE" + Name: "Front of Thanatos Tower Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120063 + Group: "AG_ADVENTURE" + Name: "Hugel Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120064 + Group: "AG_ADVENTURE" + Name: "Hugel Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120065 + Group: "AG_ADVENTURE" + Name: "Hugel Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120066 + Group: "AG_ADVENTURE" + Name: "Abyss Lake Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120067 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120068 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120069 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120070 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120071 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(5)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120072 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(6)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120073 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(7)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120074 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(8)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120075 + Group: "AG_ADVENTURE" + Name: "Lighthalzen Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120076 + Group: "AG_ADVENTURE" + Name: "Lighthalzen Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120077 + Group: "AG_ADVENTURE" + Name: "Lighthalzen Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120078 + Group: "AG_ADVENTURE" + Name: "Rachel Audhumbla Plains Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120079 + Group: "AG_ADVENTURE" + Name: "Rachel Plains Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120080 + Group: "AG_ADVENTURE" + Name: "Rachel Plains Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120081 + Group: "AG_ADVENTURE" + Name: "Rachel Plains Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120082 + Group: "AG_ADVENTURE" + Name: "Rachel Audhumbla Grassland Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120083 + Group: "AG_ADVENTURE" + Name: "Rachel Audhumbla Grassland Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120084 + Group: "AG_ADVENTURE" + Name: "Portus Luna Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120085 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120086 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120087 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120088 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120089 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(5)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120090 + Group: "AG_ADVENTURE" + Name: "Eclage Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120091 + Group: "AG_ADVENTURE" + Name: "North Bitfrost Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120092 + Group: "AG_ADVENTURE" + Name: "South Bitfrost Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120093 + Group: "AG_ADVENTURE" + Name: "Splendide Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120094 + Group: "AG_ADVENTURE" + Name: "Splendide Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120095 + Group: "AG_ADVENTURE" + Name: "Splendide Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120096 + Group: "AG_ADVENTURE" + Name: "Manuk Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120097 + Group: "AG_ADVENTURE" + Name: "Manuk Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120098 + Group: "AG_ADVENTURE" + Name: "Manuk Field Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120099 + Group: "AG_ADVENTURE" + Name: "Outskirts of Kamidal Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120100 + Group: "AG_ADVENTURE" + Name: "Outskirts of Kamidal Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120101 + Group: "AG_ADVENTURE" + Name: "Amatsu Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120102 + Group: "AG_ADVENTURE" + Name: "Kunlun Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120103 + Group: "AG_ADVENTURE" + Name: "Gonryun Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120104 + Group: "AG_ADVENTURE" + Name: "Ayothaya Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120105 + Group: "AG_ADVENTURE" + Name: "Moscovia Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120106 + Group: "AG_ADVENTURE" + Name: "Brasilis Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120107 + Group: "AG_ADVENTURE" + Name: "Dewata Field Exploration" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120108 + Group: "AG_ADVENTURE" + Name: "Malaya Field Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120109 + Group: "AG_ADVENTURE" + Name: "Malaya Field Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 10 + - ID: 120110 + Group: "AG_ADVENTURE" + Name: "Abbey Underground Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120111 + Group: "AG_ADVENTURE" + Name: "Abyss Lake Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120112 + Group: "AG_ADVENTURE" + Name: "Clock Tower Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120113 + Group: "AG_ADVENTURE" + Name: "Amatsu Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120114 + Group: "AG_ADVENTURE" + Name: "Ant Hell Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120115 + Group: "AG_ADVENTURE" + Name: "Ayothaya Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120116 + Group: "AG_ADVENTURE" + Name: "Comodo Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120117 + Group: "AG_ADVENTURE" + Name: "Brasilis Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120118 + Group: "AG_ADVENTURE" + Name: "Clock Tower Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120119 + Group: "AG_ADVENTURE" + Name: "Istana Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120120 + Group: "AG_ADVENTURE" + Name: "Scaraba Hole Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120121 + Group: "AG_ADVENTURE" + Name: "Bitfrost Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120122 + Group: "AG_ADVENTURE" + Name: "Einbroch Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120123 + Group: "AG_ADVENTURE" + Name: "Geffen Underground Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120124 + Group: "AG_ADVENTURE" + Name: "Glastheim Dungeon Exploration(1)" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120125 + Group: "AG_ADVENTURE" + Name: "Glastheim Dungeon Exploration(2)" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120126 + Group: "AG_ADVENTURE" + Name: "Glastheim Dungeon Exploration(3)" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120127 + Group: "AG_ADVENTURE" + Name: "Glastheim Dungeon Exploration(4)" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120128 + Group: "AG_ADVENTURE" + Name: "Kunlun Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120129 + Group: "AG_ADVENTURE" + Name: "Rachel Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120130 + Group: "AG_ADVENTURE" + Name: "Sphinx Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120131 + Group: "AG_ADVENTURE" + Name: "Izlude Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120132 + Group: "AG_ADVENTURE" + Name: "Robot Factory Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120133 + Group: "AG_ADVENTURE" + Name: "Bio Lab Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120134 + Group: "AG_ADVENTURE" + Name: "Gonryun Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120135 + Group: "AG_ADVENTURE" + Name: "Nogg Road Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120136 + Group: "AG_ADVENTURE" + Name: "Coal Mine Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120137 + Group: "AG_ADVENTURE" + Name: "Pyramid Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120138 + Group: "AG_ADVENTURE" + Name: "Orc Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120139 + Group: "AG_ADVENTURE" + Name: "Payon Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120140 + Group: "AG_ADVENTURE" + Name: "Labyrinth Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120141 + Group: "AG_ADVENTURE" + Name: "Undersea Tunnel Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120142 + Group: "AG_ADVENTURE" + Name: "Thanatos Tower Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120143 + Group: "AG_ADVENTURE" + Name: "Thor Volcano Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120144 + Group: "AG_ADVENTURE" + Name: "Sunken Ship Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120145 + Group: "AG_ADVENTURE" + Name: "Turtle Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 120146 + Group: "AG_ADVENTURE" + Name: "Toy Factory Dungeon Exploration" + #Reward: + # ItemID: 22876 + Score: 20 + - ID: 127001 + Group: "AG_CHATTING" + Name: "Prontera Contribution" + Map: "prontera" + Target: + Count: 100000 + Score: 10 + - ID: 127002 + Group: "AG_CHATTING" + Name: "Geffen Contribution" + Map: "geffen" + Target: + Count: 100000 + Score: 10 + - ID: 127003 + Group: "AG_CHATTING" + Name: "Morocc Contribution" + Map: "morocc" + Target: + Count: 100000 + Score: 10 + - ID: 127004 + Group: "AG_CHATTING" + Name: "Payon Contribution" + Map: "payon" + Target: + Count: 100000 + Score: 10 + - ID: 127005 + Group: "AG_CHATTING" + Name: "Yuno Contribution" + Map: "yuno" + Target: + Count: 100000 + Score: 10 + - ID: 127006 + Group: "AG_CHATTING" + Name: "Lighthalzen Contribution" + Map: "lighthalzen" + Target: + Count: 100000 + Score: 10 + - ID: 127007 + Group: "AG_CHATTING" + Name: "Einbroch Contribution" + Map: "einbroch" + Target: + Count: 100000 + Score: 10 + - ID: 127008 + Group: "AG_CHATTING" + Name: "Rachel Contribution" + Map: "rachel" + Target: + Count: 100000 + Score: 10 + - ID: 127009 + Group: "AG_CHATTING" + Name: "Veins Contribution" + Map: "veins" + Target: + Count: 100000 + Score: 10 + - ID: 128000 + Group: "AG_BATTLE" + Name: "Uninvited Guest" + #Target: + # - MobID: 2996 + # Count: 1 + Score: 10 + - ID: 128001 + Group: "AG_BATTLE" + Name: "Strange Guest" + #Target: + # - MobID: 2996 + # Count: 10 + Score: 10 + - ID: 128002 + Group: "AG_BATTLE" + Name: "Get along with map..." + #Target: + # - MobID: 2996 + # Count: 25 + Score: 20 + - ID: 128003 + Group: "AG_BATTLE" + Name: "Welcomed Guest" + #Target: + # - MobID: 2996 + # Count: 50 + Score: 30 + - ID: 128004 + Group: "AG_BATTLE" + Name: "Kimmy's best friend" + #Target: + # - MobID: 2996 + # Count: 100 + Score: 50 + - ID: 128005 + Group: "AG_BATTLE" + Name: "Novice Angler" + #Target: + # - MobID: 2322 + # Count: 1 + Score: 10 + - ID: 128006 + Group: "AG_BATTLE" + Name: "Juicy Hunter" + #Target: + # - MobID: 2322 + # Count: 10 + Score: 20 + - ID: 128007 + Group: "AG_BATTLE" + Name: "Rhythm Master" + #Target: + # - MobID: 2322 + # Count: 50 + Score: 50 + - ID: 128008 + Group: "AG_BATTLE" + Name: "Bold Adventurer" + Target: + - MobID: 1929 + Count: 1 + Score: 10 + - ID: 128009 + Group: "AG_BATTLE" + Name: "Baphomet Hatred" + Target: + - MobID: 1929 + Count: 10 + Score: 20 + - ID: 128010 + Group: "AG_BATTLE" + Name: "Goat's Nemesis" + Target: + - MobID: 1929 + Count: 50 + Score: 50 + - ID: 128011 + Group: "AG_BATTLE" + Name: "Ordinary Tourist" + #Target: + # - MobID: 3029 + # Count: 1 + Score: 10 + - ID: 128012 + Group: "AG_BATTLE" + Name: "Backcountry Expert" + #Target: + # - MobID: 3029 + # Count: 10 + Score: 20 + - ID: 128013 + Group: "AG_BATTLE" + Name: "Able to eat more like this" + #Target: + # - MobID: 3029 + # Count: 50 + Score: 50 + - ID: 128014 + Group: "AG_BATTLE" + Name: "Digest hard meat" + #Target: + # - MobID: 2319 + # Count: 1 + Score: 10 + - ID: 128015 + Group: "AG_BATTLE" + Name: "Master of Escape" + #Target: + # - MobID: 2319 + # Count: 10 + Score: 20 + - ID: 128016 + Group: "AG_BATTLE" + Name: "Immortal Hunter" + #Target: + # - MobID: 2319 + # Count: 50 + Score: 50 + - ID: 128017 + Group: "AG_BATTLE" + Name: "Stood up and overcame despair" + #Target: + # - MobID: 3097 + # Count: 1 + Score: 10 + - ID: 128018 + Group: "AG_BATTLE" + Name: "Ember of Hope" + #Target: + # - MobID: 3097 + # Count: 10 + Score: 10 + - ID: 128019 + Group: "AG_BATTLE" + Name: "Pouring Aurora" + #Target: + # - MobID: 3097 + # Count: 25 + Score: 20 + - ID: 128020 + Group: "AG_BATTLE" + Name: "Who is desperate? I am hopeless!" + #Target: + # - MobID: 3097 + # Count: 50 + Score: 30 + - ID: 128021 + Group: "AG_BATTLE" + Name: "I know god will save the world" + #Target: + # - MobID: 3097 + # Count: 100 + Score: 50 + - ID: 128022 + Group: "AG_BATTLE" + Name: "There was mercy in Morocc army" + #Target: + # - MobID: 3000 + # Count: 1 + Score: 10 + - ID: 128023 + Group: "AG_BATTLE" + Name: "There was fear in Morocc army" + #Target: + # - MobID: 3000 + # Count: 10 + Score: 20 + - ID: 128024 + Group: "AG_BATTLE" + Name: "Guard of weak army" + #Target: + # - MobID: 3000 + # Count: 50 + Score: 50 + - ID: 128025 + Group: "AG_BATTLE" + Name: "Audience with the queen" + #Target: + # - MobID: 2529 + # Count: 1 + Score: 10 + - ID: 128026 + Group: "AG_BATTLE" + Name: "Warm earth" + #Target: + # - MobID: 2533 + # Count: 1 + Score: 10 + - ID: 128027 + Group: "AG_BATTLE" + Name: "Water is very good exactly" + #Target: + # - MobID: 2534 + # Count: 1 + Score: 10 + - ID: 128028 + Group: "AG_BATTLE" + Name: "Pleasant breeze" + #Target: + # - MobID: 2535 + # Count: 1 + Score: 10 + - ID: 128029 + Group: "AG_BATTLE" + Name: "Visitor of old castle" + #Target: + # - MobID: 2476 + # Count: 1 + Score: 10 + - ID: 128030 + Group: "AG_BATTLE" + Name: "Lord of old castle" + #Target: + # - MobID: 2476 + # Count: 10 + Score: 20 + - ID: 128031 + Group: "AG_BATTLE" + Name: "Conqueror of old castle" + #Target: + # - MobID: 2476 + # Count: 50 + Score: 50 + - ID: 128032 + Group: "AG_BATTLE" + Name: "Haggard sucker" + #Target: + # - MobID: 3150 + # Count: 1 + Score: 10 + - ID: 128033 + Group: "AG_BATTLE" + Name: "Hope of the Knight" + #Target: + # - MobID: 3150 + # Count: 10 + Score: 20 + - ID: 128034 + Group: "AG_BATTLE" + Name: "Guardian of the Dawn" + #Target: + # - MobID: 3150 + # Count: 50 + Score: 50 + - ID: 128035 + Group: "AG_BATTLE" + Name: "Time Traveler" + #Target: + # - MobID: 3190 + # Count: 1 + Score: 10 + - ID: 128036 + Group: "AG_BATTLE" + Name: "Restore ancient relic" + #Target: + # - MobID: 3190 + # Count: 10 + Score: 20 + - ID: 128037 + Group: "AG_BATTLE" + Name: "Master of relic transport" + #Target: + # - MobID: 3190 + # Count: 50 + Score: 50 + - ID: 128038 + Group: "AG_BATTLE" + Name: "Show Jailbreak to the captain" + #Target: + # - MobID: 3181 + # Count: 1 + Score: 10 + - ID: 128039 + Group: "AG_BATTLE" + Name: "Show Jailbreak to the weak captain" + #Target: + # - MobID: 3188 + # Count: 1 + Score: 10 + - ID: 128040 + Group: "AG_BATTLE" + Name: "Riot on board" + #Target: + # - MobID: 3181 + # Count: 1 + Score: 20 + - ID: 128041 + Group: "AG_BATTLE" + Name: "Turmoil on board" + #Target: + # - MobID: 3181 + # Count: 10 + Score: 20 + - ID: 128042 + Group: "AG_BATTLE" + Name: "Rebellion on board" + #Target: + # - MobID: 3181 + # Count: 50 + Score: 50 + - ID: 128043 + Group: "AG_BATTLE" + Name: "Revolt of Riot" + #Target: + # - MobID: 3188 + # Count: 50 + Score: 50 + - ID: 128044 + Group: "AG_BATTLE" + Name: "Magic tournament champion" + #Target: + # - MobID: 2564 + # Count: 1 + Score: 10 + - ID: 128045 + Group: "AG_BATTLE" + Name: "Gladiator of Coliseum" + #Target: + # - MobID: 2564 + # Count: 10 + Score: 20 + - ID: 128046 + Group: "AG_BATTLE" + Name: "Slayer of Colosseum" + #Target: + # - MobID: 2564 + # Count: 50 + Score: 50 + - ID: 128047 + Group: "AG_BATTLE" + Name: "Endless Tower challenger" + Target: + - MobID: 1956 + Count: 1 + Score: 10 + - ID: 128048 + Group: "AG_BATTLE" + Name: "Endless Tower Slayer" + Target: + - MobID: 1956 + Count: 10 + Score: 20 + - ID: 128049 + Group: "AG_BATTLE" + Name: "Lord of the tower" + Target: + - MobID: 1956 + Count: 50 + Score: 50 + - ID: 128050 + Group: "AG_BATTLE" + Name: "Novice Exorcist" + #Target: + # - MobID: 2327 + # Count: 1 + Score: 10 + - ID: 128051 + Group: "AG_BATTLE" + Name: "Experienced Exorcist" + #Target: + # - MobID: 2327 + # Count: 10 + Score: 20 + - ID: 128052 + Group: "AG_BATTLE" + Name: "Legendary Exorcist" + #Target: + # - MobID: 2327 + # Count: 50 + Score: 50 + - ID: 129001 + Group: "AG_ADVENTURE" + Name: "Prontera Explorer" + Dependent: [120001, 120002, 120003, 120004, 120005, 120006, 120007, 120008, 120009, 120010] + Reward: + ItemID: 644 + Score: 20 + - ID: 129002 + Group: "AG_ADVENTURE" + Name: "Geffen Explorer" + Dependent: [120011, 120012, 120013, 120014, 120015, 120016, 120017] + Reward: + ItemID: 644 + Score: 20 + - ID: 129003 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Explorer" + Dependent: [120018, 120019, 120020, 120021, 120022, 120023] + Reward: + ItemID: 644 + Score: 20 + - ID: 129004 + Group: "AG_ADVENTURE" + Name: "Payon Explorer" + Dependent: [120024, 120025, 120026, 120027, 120028, 120029, 120030, 120031] + Reward: + ItemID: 644 + Score: 20 + - ID: 129005 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Explorer" + Dependent: [120032, 120033, 120034, 120035, 120036] + Reward: + ItemID: 644 + Score: 20 + - ID: 129006 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Explorer" + Dependent: [120037, 120038, 120039, 120040, 120041, 120042, 120043] + Reward: + ItemID: 644 + Score: 20 + - ID: 129007 + Group: "AG_ADVENTURE" + Name: "Comodo Explorer" + Dependent: [120044, 120045, 120046, 120047, 120048, 120049, 120050, 120051] + Reward: + ItemID: 644 + Score: 20 + - ID: 129008 + Group: "AG_ADVENTURE" + Name: "Rune Midgard Explorer" + Dependent: [129001, 129002, 129003, 129004, 129005, 129006, 129007] + Reward: + ItemID: 617 + Score: 50 + - ID: 129009 + Group: "AG_ADVENTURE" + Name: "Yuno Explorer" + Dependent: [120052, 120053, 120054, 120055, 120056, 120057, 120058, 120059, 120060, 120061] + Reward: + ItemID: 644 + Score: 20 + - ID: 129010 + Group: "AG_ADVENTURE" + Name: "Hugel Explorer" + Dependent: [120062, 120063, 120064, 120065, 120066] + Reward: + ItemID: 644 + Score: 20 + - ID: 129011 + Group: "AG_ADVENTURE" + Name: "Einbroch Explorer" + Dependent: [120067, 120068, 120069, 120070, 120071, 120072, 120073, 120074] + Reward: + ItemID: 644 + Score: 20 + - ID: 129012 + Group: "AG_ADVENTURE" + Name: "Lighthalzen Explorer" + Dependent: [120075, 120076, 120077] + Reward: + ItemID: 644 + Score: 20 + - ID: 129013 + Group: "AG_ADVENTURE" + Name: "Schwarzwald Explorer" + Dependent: [129009, 129010, 129011, 129012] + Reward: + ItemID: 617 + Score: 50 + - ID: 129014 + Group: "AG_ADVENTURE" + Name: "Rachel Explorer" + Dependent: [120078, 120079, 120080, 120081, 120082, 120083, 120084] + Reward: + ItemID: 644 + Score: 20 + - ID: 129015 + Group: "AG_ADVENTURE" + Name: "Veins Explorer" + Dependent: [120085, 120086, 120087, 120088, 120089] + Reward: + ItemID: 644 + Score: 20 + - ID: 129016 + Group: "AG_ADVENTURE" + Name: "Arunafeltz Explorer" + Dependent: [129014, 129015] + Reward: + ItemID: 617 + Score: 50 + - ID: 129017 + Group: "AG_ADVENTURE" + Name: "Laphine Explorer" + Dependent: [120090, 120091, 120092, 120093, 120094, 120095] + Reward: + ItemID: 644 + Score: 20 + - ID: 129018 + Group: "AG_ADVENTURE" + Name: "Manuk Explorer" + Dependent: [120096, 120097, 120098, 120099, 120100] + Reward: + ItemID: 644 + Score: 20 + - ID: 129019 + Group: "AG_ADVENTURE" + Name: "Eclage Explorer" + Dependent: [129017, 129018] + Reward: + ItemID: 617 + Score: 50 + - ID: 129020 + Group: "AG_ADVENTURE" + Name: "Localizing fields explorer" + Dependent: [120101, 120102, 120103, 120104, 120105, 120106, 120107, 120108, 120109] + Reward: + ItemID: 617 + Score: 50 + - ID: 130000 # Talk to Prince NPC (npc/quests/quests_morocc.txt L5288) + Group: "AG_CHATTING" + Name: "Socialite debut" + Reward: + TitleID: 1034 + Score: 10 + - ID: 170000 + Group: "AG_HEAR" + Name: "Song chamber is not an accident" + Score: 10 + - ID: 190000 + Group: "AG_CHATTING" + Name: "Alliance workers of merchant city" + Score: 50 + - ID: 200000 + Group: "AG_GOAL_LEVEL" + Name: "Acquire the first aura!" + Condition: " BaseLevel >= 99 " + Reward: + ItemID: 12549 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1000 + Score: 50 + - ID: 200001 + Group: "AG_GOAL_LEVEL" + Name: "Acquire the second aura!" + Condition: " BaseLevel >= 150 " + Dependent: [200000] + Reward: + ItemID: 5364 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1001 + Score: 60 + - ID: 200002 + Group: "AG_GOAL_LEVEL" + Name: "Acquire the third aura!" + Condition: " BaseLevel >= 175 " + Dependent: [200001] + Reward: + # ItemID: 18880 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1002 + Score: 70 + - ID: 200003 + Group: "AG_GOAL_LEVEL" + Name: "Master Job level!" + Condition: " JobLevel >= 50 " + Reward: + ItemID: 617 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1003 + Score: 30 + - ID: 200004 + Group: "AG_GOAL_LEVEL" + Name: "Grandmaster Job level!" + Condition: " JobLevel >= 70 " + Dependent: [200003] + Reward: + # ItemID: 12817 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1004 + Score: 50 + - ID: 200005 + Group: "AG_JOB_CHANGE" + Name: "Official Adventurer" + Condition: " Class >= JOB_SWORDMAN && Class <= JOB_THIEF " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 200006 + Group: "AG_JOB_CHANGE" + Name: "First step of job change!" + Condition: " Class >= JOB_SWORDMAN && Class <= JOB_THIEF " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 20 + - ID: 200007 + Group: "AG_JOB_CHANGE" + Name: "Veteran Adventurer! (1)" + Condition: " Class >= JOB_KNIGHT && Class <= JOB_ASSASSIN " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 25 + - ID: 200008 + Group: "AG_JOB_CHANGE" + Name: "Veteran Adventurer! (2)" + Condition: " Class >= JOB_CRUSADER && Class <= JOB_DANCER " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 25 + - ID: 200009 + Group: "AG_JOB_CHANGE" + Name: "Warrior (1)" + Condition: " Class >= JOB_LORD_KNIGHT && Class <= JOB_ASSASSIN_CROSS " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 30 + - ID: 200010 + Group: "AG_JOB_CHANGE" + Name: "Warrior (2)" + Condition: " Class >= JOB_PALADIN && Class <= JOB_GYPSY " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 30 + - ID: 200011 + Group: "AG_JOB_CHANGE" + Name: "Elite Adventurer! (1)" + Condition: " Class >= JOB_RUNE_KNIGHT && Class <= JOB_GUILLOTINE_CROSS " + Reward: + # ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 50 + - ID: 200012 + Group: "AG_JOB_CHANGE" + Name: "Transcendentaler! (1)" + Condition: " Class >= JOB_RUNE_KNIGHT_T && Class <= JOB_GUILLOTINE_CROSS_T " + Reward: + # ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 60 + - ID: 200013 + Group: "AG_JOB_CHANGE" + Name: "Elite Adventurer! (2)" + Condition: " Class >= JOB_ROYAL_GUARD && Class <= JOB_SHADOW_CHASER " + Reward: + # ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 50 + - ID: 200014 + Group: "AG_JOB_CHANGE" + Name: "Transcendentaler! (2)" + Condition: " Class >= JOB_ROYAL_GUARD_T && Class <= JOB_SHADOW_CHASER_T " + Reward: + # ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 60 + - ID: 200015 + Group: "AG_JOB_CHANGE" + Name: "The way of exceptional character" + Condition: " Class == JOB_SUPER_NOVICE || Class == JOB_GUNSLINGER || Class == JOB_NINJA || Class == JOB_TAEKWON " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 200016 + Group: "AG_JOB_CHANGE" + Name: "This is My way!" + Condition: " Class == JOB_STAR_GLADIATOR || Class == JOB_SOUL_LINKER || Class == JOB_KAGEROU || Class == JOB_OBORO || Class == JOB_REBELLION " + Reward: + # ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 20 + - ID: 200017 + Group: "AG_GOAL_STATUS" + Name: "Bearish Power!" + Condition: " bStr >= 90 " + Score: 10 + - ID: 200018 + Group: "AG_GOAL_STATUS" + Name: "Overflowing Magic!" + Condition: " bInt >= 90 " + Score: 10 + - ID: 200019 + Group: "AG_GOAL_STATUS" + Name: "Healthy Body and Mental Health!" + Condition: " bVit >= 90 " + Score: 10 + - ID: 200020 + Group: "AG_GOAL_STATUS" + Name: "Speed of Light" + Condition: " bAgi >= 90 " + Score: 10 + - ID: 200021 + Group: "AG_GOAL_STATUS" + Name: "Hawk Eyes" + Condition: " bDex >= 90 " + Score: 10 + - ID: 200022 + Group: "AG_GOAL_STATUS" + Name: "Maximum Luck" + Condition: " bLuk >= 90 " + Score: 10 + - ID: 200023 + Group: "AG_GOAL_STATUS" + Name: "Dragonlike Power!" + Condition: " bStr >= 125 " + Reward: + Script: " sc_start SC_GIANTGROWTH,180000,1; " + Score: 20 + - ID: 200024 + Group: "AG_GOAL_STATUS" + Name: "Magic Insanity" + Condition: " bInt >= 125 " + Reward: + Script: " specialeffect2 EF_HASTEUP; bonus_script \"{ bonus2 bHPLossRate,100,10000; bonus bBaseAtk,20; bonus bAspdRate,25; }\",60,0,0,SI_STEAMPACK; " + Score: 20 + - ID: 200025 + Group: "AG_GOAL_STATUS" + Name: "Rock Alloy" + Condition: " bVit >= 125 " + Reward: + Script: " specialeffect2 EF_HEAL3; sc_start2 SC_S_LIFEPOTION,600000,-5,5; " + Score: 20 + - ID: 200026 + Group: "AG_GOAL_STATUS" + Name: "Speed of Light" + Condition: " bAgi >= 125 " + Reward: + Script: " specialeffect2 EF_STEAL; sc_start SC_INCFLEE2,60000,20; " + Score: 20 + - ID: 200027 + Group: "AG_GOAL_STATUS" + Name: "Falcon's Eyes" + Condition: " bDex >= 125 " + Reward: + Script: " specialeffect2 EF_MAGICALATTHIT; sc_start SC_INCCRI,300000,30; " + Score: 20 + - ID: 200028 + Group: "AG_GOAL_STATUS" + Name: "Lucky Fever" + Condition: " bLuk >= 125 " + Reward: + Script: " specialeffect2 EF_GLORIA; sc_start SC_GLORIA,15000,0; " + Score: 20 + - ID: 200029 + Group: "AG_GOAL_STATUS" + Name: "Incarnation of Love and Hate" + Condition: " BaseLevel == 99 && Class == JOB_NOVICE " + Reward: + # ItemID: 16483 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + Score: 30 + - ID: 200030 + Group: "AG_GOAL_STATUS" + Name: "I really love it!" + Condition: " BaseLevel == 99 && (Class >= JOB_SWORDMAN && Class <= JOB_THIEF) " + Reward: + # ItemID: 16504 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + Score: 30 + - ID: 200031 + Group: "AG_JOB_CHANGE" + Name: "Reborn in Valhalla!" + Condition: " BaseLevel == 99 && Class == JOB_NOVICE_HIGH " + Reward: + # ItemID: 22808 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 230100 + Group: "AG_TAMING" + Name: "Poring is Love" + Dependent: [230101, 230102, 230103, 230104] + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1025 + Score: 50 + - ID: 230110 + Group: "AG_TAMING" + Name: "Entomologist" + Dependent: [230111, 230112, 230113, 230114, 230115, 230116] + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1026 + Score: 50 + - ID: 230120 + Group: "AG_TAMING" + Name: "Animals are also our friend" + Dependent: [230121, 230122, 230123, 230124, 230125, 230126, 230127, 230128] + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1027 + Score: 50 + - ID: 230140 + Group: "AG_TAMING" + Name: "Monster Girls Unite!!" + Dependent: [230141, 230142, 230143, 230144, 230145, 230146, 230147] + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1029 + Score: 50 + - ID: 230101 + Group: "AG_TAMING" + Name: "Poring - taming" + Target: + - MobID: 1002 + Count: 1 + Score: 10 + - ID: 230102 + Group: "AG_TAMING" + Name: "Drops - taming" + Target: + - MobID: 1113 + Count: 1 + Score: 10 + - ID: 230103 + Group: "AG_TAMING" + Name: "Poporing - taming" + Target: + - MobID: 1031 + Count: 1 + Score: 10 + - ID: 230104 + Group: "AG_TAMING" + Name: "Novice Poring - taming" + #Target: + # - MobID: 2398 + # Count: 1 + Score: 10 + - ID: 230111 + Group: "AG_TAMING" + Name: "Chonchon - taming" + Target: + - MobID: 1011 + Count: 1 + Score: 10 + - ID: 230112 + Group: "AG_TAMING" + Name: "Steel Chonchon - taming" + Target: + - MobID: 1042 + Count: 1 + Score: 10 + - ID: 230113 + Group: "AG_TAMING" + Name: "Hunter Fly - taming" + Target: + - MobID: 1035 + Count: 1 + Score: 10 + - ID: 230114 + Group: "AG_TAMING" + Name: "Rocker - taming" + Target: + - MobID: 1052 + Count: 1 + Score: 10 + - ID: 230115 + Group: "AG_TAMING" + Name: "Spore - taming" + Target: + - MobID: 1014 + Count: 1 + Score: 10 + - ID: 230116 + Group: "AG_TAMING" + Name: "Poison Spore - taming" + Target: + - MobID: 1077 + Count: 1 + Score: 10 + - ID: 230121 + Group: "AG_TAMING" + Name: "Lunatic - taming" + Target: + - MobID: 1063 + Count: 1 + Score: 10 + - ID: 230122 + Group: "AG_TAMING" + Name: "Picky - taming" + Target: + - MobID: 1049 + Count: 1 + Score: 10 + - ID: 230123 + Group: "AG_TAMING" + Name: "Savage Bebe - taming" + Target: + - MobID: 1167 + Count: 1 + Score: 10 + - ID: 230124 + Group: "AG_TAMING" + Name: "Baby Desert Wolf - taming" + Target: + - MobID: 1107 + Count: 1 + Score: 10 + - ID: 230125 + Group: "AG_TAMING" + Name: "Smokie - taming" + Target: + - MobID: 1056 + Count: 1 + Score: 10 + - ID: 230126 + Group: "AG_TAMING" + Name: "Yoyo - taming" + Target: + - MobID: 1057 + Count: 1 + Score: 10 + - ID: 230127 + Group: "AG_TAMING" + Name: "Peco Peco - taming" + Target: + - MobID: 1019 + Count: 1 + Score: 10 + - ID: 230128 + Group: "AG_TAMING" + Name: "Petite - taming" + Target: + - MobID: 1155 + Count: 1 + Score: 10 + - ID: 230141 + Group: "AG_TAMING" + Name: "Munak - taming" + Target: + - MobID: 1026 + Count: 1 + Score: 10 + - ID: 230142 + Group: "AG_TAMING" + Name: "Isis - taming" + Target: + - MobID: 1029 + Count: 1 + Score: 10 + - ID: 230143 + Group: "AG_TAMING" + Name: "Sohee - taming" + Target: + - MobID: 1170 + Count: 1 + Score: 10 + - ID: 230144 + Group: "AG_TAMING" + Name: "Zherlthsh - taming" + Target: + - MobID: 1200 + Count: 1 + Score: 10 + - ID: 230145 + Group: "AG_TAMING" + Name: "Alice - taming" + Target: + - MobID: 1275 + Count: 1 + Score: 10 + - ID: 230146 + Group: "AG_TAMING" + Name: "Succubus - taming" + Target: + - MobID: 1370 + Count: 1 + Score: 10 + - ID: 230147 + Group: "AG_TAMING" + Name: "Loli Ruri - taming" + Target: + - MobID: 1505 + Count: 1 + Score: 10 + - ID: 220000 + Group: "AG_CHATTING_CREATE" + Name: "Community begin" + Condition: " true " + Score: 10 + - ID: 220001 + Group: "AG_CHATTING_DYING" + Name: "A mouth only moment" + Condition: " true " + Score: 10 + - ID: 220002 + Group: "AG_CHATTING_COUNT" + Name: "Admiring the chatter" + Condition: " ARG0 == 20 " + Score: 10 + - ID: 220003 + Group: "AG_ADD_FRIEND" + Name: "My friend's friend~" + Condition: " ARG0 >= 1 " + Score: 10 + - ID: 220004 + Group: "AG_ADD_FRIEND" + Name: "A competition of popularity" + Condition: " ARG0 >= 10 " + Score: 10 + - ID: 220005 + Group: "AG_PARTY" + Name: "Let's Party~" + Condition: " true " + Score: 10 + - ID: 220006 + Group: "AG_MARRY" + Name: "Married with who..?" + Condition: " true " + Reward: + TitleID: 1022 + Score: 20 + - ID: 220007 + Group: "AG_BABY" + Name: "Can you grow?" + Condition: " ARG0 == 1 " + Reward: + TitleID: 1032 + Score: 20 + - ID: 220008 + Group: "AG_BABY" + Name: "Being a parent" + Condition: " ARG0 == 2 " + Reward: + TitleID: 1033 + Score: 20 + - ID: 220009 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (1)" + Condition: " ARG0 >= 10000 " + Target: + Count: 10000 + Score: 10 + - ID: 220010 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (2)" + Condition: " ARG0 >= 100000 " + Target: + Count: 100000 + Score: 15 + - ID: 220011 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (3)" + Condition: " ARG0 >= 500000 " + Target: + Count: 500000 + Score: 20 + - ID: 220012 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (4)" + Condition: " ARG0 >= 1000000 " + Target: + Count: 1000000 + Score: 30 + - ID: 220013 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (5)" + Condition: " ARG0 >= 5000000 " + Target: + Count: 5000000 + Score: 50 + - ID: 220014 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (1)" + Condition: " ARG0 == 1 && ARG1 >= 7 " + Score: 10 + - ID: 220015 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (2)" + Condition: " ARG0 == 1 && ARG1 >= 12 " + Score: 15 + - ID: 220016 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (3)" + Condition: " ARG0 == 2 && ARG1 >= 7 " + Score: 10 + - ID: 220017 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (4)" + Condition: " ARG0 == 2 && ARG1 >= 12 " + Score: 15 + - ID: 220018 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (5)" + Condition: " ARG0 == 3 && ARG1 >= 7 " + Score: 15 + - ID: 220019 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (6)" + Condition: " ARG0 == 3 && ARG1 >= 12 " + Score: 20 + - ID: 220020 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (7)" + Condition: " ARG0 == 4 && ARG1 >= 7 " + Score: 20 + - ID: 220021 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (8)" + Condition: " ARG0 == 4 && ARG1 >= 12 " + Score: 30 + - ID: 220022 + Group: "AG_ENCHANT_FAIL" + Name: "Human's greed has no ending.." + Condition: " true " + Score: 10 + - ID: 220023 + Group: "AG_GET_ITEM" + Name: "I found it! (1)" + Condition: " ARG0 >= 100 " + Score: 10 + - ID: 220024 + Group: "AG_GET_ITEM" + Name: "I found it! (2)" + Condition: " ARG0 >= 1000 " + Score: 10 + - ID: 220025 + Group: "AG_GET_ITEM" + Name: "I found it! (3)" + Condition: " ARG0 >= 5000 " + Score: 15 + - ID: 220026 + Group: "AG_GET_ITEM" + Name: "I found it! (4)" + Condition: " ARG0 >= 10000 " + Score: 15 + - ID: 220027 + Group: "AG_GET_ITEM" + Name: "I found it! (5)" + Condition: " ARG0 >= 50000 " + Score: 20 + - ID: 220028 + Group: "AG_GET_ITEM" + Name: "I found it! (6)" + Condition: " ARG0 >= 100000 " + Score: 20 + - ID: 220029 + Group: "AG_GET_ITEM" + Name: "I found it! (7)" + Condition: " ARG0 >= 150000 " + Score: 30 + - ID: 220030 + Group: "AG_GET_ZENY" + Name: "Rich King (1)" + Condition: " ARG0 >= 10000 " + Score: 10 + - ID: 220031 + Group: "AG_GET_ZENY" + Name: "Rich King (2)" + Condition: " ARG0 >= 100000 " + Score: 15 + - ID: 220032 + Group: "AG_GET_ZENY" + Name: "Rich King (3)" + Condition: " ARG0 >= 1000000 " + Score: 20 + - ID: 220033 + Group: "AG_GET_ZENY" + Name: "Rich King (4)" + Condition: " ARG0 >= 10000000 " + Score: 25 + - ID: 220034 + Group: "AG_GET_ZENY" + Name: "Rich King (5)" + Condition: " ARG0 >= 100000000 " + Score: 30 + - ID: 220035 + Group: "AG_GET_ZENY" + Name: "Rich King (6)" + Condition: " ARG0 >= 1000000000 " + Score: 40 + - ID: 230200 + Group: "AG_BATTLE" + Name: "Poring seeker" + Dependent: [230201, 230202, 230203] + Score: 10 + - ID: 230201 + Group: "AG_BATTLE" + Name: "Exploring Poring's life (1)" + Target: + - MobID: 1002 + Count: 10 + # - MobID: 2398 + # Count: 10 + - MobID: 1113 + Count: 10 + - MobID: 1031 + Count: 10 + - MobID: 1242 + Count: 10 + Score: 10 + - ID: 230202 + Group: "AG_BATTLE" + Name: "Exploring Poring's life (2)" + Target: + - MobID: 1090 + Count: 1 + - MobID: 1582 + Count: 1 + - MobID: 1096 + Count: 1 + - MobID: 1388 + Count: 1 + - MobID: 1120 + Count: 1 + Score: 15 + - ID: 230203 + Group: "AG_BATTLE" + Name: "Exploring Poring's life (3)" + Target: + - MobID: 1613 + Count: 5 + - MobID: 1977 + Count: 5 + - MobID: 1836 + Count: 5 + Score: 20 + - ID: 240000 + Group: "AG_GOAL_LEVEL" + Name: "Complete challenges after first introduction" + Score: 10 + - ID: 240001 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 1" + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240002 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 2" + Dependent: [240001] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240003 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 3" + Dependent: [240002] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240004 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 4" + Dependent: [240003] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240005 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 5" + Dependent: [240004] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240006 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 6" + Dependent: [240005] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240007 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 7" + Dependent: [240006] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240008 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 8" + Dependent: [240007] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240009 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 9" + Dependent: [240008] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240010 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 10" + Dependent: [240009] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1023 + Score: 10 + - ID: 240011 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 11" + Dependent: [240010] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240012 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 12" + Dependent: [240011] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240013 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 13" + Dependent: [240012] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240014 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 14" + Dependent: [240013] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240015 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 15" + Dependent: [240014] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240016 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 16" + Dependent: [240015] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240017 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 17" + Dependent: [240016] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240018 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 18" + Dependent: [240017] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240019 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 19" + Dependent: [240018] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240020 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 20" + Dependent: [240019] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1024 + Score: 10 + - ID: 220036 + Group: "AG_EAT" + Name: "The beginning of outdoor" + Score: 20 + - ID: 220037 + Group: "AG_EAT" + Name: "The first step becoming a chef" + Score: 20 diff --git a/db/pre-re/item_flag.txt b/db/pre-re/item_flag.txt index 4639dc22f0..ef9cce5b80 100644 --- a/db/pre-re/item_flag.txt +++ b/db/pre-re/item_flag.txt @@ -7,6 +7,7 @@ // 4 - GUID Item: When this item is obtained, will generates GUID that cannot be stacked even same or stackable item // 8 - Item will be bound item when equipped // 16 - Special Broadcast: When item dropped by monster and player loot it, will be broadcasted! +// 32 - Item will not be removed on consumption. Also supports 'itemskill' // NOTE: For removing flag by import file, use "-" to remove the flag. Example, 604,-1 will removes flag 1 from Branch_Of_Dead_Tree // Logged as Dead Branch item diff --git a/db/re/achievement_db.yml b/db/re/achievement_db.yml new file mode 100644 index 0000000000..ff756f9524 --- /dev/null +++ b/db/re/achievement_db.yml @@ -0,0 +1,2407 @@ +# This file is a part of rAthena. +# Copyright(C) 2017 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 . +# +########################################################################### +# Custom Achievement Database +########################################################################### +# +# Achievement Settings +# +########################################################################### +# ID - Unique achievement ID. +########################################################################### +# Group - Achievement group type. Each achievement type calls a specific +# objective check. +# Valid groups: +# AG_ADD_FRIEND +# AG_ADVENTURE +# AG_BABY +# AG_BATTLE +# AG_CHATTING +# AG_CHATTING_COUNT +# AG_CHATTING_CREATE +# AG_CHATTING_DYING +# AG_EAT +# AG_GET_ITEM +# AG_GET_ZENY +# AG_GOAL_ACHIEVE +# AG_GOAL_LEVEL +# AG_GOAL_STATUS +# AG_HEAR +# AG_JOB_CHANGE +# AG_MARRY +# AG_PARTY +# AG_ENCHANT_FAIL +# AG_ENCHANT_SUCCESS +# AG_SEE +# AG_SPEND_ZENY +# AG_TAMING +########################################################################### +# Name - Achievement name. Used when sending rewards through RODEX. +########################################################################### +# Target - A list of monster ID and count values that the achievement +# requires. The target count can also be used for achievements that keep +# a counter while not being related to monster kills. +# Capped at MAX_ACHIEVEMENT_OBJECTIVES. +########################################################################### +# Condition - A conditional statement that must be met for the achievement +# to be considered complete. +########################################################################### +# Map - A map name that is used for the AG_CHATTING type which increments +# the counter based on the player's map. +########################################################################### +# Dependent: - A list of achievement IDs that need to be completed before +# this achievement is considered complete. +########################################################################### +# Reward - A list of rewards that are given on completion. All fields are +# optional. +# ItemID: Item ID +# Amount: Amount of Item ID (default 1) +# Script: Bonus Script +# TitleID: Title ID +########################################################################### +# Score - Achievement points that are given on completion. +########################################################################### + +Achievements: + - ID: 110000 + Group: "AG_EAT" + Name: "At this time I live to eat" + Score: 10 + - ID: 110001 + Group: "AG_SEE" + Name: "A fan of this polarity" + Score: 10 + - ID: 120001 + Group: "AG_ADVENTURE" + Name: "North Prontera Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120002 + Group: "AG_ADVENTURE" + Name: "North Prontera Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120003 + Group: "AG_ADVENTURE" + Name: "North Prontera Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120004 + Group: "AG_ADVENTURE" + Name: "West Prontera Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120005 + Group: "AG_ADVENTURE" + Name: "West Prontera Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120006 + Group: "AG_ADVENTURE" + Name: "East Prontera Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120007 + Group: "AG_ADVENTURE" + Name: "South Prontera Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120008 + Group: "AG_ADVENTURE" + Name: "South Prontera Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120009 + Group: "AG_ADVENTURE" + Name: "South Prontera Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120010 + Group: "AG_ADVENTURE" + Name: "South Prontera Field Exploration(4)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120011 + Group: "AG_ADVENTURE" + Name: "East Geffen Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120012 + Group: "AG_ADVENTURE" + Name: "Southeast Geffen Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120013 + Group: "AG_ADVENTURE" + Name: "Northwest Geffen Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120014 + Group: "AG_ADVENTURE" + Name: "Northwest Geffen Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120015 + Group: "AG_ADVENTURE" + Name: "Northwest Geffen Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120016 + Group: "AG_ADVENTURE" + Name: "South Geffen Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120017 + Group: "AG_ADVENTURE" + Name: "South Geffen Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120018 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120019 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120020 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120021 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(4)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120022 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(5)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120023 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Field Exploration(6)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120024 + Group: "AG_ADVENTURE" + Name: "Southwest Payon Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120025 + Group: "AG_ADVENTURE" + Name: "Southwest Payon Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120026 + Group: "AG_ADVENTURE" + Name: "Southwest Payon Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120027 + Group: "AG_ADVENTURE" + Name: "Southwest Payon Field Exploration(4)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120028 + Group: "AG_ADVENTURE" + Name: "East Payon Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120029 + Group: "AG_ADVENTURE" + Name: "East Payon Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120030 + Group: "AG_ADVENTURE" + Name: "East Payon Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120031 + Group: "AG_ADVENTURE" + Name: "East Payon Field Exploration(4)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120032 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120033 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120034 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120035 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(4)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120036 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Field Exploration(5)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120037 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120038 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120039 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120040 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(4)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120041 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(5)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120042 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Field Exploration(6)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120043 + Group: "AG_ADVENTURE" + Name: "South Aldebaran Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120044 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120045 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120046 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120047 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(4)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120048 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(5)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120049 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(6)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120050 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(7)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120051 + Group: "AG_ADVENTURE" + Name: "Comodo Field Exploration(8)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120052 + Group: "AG_ADVENTURE" + Name: "Border Checkpoint Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120053 + Group: "AG_ADVENTURE" + Name: "Border Checkpoint Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120054 + Group: "AG_ADVENTURE" + Name: "Kiel Hyre Mansion Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120055 + Group: "AG_ADVENTURE" + Name: "El Mes Plateau Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120056 + Group: "AG_ADVENTURE" + Name: "El Mes Plateau Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120057 + Group: "AG_ADVENTURE" + Name: "El Mes Plateau Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120058 + Group: "AG_ADVENTURE" + Name: "El Mes Gorge Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120059 + Group: "AG_ADVENTURE" + Name: "Kiel Hyre Academy Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120060 + Group: "AG_ADVENTURE" + Name: "Guard Camp Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120061 + Group: "AG_ADVENTURE" + Name: "Yuno Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120062 + Group: "AG_ADVENTURE" + Name: "Front of Thanatos Tower Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120063 + Group: "AG_ADVENTURE" + Name: "Hugel Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120064 + Group: "AG_ADVENTURE" + Name: "Hugel Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120065 + Group: "AG_ADVENTURE" + Name: "Hugel Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120066 + Group: "AG_ADVENTURE" + Name: "Abyss Lake Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120067 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120068 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120069 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120070 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(4)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120071 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(5)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120072 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(6)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120073 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(7)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120074 + Group: "AG_ADVENTURE" + Name: "Einbroch Field Exploration(8)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120075 + Group: "AG_ADVENTURE" + Name: "Lighthalzen Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120076 + Group: "AG_ADVENTURE" + Name: "Lighthalzen Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120077 + Group: "AG_ADVENTURE" + Name: "Lighthalzen Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120078 + Group: "AG_ADVENTURE" + Name: "Rachel Audhumbla Plains Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120079 + Group: "AG_ADVENTURE" + Name: "Rachel Plains Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120080 + Group: "AG_ADVENTURE" + Name: "Rachel Plains Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120081 + Group: "AG_ADVENTURE" + Name: "Rachel Plains Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120082 + Group: "AG_ADVENTURE" + Name: "Rachel Audhumbla Grassland Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120083 + Group: "AG_ADVENTURE" + Name: "Rachel Audhumbla Grassland Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120084 + Group: "AG_ADVENTURE" + Name: "Portus Luna Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120085 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120086 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120087 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120088 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(4)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120089 + Group: "AG_ADVENTURE" + Name: "Veins Field Exploration(5)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120090 + Group: "AG_ADVENTURE" + Name: "Eclage Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120091 + Group: "AG_ADVENTURE" + Name: "North Bitfrost Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120092 + Group: "AG_ADVENTURE" + Name: "South Bitfrost Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120093 + Group: "AG_ADVENTURE" + Name: "Splendide Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120094 + Group: "AG_ADVENTURE" + Name: "Splendide Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120095 + Group: "AG_ADVENTURE" + Name: "Splendide Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120096 + Group: "AG_ADVENTURE" + Name: "Manuk Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120097 + Group: "AG_ADVENTURE" + Name: "Manuk Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120098 + Group: "AG_ADVENTURE" + Name: "Manuk Field Exploration(3)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120099 + Group: "AG_ADVENTURE" + Name: "Outskirts of Kamidal Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120100 + Group: "AG_ADVENTURE" + Name: "Outskirts of Kamidal Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120101 + Group: "AG_ADVENTURE" + Name: "Amatsu Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120102 + Group: "AG_ADVENTURE" + Name: "Kunlun Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120103 + Group: "AG_ADVENTURE" + Name: "Gonryun Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120104 + Group: "AG_ADVENTURE" + Name: "Ayothaya Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120105 + Group: "AG_ADVENTURE" + Name: "Moscovia Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120106 + Group: "AG_ADVENTURE" + Name: "Brasilis Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120107 + Group: "AG_ADVENTURE" + Name: "Dewata Field Exploration" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120108 + Group: "AG_ADVENTURE" + Name: "Malaya Field Exploration(1)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120109 + Group: "AG_ADVENTURE" + Name: "Malaya Field Exploration(2)" + Reward: + ItemID: 22876 + Score: 10 + - ID: 120110 + Group: "AG_ADVENTURE" + Name: "Abbey Underground Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120111 + Group: "AG_ADVENTURE" + Name: "Abyss Lake Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120112 + Group: "AG_ADVENTURE" + Name: "Clock Tower Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120113 + Group: "AG_ADVENTURE" + Name: "Amatsu Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120114 + Group: "AG_ADVENTURE" + Name: "Ant Hell Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120115 + Group: "AG_ADVENTURE" + Name: "Ayothaya Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120116 + Group: "AG_ADVENTURE" + Name: "Comodo Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120117 + Group: "AG_ADVENTURE" + Name: "Brasilis Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120118 + Group: "AG_ADVENTURE" + Name: "Clock Tower Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120119 + Group: "AG_ADVENTURE" + Name: "Istana Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120120 + Group: "AG_ADVENTURE" + Name: "Scaraba Hole Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120121 + Group: "AG_ADVENTURE" + Name: "Bitfrost Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120122 + Group: "AG_ADVENTURE" + Name: "Einbroch Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120123 + Group: "AG_ADVENTURE" + Name: "Geffen Underground Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120124 + Group: "AG_ADVENTURE" + Name: "Glastheim Dungeon Exploration(1)" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120125 + Group: "AG_ADVENTURE" + Name: "Glastheim Dungeon Exploration(2)" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120126 + Group: "AG_ADVENTURE" + Name: "Glastheim Dungeon Exploration(3)" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120127 + Group: "AG_ADVENTURE" + Name: "Glastheim Dungeon Exploration(4)" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120128 + Group: "AG_ADVENTURE" + Name: "Kunlun Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120129 + Group: "AG_ADVENTURE" + Name: "Rachel Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120130 + Group: "AG_ADVENTURE" + Name: "Sphinx Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120131 + Group: "AG_ADVENTURE" + Name: "Izlude Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120132 + Group: "AG_ADVENTURE" + Name: "Robot Factory Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120133 + Group: "AG_ADVENTURE" + Name: "Bio Lab Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120134 + Group: "AG_ADVENTURE" + Name: "Gonryun Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120135 + Group: "AG_ADVENTURE" + Name: "Nogg Road Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120136 + Group: "AG_ADVENTURE" + Name: "Coal Mine Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120137 + Group: "AG_ADVENTURE" + Name: "Pyramid Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120138 + Group: "AG_ADVENTURE" + Name: "Orc Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120139 + Group: "AG_ADVENTURE" + Name: "Payon Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120140 + Group: "AG_ADVENTURE" + Name: "Labyrinth Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120141 + Group: "AG_ADVENTURE" + Name: "Undersea Tunnel Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120142 + Group: "AG_ADVENTURE" + Name: "Thanatos Tower Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120143 + Group: "AG_ADVENTURE" + Name: "Thor Volcano Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120144 + Group: "AG_ADVENTURE" + Name: "Sunken Ship Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120145 + Group: "AG_ADVENTURE" + Name: "Turtle Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 120146 + Group: "AG_ADVENTURE" + Name: "Toy Factory Dungeon Exploration" + Reward: + ItemID: 22876 + Score: 20 + - ID: 127001 + Group: "AG_CHATTING" + Name: "Prontera Contribution" + Map: "prontera" + Target: + Count: 100000 + Score: 10 + - ID: 127002 + Group: "AG_CHATTING" + Name: "Geffen Contribution" + Map: "geffen" + Target: + Count: 100000 + Score: 10 + - ID: 127003 + Group: "AG_CHATTING" + Name: "Morocc Contribution" + Map: "morocc" + Target: + Count: 100000 + Score: 10 + - ID: 127004 + Group: "AG_CHATTING" + Name: "Payon Contribution" + Map: "payon" + Target: + Count: 100000 + Score: 10 + - ID: 127005 + Group: "AG_CHATTING" + Name: "Yuno Contribution" + Map: "yuno" + Target: + Count: 100000 + Score: 10 + - ID: 127006 + Group: "AG_CHATTING" + Name: "Lighthalzen Contribution" + Map: "lighthalzen" + Target: + Count: 100000 + Score: 10 + - ID: 127007 + Group: "AG_CHATTING" + Name: "Einbroch Contribution" + Map: "einbroch" + Target: + Count: 100000 + Score: 10 + - ID: 127008 + Group: "AG_CHATTING" + Name: "Rachel Contribution" + Map: "rachel" + Target: + Count: 100000 + Score: 10 + - ID: 127009 + Group: "AG_CHATTING" + Name: "Veins Contribution" + Map: "veins" + Target: + Count: 100000 + Score: 10 + - ID: 128000 + Group: "AG_BATTLE" + Name: "Uninvited Guest" + Target: + - MobID: 2996 + Count: 1 + Score: 10 + - ID: 128001 + Group: "AG_BATTLE" + Name: "Strange Guest" + Target: + - MobID: 2996 + Count: 10 + Score: 10 + - ID: 128002 + Group: "AG_BATTLE" + Name: "Get along with map..." + Target: + - MobID: 2996 + Count: 25 + Score: 20 + - ID: 128003 + Group: "AG_BATTLE" + Name: "Welcomed Guest" + Target: + - MobID: 2996 + Count: 50 + Score: 30 + - ID: 128004 + Group: "AG_BATTLE" + Name: "Kimmy's best friend" + Target: + - MobID: 2996 + Count: 100 + Score: 50 + - ID: 128005 + Group: "AG_BATTLE" + Name: "Novice Angler" + Target: + - MobID: 2322 + Count: 1 + Score: 10 + - ID: 128006 + Group: "AG_BATTLE" + Name: "Juicy Hunter" + Target: + - MobID: 2322 + Count: 10 + Score: 20 + - ID: 128007 + Group: "AG_BATTLE" + Name: "Rhythm Master" + Target: + - MobID: 2322 + Count: 50 + Score: 50 + - ID: 128008 + Group: "AG_BATTLE" + Name: "Bold Adventurer" + Target: + - MobID: 1929 + Count: 1 + Score: 10 + - ID: 128009 + Group: "AG_BATTLE" + Name: "Baphomet Hatred" + Target: + - MobID: 1929 + Count: 10 + Score: 20 + - ID: 128010 + Group: "AG_BATTLE" + Name: "Goat's Nemesis" + Target: + - MobID: 1929 + Count: 50 + Score: 50 + - ID: 128011 + Group: "AG_BATTLE" + Name: "Ordinary Tourist" + #Target: + # - MobID: 3029 + # Count: 1 + Score: 10 + - ID: 128012 + Group: "AG_BATTLE" + Name: "Backcountry Expert" + #Target: + # - MobID: 3029 + # Count: 10 + Score: 20 + - ID: 128013 + Group: "AG_BATTLE" + Name: "Able to eat more like this" + #Target: + # - MobID: 3029 + # Count: 50 + Score: 50 + - ID: 128014 + Group: "AG_BATTLE" + Name: "Digest hard meat" + Target: + - MobID: 2319 + Count: 1 + Score: 10 + - ID: 128015 + Group: "AG_BATTLE" + Name: "Master of Escape" + Target: + - MobID: 2319 + Count: 10 + Score: 20 + - ID: 128016 + Group: "AG_BATTLE" + Name: "Immortal Hunter" + Target: + - MobID: 2319 + Count: 50 + Score: 50 + - ID: 128017 + Group: "AG_BATTLE" + Name: "Stood up and overcame despair" + #Target: + # - MobID: 3097 + # Count: 1 + Score: 10 + - ID: 128018 + Group: "AG_BATTLE" + Name: "Ember of Hope" + #Target: + # - MobID: 3097 + # Count: 10 + Score: 10 + - ID: 128019 + Group: "AG_BATTLE" + Name: "Pouring Aurora" + #Target: + # - MobID: 3097 + # Count: 25 + Score: 20 + - ID: 128020 + Group: "AG_BATTLE" + Name: "Who is desperate? I am hopeless!" + #Target: + # - MobID: 3097 + # Count: 50 + Score: 30 + - ID: 128021 + Group: "AG_BATTLE" + Name: "I know god will save the world" + #Target: + # - MobID: 3097 + # Count: 100 + Score: 50 + - ID: 128022 + Group: "AG_BATTLE" + Name: "There was mercy in Morocc army" + #Target: + # - MobID: 3000 + # Count: 1 + Score: 10 + - ID: 128023 + Group: "AG_BATTLE" + Name: "There was fear in Morocc army" + #Target: + # - MobID: 3000 + # Count: 10 + Score: 20 + - ID: 128024 + Group: "AG_BATTLE" + Name: "Guard of weak army" + #Target: + # - MobID: 3000 + # Count: 50 + Score: 50 + - ID: 128025 + Group: "AG_BATTLE" + Name: "Audience with the queen" + #Target: + # - MobID: 2529 + # Count: 1 + Score: 10 + - ID: 128026 + Group: "AG_BATTLE" + Name: "Warm earth" + #Target: + # - MobID: 2533 + # Count: 1 + Score: 10 + - ID: 128027 + Group: "AG_BATTLE" + Name: "Water is very good exactly" + #Target: + # - MobID: 2534 + # Count: 1 + Score: 10 + - ID: 128028 + Group: "AG_BATTLE" + Name: "Pleasant breeze" + #Target: + # - MobID: 2535 + # Count: 1 + Score: 10 + - ID: 128029 + Group: "AG_BATTLE" + Name: "Visitor of old castle" + Target: + - MobID: 2476 + Count: 1 + Score: 10 + - ID: 128030 + Group: "AG_BATTLE" + Name: "Lord of old castle" + Target: + - MobID: 2476 + Count: 10 + Score: 20 + - ID: 128031 + Group: "AG_BATTLE" + Name: "Conqueror of old castle" + Target: + - MobID: 2476 + Count: 50 + Score: 50 + - ID: 128032 + Group: "AG_BATTLE" + Name: "Haggard sucker" + #Target: + # - MobID: 3150 + # Count: 1 + Score: 10 + - ID: 128033 + Group: "AG_BATTLE" + Name: "Hope of the Knight" + #Target: + # - MobID: 3150 + # Count: 10 + Score: 20 + - ID: 128034 + Group: "AG_BATTLE" + Name: "Guardian of the Dawn" + #Target: + # - MobID: 3150 + # Count: 50 + Score: 50 + - ID: 128035 + Group: "AG_BATTLE" + Name: "Time Traveler" + #Target: + # - MobID: 3190 + # Count: 1 + Score: 10 + - ID: 128036 + Group: "AG_BATTLE" + Name: "Restore ancient relic" + #Target: + # - MobID: 3190 + # Count: 10 + Score: 20 + - ID: 128037 + Group: "AG_BATTLE" + Name: "Master of relic transport" + #Target: + # - MobID: 3190 + # Count: 50 + Score: 50 + - ID: 128038 + Group: "AG_BATTLE" + Name: "Show Jailbreak to the captain" + #Target: + # - MobID: 3181 + # Count: 1 + Score: 10 + - ID: 128039 + Group: "AG_BATTLE" + Name: "Show Jailbreak to the weak captain" + #Target: + # - MobID: 3188 + # Count: 1 + Score: 10 + - ID: 128040 + Group: "AG_BATTLE" + Name: "Riot on board" + #Target: + # - MobID: 3181 + # Count: 1 + Score: 20 + - ID: 128041 + Group: "AG_BATTLE" + Name: "Turmoil on board" + #Target: + # - MobID: 3181 + # Count: 10 + Score: 20 + - ID: 128042 + Group: "AG_BATTLE" + Name: "Rebellion on board" + #Target: + # - MobID: 3181 + # Count: 50 + Score: 50 + - ID: 128043 + Group: "AG_BATTLE" + Name: "Revolt of Riot" + #Target: + # - MobID: 3188 + # Count: 50 + Score: 50 + - ID: 128044 + Group: "AG_BATTLE" + Name: "Magic tournament champion" + Target: + - MobID: 2564 + Count: 1 + Score: 10 + - ID: 128045 + Group: "AG_BATTLE" + Name: "Gladiator of Coliseum" + Target: + - MobID: 2564 + Count: 10 + Score: 20 + - ID: 128046 + Group: "AG_BATTLE" + Name: "Slayer of Colosseum" + Target: + - MobID: 2564 + Count: 50 + Score: 50 + - ID: 128047 + Group: "AG_BATTLE" + Name: "Endless Tower challenger" + Target: + - MobID: 1956 + Count: 1 + Score: 10 + - ID: 128048 + Group: "AG_BATTLE" + Name: "Endless Tower Slayer" + Target: + - MobID: 1956 + Count: 10 + Score: 20 + - ID: 128049 + Group: "AG_BATTLE" + Name: "Lord of the tower" + Target: + - MobID: 1956 + Count: 50 + Score: 50 + - ID: 128050 + Group: "AG_BATTLE" + Name: "Novice Exorcist" + Target: + - MobID: 2327 + Count: 1 + Score: 10 + - ID: 128051 + Group: "AG_BATTLE" + Name: "Experienced Exorcist" + Target: + - MobID: 2327 + Count: 10 + Score: 20 + - ID: 128052 + Group: "AG_BATTLE" + Name: "Legendary Exorcist" + Target: + - MobID: 2327 + Count: 50 + Score: 50 + - ID: 129001 + Group: "AG_ADVENTURE" + Name: "Prontera Explorer" + Dependent: [120001, 120002, 120003, 120004, 120005, 120006, 120007, 120008, 120009, 120010] + Reward: + ItemID: 644 + Score: 20 + - ID: 129002 + Group: "AG_ADVENTURE" + Name: "Geffen Explorer" + Dependent: [120011, 120012, 120013, 120014, 120015, 120016, 120017] + Reward: + ItemID: 644 + Score: 20 + - ID: 129003 + Group: "AG_ADVENTURE" + Name: "Sograt Desert Explorer" + Dependent: [120018, 120019, 120020, 120021, 120022, 120023] + Reward: + ItemID: 644 + Score: 20 + - ID: 129004 + Group: "AG_ADVENTURE" + Name: "Payon Explorer" + Dependent: [120024, 120025, 120026, 120027, 120028, 120029, 120030, 120031] + Reward: + ItemID: 644 + Score: 20 + - ID: 129005 + Group: "AG_ADVENTURE" + Name: "North Mjolnir Explorer" + Dependent: [120032, 120033, 120034, 120035, 120036] + Reward: + ItemID: 644 + Score: 20 + - ID: 129006 + Group: "AG_ADVENTURE" + Name: "South Mjolnir Explorer" + Dependent: [120037, 120038, 120039, 120040, 120041, 120042, 120043] + Reward: + ItemID: 644 + Score: 20 + - ID: 129007 + Group: "AG_ADVENTURE" + Name: "Comodo Explorer" + Dependent: [120044, 120045, 120046, 120047, 120048, 120049, 120050, 120051] + Reward: + ItemID: 644 + Score: 20 + - ID: 129008 + Group: "AG_ADVENTURE" + Name: "Rune Midgard Explorer" + Dependent: [129001, 129002, 129003, 129004, 129005, 129006, 129007] + Reward: + ItemID: 617 + Score: 50 + - ID: 129009 + Group: "AG_ADVENTURE" + Name: "Yuno Explorer" + Dependent: [120052, 120053, 120054, 120055, 120056, 120057, 120058, 120059, 120060, 120061] + Reward: + ItemID: 644 + Score: 20 + - ID: 129010 + Group: "AG_ADVENTURE" + Name: "Hugel Explorer" + Dependent: [120062, 120063, 120064, 120065, 120066] + Reward: + ItemID: 644 + Score: 20 + - ID: 129011 + Group: "AG_ADVENTURE" + Name: "Einbroch Explorer" + Dependent: [120067, 120068, 120069, 120070, 120071, 120072, 120073, 120074] + Reward: + ItemID: 644 + Score: 20 + - ID: 129012 + Group: "AG_ADVENTURE" + Name: "Lighthalzen Explorer" + Dependent: [120075, 120076, 120077] + Reward: + ItemID: 644 + Score: 20 + - ID: 129013 + Group: "AG_ADVENTURE" + Name: "Schwarzwald Explorer" + Dependent: [129009, 129010, 129011, 129012] + Reward: + ItemID: 617 + Score: 50 + - ID: 129014 + Group: "AG_ADVENTURE" + Name: "Rachel Explorer" + Dependent: [120078, 120079, 120080, 120081, 120082, 120083, 120084] + Reward: + ItemID: 644 + Score: 20 + - ID: 129015 + Group: "AG_ADVENTURE" + Name: "Veins Explorer" + Dependent: [120085, 120086, 120087, 120088, 120089] + Reward: + ItemID: 644 + Score: 20 + - ID: 129016 + Group: "AG_ADVENTURE" + Name: "Arunafeltz Explorer" + Dependent: [129014, 129015] + Reward: + ItemID: 617 + Score: 50 + - ID: 129017 + Group: "AG_ADVENTURE" + Name: "Laphine Explorer" + Dependent: [120090, 120091, 120092, 120093, 120094, 120095] + Reward: + ItemID: 644 + Score: 20 + - ID: 129018 + Group: "AG_ADVENTURE" + Name: "Manuk Explorer" + Dependent: [120096, 120097, 120098, 120099, 120100] + Reward: + ItemID: 644 + Score: 20 + - ID: 129019 + Group: "AG_ADVENTURE" + Name: "Eclage Explorer" + Dependent: [129017, 129018] + Reward: + ItemID: 617 + Score: 50 + - ID: 129020 + Group: "AG_ADVENTURE" + Name: "Localizing fields explorer" + Dependent: [120101, 120102, 120103, 120104, 120105, 120106, 120107, 120108, 120109] + Reward: + ItemID: 617 + Score: 50 + - ID: 130000 # Talk to Prince NPC (npc/quests/quests_morocc.txt L5288) + Group: "AG_CHATTING" + Name: "Socialite debut" + Reward: + TitleID: 1034 + Score: 10 + - ID: 170000 + Group: "AG_HEAR" + Name: "Song chamber is not an accident" + Score: 10 + - ID: 190000 + Group: "AG_CHATTING" + Name: "Alliance workers of merchant city" + Score: 50 + - ID: 200000 + Group: "AG_GOAL_LEVEL" + Name: "Acquire the first aura!" + Condition: " BaseLevel >= 99 " + Reward: + ItemID: 12549 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1000 + Score: 50 + - ID: 200001 + Group: "AG_GOAL_LEVEL" + Name: "Acquire the second aura!" + Condition: " BaseLevel >= 150 " + Dependent: [200000] + Reward: + ItemID: 5364 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1001 + Score: 60 + - ID: 200002 + Group: "AG_GOAL_LEVEL" + Name: "Acquire the third aura!" + Condition: " BaseLevel >= 175 " + Dependent: [200001] + Reward: + ItemID: 18880 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1002 + Score: 70 + - ID: 200003 + Group: "AG_GOAL_LEVEL" + Name: "Master Job level!" + Condition: " JobLevel >= 50 " + Reward: + ItemID: 617 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1003 + Score: 30 + - ID: 200004 + Group: "AG_GOAL_LEVEL" + Name: "Grandmaster Job level!" + Condition: " JobLevel >= 70 " + Dependent: [200003] + Reward: + ItemID: 12817 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + TitleID: 1004 + Score: 50 + - ID: 200005 + Group: "AG_JOB_CHANGE" + Name: "Official Adventurer" + Condition: " Class >= JOB_SWORDMAN && Class <= JOB_THIEF " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 200006 + Group: "AG_JOB_CHANGE" + Name: "First step of job change!" + Condition: " Class >= JOB_SWORDMAN && Class <= JOB_THIEF " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 20 + - ID: 200007 + Group: "AG_JOB_CHANGE" + Name: "Veteran Adventurer! (1)" + Condition: " Class >= JOB_KNIGHT && Class <= JOB_ASSASSIN " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 25 + - ID: 200008 + Group: "AG_JOB_CHANGE" + Name: "Veteran Adventurer! (2)" + Condition: " Class >= JOB_CRUSADER && Class <= JOB_DANCER " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 25 + - ID: 200009 + Group: "AG_JOB_CHANGE" + Name: "Warrior (1)" + Condition: " Class >= JOB_LORD_KNIGHT && Class <= JOB_ASSASSIN_CROSS " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 30 + - ID: 200010 + Group: "AG_JOB_CHANGE" + Name: "Warrior (2)" + Condition: " Class >= JOB_PALADIN && Class <= JOB_GYPSY " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 30 + - ID: 200011 + Group: "AG_JOB_CHANGE" + Name: "Elite Adventurer! (1)" + Condition: " Class >= JOB_RUNE_KNIGHT && Class <= JOB_GUILLOTINE_CROSS " + Reward: + ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 50 + - ID: 200012 + Group: "AG_JOB_CHANGE" + Name: "Transcendentaler! (1)" + Condition: " Class >= JOB_RUNE_KNIGHT_T && Class <= JOB_GUILLOTINE_CROSS_T " + Reward: + ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 60 + - ID: 200013 + Group: "AG_JOB_CHANGE" + Name: "Elite Adventurer! (2)" + Condition: " Class >= JOB_ROYAL_GUARD && Class <= JOB_SHADOW_CHASER " + Reward: + ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 50 + - ID: 200014 + Group: "AG_JOB_CHANGE" + Name: "Transcendentaler! (2)" + Condition: " Class >= JOB_ROYAL_GUARD_T && Class <= JOB_SHADOW_CHASER_T " + Reward: + ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 60 + - ID: 200015 + Group: "AG_JOB_CHANGE" + Name: "The way of exceptional character" + Condition: " Class == JOB_SUPER_NOVICE || Class == JOB_GUNSLINGER || Class == JOB_NINJA || Class == JOB_TAEKWON " + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 200016 + Group: "AG_JOB_CHANGE" + Name: "This is My way!" + Condition: " Class == JOB_STAR_GLADIATOR || Class == JOB_SOUL_LINKER || Class == JOB_KAGEROU || Class == JOB_OBORO || Class == JOB_REBELLION " + Reward: + ItemID: 16483 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 20 + - ID: 200017 + Group: "AG_GOAL_STATUS" + Name: "Bearish Power!" + Condition: " bStr >= 90 " + Score: 10 + - ID: 200018 + Group: "AG_GOAL_STATUS" + Name: "Overflowing Magic!" + Condition: " bInt >= 90 " + Score: 10 + - ID: 200019 + Group: "AG_GOAL_STATUS" + Name: "Healthy Body and Mental Health!" + Condition: " bVit >= 90 " + Score: 10 + - ID: 200020 + Group: "AG_GOAL_STATUS" + Name: "Speed of Light" + Condition: " bAgi >= 90 " + Score: 10 + - ID: 200021 + Group: "AG_GOAL_STATUS" + Name: "Hawk Eyes" + Condition: " bDex >= 90 " + Score: 10 + - ID: 200022 + Group: "AG_GOAL_STATUS" + Name: "Maximum Luck" + Condition: " bLuk >= 90 " + Score: 10 + - ID: 200023 + Group: "AG_GOAL_STATUS" + Name: "Dragonlike Power!" + Condition: " bStr >= 125 " + Reward: + Script: " sc_start SC_GIANTGROWTH,180000,1; " + Score: 20 + - ID: 200024 + Group: "AG_GOAL_STATUS" + Name: "Magic Insanity" + Condition: " bInt >= 125 " + Reward: + Script: " specialeffect2 EF_HASTEUP; bonus_script \"{ bonus2 bHPLossRate,100,10000; bonus bBaseAtk,20; bonus bAspdRate,25; }\",60,0,0,SI_STEAMPACK; " + Score: 20 + - ID: 200025 + Group: "AG_GOAL_STATUS" + Name: "Rock Alloy" + Condition: " bVit >= 125 " + Reward: + Script: " specialeffect2 EF_HEAL3; sc_start2 SC_S_LIFEPOTION,600000,-5,5; " + Score: 20 + - ID: 200026 + Group: "AG_GOAL_STATUS" + Name: "Speed of Light" + Condition: " bAgi >= 125 " + Reward: + Script: " specialeffect2 EF_STEAL; sc_start SC_INCFLEE2,60000,20; " + Score: 20 + - ID: 200027 + Group: "AG_GOAL_STATUS" + Name: "Falcon's Eyes" + Condition: " bDex >= 125 " + Reward: + Script: " specialeffect2 EF_MAGICALATTHIT; sc_start SC_INCCRI,300000,30; " + Score: 20 + - ID: 200028 + Group: "AG_GOAL_STATUS" + Name: "Lucky Fever" + Condition: " bLuk >= 125 " + Reward: + Script: " specialeffect2 EF_GLORIA; sc_start SC_GLORIA,15000,0; " + Score: 20 + - ID: 200029 + Group: "AG_GOAL_STATUS" + Name: "Incarnation of Love and Hate" + Condition: " BaseLevel == 99 && Class == JOB_NOVICE " + Reward: + ItemID: 16483 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + Score: 30 + - ID: 200030 + Group: "AG_GOAL_STATUS" + Name: "I really love it!" + Condition: " BaseLevel == 99 && (Class >= JOB_SWORDMAN && Class <= JOB_THIEF) " + Reward: + ItemID: 16504 + Script: " specialeffect2 EF_BLESSING; sc_start SC_BLESSING,30000,10; " + Score: 30 + - ID: 200031 + Group: "AG_JOB_CHANGE" + Name: "Reborn in Valhalla!" + Condition: " BaseLevel == 99 && Class == JOB_NOVICE_HIGH " + Reward: + ItemID: 22808 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 230100 + Group: "AG_TAMING" + Name: "Poring is Love" + Dependent: [230101, 230102, 230103, 230104] + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1025 + Score: 50 + - ID: 230110 + Group: "AG_TAMING" + Name: "Entomologist" + Dependent: [230111, 230112, 230113, 230114, 230115, 230116] + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1026 + Score: 50 + - ID: 230120 + Group: "AG_TAMING" + Name: "Animals are also our friend" + Dependent: [230121, 230122, 230123, 230124, 230125, 230126, 230127, 230128] + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1027 + Score: 50 + - ID: 230140 + Group: "AG_TAMING" + Name: "Monster Girls Unite!!" + Dependent: [230141, 230142, 230143, 230144, 230145, 230146, 230147] + Reward: + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1029 + Score: 50 + - ID: 230101 + Group: "AG_TAMING" + Name: "Poring - taming" + Target: + - MobID: 1002 + Count: 1 + Score: 10 + - ID: 230102 + Group: "AG_TAMING" + Name: "Drops - taming" + Target: + - MobID: 1113 + Count: 1 + Score: 10 + - ID: 230103 + Group: "AG_TAMING" + Name: "Poporing - taming" + Target: + - MobID: 1031 + Count: 1 + Score: 10 + - ID: 230104 + Group: "AG_TAMING" + Name: "Novice Poring - taming" + Target: + - MobID: 2398 + Count: 1 + Score: 10 + - ID: 230111 + Group: "AG_TAMING" + Name: "Chonchon - taming" + Target: + - MobID: 1011 + Count: 1 + Score: 10 + - ID: 230112 + Group: "AG_TAMING" + Name: "Steel Chonchon - taming" + Target: + - MobID: 1042 + Count: 1 + Score: 10 + - ID: 230113 + Group: "AG_TAMING" + Name: "Hunter Fly - taming" + Target: + - MobID: 1035 + Count: 1 + Score: 10 + - ID: 230114 + Group: "AG_TAMING" + Name: "Rocker - taming" + Target: + - MobID: 1052 + Count: 1 + Score: 10 + - ID: 230115 + Group: "AG_TAMING" + Name: "Spore - taming" + Target: + - MobID: 1014 + Count: 1 + Score: 10 + - ID: 230116 + Group: "AG_TAMING" + Name: "Poison Spore - taming" + Target: + - MobID: 1077 + Count: 1 + Score: 10 + - ID: 230121 + Group: "AG_TAMING" + Name: "Lunatic - taming" + Target: + - MobID: 1063 + Count: 1 + Score: 10 + - ID: 230122 + Group: "AG_TAMING" + Name: "Picky - taming" + Target: + - MobID: 1049 + Count: 1 + Score: 10 + - ID: 230123 + Group: "AG_TAMING" + Name: "Savage Bebe - taming" + Target: + - MobID: 1167 + Count: 1 + Score: 10 + - ID: 230124 + Group: "AG_TAMING" + Name: "Baby Desert Wolf - taming" + Target: + - MobID: 1107 + Count: 1 + Score: 10 + - ID: 230125 + Group: "AG_TAMING" + Name: "Smokie - taming" + Target: + - MobID: 1056 + Count: 1 + Score: 10 + - ID: 230126 + Group: "AG_TAMING" + Name: "Yoyo - taming" + Target: + - MobID: 1057 + Count: 1 + Score: 10 + - ID: 230127 + Group: "AG_TAMING" + Name: "Peco Peco - taming" + Target: + - MobID: 1019 + Count: 1 + Score: 10 + - ID: 230128 + Group: "AG_TAMING" + Name: "Petite - taming" + Target: + - MobID: 1155 + Count: 1 + Score: 10 + - ID: 230141 + Group: "AG_TAMING" + Name: "Munak - taming" + Target: + - MobID: 1026 + Count: 1 + Score: 10 + - ID: 230142 + Group: "AG_TAMING" + Name: "Isis - taming" + Target: + - MobID: 1029 + Count: 1 + Score: 10 + - ID: 230143 + Group: "AG_TAMING" + Name: "Sohee - taming" + Target: + - MobID: 1170 + Count: 1 + Score: 10 + - ID: 230144 + Group: "AG_TAMING" + Name: "Zherlthsh - taming" + Target: + - MobID: 1200 + Count: 1 + Score: 10 + - ID: 230145 + Group: "AG_TAMING" + Name: "Alice - taming" + Target: + - MobID: 1275 + Count: 1 + Score: 10 + - ID: 230146 + Group: "AG_TAMING" + Name: "Succubus - taming" + Target: + - MobID: 1370 + Count: 1 + Score: 10 + - ID: 230147 + Group: "AG_TAMING" + Name: "Loli Ruri - taming" + Target: + - MobID: 1505 + Count: 1 + Score: 10 + - ID: 220000 + Group: "AG_CHATTING_CREATE" + Name: "Community begin" + Condition: " true " + Score: 10 + - ID: 220001 + Group: "AG_CHATTING_DYING" + Name: "A mouth only moment" + Condition: " true " + Score: 10 + - ID: 220002 + Group: "AG_CHATTING_COUNT" + Name: "Admiring the chatter" + Condition: " ARG0 == 20 " + Score: 10 + - ID: 220003 + Group: "AG_ADD_FRIEND" + Name: "My friend's friend~" + Condition: " ARG0 >= 1 " + Score: 10 + - ID: 220004 + Group: "AG_ADD_FRIEND" + Name: "A competition of popularity" + Condition: " ARG0 >= 10 " + Score: 10 + - ID: 220005 + Group: "AG_PARTY" + Name: "Let's Party~" + Condition: " true " + Score: 10 + - ID: 220006 + Group: "AG_MARRY" + Name: "Married with who..?" + Condition: " true " + Reward: + TitleID: 1022 + Score: 20 + - ID: 220007 + Group: "AG_BABY" + Name: "Can you grow?" + Condition: " ARG0 == 1 " + Reward: + TitleID: 1032 + Score: 20 + - ID: 220008 + Group: "AG_BABY" + Name: "Being a parent" + Condition: " ARG0 == 2 " + Reward: + TitleID: 1033 + Score: 20 + - ID: 220009 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (1)" + Condition: " ARG0 >= 10000 " + Target: + Count: 10000 + Score: 10 + - ID: 220010 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (2)" + Condition: " ARG0 >= 100000 " + Target: + Count: 100000 + Score: 15 + - ID: 220011 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (3)" + Condition: " ARG0 >= 500000 " + Target: + Count: 500000 + Score: 20 + - ID: 220012 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (4)" + Condition: " ARG0 >= 1000000 " + Target: + Count: 1000000 + Score: 30 + - ID: 220013 + Group: "AG_SPEND_ZENY" + Name: "Activating the market economy (5)" + Condition: " ARG0 >= 5000000 " + Target: + Count: 5000000 + Score: 50 + - ID: 220014 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (1)" + Condition: " ARG0 == 1 && ARG1 >= 7 " + Score: 10 + - ID: 220015 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (2)" + Condition: " ARG0 == 1 && ARG1 >= 12 " + Score: 15 + - ID: 220016 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (3)" + Condition: " ARG0 == 2 && ARG1 >= 7 " + Score: 10 + - ID: 220017 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (4)" + Condition: " ARG0 == 2 && ARG1 >= 12 " + Score: 15 + - ID: 220018 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (5)" + Condition: " ARG0 == 3 && ARG1 >= 7 " + Score: 15 + - ID: 220019 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (6)" + Condition: " ARG0 == 3 && ARG1 >= 12 " + Score: 20 + - ID: 220020 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (7)" + Condition: " ARG0 == 4 && ARG1 >= 7 " + Score: 20 + - ID: 220021 + Group: "AG_ENCHANT_SUCCESS" + Name: "I can't quit from refining! (8)" + Condition: " ARG0 == 4 && ARG1 >= 12 " + Score: 30 + - ID: 220022 + Group: "AG_ENCHANT_FAIL" + Name: "Human's greed has no ending.." + Condition: " true " + Score: 10 + - ID: 220023 + Group: "AG_GET_ITEM" + Name: "I found it! (1)" + Condition: " ARG0 >= 100 " + Score: 10 + - ID: 220024 + Group: "AG_GET_ITEM" + Name: "I found it! (2)" + Condition: " ARG0 >= 1000 " + Score: 10 + - ID: 220025 + Group: "AG_GET_ITEM" + Name: "I found it! (3)" + Condition: " ARG0 >= 5000 " + Score: 15 + - ID: 220026 + Group: "AG_GET_ITEM" + Name: "I found it! (4)" + Condition: " ARG0 >= 10000 " + Score: 15 + - ID: 220027 + Group: "AG_GET_ITEM" + Name: "I found it! (5)" + Condition: " ARG0 >= 50000 " + Score: 20 + - ID: 220028 + Group: "AG_GET_ITEM" + Name: "I found it! (6)" + Condition: " ARG0 >= 100000 " + Score: 20 + - ID: 220029 + Group: "AG_GET_ITEM" + Name: "I found it! (7)" + Condition: " ARG0 >= 150000 " + Score: 30 + - ID: 220030 + Group: "AG_GET_ZENY" + Name: "Rich King (1)" + Condition: " ARG0 >= 10000 " + Score: 10 + - ID: 220031 + Group: "AG_GET_ZENY" + Name: "Rich King (2)" + Condition: " ARG0 >= 100000 " + Score: 15 + - ID: 220032 + Group: "AG_GET_ZENY" + Name: "Rich King (3)" + Condition: " ARG0 >= 1000000 " + Score: 20 + - ID: 220033 + Group: "AG_GET_ZENY" + Name: "Rich King (4)" + Condition: " ARG0 >= 10000000 " + Score: 25 + - ID: 220034 + Group: "AG_GET_ZENY" + Name: "Rich King (5)" + Condition: " ARG0 >= 100000000 " + Score: 30 + - ID: 220035 + Group: "AG_GET_ZENY" + Name: "Rich King (6)" + Condition: " ARG0 >= 1000000000 " + Score: 40 + - ID: 230200 + Group: "AG_BATTLE" + Name: "Poring seeker" + Dependent: [230201, 230202, 230203] + Score: 10 + - ID: 230201 + Group: "AG_BATTLE" + Name: "Exploring Poring's life (1)" + Target: + - MobID: 1002 + Count: 10 + - MobID: 2398 + Count: 10 + - MobID: 1113 + Count: 10 + - MobID: 1031 + Count: 10 + - MobID: 1242 + Count: 10 + Score: 10 + - ID: 230202 + Group: "AG_BATTLE" + Name: "Exploring Poring's life (2)" + Target: + - MobID: 1090 + Count: 1 + - MobID: 1582 + Count: 1 + - MobID: 1096 + Count: 1 + - MobID: 1388 + Count: 1 + - MobID: 1120 + Count: 1 + Score: 15 + - ID: 230203 + Group: "AG_BATTLE" + Name: "Exploring Poring's life (3)" + Target: + - MobID: 1613 + Count: 5 + - MobID: 1977 + Count: 5 + - MobID: 1836 + Count: 5 + Score: 20 + - ID: 240000 + Group: "AG_GOAL_LEVEL" + Name: "Complete challenges after first introduction" + Score: 10 + - ID: 240001 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 1" + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240002 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 2" + Dependent: [240001] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240003 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 3" + Dependent: [240002] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240004 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 4" + Dependent: [240003] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240005 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 5" + Dependent: [240004] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240006 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 6" + Dependent: [240005] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240007 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 7" + Dependent: [240006] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240008 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 8" + Dependent: [240007] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240009 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 9" + Dependent: [240008] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240010 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 10" + Dependent: [240009] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1023 + Score: 10 + - ID: 240011 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 11" + Dependent: [240010] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240012 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 12" + Dependent: [240011] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240013 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 13" + Dependent: [240012] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240014 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 14" + Dependent: [240013] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240015 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 15" + Dependent: [240014] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240016 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 16" + Dependent: [240015] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240017 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 17" + Dependent: [240016] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240018 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 18" + Dependent: [240017] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240019 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 19" + Dependent: [240018] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + Score: 10 + - ID: 240020 + Group: "AG_GOAL_ACHIEVE" + Name: "Reaching Level 20" + Dependent: [240019] + Reward: + ItemID: 644 + Script: " specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,30000,10; " + TitleID: 1024 + Score: 10 + - ID: 220036 + Group: "AG_EAT" + Name: "The beginning of outdoor" + Score: 20 + - ID: 220037 + Group: "AG_EAT" + Name: "The first step becoming a chef" + Score: 20 diff --git a/db/re/instance_db.txt b/db/re/instance_db.txt index 9b585d55db..c3bfed1895 100644 --- a/db/re/instance_db.txt +++ b/db/re/instance_db.txt @@ -22,3 +22,4 @@ 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,374 +18,Ghost Palace,3600,300,1@spa,42,196 diff --git a/db/re/item_db.txt b/db/re/item_db.txt index c9e9163c4a..b118a34151 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -784,7 +784,7 @@ 1440,Battle_Hook_,Battle Hook,5,20,,900,140,,3,3,0x00004082,18,2,2,4,65,1,4,{ bonus2 bAddEff,Eff_Stun,500; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bAddRace,RC_Player,20; skill "KN_PIERCE",3; },{},{} 1441,Blue_Spear,Blue Spear,5,10,,1200,180:170,,3,1,0x00004000,56,2,2,3,100,1,4,{ bonus bDex,5; bonus bInt,5; },{},{} 1442,Ru_Gold_Spear,Ru Gold Spear,5,0,,1200,180,,3,2,0x00004000,56,2,2,3,120,1,4,{ bonus bStr,8; bonus bAgi,8; },{},{} -1443,Crimson_Spear,Crimson Spear,5,20,,900,90,,3,2,0x00004082,56,2,2,3,70,1,4,{ .@r = getrefine(); bonus bBaseAtk,((BaseLevel/10)*5)+(.@r<=15?pow(.@r,2):225); },{},{} +1443,Crimson_Spear,Crimson Spear,5,20,,900,90,,3,2,0x00004082,63,2,2,3,70,1,4,{ .@r = getrefine(); bonus bBaseAtk,((BaseLevel/10)*5)+(.@r<=15?pow(.@r,2):225); },{},{} 1446,Requiem_Spear,Requiem Spear,5,20,,1000,130,,3,,0x00004080,63,2,2,4,100,1,4,{ .@r = getrefine(); .@b = 40; bonus bUnbreakableWeapon,1; if(.@r>=5){ .@b += (.@r-5)*15+20; } bonus2 bAddRace2,RC2_BioLab,.@b; },{},{} //=================================================================== // 2-Handed Spears @@ -1379,12 +1379,12 @@ 2174,Lumiere_Shield,Lumiere Shield,4,20,,1300,,50,,1,0xFFFFFFFF,63,2,32,,65,1,3,{},{},{} 2175,Esprit_Shield,Spirit Shield,4,20,,1300,,50,,1,0xFFFFFFFF,63,2,32,,65,1,3,{},{},{} 2176,Dark_Book,Black Book,4,20,,500,,80,,1,0xFFFFFFFF,63,2,32,,65,1,5,{ bonus bMdef,5; .@r = getrefine(); bonus3 bAutoSpellWhenHit,"NPC_DRAGONFEAR",1,(.@r<=6)?(10):((.@r<=8)?(20):(30)); },{},{} -2177,Shield_Of_Death,Shield Of Death,4,20,,2000,,150,,1,0xFFFFFFFF,63,2,32,,90,1,3,{ bonus2 bAddClass,Class_Boss,2; bonus2 bMagicAddClass,Class_Boss,2; bonus2 bAddClass,Class_Normal,10; bonus2 bMagicAddClass,Class_Normal,10; },{},{} -2178,TE_Woe_Buckler,TE Woe Buckler,4,0,,0,,15,,0,0xFFFFFFFF,63,2,32,1,40,1,2,{ bonus bMdef,15; bonus bMaxHP,100; bonus bMaxSP,100; bonus2 bSubRace,RC_Player,15; },{},{} -2179,TE_Woe_Shield,TE Woe Shield,4,0,,0,,25,,0,0x000444A2,63,2,32,1,40,1,3,{ bonus bMdef,5; bonus bMaxHP,200; bonus2 bSubRace,RC_Player,20; },{},{} -2180,TE_Woe_Magic_Guard,TE Woe Magic Guard,4,0,,0,,5,,0,0x00818315,63,2,32,1,40,1,1,{ bonus bMdef,25; bonus bMaxSP,200; bonus2 bSubRace,RC_Player,10; },{},{} +2177,Shield_Of_Death,Shield Of Death,4,20,,2000,,150,,1,0xFFFFFFFF,63,2,32,,90,1,3,{ bonus2 bAddClass,Class_Boss,2; bonus2 bMagicAddClass,Class_Boss,2; bonus2 bSubClass,Class_Normal,-10; },{},{} +2178,TE_Woe_Buckler,TE Woe Buckler,4,0,,0,,15,,0,0xFFFFFFFF,63,2,32,,40,1,2,{ bonus bMdef,15; bonus bMaxHP,100; bonus bMaxSP,100; bonus2 bSubRace,RC_Player,15; },{},{} +2179,TE_Woe_Shield,TE Woe Shield,4,0,,0,,25,,0,0x000444A2,63,2,32,,40,1,3,{ bonus bMdef,5; bonus bMaxHP,200; bonus2 bSubRace,RC_Player,20; },{},{} +2180,TE_Woe_Magic_Guard,TE Woe Magic Guard,4,0,,0,,5,,0,0x00818315,63,2,32,,40,1,1,{ bonus bMdef,25; bonus bMaxSP,200; bonus2 bSubRace,RC_Player,10; },{},{} 2181,Hervor,Hervor,4,10,,1500,,100,,0,0xFFFFFFFF,63,2,32,,1,,2,{ bonus bMdef,5; bonus2 bSubRace,RC_All,30; bonus bUnbreakableArmor,1; },{},{} -2182,Hervor_Alvitr,Hervor Alvitr,4,0,,3000,,150,,0,0x000FDF80,56,2,32,1,100,0,2,{ bonus bMdef,10; bonus bVit,20; bonus2 bSubRace,RC_All,30; bonus bUnbreakableShield,1; autobonus2 "{ sc_end SC_STUN; sc_end SC_SLEEP; sc_end SC_CURSE; sc_end SC_STONE; sc_end SC_POISON; sc_end SC_BLIND; sc_end SC_SILENCE; sc_end SC_BLEEDING; sc_end SC_CONFUSION; sc_end SC_FREEZE; bonus2 bResEff,Eff_Stun,10000; bonus2 bResEff,Eff_Sleep,10000; bonus2 bResEff,Eff_Curse,10000; bonus2 bResEff,Eff_Stone,10000; bonus2 bResEff,Eff_Poison,10000; bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Silence,10000; bonus2 bResEff,Eff_Bleeding,10000; bonus2 bResEff,Eff_Confusion,10000; bonus2 bResEff,Eff_Freeze,10000; }",10,60000,BF_SHORT; },{},{} +2182,Hervor_Alvitr,Hervor Alvitr,4,0,,3000,,150,,0,0x000FDF80,56,2,32,,100,0,2,{ bonus bMdef,10; bonus bVit,20; bonus2 bSubRace,RC_All,30; bonus bUnbreakableShield,1; autobonus2 "{ sc_end SC_STUN; sc_end SC_SLEEP; sc_end SC_CURSE; sc_end SC_STONE; sc_end SC_POISON; sc_end SC_BLIND; sc_end SC_SILENCE; sc_end SC_BLEEDING; sc_end SC_CONFUSION; sc_end SC_FREEZE; bonus2 bResEff,Eff_Stun,10000; bonus2 bResEff,Eff_Sleep,10000; bonus2 bResEff,Eff_Curse,10000; bonus2 bResEff,Eff_Stone,10000; bonus2 bResEff,Eff_Poison,10000; bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Silence,10000; bonus2 bResEff,Eff_Bleeding,10000; bonus2 bResEff,Eff_Confusion,10000; bonus2 bResEff,Eff_Freeze,10000; }",10,60000,BF_SHORT; },{},{} 2183,Impr_Angel's_Safeguard,Advanced Angelic Guard,4,10000,,400,,30,,1,0x00000001,63,2,32,,99,1,1,{ bonus2 bSubRace,RC_Demon,5; bonus2 bSubEle,Ele_All,5; bonus2 bSubEle,Ele_Neutral,-5; },{},{} 2185,Magic_Reflect,Magic Reflect,4,10,,1000,,50,,1,0xFFFFFFFF,63,2,32,,99,1,3,{ bonus bMdef,10; bonus bMagicDamageReturn,3+((getrefine()>=9) ? 3 : 0); },{},{} 2186,Great_Encyclopedia_Revision,Great Encyclopedia Revision,4,10,,200,0:5,50,,1,0x00810100,63,2,32,,99,1,4,{ bonus bInt,3; bonus bDex,2; .@r = getrefine(); bonus bCritical,3+((.@r >= 7) ? 2 : 0); if(.@r >= 9) bonus bMatk,5; },{},{} @@ -1392,7 +1392,7 @@ 2188,Svalinn_J,Svalinn,4,10,,500,,80,,1,0xFFFFFFFF,63,2,32,,65,1,3,{ .@r = getrefine(); bonus bMaxHP,9+.@r/3; bonus2 bAddEle,Ele_Water,4+.@r/3*5; },{},{} 2189,Mad_Bunny,Mad Bunny Shield,4,10,,100,,40,,1,0xFFFFFFFF,63,2,32,,30,1,6,{ bonus2 bSubEle,Ele_All,5; bonus bMdef,6; bonus bDex,1; },{},{} 2190,Ancient_Shield_Of_Aeon,Ancient Shield Of Aeon,4,0,,200,,5,,0,0x000FDF80,63,2,32,,130,1,2,{ bonus2 bSubEle,Ele_Neutral,10; bonus2 bSubEle,Ele_Fire,10; bonus2 bSubEle,Ele_Water,10; bonus2 bSubEle,Ele_Wind,10; bonus2 bSubEle,Ele_Earth,10; bonus2 bSubEle,Ele_Dark,10; bonus2 bSubEle,Ele_Holy,10; bonus2 bSubEle,Ele_Ghost,10; bonus bMaxHP,500; bonus bMaxSP,50; if(getrefine()>=14) skill "MG_STONECURSE",5; },{},{} -2195,Lian_Shield,Lian Shield,4,0,,1300,,50,,1,0xFFFFFFFF,63,2,32,1,65,1,,{ bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubRace,RC_Formless,-5; },{},{} +2195,Lian_Shield,Lian Shield,4,0,,1300,,50,,1,0xFFFFFFFF,63,2,32,,65,1,,{ bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubRace,RC_Formless,-5; },{},{} 2196,White_Gold_Shield,White Gold Shield,4,0,,1800,,140,,1,0xFFFFFFFF,63,2,32,,,1,,{ autobonus2 "{ bonus bMagicDamageReturn,20; }",100,2000,BF_MAGIC; /* Confirm: Success rate? */ },{},{} 2198,Lapine_Shield,Lapine Shield,4,0,,1000,,25,,1,0xFFFFFFFF,63,2,32,,100,1,,{ bonus bMdef,10; if (getrefine() > 7) { bonus bMatk,20; } },{},{} // GM Shield @@ -1698,9 +1698,9 @@ 2493,Goibne's_Combat_Boots_,Goibne's Greaves,4,30000,,700,,13,,1,0xFFFFFFFE,63,2,64,,54,1,0,{ bonus bMdef,3; bonus bMaxHPrate,5; bonus bMaxSPrate,5; },{},{} 2494,Chrystal_Pumps_,Crystal Pumps,4,20,,100,,5,,1,0xFFFFFFFE,63,0,64,,0,1,0,{ bonus bMdef,10; bonus bLuk,5; },{},{} 2495,Egir_Shoes,Egir Shoes,4,200000,,300,,13,,1,0xFFFFFFFF,63,2,64,,110,1,0,{ if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus bMaxHP,BaseLevel*5; else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus bMaxSP,JobLevel*2; },{},{} -2496,TE_Woe_Shoes,TE Woe Shoes,4,0,,0,,5,,0,0xFFFFFFFF,63,2,64,0,40,1,,{ bonus bMdef,5; bonus bMaxHP,150; bonus bMaxSP,150; bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25; },{},{} -2497,TE_Woe_Boots,TE Woe Boots,4,0,,0,,10,,0,0x000444A2,63,2,64,0,40,1,,{ bonus bMaxHP,200; bonus bMaxSP,100; bonus2 bAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} -2498,TE_Woe_Magic_Sandal,TE Woe Magic Sandal,4,0,,0,,5,,0,0x00818315,63,2,64,1,40,1,,{ bonus bMdef,5; bonus bMaxHP,100; bonus bMaxSP,200; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25; },{},{} +2496,TE_Woe_Shoes,TE Woe Shoes,4,0,,0,,5,,0,0xFFFFFFFF,63,2,64,,40,1,,{ bonus bMdef,5; bonus bMaxHP,150; bonus bMaxSP,150; bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25; },{},{} +2497,TE_Woe_Boots,TE Woe Boots,4,0,,0,,10,,0,0x000444A2,63,2,64,,40,1,,{ bonus bMaxHP,200; bonus bMaxSP,100; bonus2 bAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} +2498,TE_Woe_Magic_Sandal,TE Woe Magic Sandal,4,0,,0,,5,,0,0x00818315,63,2,64,,40,1,,{ bonus bMdef,5; bonus bMaxHP,100; bonus bMaxSP,200; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25; },{},{} 2499,Temporal_Boots,Temporal Boots,4,400,,600,,20,,0,0xFFFFFFFF,63,2,64,,10,1,,{ .@r = getrefine(); bonus bMaxHP,300; bonus bMaxSP,30; bonus bMaxHP,100*(.@r/3); bonus bMaxSP,10*(.@r/3); },{},{} //=================================================================== // Garments @@ -2137,15 +2137,15 @@ 2941,Gunslinger_Manual,Gunslinger Manual,4,0,,100,,0,,0,0x00000001,63,2,136,,0,0,0,{ bonus bMaxSP,100; skill "GS_GLITTERING",1; skill "GS_ADJUSTMENT",1; skill "GS_MADNESSCANCEL",1; skill "GS_INCREASING",1; },{},{} 2942,Taekwon_Manual,Taekwon Manual,4,0,,100,,0,,0,0x00000001,63,2,136,,0,0,0,{ bonus bMaxSP,100; skill "TK_SEVENWIND",4; skill "TK_JUMPKICK",5; },{},{} 2943,Critical_Ring_,Critical Ring,4,0,,100,,,,1,0xFFFFFFFF,63,2,136,,,0,,{ bonus bCritical,5;},{},{} -2944,TE_Ring_Of_Protection,TE Ring Of Protection,4,0,,0,,,,0,0xFFFFFFFF,63,2,136,1,40,0,,{ bonus bMaxHP,100; bonus2 bSubRace,RC_Player,5; },{},{} -2945,TE_Ring_Of_Rage,TE Ring Of Rage,4,0,,0,,,,0,0xFFFFFFFF,63,2,136,1,40,0,,{ bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; },{},{} -2946,TE_Ring_Of_Defiance,TE Ring Of Defiance,4,0,,0,,,,0,0xFFFFFFFF,63,2,136,1,40,0,,{ bonus bMdef,5; bonus2 bSubRace,RC_Player,5; },{},{} +2944,TE_Ring_Of_Protection,TE Ring Of Protection,4,0,,0,,,,0,0xFFFFFFFF,63,2,136,,40,0,,{ bonus bMaxHP,100; bonus2 bSubRace,RC_Player,5; },{},{} +2945,TE_Ring_Of_Rage,TE Ring Of Rage,4,0,,0,,,,0,0xFFFFFFFF,63,2,136,,40,0,,{ bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; },{},{} +2946,TE_Ring_Of_Defiance,TE Ring Of Defiance,4,0,,0,,,,0,0xFFFFFFFF,63,2,136,,40,0,,{ bonus bMdef,5; bonus2 bSubRace,RC_Player,5; },{},{} 2948,Demon_Wing,Demon Wing,4,10,,100,,,,1,0xFFFFFFFF,63,2,136,,70,,,{ bonus bFlee,5; },{},{} 2949,Silversmith_Bracelet,Silversmith Bracelet,4,10,,100,,3,,1,0xFFFFFFFF,63,2,136,,60,,,{ bonus bAllStats,1; bonus bMdef,3; skill "SA_SPELLBREAKER",5; },{},{} -2950,Rune_Ring,Rune Ring,4,0,,0,,,,0,0xFFFFFFFF,63,2,136,1,1,0,,{ bonus2 bExpAddClass,Class_Normal,10; },{},{} -2951,Kvasir_Ring_Blue,Kvasir Ring Blue,4,0,,100,,,,0,0xFFFFFFFF,63,2,136,1,1,0,,{ bonus bMaxSP,30; skill "ECL_SNOWFLIP",1; },{},{} -2952,Kvasir_Ring_Red,Kvasir Ring Red,4,0,,100,,,,0,0xFFFFFFFF,63,2,136,1,1,0,,{ bonus bMaxSP,30; skill "ECL_PEONYMAMY",1; },{},{} -2953,Kvasir_Ring_Green,Kvasir Ring Green,4,0,,100,,,,0,0xFFFFFFFF,63,2,136,1,1,0,,{ bonus bMaxHP,100; skill "ECL_SADAGUI",1; },{},{} +2950,Rune_Ring,Rune Ring,4,0,,0,,,,0,0xFFFFFFFF,63,2,136,,1,0,,{ bonus2 bExpAddClass,Class_Normal,10; },{},{} +2951,Kvasir_Ring_Blue,Kvasir Ring Blue,4,0,,100,,,,0,0xFFFFFFFF,63,2,136,,1,0,,{ bonus bMaxSP,30; skill "ECL_SNOWFLIP",1; },{},{} +2952,Kvasir_Ring_Red,Kvasir Ring Red,4,0,,100,,,,0,0xFFFFFFFF,63,2,136,,1,0,,{ bonus bMaxSP,30; skill "ECL_PEONYMAMY",1; },{},{} +2953,Kvasir_Ring_Green,Kvasir Ring Green,4,0,,100,,,,0,0xFFFFFFFF,63,2,136,,1,0,,{ bonus bMaxHP,100; skill "ECL_SADAGUI",1; },{},{} 2954,Kvasir_Ring_Brown,Kvasir Ring Brown,4,10,,100,,,,0,0xFFFFFFFF,63,2,136,,1,,,{ bonus bMaxHP,100; },{},{} 2956,Safety_Ring_,Advanced Safety Ring,4,75000,,100,,10,,1,0xFFFFFFFE,63,2,136,,50,0,0,{ bonus bMdef,5; bonus bAllStats,1; },{},{} 2957,Good_Ring_Of_Flame_Lord,Advanced Ring Of Flame Lord,4,20,,100,,0,,0,0x7CCFDF80,63,2,136,,85,0,0,{ bonus bStr,3; bonus bVit,2; bonus bBaseAtk,20; bonus2 bSubEle,Ele_Fire,10; bonus3 bAutoSpell,"CH_SOULCOLLECT",1,30; bonus3 bAutoSpell,"MO_EXPLOSIONSPIRITS",1,10; bonus3 bAutoSpell,"PA_PRESSURE",2,30; bonus3 bAutoSpell,"MG_FIREBALL",1,150; bonus3 bAutoSpell,"KN_BOWLINGBASH",5,20; },{},{} @@ -2178,7 +2178,7 @@ 2995,Supplement_Part_Dex,Supplement Part Dex,4,25000,,100,,0,,1,0x00000400,56,2,136,,100,0,0,{ bonus bUseSPrate,-10; bonus bDelayrate,-10; bonus bVariableCastrate,-10; bonus2 bSkillVariableCast,"NC_AXEBOOMERANG",-2000; },{},{} 2996,Reinforced_Parts_Gun_Barrel,Reinforced Parts - Gun Barrel,4,10,,500,,,,1,0xFFFFFFFF,63,2,136,,100,,,{ bonus2 bAddClass,Class_All,4; bonus bHit,10; bonus2 bSkillAtk,"NC_BOOSTKNUCKLE",25; },{},{} 2997,RWC_Gold_Brooch,RWC Gold Brooch,4,10,,200,,0,,1,0xFFFFFFFF,63,2,136,,0,0,,{ bonus bBaseAtk,25; bonus bMatk,20; },{},{} -2998,Shining_Trapezohedron,Shining Trapezohedron,4,0,,100,,,,1,0xFFFFFFFF,63,2,136,1,90,1,,{ bonus2 bSubEle,Ele_Holy,10; },{},{} +2998,Shining_Trapezohedron,Shining Trapezohedron,4,0,,100,,,,1,0xFFFFFFFF,63,2,136,,90,1,,{ bonus2 bSubEle,Ele_Holy,10; },{},{} 2999,RWC_Brooch,RWC Brooch,4,10,,200,,0,,0,0xFFFFFFFF,63,2,136,,0,0,,{ bonus bMaxHP,300; bonus bMaxSP,30; },{},{} //=================================================================== // Cards @@ -3118,6 +3118,12 @@ 4948,Skill_Delay1,After Skill Delay Lv1,6,10,,,,,,,,,,,,,,,{ bonus bDelayrate,-2; },{},{} 4949,Skill_Delay2,After Skill Delay Lv2,6,10,,,,,,,,,,,,,,,{ bonus bDelayrate,-4; },{},{} 4950,Skill_Delay3,After Skill Delay Lv3,6,10,,,,,,,,,,,,,,,{ bonus bDelayrate,-6; },{},{} +4994,Rune_of_Strength_Lv_1,Rune of Strength Lv 1,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bStr,5; } if (.@r>=10) { bonus bAtkRate,5; } },{},{} +4995,Rune_of_Strength_Lv_2,Rune of Strength Lv 2,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bStr,6; } if (.@r>=11) { bonus bStr,1; bonus bAtkRate,7; } },{},{} +4996,Rune_of_Strength_Lv_3,Rune of Strength_Lv 3,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bStr,7; } if (.@r>=12) { bonus bStr,1; bonus bAtkRate,8; } if (.@r>=13) { bonus bStr,1; bonus bAtkRate,2; } },{},{} +4997,Rune_of_Agility_Lv_1,Rune of Agility Lv 1,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bAgi,5; } if (.@r>=10) { bonus bFlee2,5; } },{},{} +4998,Rune_of_Agility_Lv_2,Rune of Agility Lv 2,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bAgi,6; } if (.@r>=11) { bonus bAgi,1; bonus bFlee2,7; } },{},{} +4999,Rune_of_Agility_Lv_3,Rune of Agility Lv 3,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bAgi,7; } if (.@r>=12) { bonus bAgi,1; bonus bFlee2,5; } if (.@r>=13) { bonus bAgi,1; bonus bFlee2,5; } },{},{} //=================================================================== // More Headgears //=================================================================== @@ -4000,23 +4006,23 @@ 5894,RCC2013_3RD_CROWN,RCC2013 3RD CROWN,4,20,,2500,,7,,1,0xFFFFFFFF,63,2,256,,1,0,1108,{ bonus bAllStats,3; skill "AL_TELEPORT",1; },{ sc_start SC_SPEEDUP0,-1,25; },{ sc_end SC_SPEEDUP0; } 5895,RCC2013_ANV_Hat,RCC2013 ANV Hat,4,20,,2500,,7,,1,0xFFFFFFFF,63,2,256,,1,0,1109,{ bonus bAllStats,1; bonus2 bAddClass,Class_All,2; bonus bMatkRate,2; },{},{} 5906,Oni_Horns_,Oni Horns,4,0,,20,,10,,1,0x00001000,63,2,256,,100,1,1127,{ bonus2 bSkillAtk,"GC_COUNTERSLASH",(10*getskilllv("GC_WEAPONBLOCKING")); .@r = getrefine(); if(.@r > 6){ bonus bAtk,20; bonus bHit,5; } if(.@r > 9){ bonus3 bAutoSpell,"GC_CROSSIMPACT",1,10; } },{},{} -5914,C_Flutter_Butterfly,C Flutter Butterfly,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,1,1,0,1378,{ hateffect HAT_EF_FLUTTER_BUTTERFLY,true; },{},{ hateffect HAT_EF_FLUTTER_BUTTERFLY,false; } -5917,Yellow_Scarf,Yellow Scarf,4,0,,100,,,,0,0xFFFFFFFF,63,2,1,0,90,0,1170,{ bonus bLongAtkDef,3; },{},{} +5914,C_Flutter_Butterfly,C Flutter Butterfly,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,,1,0,1378,{ hateffect HAT_EF_FLUTTER_BUTTERFLY,true; },{},{ hateffect HAT_EF_FLUTTER_BUTTERFLY,false; } +5917,Yellow_Scarf,Yellow Scarf,4,0,,100,,,,0,0xFFFFFFFF,63,2,1,,90,0,1170,{ bonus bLongAtkDef,3; },{},{} 5918,Gambler_Seal,Gambler Seal,4,0,,500,,,,0,0xFFFFFFFF,63,2,512,,,0,1202,{ bonus bCritical,3; bonus bCritAtkRate,3; bonus2 bSubSkill,"RA_ARROWSTORM",10; bonus2 bSubSkill,"SR_GATEOFHELL",10; .@dex = readparam(bDex); .@luk = readparam(bLuk); bonus bCritAtkRate,-(.@dex/10)*2; bonus bCritical,.@luk/10; bonus bBaseAtk,(.@luk/10)*2; bonus bMatk,(.@luk/10)*2; if (.@luk > 120) { bonus bCritical,10; bonus bCritAtkRate,10; bonus2 bSubSkill,"RA_ARROWSTORM",30; bonus2 bSubSkill,"SR_GATEOFHELL",30; } else if (.@luk > 108) { bonus bCritical,5; bonus bCritAtkRate,10; } },{},{} -5919,Camellia_Hair_Pin,Camellia Hair Pin,4,0,,1000,,,,1,0xFFFFFFFF,63,2,256,0,50,1,1203,{ bonus bMdef,20; bonus3 bAutoSpell,"AL_PNEUMA",1,30+getrefine()*5; /* CONFIRM The Rate*/ },{},{} +5919,Camellia_Hair_Pin,Camellia Hair Pin,4,0,,1000,,,,1,0xFFFFFFFF,63,2,256,,50,1,1203,{ bonus bMdef,20; bonus3 bAutoSpell,"AL_PNEUMA",1,30+getrefine()*5; /* CONFIRM The Rate*/ },{},{} 5920,Medical_Boots,Medical Boots,4,0,,300,,10,,0,0xFFFFFFFF,63,2,64,,10,1,,{ .@r = getrefine(); bonus bHealPower,10+((.@r/2) * 2); bonus2 bSkillUseSP,"AB_CHEAL",(.@r * 5); },{},{} -5943,Owlviscount_Silk_Hat,Owl Viscount Silk Hat,4,0,,500,,15,,1,0xFFFFFFFF,63,2,256,0,70,1,1323,{ bonus bInt,1; bonus bAspdRate,10; .@r = getrefine(); bonus bMatk,7*.@r; autobonus "{ .@r = getrefine(); bonus bAspdRate,(.@r >= 9 ? 40 : ((.@r >= 7) ? 10 : ((.@r >= 5) ? 5 : 1))); }",.@r*20,30000,BF_MAGIC,"{ specialeffect2 EF_SPELLBREAKER }"; },{},{} -5966,KarduiEar,KarduiEar,4,0,,300,,,,0,0xFFFFFFFF,63,2,512,0,70,0,1357,{ .@dex = readparam(bDex); bonus bMatk,(.@dex > 10) ? .@dex/10*2 : 0; if (.@dex > 107) { bonus bVariableCastrate,-10; bonus bMatk,60; } if (.@dex > 119) { bonus bVariableCastrate,-5; bonus bMatk,100; } },{},{} -5967,Flying Galapago,Flying Galapago,4,0,,500,,,,0,0xFFFFFFFF,63,2,1,0,110,0,1358,{ bonus bAgi,1; bonus2 bSkillAtk,"HT_BLITZBEAT",getskilllv("HT_STEELCROW")*40; },{},{} -5968,DVAngelNurseCap,DVAngelNurseCap,4,0,,500,,10,,1,0xFFFFFFFF,63,2,256,0,50,1,1359,{ if (BaseClass == Job_Acolyte) bonus bHealPower,3; bonus bNoCastCancel,1; .@r = getrefine(); bonus bHealPower,(.@r > 8) ? 12 : ((.@r > 6) ? 9 : ((.@r > 4) ? 6 : 0)); },{},{} -5969,QueenAnzRevenge,QueenAnzRevenge,4,0,,400,,7,,1,0xFFFFFFFF,63,2,256,0,100,1,1360,{ bonus bStr,5; .@r = getrefine(); bonus2 bAddClass,Class_All,7+(.@r > 8 ? 4 : (.@r > 6 ? 3 : (.@r > 4 ? 2 : 0))); bonus bNoSizeFix,1; },{},{} -5971,Moon_Eyepatch,Moon Eyepatch,4,0,,100,,,,1,0xFFFFFFFF,63,2,512,0,10,0,1370,{ bonus2 bSubEle,Ele_Water,5; },{},{} -5972,Chatty_Parrot,Chatty Parrot,4,0,,100,,,,0,0xFFFFFFFF,63,2,1,0,80,0,1116,{ bonus bMatkRate,BaseLevel/50; bonus bVariableCast,-readparam(bInt)/30; },{},{} -5973,Ancient_Elven_Ear_J,Ancient Elven Ear J,4,0,,200,,,,0,0xFFFFFFFF,63,2,512,0,70,0,665,{ bonus bLuk,10; bonus bMdef,10; bonus bFlee2,2; },{},{} -5978,Syringe_Toy,Toy Syringe,4,0,,100,,3,,0,0xFFFFFFFF,63,2,1,1,70,0,842,{ bonus bMdef,3; bonus2 bAddItemHealRate,545,150; bonus2 bAddItemHealRate,546,150; bonus2 bAddItemHealRate,547,150; },{},{} -5979,C_Angel_Fluttering,C Angel Fluttering,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,0,1,0,1380,{ hateffect HAT_EF_ANGEL_FLUTTERING,true; },{},{ hateffect HAT_EF_ANGEL_FLUTTERING,false; } -5980,C_Classical_Fhat,C Classical Fhat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,0,1,0,1381,{},{},{} -5985,Noble_Mask,Noble Mask,4,0,,200,,,,0,0xFFFFFFFF,63,2,256,0,30,0,1409,{ bonus2 bSkillAtk,"PA_SACRIFICE",BaseLevel*2; bonus2 bSkillVariableCast,"PA_PRESSURE",-2000; bonus2 bSkillVariableCast,"CR_DEVOTION",-2000; if (BaseLevel > 149) { bonus bMaxHPrate,3; bonus bAspdRate,3; } else if (BaseLevel > 99) { bonus bMaxHPrate,2; bonus bAspdRate,2; } else { bonus bMaxHPrate,1; bonus bAspdRate,1; } },{},{} +5943,Owlviscount_Silk_Hat,Owl Viscount Silk Hat,4,0,,500,,15,,1,0xFFFFFFFF,63,2,256,,70,1,1323,{ bonus bInt,1; bonus bAspdRate,10; .@r = getrefine(); bonus bMatk,7*.@r; autobonus "{ .@r = getrefine(); bonus bAspdRate,(.@r >= 9 ? 40 : ((.@r >= 7) ? 10 : ((.@r >= 5) ? 5 : 1))); }",.@r*20,30000,BF_MAGIC,"{ specialeffect2 EF_SPELLBREAKER }"; },{},{} +5966,KarduiEar,KarduiEar,4,0,,300,,,,0,0xFFFFFFFF,63,2,512,,70,0,1357,{ .@dex = readparam(bDex); bonus bMatk,(.@dex > 10) ? .@dex/10*2 : 0; if (.@dex > 107) { bonus bVariableCastrate,-10; bonus bMatk,60; } if (.@dex > 119) { bonus bVariableCastrate,-5; bonus bMatk,100; } },{},{} +5967,Flying Galapago,Flying Galapago,4,0,,500,,,,0,0xFFFFFFFF,63,2,1,,110,0,1358,{ bonus bAgi,1; bonus2 bSkillAtk,"HT_BLITZBEAT",getskilllv("HT_STEELCROW")*40; },{},{} +5968,DVAngelNurseCap,DVAngelNurseCap,4,0,,500,,10,,1,0xFFFFFFFF,63,2,256,,50,1,1359,{ if (BaseClass == Job_Acolyte) bonus bHealPower,3; bonus bNoCastCancel,1; .@r = getrefine(); bonus bHealPower,(.@r > 8) ? 12 : ((.@r > 6) ? 9 : ((.@r > 4) ? 6 : 0)); },{},{} +5969,QueenAnzRevenge,QueenAnzRevenge,4,0,,400,,7,,1,0xFFFFFFFF,63,2,256,,100,1,1360,{ bonus bStr,5; .@r = getrefine(); bonus2 bAddClass,Class_All,7+(.@r > 8 ? 4 : (.@r > 6 ? 3 : (.@r > 4 ? 2 : 0))); bonus bNoSizeFix,1; },{},{} +5971,Moon_Eyepatch,Moon Eyepatch,4,0,,100,,,,1,0xFFFFFFFF,63,2,512,,10,0,1370,{ bonus2 bSubEle,Ele_Water,5; },{},{} +5972,Chatty_Parrot,Chatty Parrot,4,0,,100,,,,0,0xFFFFFFFF,63,2,1,,80,0,1116,{ bonus bMatkRate,BaseLevel/50; bonus bVariableCast,-readparam(bInt)/30; },{},{} +5973,Ancient_Elven_Ear_J,Ancient Elven Ear J,4,0,,200,,,,0,0xFFFFFFFF,63,2,512,,70,0,665,{ bonus bLuk,10; bonus bMdef,10; bonus bFlee2,2; },{},{} +5978,Syringe_Toy,Toy Syringe,4,0,,100,,3,,0,0xFFFFFFFF,63,2,1,,70,0,842,{ bonus bMdef,3; bonus2 bAddItemHealRate,545,150; bonus2 bAddItemHealRate,546,150; bonus2 bAddItemHealRate,547,150; },{},{} +5979,C_Angel_Fluttering,C Angel Fluttering,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,,1,0,1380,{ hateffect HAT_EF_ANGEL_FLUTTERING,true; },{},{ hateffect HAT_EF_ANGEL_FLUTTERING,false; } +5980,C_Classical_Fhat,C Classical Fhat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,0,1381,{},{},{} +5985,Noble_Mask,Noble Mask,4,0,,200,,,,0,0xFFFFFFFF,63,2,256,,30,0,1409,{ bonus2 bSkillAtk,"PA_SACRIFICE",BaseLevel*2; bonus2 bSkillVariableCast,"PA_PRESSURE",-2000; bonus2 bSkillVariableCast,"CR_DEVOTION",-2000; if (BaseLevel > 149) { bonus bMaxHPrate,3; bonus bAspdRate,3; } else if (BaseLevel > 99) { bonus bMaxHPrate,2; bonus bAspdRate,2; } else { bonus bMaxHPrate,1; bonus bAspdRate,1; } },{},{} //=================================================================== // More Etc Items //=================================================================== @@ -4839,7 +4845,8 @@ 6915,Captured_Soul,Captured Soul,3,10,,0,,,,,,,,,,,,,{},{},{} 6916,Piece_Of_Soul_Monkey,Piece Of Soul Monkey,3,10,,0,,,,,,,,,,,,,{},{},{} 6917,Piece_Of_Soul_Chicken,Piece Of Soul Chicken,3,10,,0,,,,,,,,,,,,,{},{},{} -6919,Honor_Proof,Honor Proof,3,10,,10,,,,,,,,,,,,,{},{},{} +6919,Honor_Proof,Honor Token,3,10,,10,,,,,,,,,,,,,{},{},{} +6920,Rune_Magic_Powder,Rune Magic Powder,3,10,,10,,,,,,,,,,,,,{},{},{} 6921,Dehumidifiers,Dehumidifiers,3,10,,10,,,,,,,,,,,,,{},{},{} 6922,Sandpaper,Sandpaper,3,10,,10,,,,,,,,,,,,,{},{},{} 6923,Bright_Fire_Lights,Bright Fire Lights,3,10,,10,,,,,,,,,,,,,{},{},{} @@ -6752,7 +6759,7 @@ 12619,Cgrade_Pocket,C Grade Coin Bag,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Cgrade_Pocket); },{},{} 12620,Dgrade_Pocket,D Grade Coin Bag,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Dgrade_Pocket); },{},{} 12621,Egrade_Pocket,E Grade Coin Bag,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Egrade_Pocket); },{},{} -12622,Boarding_Halter,Reins Of Mount,11,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ setmounting(); },{},{ if (ismounting()) setmounting(); } +12622,Boarding_Halter,Reins Of Mount,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ setmounting(); },{},{ if (ismounting()) setmounting(); } 12623,High_Weapon_Box,Advanced Weapons Box,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getrandgroupitem(IG_Advanced_Weapons_Box,1); },{},{} 12624,Delicious_Jelly,Delicious Jelly,0,20,,50,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal 3,3; },{},{} 12625,Sapa_Feat_Cert_Pack,Sapa Feat Cert Pack,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} @@ -6763,7 +6770,7 @@ 12630,Teddy_Bear_Scroll,Teddy Bear Scroll,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ mercenary_create 2217,1800000; },{},{} 12631,Macro_Stone_A,Macro Stone A,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12632,Macro_Stone_B,Macro Stone B,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} -12633,Malang_Cat_Can,Malangdo Cat Can,2,20,,50,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_MAGICALATTHIT; bonus_script "{ bonus2 bExpAddRace,RC_All,10; }",1200; sc_start SC_ITEMBOOST,1200000,20; },{},{} +12633,Malang_Cat_Can,Malangdo Cat Can,2,20,,50,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_MAGICALATTHIT; bonus_script "{ bonus2 bExpAddRace,RC_All,10; bonus2 bDropAddRace,RC_All,20; }",1200,1,0,SI_OVERLAPEXPUP; },{},{} 12634,Macro_Stone_A1,Macro Stone A1,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12635,Macro_Stone_A2,Macro Stone A2,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12636,Malang_Sp_Can,Malangdo Canned Specialties,2,20,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ warp "malangdo",140,114; },{},{} @@ -6807,8 +6814,8 @@ 12674,God_Material_Box,God Material Box,2,20,,500,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_God_Material_Box); },{},{} 12675,Sg_Weapon_Supply_Box,WoE Weapon Supply Box,2,20,,500,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Sg_Weapon_Supply_Box); },{},{} 12676,Sg_Violet_Potion_Box,Siege Violet Potion Box,2,20,,500,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 11547,50; },{},{} -12677,Siege_Arrow_Quiver_S,Siege Arrow Quiver S,2,2,,100,,,,,0xFFFFFFFF,63,2,,,130,,,{ getitem 1776,200; },{},{} -12678,Siege_Arrow_Quiver_A,Siege Arrow Quiver A,2,2,,100,,,,,0xFFFFFFFF,63,2,,,95,,,{ getitem 1775,200; },{},{} +12677,Siege_Arrow_Quiver_S,Siege Arrow Quiver S,2,2,,100,,,,,0xFFFFFFFF,63,2,,,130,,,{ getitem 1775,200; },{},{} +12678,Siege_Arrow_Quiver_A,Siege Arrow Quiver A,2,2,,100,,,,,0xFFFFFFFF,63,2,,,95,,,{ getitem 1776,200; },{},{} 12679,Sg_White_Potion_Box,Siege White Potion Box,2,20,,200,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 11548,30; },{},{} 12680,Sg_Blue_Potion_Box,Siege Blue Potion Box,2,20,,200,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 11549,10; },{},{} 12681,Nestea_Lemon,Nestea Lemon,2,0,,50,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} @@ -7007,7 +7014,7 @@ 12884,Infinite_Concentration_Potion,Infinite Concentration Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION0,1800000,4; },{},{} 12885,Infinite_Awakening_Potion,Infinite Awakening Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION1,1800000,6; },{},{} 12886,Infinite_Berserk_Potion,Infinite Berserk Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION2,1800000,9; },{},{} -12887,C_Wing_Of_Fly,Infinite Flywing,11,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ unitskilluseid getcharid(3),"AL_TELEPORT",1; },{},{} +12887,C_Wing_Of_Fly,Infinite Flywing,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "AL_TELEPORT",1; },{},{} 12888,Siege_Kit_Box,Siege Kit Box,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12889,Weapon_Box_Spear,Weapon Box(Spear),2,10,,200,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{} 12890,Weapon_Box_Mace,Weapon Box(Mace),2,10,,200,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{} @@ -7296,8 +7303,8 @@ 13195,RAG203_,RAG203,5,1800000,,1300,260,,9,0,0x40000000,63,2,34,3,140,1,18,{ bonus bHit,10; bonus bCriticalRate,15; bonus4 bAutoSpell,"AL_DECAGI",1,10,1; },{},{} 13196,Peace_Breaker_,Peace Breaker,5,1950000,,1400,250,,9,1,0x41000000,63,2,34,3,140,1,20,{ bonus bHit,-25; bonus bAspdRate,25; },{},{} 13197,Mini_Mei,Mini Mei,5,1600000,,2500,220,,9,2,0x41000000,63,2,34,2,106,1,19,{},{},{} -13198,Tempest_,Tempest,5,2200000,,2500,250,,9,0,0x41000000,63,2,34,2,140,1,19,{ bonus bHit,-25; bonus bCritical,10; bonus bLongAtkRate,20; },{},{} -13199,Tempest,Tempest,5,2200000,,2500,250,,9,1,0x41000000,63,2,34,2,140,1,19,{ bonus bHit,-25; bonus bCritical,10; bonus bLongAtkRate,20; },{},{} +13198,Tempest_,Tempest,5,2200000,,2500,250,,9,0,0x41000000,63,2,34,4,140,1,19,{ bonus bHit,-25; bonus bCritical,10; bonus bLongAtkRate,20; },{},{} +13199,Tempest,Tempest,5,2200000,,2500,250,,9,1,0x41000000,63,2,34,4,140,1,19,{ bonus bHit,-25; bonus bCritical,10; bonus bLongAtkRate,20; },{},{} //=================================================================== // Bullets //=================================================================== @@ -8598,11 +8605,11 @@ 15059,2011Love_Daddy,2011Love Daddy,4,20,,100,0,80,0,1,0xFFFFFFFF,63,2,16,,0,1,0,{},{},{} 15060,Sky_Blue_Smock,Sky Blue Smock,4,20,,300,0,1,0,1,0xFFFFFFFF,63,2,16,,0,1,0,{},{},{} 15061,Egir_Armor,Egir Armor,4,200000,,2600,,55,,1,0xFFFFFFFF,63,2,16,,110,1,0,{ bonus bAllStats,1; if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus2 bResEff,Eff_Silence,5000; else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus2 bResEff,Eff_Stun,5000; },{},{} -15062,TE_Woe_Coat,TE Woe Coat,4,0,,0,,15,,0,0xFFFFFFFF,63,2,16,0,40,1,,{ bonus bMdef,15; bonus bMaxHP,250; bonus bMaxSP,250; bonus2 bSubRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} -15063,TE_Woe_Chain_Mail,TE Woe Chain Mail,4,0,,0,,25,,0,0x000444A2,63,2,16,0,40,1,,{ bonus bMdef,5; bonus bMaxHP,450; bonus bMaxSP,50; bonus2 bSubRace,RC_Player,15; bonus2 bResEff,Eff_Freeze,25; },{},{} -15064,TE_Woe_Mage_Coat,TE Woe Mage Coat,4,0,,0,,5,,0,0x00818315,63,2,16,0,40,1,,{ bonus bMdef,25; bonus bMaxHP,200; bonus bMaxSP,200; bonus2 bSubRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25; },{},{} +15062,TE_Woe_Coat,TE Woe Coat,4,0,,0,,15,,0,0xFFFFFFFF,63,2,16,,40,1,,{ bonus bMdef,15; bonus bMaxHP,250; bonus bMaxSP,250; bonus2 bSubRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} +15063,TE_Woe_Chain_Mail,TE Woe Chain Mail,4,0,,0,,25,,0,0x000444A2,63,2,16,,40,1,,{ bonus bMdef,5; bonus bMaxHP,450; bonus bMaxSP,50; bonus2 bSubRace,RC_Player,15; bonus2 bResEff,Eff_Freeze,25; },{},{} +15064,TE_Woe_Mage_Coat,TE Woe Mage Coat,4,0,,0,,5,,0,0x00818315,63,2,16,,40,1,,{ bonus bMdef,25; bonus bMaxHP,200; bonus bMaxSP,200; bonus2 bSubRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25; },{},{} 15066,Engraved_Plate_Armor,Engraved Plate Armor,4,100000,,3000,,120,,1,0x00004082,63,2,16,,150,1,,{ bonus bMdef,25; },{},{} -15067,Rune_Suit,Rune Suit,4,0,,0,,,,0,0xFFFFFFFF,63,2,16,0,1,1,,{ bonus2 bExpAddRace,RC_All,10; },{},{} +15067,Rune_Suit,Rune Suit,4,0,,0,,,,0,0xFFFFFFFF,63,2,16,,1,1,,{ bonus2 bExpAddRace,RC_All,10; },{},{} 15068,Im_Angel's_Protection,Advanced Angelic Protection,4,10000,,600,,40,,1,0x00000001,63,2,16,,99,1,0,{ bonus bMdef,30; },{},{} 15069,Suit_Of_Sid,Suit Of Sid,4,20,,1000,,30,,0,0xFFFFFFFF,63,2,16,,0,1,0,{},{},{} 15070,Clothes_of_Happiness,Clothes of Happiness,4,10,,1000,,5,,1,0xFFFFFFFF,63,2,16,,1,1,,{ bonus bMdef,5; bonus bLuk,getrefine(); },{},{} @@ -9659,10 +9666,10 @@ 18728,Egir_Helm,Egir Helm,4,200000,,800,,10,,1,0xFFFFFFFF,63,2,256,,110,1,870,{ bonus bMdef,5; bonus bUnbreakableHelm,1; },{},{} 18729,MVP_Basketball,MVP Basketball,4,20,,150,,6,,1,0xFFFFFFFF,63,2,256,,1,1,871,{ bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10; bonus2 bAddItemHealRate,522,30; .@r = getrefine(); bonus bVariableCastrate,(.@r>=12)?(-5):((.@r>=10)?(-4):(-3)); },{},{} 18730,Cryptura_Academy_Hat,Cryptura Academy Hat,4,0,,200,,2,,1,0xFFFFFFFF,63,2,256,,0,1,872,{ bonus bMaxHP,15; bonus bMaxSP,5; },{},{} -18732,TE_Woe_Cap,TE Woe Cap,4,0,,0,,5,,0,0xFFFFFFFF,63,2,256,0,40,1,14,{ bonus bMdef,5; bonus bBaseAtk,5; bonus bMatk,5; bonus2 bAddRace,RC_Player,10; bonus2 bMagicAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} -18733,TE_Woe_Bone_Helm,TE Woe Bone Helm,4,0,,0,,10,,0,0x000444A2,63,2,256,0,40,1,103,{ bonus bBaseAtk,10; bonus2 bAddRace,RC_Player,20; bonus2 bResEff,Eff_Freeze,25; },{},{} -18734,TE_Woe_Magic_Eyes,TE Woe Magic Eyes,4,0,,0,,5,,0,0x00818315,63,2,256,0,40,1,209,{ bonus bMdef,5; bonus bMatk,10; bonus2 bMagicAddRace,RC_Player,20; bonus2 bResEff,Eff_Freeze,25; },{},{} -18736,Censor_Bar_,Censor Bar,4,0,,100,,,,0,0xFFFFFFFF,63,2,512,0,1,0,229,{},{},{} +18732,TE_Woe_Cap,TE Woe Cap,4,0,,0,,5,,0,0xFFFFFFFF,63,2,256,,40,1,14,{ bonus bMdef,5; bonus bBaseAtk,5; bonus bMatk,5; bonus2 bAddRace,RC_Player,10; bonus2 bMagicAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} +18733,TE_Woe_Bone_Helm,TE Woe Bone Helm,4,0,,0,,10,,0,0x000444A2,63,2,256,,40,1,103,{ bonus bBaseAtk,10; bonus2 bAddRace,RC_Player,20; bonus2 bResEff,Eff_Freeze,25; },{},{} +18734,TE_Woe_Magic_Eyes,TE Woe Magic Eyes,4,0,,0,,5,,0,0x00818315,63,2,256,,40,1,209,{ bonus bMdef,5; bonus bMatk,10; bonus2 bMagicAddRace,RC_Player,20; bonus2 bResEff,Eff_Freeze,25; },{},{} +18736,Censor_Bar_,Censor Bar,4,0,,100,,,,0,0xFFFFFFFF,63,2,512,,1,0,229,{},{},{} 18737,Fortier_Mask,Fortier Masque,4,20,,200,,0,,0,0xFFFFFFFF,63,2,512,,10,0,876,{ bonus bUnbreakableHelm,1; bonus2 bMagicAtkEle,Ele_Fire,4; },{},{} 18739,Carnation_Hairband,Carnation Hairband,4,20,,100,,0,,0,0xFFFFFFFF,63,2,256,,0,1,878,{ bonus bLuk,1; },{},{} 18740,Hair_Of_The_Strong,RMSC2012 Special Costume,4,20,,0,,0,,0,0xFFFFFFFF,63,2,1024,,0,0,879,{},{},{} @@ -9679,7 +9686,7 @@ 18752,Cursed_Book,Cursed Book,4,20,,300,,3,,1,0xFFFFFFFE,63,2,256,,99,1,890,{ .@r = getrefine(); bonus2 bHPLossRate,.@r,5000; bonus2 bHPDrainRate,40,4+(.@r/2); bonus2 bSPDrainRate,10,1+(.@r/3); },{},{} 18753,Tw_Rice_Ball,Tw Rice Ball,4,20,,100,,6,,0,0xFFFFFFFF,63,2,256,,0,0,892,{ bonus bLuk,1; bonus2 bAddMonsterDropItem,564,100; },{},{} 18754,Blood_Sucker,Blood Sucker,4,20,,300,,0,,0,0xFFFFFFFF,63,2,1,,40,0,893,{ bonus bUnbreakableHelm,1; bonus2 bHPDrainRate,30,5; bonus bHPrecovRate,-100; bonus bSPrecovRate,-100; },{},{} -18755,Feather_Beret_,Feather Beret,4,0,,600,,1,,1,0xFFFFFFFF,63,2,256,0,1,1,224,{ bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10; },{},{} +18755,Feather_Beret_,Feather Beret,4,0,,600,,1,,1,0xFFFFFFFF,63,2,256,,1,1,224,{ bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10; },{},{} 18756,Black_Shiba_Inu_Hat,Black Shiba Inu Hat,4,20,,400,,6,,1,0xFFFFFFFF,63,2,256,,50,1,894,{ bonus bBaseAtk,30; bonus2 bAddRace,RC_Brute,10; },{},{} 18758,Hat_Of_Scrat,Hat Of Scrat,4,20,,200,,3,,1,0xFFFFFFFF,63,2,256,,0,1,896,{},{},{} 18759,Stretched_Nose_M,Wood Goblin's Nose,4,20,,200,,0,,0,0xFFFFFFFF,63,2,512,,50,0,737,{ bonus bUnbreakableHelm,1; bonus2 bAddMonsterDropItem,1032,400; bonus2 bAddMonsterDropItem,1033,100; bonus3 bAddMonsterDropItem,576,RC_Plant,40; },{},{} @@ -9759,7 +9766,7 @@ 18863,Exorcist_Robe,Exorcist Robe,4,10,,1700,,57,,1,0xFFFFFFFF,63,2,16,,60,1,,{ bonus bMdef,5; .@r = getrefine(); if (.@r >= 3) { bonus2 bAddRace,RC_Undead,.@r/3*5; } if (BaseClass==Job_Acolyte) bonus2 bAddRace,RC_Undead,10; },{},{} 18864,Earth_Goddess_Flower,Earth Goddess Flower,4,10,,250,,6,,0,0xFFFFFFFF,63,2,256,,1,1,864,{ bonus2 bAddEle,Ele_Earth,15; skill "WZ_EARTHSPIKE",5; },{},{} 18865,Sword_Master_Crown,Sword Master Crown,4,10,,1000,,30,,1,0xFFFFFFFF,63,2,256,,50,1,981,{ .@i = BaseLevel; bonus bBaseAtk,(.@i>150)?(15):((.@i>100)?(10):((.@i>50)?(5):(0))); if(getskilllv("SM_SWORD")==10) bonus bHit,10; if(getskilllv("SM_TWOHAND")==10) bonus bUseSPrate,-5; if(getskilllv("AM_AXEMASTERY")==10) bonus bVariableCastrate,-5; if(getskilllv("AS_KATAR")==10) bonus bCritAtkRate,20; if(getskilllv("PR_MACEMASTERY")==10) bonus bAspdRate,10; },{},{} -18867,Vajra,Vajra,4,0,,300,,,,0,0xFFFFFFFF,63,2,1,0,48,0,983,{ bonus bDex,1; bonus bLongAtkRate,2; },{},{} +18867,Vajra,Vajra,4,0,,300,,,,0,0xFFFFFFFF,63,2,1,,48,0,983,{ bonus bDex,1; bonus bLongAtkRate,2; },{},{} 18868,Assassin_Skull_Mask,Assassin Skull Mask,4,10,,500,,2,,0,0xFFFFFFFF,63,2,513,,70,,984,{ bonus bCritical,5; },{},{} 18870,Very_Sweet_Candy_Bar,Very Sweet Candy Bar,4,10,,10,,,,0,0xFFFFFFFF,63,2,1,,1,1,446,{ bonus bAllStats,2; bonus bBaseAtk,10; bonus bMatk,10; bonus2 bExpAddClass,Class_All,2; },{},{} 18871,Very_Sweet_Candy,Very Sweet Candy,4,10,,10,,,,0,0xFFFFFFFF,63,2,1,,1,1,446,{ bonus bAllStats,1; bonus bBaseAtk,5; bonus bMatk,5; },{},{} @@ -9828,7 +9835,7 @@ 19020,Survive_Circlet,Survive Circlet,4,0,,500,,10,,0,0xFFFFFFFF,63,2,256,,,1,1220,{ .@r = getrefine(); bonus bInt,(3 + (.@r/2)+ (BaseLevel > 130 ? .@r : 0)); bonus bMatkRate,4; },{},{} 19021,Gigant_Helm,Gigant Helm,4,0,,500,,10,,0,0xFFFFFFFF,63,2,256,,,1,1221,{ bonus bStr,3+((BaseLevel > 130) ? getrefine() : 0); bonus2 bAddClass,Class_All,4; },{},{} 19022,Floating_Stone_Of_Intelligence,Floating Stone Of Intelligence,4,,,,,,,,0xFFFFFFFF,63,2,256,,,,1230,{},{ sc_start SC_FSTONE,-1,0; },{ sc_end SC_FSTONE; } // jRO Item -19024,Protect_Feathers,Protect Feathers,4,0,,500,,,,0,0xFFFFFFFF,63,2,512,0,70,0,1232,{ bonus2 bSubRace,RC_DemiHuman,2; bonus2 bSubRace,RC_Player,2; bonus bAspdRate,-5; .@vit = readparam(bVit); if (.@vit >= 108) { bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3; bonus bAspdRate,-5; } if (.@vit >= 120) { bonus bMaxHPRate,3; bonus bMdef,3; } },{},{} +19024,Protect_Feathers,Protect Feathers,4,0,,500,,,,0,0xFFFFFFFF,63,2,512,,70,0,1232,{ bonus2 bSubRace,RC_DemiHuman,2; bonus2 bSubRace,RC_Player,2; bonus bAspdRate,-5; .@vit = readparam(bVit); if (.@vit >= 108) { bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3; bonus bAspdRate,-5; } if (.@vit >= 120) { bonus bMaxHPRate,3; bonus bMdef,3; } },{},{} 19026,Aegir_Helm,Aegir Helm,4,10,,800,,10,,1,0xFFFFFFFF,63,2,256,,40,1,870,{ bonus bVit,3; },{},{} 19030,Pretty_Rabbit_Hood,Pretty Rabbit Hood,4,10,,100,,20,,1,0xFFFFFFFF,63,2,769,,1,1,1085,{ bonus bMaxHP,(15*BaseLevel); },{},{} 19031,Fallen_Angel_Blessing,Fallen Angel Blessing,4,0,,200,,1,,0,0xFFFFFFFF,63,2,512,,,1,1250,{ bonus2 bAddRace,RC_Angel,5; bonus2 bSubRace,RC_Angel,5; },{},{} @@ -9840,7 +9847,7 @@ 19051,Warrior_Moon_Cat,Warrior Moon Cat,4,20,,100,,5,,1,0xFFFFFFFF,63,2,256,,1,1,1308,{ /*Enables use of Level 1 Monster's Cry*/ bonus bAllStats,3; bonus2 bHPDrainRate,40,5; bonus2 bSPDrainRate,10,2; },{},{} 19052,Sigruns_Wing,Rental Sigrun's Wing,4,10,,0,,2,,0,0xFFFFFFFF,63,2,512,,1,0,568,{ if (Class == Job_Swordman || Class == Job_Thief || Class == Job_Merchant || Class == Job_Taekwon || Class == Job_Star_Gladiator || Class == Job_Star_Gladiator2) bonus bAspd,1; else if (Class == Job_Mage || Class == Job_Acolyte || Class == Job_Ninja || Class == Job_Soul_Linker) { bonus bMatk,5; bonus bHealPower,2; } else if (Class == Job_Archer || Class == Job_Gunslinger) bonus bLongAtkRate,2; else if (Class == Job_Novice || Class == Job_SuperNovice) { bonus bMaxHP,120; bonus bMaxSP,60; } },{},{} 19053,Fighter_Moon_Cat,Fighter Moon Cat,4,20,,100,,5,,1,0xFFFFFFFF,63,2,256,,1,1,1308,{ /*Enables use of Level 1 Monster's Cry*/ .@r = getrefine(); bonus bAllStats,3; bonus2 bAddEff,Eff_Stun,500+(.@r*100); },{},{} -19082,Bio_Protector,Bio Protector,4,0,,500,,3,,0,0xFFFFFFFF,63,2,512,1,50,1,1366,{ bonus bHit,10; bonus bVariableCastrate,-5; bonus bPerfectHitRate,5; },{},{} +19082,Bio_Protector,Bio Protector,4,0,,500,,3,,0,0xFFFFFFFF,63,2,512,,50,1,1366,{ bonus bHit,10; bonus bVariableCastrate,-5; bonus bPerfectHitRate,5; },{},{} 19083,Mask_of_Hero,Mask of Hero,4,20,,200,,0,,0,0xFFFFFFFF,63,2,512,,70,0,1367,{ bonus bVit,10; bonus bMdef,10; bonus bShortWeaponDamageReturn,1; },{},{} 19084,Parfaille_Vigilante_Hat,Parfaille Vigilante Hat,4,0,,100,,2,,0,0x80000000,63,2,256,,20,1,1368,{ bonus bLuk,1; bonus3 bAutoSpell,"AL_BLESSING",3,100; },{},{} 19085,Sigrun's_Wings_,Sigrun's Wings,4,20,,100,,2,,1,0xFFFFFFFF,63,2,512,,1,0,568,{ if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief||(BaseJob==Job_Taekwon&&Class!=Job_Soul_Linker)) { bonus bAspd,1; bonus bAgi,-2; } else if(BaseClass==Job_Mage||BaseClass==Job_Acolyte||Class==Job_Ninja||Class==Job_Soul_Linker){ bonus bMatk,3; bonus bHealPower,2; } else if(BaseClass==Job_Archer||BaseClass==Job_Gunslinger) bonus bLongAtkRate,1; else if(BaseJob==Job_Novice||BaseJob==Job_SuperNovice) { bonus bMaxHP,60; bonus bMaxSP,30; } },{},{} @@ -9854,9 +9861,9 @@ 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; },{},{} -19109,Valhalla_Idol,Valhalla Idol,4,0,,300,,2,,0,0xFFFFFFFF,63,2,512,0,70,0,1423,{ bonus bMaxSP,50; bonus3 bAutoSpell,"MG_SAFETYWALL",10,50; },{},{} -19111,Laser_Of_Eagle,Laser of Eagle,4,0,,400,,5,,1,0xFFFFFFFF,63,2,256,0,100,1,1424,{ bonus bDex,2; bonus bLongAtkRate,10; bonus4 bAutoSpell,"PR_LEXAETERNA",1,50,BF_LONG; /*TODO: Chance to transform become Shechil while attacking.*/ },{},{} -19116,Red_Baby_Dragon,Red Baby Dragon,4,0,,700,,,1,1,0xFFFFFFFF,63,2,256,0,90,1,1463,{ .@r=getrefine(); bonus bMaxHPrate,5; bonus bMaxSPrate,5; bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; if (.@r>=6) { bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; } if (.@r>=8) { bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; } },{},{} +19109,Valhalla_Idol,Valhalla Idol,4,0,,300,,2,,0,0xFFFFFFFF,63,2,512,,70,0,1423,{ bonus bMaxSP,50; bonus3 bAutoSpell,"MG_SAFETYWALL",10,50; },{},{} +19111,Laser_Of_Eagle,Laser of Eagle,4,0,,400,,5,,1,0xFFFFFFFF,63,2,256,,100,1,1424,{ bonus bDex,2; bonus bLongAtkRate,10; bonus4 bAutoSpell,"PR_LEXAETERNA",1,50,BF_LONG; /*TODO: Chance to transform become Shechil while attacking.*/ },{},{} +19116,Red_Baby_Dragon,Red Baby Dragon,4,0,,700,,,1,1,0xFFFFFFFF,63,2,256,,90,1,1463,{ .@r=getrefine(); bonus bMaxHPrate,5; bonus bMaxSPrate,5; bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; if (.@r>=6) { bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; } if (.@r>=8) { bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; } },{},{} 19117,Poring_Sunglasses,Poring Sunglasses,4,0,,10,,0,,0,0xFFFFFFFF,63,2,512,,1,0,954,{ bonus2 bDropAddRace,RC_All,5; bonus2 bExpAddRace,RC_All,5; },{},{} 19118,Poring_Sunglasses_,Poring Sunglasses,4,0,,10,,0,,1,0xFFFFFFFF,63,2,512,,1,0,954,{ bonus2 bDropAddRace,RC_All,4; bonus2 bExpAddRace,RC_All,4; },{},{} 19126,Shadow_Booster_,Magical Booster,4,10,,300,,,,1,0xFFFFFFFF,63,2,512,,1,1,873,{ bonus bAspd,1; bonus bDelayrate,-1; },{},{} @@ -10389,7 +10396,7 @@ 20096,C_Blue_Ribbon,Costume Blue Ribbon,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,441,{},{},{} 20097,C_White_Ribbon,Costume White Ribbon,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,442,{},{},{} 20098,C_Vampire_Hairband,Costume Vampire Hairband,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1238,{},{},{} -20099,C_Ljosalfar,Flying Ljosalfar,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,1,1,1,1239,{},{ sc_start SC_LJOSALFAR,-1,0; },{ sc_end SC_LJOSALFAR; } +20099,C_Ljosalfar,Flying Ljosalfar,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1239,{},{ sc_start SC_LJOSALFAR,-1,0; },{ sc_end SC_LJOSALFAR; } 20100,C_Volume_Fhat,Costume Volume Fhat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1240,{},{},{} 20101,C_Bragi_Wing_Ears,Costume Bragi Wing Ears,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1241,{},{},{} 20102,C_Horse_King_J,Costume Horse King J,4,0,,0,,,,0,0xFFFFFFFF,63,2,7168,,1,1,1189,{},{},{} @@ -10405,9 +10412,9 @@ 20112,C_Aqua_Ten_Gallon_Hat,Costume Aqua Ten Gallon Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1256,{},{},{} 20113,C_Star_Reading_Hat,Costume Star Reading Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1253,{},{},{} 20114,C_Funeral_Hat,Costume Funeral Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,77,{},{},{} -20115,C_Under_Rim_Glasses,Under Rim Glasses,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,1,1,1,1255,{},{},{} -20116,C_Mermaid_Headphone,Mermaid Headphone,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,1,1,1,1254,{},{},{} -20117,C_Raspberry_Mousse_Hat,Raspberry Mousse Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,1,1,1,1257,{},{},{} +20115,C_Under_Rim_Glasses,Under Rim Glasses,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,1255,{},{},{} +20116,C_Mermaid_Headphone,Mermaid Headphone,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,1254,{},{},{} +20117,C_Raspberry_Mousse_Hat,Raspberry Mousse Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1257,{},{},{} 20118,C_Cake_Hat,Costume Cake Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,109,{},{},{} 20119,C_Beanie,Costume Beanie,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,160,{},{},{} 20120,C_Aerial,Costume Aerial,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,97,{},{},{} @@ -10508,9 +10515,9 @@ 20215,C_Black_Devil_Mask,Costume Black Devil Mask,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,760,{},{},{} 20216,C_Rideword_Hat,Costume Rideword Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,890,{},{},{} 20217,C_Arabian_Veil,Costume Arabian Veil,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1300,{},{},{} -20218,C_Spell_Circuit,Costume Spell Circuit,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,1,1,1,1301,{},{},{} +20218,C_Spell_Circuit,Costume Spell Circuit,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1301,{},{},{} 20219,C_Angel_Marcher_Hat,Costume Angel Marcher Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1302,{},{},{} -20220,C_Dark_Night_Veil,Costume Dark Night Veil,4,0,,0,,,,0,0xFFFFFFFF,63,2,3072,1,1,1,1303,{},{},{} +20220,C_Dark_Night_Veil,Costume Dark Night Veil,4,0,,0,,,,0,0xFFFFFFFF,63,2,3072,,1,1,1303,{},{},{} 20221,C_Eyes_Of_Ifrit,C Eyes Of Ifrit,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,886,{},{},{} 20222,C_Blue_Pigtail_Santa_Hat,Costume Blue Pigtail Santa Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,,1,395,{},{},{} 20223,C_Romantic_Leaf,Costume Romantic Leaf,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,,1,1,57,{},{},{} @@ -10594,8 +10601,8 @@ 20312,C_Barons_Evil_Eye,Costume Baron's Evil Eye,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,989,{},{},{} 20313,C_CD_in_Mouth,Costume CD in Mouth,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,,1,1,815,{},{},{} 20314,C_New_Wave_Sunglasses,Costume New Wave Sunglasses,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,856,{},{},{} -20315,C_Analyze_Eye,Costume Analyze Eye,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,1,1,1,1351,{},{},{} -20316,C_Seraph_Wing_Helm,Costume Seraph Wing Helm,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,1,1,1,1352,{},{},{} +20315,C_Analyze_Eye,Costume Analyze Eye,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,,1,1,1351,{},{},{} +20316,C_Seraph_Wing_Helm,Costume Seraph Wing Helm,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1352,{},{},{} 20317,C_Nekomimi_Cyber_Headphone,Costume Nekomimi Cyber Headphone,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1353,{},{},{} 20318,C_Charleston_Antenna,Costume Charleston Antenna,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,1354,{},{},{} 20319,C_Crimson_Booster,Costume Crimson Booster,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,1355,{},{},{} @@ -10603,8 +10610,8 @@ 20321,C_Pterios_Fins,Costume Pterios Fins,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,1009,{},{},{} 20322,C_Seal_Hat,Costume Seal Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,540,{},{},{} 20323,C_Sparkling_Sound,Costume Sparkling Sound,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,,1,1,1074,{},{},{} -20324,C_Pigeon_Hat,Costume Pigeon Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,1,1,1,1362,{},{},{} -20325,C_Little_Aquarium,Costume Little Aquarium,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,1,1,1,1363,{},{},{} +20324,C_Pigeon_Hat,Costume Pigeon Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1362,{},{},{} +20325,C_Little_Aquarium,Costume Little Aquarium,4,0,,0,,,,0,0xFFFFFFFF,63,2,2048,,1,1,1363,{},{},{} 20326,C_Sailor_Collar,Costume Sailor Collar,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,,1,1,1364,{},{},{} 20327,C_Marine_Cap,Costume Marine Cap,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1365,{},{},{} 20328,C_Mackerel_Pike,Costume Mackerel Pike,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,,1,1,1081,{},{},{} @@ -10746,12 +10753,12 @@ 20510,C_SwordWing,Costume Sword Wing,4,0,,0,,0,,0,0xFFFFFFFF,63,2,8192,,1,0,19,{},{},{} 20600,Fantastic_Aura,Fantastic Aura,4,0,,0,,0,,0,0xFFFFFFFF,63,2,8192,,1,0,0,{ /*TODO: View ID*/ bonus bUnbreakableHelm,1; },{},{} 20700,Egir_Manteau,Egir Manteau,4,200000,,300,,10,,1,0xFFFFFFFF,63,2,4,,110,1,0,{ bonus bUnbreakableGarment,1; .@r = getrefine(); if (.@r > 10) .@r = 10; if (BaseClass == Job_Mage || BaseClass == Job_Archer || BaseClass == Job_Acolyte) { bonus bFlee2,5+(.@r*2); } else if (BaseClass == Job_Swordman || BaseClass == Job_Merchant || BaseClass == Job_Thief) { bonus bShortWeaponDamageReturn,5+(.@r*2); } },{},{} -20702,TE_Woe_Muffler,TE Woe Muffler,4,0,,0,,5,,0,0xFFFFFFFF,63,2,4,1,40,1,,{ bonus bMdef,5; bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25; },{},{} -20703,TE_Woe_Manteau,TE Woe Manteau,4,0,,0,,10,,0,0x000444A2,63,2,4,1,40,1,,{ bonus2 bAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} -20704,TE_Woe_Magic_Manteau,TE Woe Magic Manteau,4,0,,0,,5,,0,0x00818315,63,2,4,1,40,1,,{ bonus2 bMagicAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} +20702,TE_Woe_Muffler,TE Woe Muffler,4,0,,0,,5,,0,0xFFFFFFFF,63,2,4,,40,1,,{ bonus bMdef,5; bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25; },{},{} +20703,TE_Woe_Manteau,TE Woe Manteau,4,0,,0,,10,,0,0x000444A2,63,2,4,,40,1,,{ bonus2 bAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} +20704,TE_Woe_Magic_Manteau,TE Woe Magic Manteau,4,0,,0,,5,,0,0x00818315,63,2,4,,40,1,,{ bonus2 bMagicAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25; },{},{} 20706,Amistr_Bag,Amistr Bag,4,10,,500,,18,,0,0xFFFFFFFF,63,2,4,,1,,4,{ bonus bAllStats,1; bonus2 bSubEle,Ele_All,5; },{},{} 20707,Kirin_Wing,Kirin Wing,4,20,,0,,18,,0,0xFFFFFFFF,63,2,4,,0,1,6,{ bonus bAllStats,1; bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5; },{},{} -20709,Mana_Manteau,Mana Manteau,4,0,,0,,,,0,0xFFFFFFFF,63,2,4,0,1,1,,{ bonus2 bExpAddRace,RC_All,10; },{},{} +20709,Mana_Manteau,Mana Manteau,4,0,,0,,,,0,0xFFFFFFFF,63,2,4,,1,1,,{ bonus2 bExpAddRace,RC_All,10; },{},{} 20710,Impr_Angel's_Warmth,Advanced Angelic Cardigan,4,10000,,400,,6,,1,0x00000001,63,2,4,,99,1,0,{ bonus bHPrecovRate,50; },{},{} 20711,Manteau_Of_Diego,Manteau Of Diego,4,20,,600,,15,,1,0xFFFFFFFF,63,2,4,,0,1,0,{ bonus bInt,1; bonus bDex,1; bonus bMdef,3; },{},{} 20717,Gigant_Snake_Skin,Gigant Snake Skin,4,10,,400,,38,,0,0xFFFFFFFF,63,2,4,,1,1,0,{ bonus bMdef,10; },{},{} @@ -10769,7 +10776,7 @@ 20746,C_Rudra_Wings,Costume Rudra Wings,4,10,,0,,,,0,0xFFFFFFFF,63,2,8192,,1,0,8,{},{},{} 20748,Cloak_Of_Casualties,Cloak Of Casualties,4,10,,600,,20,,0,0xFFFFFFFF,63,2,4,,120,1,,{ .@r = getrefine(); bonus bAgi,5; bonus bFlee,10; if(readparam(bStr)>=90) bonus bBaseAtk,10+(.@r*2); if(readparam(bInt)>=90) bonus bMatk,20+(.@r*3); if(readparam(bVit)>=90) bonus2 bSubEle,Ele_Neutral,3+((.@r>=8)?3:0)+((.@r>=10)?4:0); if(readparam(bAgi)>=90){ bonus bAspdRate,3+(.@r/2); bonus bAspd,((.@r>=10)?1:0); } if(readparam(bDex)>=90) bonus bLongAtkRate,3+(.@r/2); if(readparam(bLuk)>=90) bonus bCriticalRate,5+.@r; },{},{} 20749,Cloak_Of_Casualties_,Cloak Of Casualties,4,10,,600,,30,,1,0xFFFFFFFF,63,2,4,,170,1,,{ .@r = getrefine(); bonus bMaxHPrate,.@r/2; bonus bMaxSPrate,.@r/2; bonus bAgi,5; bonus bFlee,10; if(readparam(bStr)>=90) bonus bBaseAtk,10+(.@r*2); if(readparam(bInt)>=90) bonus bMatk,20+(.@r*3); if(readparam(bVit)>=90) bonus2 bSubEle,Ele_Neutral,3+((.@r>=8)?3:0)+((.@r>=10)?4:0); if(readparam(bAgi)>=90){ bonus bAspdRate,3+(.@r/2); bonus bAspd,((.@r>=10)?1:0); } if(readparam(bDex)>=90) bonus bLongAtkRate,3+(.@r/2); if(readparam(bLuk)>=90) bonus bCriticalRate,5+.@r; },{},{} -20753,Lian_Robe,Lian Robe,4,0,,700,,20,1,1,0xFFFFFFFF,63,2,4,0,65,1,,{ bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubRace,RC_Formless,-5; },{},{} +20753,Lian_Robe,Lian Robe,4,0,,700,,20,1,1,0xFFFFFFFF,63,2,4,,65,1,,{ bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubRace,RC_Formless,-5; },{},{} 20756,Aegir_Cloak,Aegir Cloak,4,10,,300,,10,,1,0xFFFFFFFF,63,2,4,,40,1,,{ bonus bUnbreakableGarment,1; bonus bMaxHP,500; bonus bMaxSP,50; },{},{} 20761,C_Happiness_Wings,Costume Happiness Wings,4,0,,0,,0,,0,0xFFFFFFFF,63,2,8192,,1,0,9,{},{},{} 20762,C_Great_Devil_Wings,Costume Great Devil Wings,4,0,,0,,0,,0,0xFFFFFFFF,63,2,8192,,1,0,10,{},{},{} @@ -10779,12 +10786,12 @@ 20780,Unity_STR_Manteau,Unity STR Manteau,4,32000,,300,,20,,1,0xFFFFFFFF,63,2,4,,1,1,0,{ .@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bMaxHPrate,2*(.@r/2); } },{},{} 20781,Unity_AGI_Manteau,Unity AGI Manteau,4,32000,,300,,20,,1,0xFFFFFFFF,63,2,4,,1,1,0,{ .@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bFlee,3*(.@r/2); } },{},{} 20782,Unity_INT_Muffler,Unity INT Muffler,4,32000,,300,,20,,1,0xFFFFFFFF,63,2,4,,1,1,0,{ .@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bUseSPrate,-(.@r/2); } },{},{} -20783,Hero_Cape,Hero Cape,4,0,,100,,,,1,0xFFFFFFFF,63,2,4,1,10,1,,{ .@r = getrefine(); bonus2 bSubEle,Ele_Neutral,1+(.@r/3); bonus bFlee,1+(.@r/3); if (.@r > 9) { bonus2 bSubEle,Ele_Neutral,20; bonus bFlee,20; } },{},{} +20783,Hero_Cape,Hero Cape,4,0,,100,,,,1,0xFFFFFFFF,63,2,4,,10,1,,{ .@r = getrefine(); bonus2 bSubEle,Ele_Neutral,1+(.@r/3); bonus bFlee,1+(.@r/3); if (.@r > 9) { bonus2 bSubEle,Ele_Neutral,20; bonus bFlee,20; } },{},{} 20787,Unity_Exquisite_Muffler,Unity Exquisite Muffler,4,32000,,300,,20,,1,0xFFFFFFFF,63,2,4,,1,1,0,{ .@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bCritical,2*(.@r/2); } },{},{} 20788,Private_Doram_Manteau,Private Doram Manteau,4,20,,300,,20,,1,0x80000000,7,2,4,,100,1,,{ bonus bFlee,5; bonus2 bSubEle,Ele_Neutral,2; bonus bFlee2,getrefine()/3; },{},{} 20789,Luxury_Doram_Manteau,Luxury Doram Manteau,4,20,,400,,25,,1,0x80000000,7,2,4,,140,1,,{ bonus bFlee,7; bonus2 bSubEle,Ele_Neutral,3; .@r = getrefine()/3; bonus bFlee2,.@r; bonus bLuk,.@r; },{},{} 20790,Elegant_Doram_Manteau,Elegant Doram Manteau,4,20,,500,,30,,1,0x80000000,7,2,4,,175,1,,{ bonus bFlee,10; bonus2 bSubEle,Ele_Neutral,5; .@r = getrefine()/2; bonus bFlee2,.@r; bonus bInt,.@r; bonus bDex,.@r; bonus bLuk,.@r; },{},{} -20797,Etran_Shirt,Etran Shirt,4,0,,150,,,,1,0xFFFFFFFF,63,2,4,1,1,1,,{ bonus bMdef,10; bonus bMaxHPrate,2; .@r = getrefine(); if (.@r >= 6) bonus bMaxHPrate,4; if (.@r >= 7) bonus bMaxHPrate,6; if (.@r >= 8) bonus bMaxHPrate,8; if (.@r >= 9) bonus bNoKnockback,1; },{},{} +20797,Etran_Shirt,Etran Shirt,4,0,,150,,,,1,0xFFFFFFFF,63,2,4,,1,1,,{ bonus bMdef,10; bonus bMaxHPrate,2; .@r = getrefine(); if (.@r >= 6) bonus bMaxHPrate,4; if (.@r >= 7) bonus bMaxHPrate,6; if (.@r >= 8) bonus bMaxHPrate,8; if (.@r >= 9) bonus bNoKnockback,1; },{},{} 20798,C_Grim_Reaper_Protection,Costume Grim Reaper Protection,4,0,,0,,,,0,0xFFFFFFFF,63,2,4096,,1,0,1450,{},{},{} 20815,SeraphimRobe,Seraphim Robe,4,0,,300,,18,,1,0xFFFFFFFF,63,2,4,,1,1,,{ bonus bMaxHPrate,10; bonus2 bMagicAtkEle,Ele_Neutral,5; .@r = getrefine(); if (.@r > 6) { bonus2 bSubEle,Ele_Dark,20; bonus2 bSubEle,Ele_Holy,20; bonus bMatkRate,10; } if (.@r > 8) { bonus2 bSubEle,Ele_Dark,10; bonus2 bSubEle,Ele_Holy,10; bonus bVariableCastrate,-5; } if (getskilllv("CR_TRUST") > 0) { bonus2 bSubEle,Ele_Holy,.@r*3; } },{},{} 20819,Oxygen_Bottle,Oxygen Bottle,4,0,,500,,0,,1,0xFFFFFFFF,63,2,4,,40,0,0,{ bonus bFlee,12+getrefine(); bonus bHit,getrefine(); },{},{} @@ -10830,7 +10837,7 @@ 22009,Temporal_INT_Boots_,Temporal Boots Of Intelligence,4,20,,600,,20,,1,0xFFFFFFFF,56,2,64,,99,1,,{ .@r = getrefine(); bonus bMdef,5; bonus bMaxHP,300+(100*(.@r/3)); bonus bMaxSP,30+(10*(.@r/3)); bonus bMatk,10*(.@r/3); if(readparam(bInt)>=120) bonus bMatk,60; },{},{} 22010,Temporal_AGI_Boots_,Temporal Boots Of Agility,4,20,,600,,25,,1,0xFFFFFFFF,56,2,64,,99,1,,{ .@r = getrefine(); bonus bMaxHP,300+(100*(.@r/3)); bonus bMaxSP,30+(10*(.@r/3)); bonus bAspdRate,3*(.@r/3); if(readparam(bAgi)>=120) bonus bAspd,1; },{},{} 22011,Temporal_LUK_Boots_,Temporal Boots Of Luck,4,20,,600,,20,,1,0xFFFFFFFF,56,2,64,,99,1,,{ .@r = getrefine(); bonus bMaxHP,300+(100*(.@r/3)); bonus bMaxSP,30+(10*(.@r/3)); bonus bMdef,5; bonus bCritAtkRate,2*(.@r/3); if(readparam(bLuk)>=120) bonus bCritAtkRate,30; },{},{} -22012,Mana_Boots,Mana Boots,4,0,,0,,,,0,0xFFFFFFFF,63,2,64,0,1,1,,{ bonus2 bExpAddRace,RC_All,10; },{},{} +22012,Mana_Boots,Mana Boots,4,0,,0,,,,0,0xFFFFFFFF,63,2,64,,1,1,,{ bonus2 bExpAddRace,RC_All,10; },{},{} 22014,Enhanced_Variant_Shoes,Enhanced Variant Shoes,4,20,,500,,13,,1,0x7CCFDF80,63,2,64,,85,1,0,{ bonus bMaxHPrate,12; bonus bMaxSPrate,12; .@r = getrefine(); bonus bDef,.@r; bonus bMdef,.@r; },{},{} 22015,Impr_Angel's_Arrival,Advanced Angel's Reincarnation,4,10000,,300,,8,,1,0x00000001,63,2,64,,99,1,0,{ bonus bMaxHP,500; bonus bMaxSP,100; },{},{} 22018,Shoes_Of_Wise_Man,Shoes Of Wise Man,4,10,,300,,15,,1,0xFFFFFFFF,63,2,64,,50,1,,{ .@r = getrefine(); if(.@r>5){ bonus bInt,.@r-5; bonus bMaxHPrate,-(.@r-5); } },{},{} @@ -10848,8 +10855,8 @@ 22059,Aegir_Shoes,Aegir Shoes,4,10,,300,,13,,1,0xFFFFFFFF,63,2,64,,40,1,,{ bonus bUnbreakableShoes,1; bonus bMaxHP,500; bonus bMaxSP,50; },{},{} 22064,Thorny_Shoes,Thorny Shoes,4,0,,1000,,25,,1,0xFFFFFFFF,63,2,64,,,1,,{ bonus bShortWeaponDamageReturn,getrefine()/2; },{},{} 22067,Shoe_of_Witch,Shoe of Witch,4,10,,400,,10,,0,0xFFFFFFFE,63,2,64,,1,1,,{ skill "ALL_CATCRY",1; },{},{} -22069,Lian_Shoes,Lian Shoes,4,0,,250,,12,,1,0xFFFFFFFF,63,2,64,1,90,1,,{ bonus bMdef,3; bonus2 bSubEle,Ele_Neutral,5; .@r = getrefine(); bonus bMaxHPrate,.@r; bonus bMaxSPrate,.@r; },{},{} -22072,Hikingboots,Hikingboots,4,0,,500,,10,,1,0xFFFFFFFF,63,2,64,0,100,1,,{ .@r = getrefine(); bonus bMaxHPRate,4+(.@r/3); bonus bMaxSPRate,4+(.@r/3); if (.@r > 9) bonus bSpeedRate,25; },{},{} +22069,Lian_Shoes,Lian Shoes,4,0,,250,,12,,1,0xFFFFFFFF,63,2,64,,90,1,,{ bonus bMdef,3; bonus2 bSubEle,Ele_Neutral,5; .@r = getrefine(); bonus bMaxHPrate,.@r; bonus bMaxSPrate,.@r; },{},{} +22072,Hikingboots,Hikingboots,4,0,,500,,10,,1,0xFFFFFFFF,63,2,64,,100,1,,{ .@r = getrefine(); bonus bMaxHPRate,4+(.@r/3); bonus bMaxSPRate,4+(.@r/3); if (.@r > 9) bonus bSpeedRate,25; },{},{} 22075,Rift_Shoes,Rift Shoes,4,20,,250,,12,,1,0xFFFFFFFF,63,2,64,,100,1,,{ .@r = getrefine(); bonus bMaxHP,(.@r >= 9 ? 1300 : .@r >= 7 ? 700 : 300); bonus bMaxSP,-50; },{},{} 22076,Wooden_Slipper,Wooden Slipper,4,20,,50,,10,,1,0x80000000,7,2,64,,9,1,,{ bonus2 bHPRegenRate,2,10000; },{},{} 22077,Red_Eco-Friendly_Shoes,Red Eco-Friendly Shoes,4,20,,100,,20,,1,0x80000000,7,2,64,,18,1,,{ bonus bCritical,5; bonus2 bHPRegenRate,4,10000; bonus2 bSPRegenRate,1,10000; },{},{} @@ -10857,13 +10864,13 @@ 22079,Unity_AGI_Boots,Unity AGI Boots,4,10,,300,,20,,1,0xFFFFFFFF,63,2,64,,1,1,,{ .@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bAgi,.@r/2; } },{},{} 22080,Unity_DEX_Boots,Unity DEX Boots,4,10,,300,,20,,1,0xFFFFFFFF,63,2,64,,1,1,,{ .@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bDex,.@r/2; } },{},{} 22081,Unity_INT_Boots,Unity INT Boots,4,10,,300,,20,,1,0xFFFFFFFF,63,2,64,,1,1,,{ .@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bInt,.@r/2; } },{},{} -22082,Polyhedron_Shoes,Polyhedron Shoes,4,0,,500,,12,,1,0xFFFFFFFF,63,2,64,0,90,1,,{ .@r = getrefine(); bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubEle,Ele_Fire,5; bonus2 bSubEle,Ele_Water,5; bonus2 bSubEle,Ele_Wind,5; if (.@r > 4) { .@b = (.@r > 6) ? 10 : 5; bonus2 bAddEle,Ele_Neutral,.@b; bonus2 bAddEle,Ele_Fire,.@b; bonus2 bAddEle,Ele_Water,.@b; bonus2 bAddEle,Ele_Wind,.@b; } },{},{} +22082,Polyhedron_Shoes,Polyhedron Shoes,4,0,,500,,12,,1,0xFFFFFFFF,63,2,64,,90,1,,{ .@r = getrefine(); bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubEle,Ele_Fire,5; bonus2 bSubEle,Ele_Water,5; bonus2 bSubEle,Ele_Wind,5; if (.@r > 4) { .@b = (.@r > 6) ? 10 : 5; bonus2 bAddEle,Ele_Neutral,.@b; bonus2 bAddEle,Ele_Fire,.@b; bonus2 bAddEle,Ele_Water,.@b; bonus2 bAddEle,Ele_Wind,.@b; } },{},{} 22083,Private_Doram_Shoes,Private Doram Shoes,4,20,,500,,25,,1,0x80000000,7,2,64,,100,1,,{ bonus bMaxHP,100; bonus bMaxSP,50; .@r = getrefine()/3; bonus bHPrecovRate,.@r*10; bonus bSPrecovRate,.@r*10; },{},{} 22084,Luxury_Doram_Shoes,Luxury Doram Shoes,4,20,,600,,30,,1,0x80000000,7,2,64,,140,1,,{ bonus bMaxHP,300; bonus bMaxSP,100; .@r = getrefine()/3; bonus bHPrecovRate,20*.@r; bonus bSPrecovRate,20*.@r; },{},{} 22085,Elegant_Doram_Shoes,Elegant Doram Shoes,4,20,,700,,35,,1,0x80000000,7,2,64,,175,1,,{ bonus bMaxHPrate,10; bonus bMaxSPrate,5; .@r = getrefine()/2; bonus bMaxHP,100*.@r; bonus bMaxSP,20*.@r; if(.@r >= 4) bonus2 bSkillUseSP,"SU_LOPE",5; },{},{} 22089,Crimson_Gaiter_,Crimson Gaiter,4,0,,500,,10,,1,0xFFFFFFFF,63,2,64,,50,1,,{ bonus bCritical,2; bonus bCritAtkRate,2; if(getrefine()>=7){ bonus bCritical,3; bonus bCritAtkRate,3; } },{},{} 22101,Angel_Poring_Boots,Angel Poring Boots,4,10,,300,,15,,1,0xFFFFFFFF,63,2,64,,1,1,,{ bonus bAllStats,1; skill "AL_HEAL",1; },{},{} -22103,Excelion_Leg,Excelion Leg,4,0,,500,,13,,0,0xFFFFFFFF,63,2,64,1,100,1,,{ .@r = getrefine(); bonus bMaxHP,5+((BaseLevel > 129) ? 4 : 0)+(.@r/3)*3; bonus bMaxSP,5+((BaseLevel > 129) ? 4 : 0)+(.@r/3)*3; },{},{} +22103,Excelion_Leg,Excelion Leg,4,0,,500,,13,,0,0xFFFFFFFF,63,2,64,,100,1,,{ .@r = getrefine(); bonus bMaxHP,5+((BaseLevel > 129) ? 4 : 0)+(.@r/3)*3; bonus bMaxSP,5+((BaseLevel > 129) ? 4 : 0)+(.@r/3)*3; },{},{} 22106,Giant_Boots,Giant Boots,4,0,,500,,13,,1,0xFFFFFFFF,63,2,64,,1,1,,{ bonus2 bSubRace,RC_All,1; bonus bMaxHPrate,2; bonus bMaxSPrate,2; .@r = getrefine(); if (.@r > 4) { bonus bDefRate,2; bonus bMaxHPrate,4; bonus bMaxSPrate,4; } if (.@r > 6) { bonus bDefRate,2; bonus bMaxHPrate,4; bonus bMaxSPrate,4; } },{},{} 22122,Para_Team_Boots100,Awakened Eden Group Boots I,4,0,,0,,22,,0,0xFFFFFFFF,63,2,64,,100,1,,{ bonus bAllStats,1; bonus bHPrecovRate,30; bonus bSPrecovRate,14; },{},{} 22123,Para_Team_Boots115,Awakened Eden Group Boots II,4,0,,0,,25,,0,0xFFFFFFFF,63,2,64,,115,1,,{ bonus bAllStats,1; bonus bHPrecovRate,36; bonus bSPrecovRate,18; },{},{} @@ -10873,7 +10880,7 @@ //=================================================================== // New Usable items //=================================================================== -22508,Para_Team_Mark_,Eden Group Mark,11,0,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ warp "moc_para01",171,115; },{},{} +22508,Para_Team_Mark_,Eden Group Mark,2,0,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ warp "moc_para01",171,115; },{},{} 22507,ShabbyOldScroll,Old Scroll,2,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ callfunc "F_22507"; },{},{} 22510,King_Wolf_Scroll,King Wolf Scroll,2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ /*TODO, confirm the rates*/ getitem callfunc("F_Rand",6635,19598,5658,6238,6239),1; },{},{} 22511,Fenrirs_Power_Scroll,Fenrir's Power Scroll,2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ bonus_script "bonus bMatk,25; bonus bFixedCastRate,-50;",300,1025; },{},{} @@ -11057,9 +11064,9 @@ 22844,Sealed_Dracula_Card_Album,Sealed Dracula Card Album,2,10,,10,,,,,,,,,,,,,{/*No Info*/},{},{} 22845,Sealed_Fortune_Egg,Sealed Fortune Egg,2,10,,10,,,,0,0xFFFFFFFF,63,2,,,1,,,{ getitem callfunc("F_Rand",4488,4497,4486,4480,4485,4539,4487,4494,4538,4489,4490,4482,4503,22846),1; },{},{} 22846,Sealed_Dracula_Card_,Sealed Dracula Card,2,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ bonus_script "{ bonus2 bSPDrainRate,50,5; }",300; },{},{} -22847,Prontera_Medal,Prontera Medal,2,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ warp "prontera",0,0; /*No coord info*/ },{},{} +22847,Prontera_Medal,Prontera Medal,2,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ warp "prontera",159,192; /*No coord info*/ },{},{} 22848,Prison_Key,Prison Key,2,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ warp "prt_prison",0,0; /*No coord info*/ },{},{} -22849,Prontera_Time_Crystal,Prontera Time Crystal,2,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ warp "prt_lib_q",0,0; /*No map+coord info*/ },{},{} +22849,Prontera_Time_Crystal,Prontera Time Crystal,2,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ warp "prt_q",155,27; },{},{} 22850,January_Gift_Box_,January Gift Box,2,10,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ rentitem 19052,604800; },{},{} 22851,February_Gift_Box_,February Gift Box,2,10,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 12105,2; },{},{} 22852,March_Gift_Box_,March Gift Box,2,10,,100,,,,,0xFFFFFFFF,63,2,,,,,,{/*2 Lucky Eggs*/},{},{} @@ -11078,7 +11085,7 @@ 22873,Sealed_Beelzebub_Scroll_II,Sealed Beelzebub Scroll II,2,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem callfunc("F_Rand",22875,6238,6239,6228,6232,24231,24232,17474,6635),1; },{},{} 22874,Sealed_Beelzebub_Card_Album,Sealed Beelzebub Card Album,2,10,,50,,,,,0xFFFFFFFF,63,2,,,,,,{/*No Info*/},{},{} 22875,Sealed_Beelzebub_Card,Sealed Beelzebub Card,6,20,,10,,,,,,,,769,,,,,{ bonus bVariableCastrate,-15; /*Item removed on 2014-12-17*/ },{},{} -22876,Old_Money_Pocket,Old Money Pocket,3,0,,0,,,,,,,,,,,,,{},{},{} +22876,Old_Money_Pocket,Old Money Pocket,3,0,,0,,,,,,,,,,,,,{ Zeny += rand(500,550); },{},{} 22881,Rope_Gallows,Rope Gallows,2,10,,0,,,,,0xFFFFFFFF,63,2,,,,,,{/*Used to catch a Lost Sheep*/},{},{} 22882,Chocolate_Rice_Cake_Soup,Chocolate Rice Cake Soup,2,10,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal 10,10; },{},{} 22883,September_Gift_Box_,September Gift Box,2,10,,100,,,,,0xFFFFFFFF,63,2,,,,,,{/*2 Lucky Eggs*/},{},{} @@ -11455,27 +11462,30 @@ 28316,RCC2013_ARMLET_,RCC2013_ARMLET_,4,200,,200,,,,1,0xFFFFFFFF,63,2,136,,1,0,,{ bonus2 bAddClass,Class_All,1; },{},{} 28317,RCC2013_RING,RCC2013_RING,4,200,,200,,,,0,0xFFFFFFFF,63,2,136,,1,0,,{ bonus2 bAddClass,Class_All,1; },{},{} 28318,RCC2013_RING_,RCC2013_RING_,4,200,,200,,,,1,0xFFFFFFFF,63,2,136,,1,0,,{ bonus2 bAddClass,Class_All,1; },{},{} -28310,Sarah's_Left_Earring,Sarah's Left Earring,4,10,,100,,,,0,0xFFFFFFFF,63,2,128,,145,0,,{ skill "AL_HEAL",1; },{},{} -28311,Sarah's_Right_Earring,Sarah's Right Earring,4,10,,100,,,,0,0xFFFFFFFF,63,2,8,,145,0,,{ skill "AL_TELEPORT",1; },{},{} -28321,Falconer_Claw,Falconer Claw,4,0,,100,,5,,1,0x00000800,63,2,136,0,80,0,,{ bonus bDex,1; bonus2 bSkillAtk,"HT_BLITZBEAT",getskilllv("HT_STEELCROW")*10; },{},{} -28322,Falconer_Glove,Falconer Glove,4,0,,100,,5,,1,0x00000800,63,2,136,0,80,0,,{ bonus bDex,1; bonus bUseSPrate,-5; },{},{} +28310,Sarah's_Left_Earring,Sarah's Left Earring,4,10,,100,,,,0,0xFFFFFFFF,63,2,8,,145,0,,{ skill "AL_HEAL",1; },{},{} +28311,Sarah's_Right_Earring,Sarah's Right Earring,4,10,,100,,,,0,0xFFFFFFFF,63,2,128,,145,0,,{ skill "AL_TELEPORT",1; },{},{} +28321,Falconer_Claw,Falconer Claw,4,0,,100,,5,,1,0x00000800,63,2,136,,80,0,,{ bonus bDex,1; bonus2 bSkillAtk,"HT_BLITZBEAT",getskilllv("HT_STEELCROW")*10; },{},{} +28322,Falconer_Glove,Falconer Glove,4,0,,100,,5,,1,0x00000800,63,2,136,,80,0,,{ bonus bDex,1; bonus bUseSPrate,-5; },{},{} 28326,Broken_Chips_01,Broken Chips 01,4,10,,100,,,,1,0xFFFFFFFF,63,2,136,,100,0,,{ bonus bStr,4; },{},{} 28327,Broken_Chips_02,Broken Chips 02,4,10,,100,,,,1,0xFFFFFFFF,63,2,136,,100,0,,{ bonus bInt,4; },{},{} 28332,Jewerly_Ring,Jewerly Ring,4,10,,100,,,,0,0xFFFFFFFF,63,2,136,,1,0,,{ bonus bLuk,20; autobonus "{ bonus bAspd,2; }",50,2000,BF_WEAPON|BF_MAGIC; },{},{} 28333,Gold_PC_Room_Ring,Gold PC Room Ring,4,10,,0,,,,1,0xFFFFFFFF,63,2,136,,1,0,,{ bonus bMaxHPrate,3; bonus bMaxSPrate,3; },{},{} 28342,Critical_Anklet,Critical Anklet,4,0,,200,,3,,1,0xFFFFFFFF,63,2,136,,,0,,{ bonus bCritical,5; },{},{} -28358,Cursed_Lucky_Clover,Cursed Lucky Clover,4,0,,100,,,,1,0xFFFFFFFF,63,2,136,0,100,0,,{ bonus bLuk,2; bonus bFlee,3; bonus2 bAddEff2,Eff_Curse,5; },{},{ sc_end SC_CLOAKING; /*FIXME: Because the combo has Cloaking skill*/ } -28372,Imperial_Ring,Imperial Ring,4,0,,500,,3,,1,0xFFFFFFFF,63,2,136,0,50,0,,{ bonus bStr,1; bonus bInt,1; bonus bMaxHPRate,3; bonus bMaxSPRate,3; },{},{} +28354,City_Map,City Map,4,0,,100,,0,,1,0xFFFFFFFF,63,2,136,,1,0,0,{ /* todo */ },{},{} +28355,Shining_Holy_Water,Shining Holy Water,4,0,,100,,0,,1,0xFFFFFFFF,63,2,136,,1,0,0,{ /* todo */ },{},{} +28356,Prontera_Badge,Prontera Badge,4,0,,100,,0,,0,0xFFFFFFFF,63,2,136,,1,0,0,{ /*warp "prontera",159,192; 15 mins cooldown */ },{},{} +28358,Cursed_Lucky_Clover,Cursed Lucky Clover,4,0,,100,,,,1,0xFFFFFFFF,63,2,136,,100,0,,{ bonus bLuk,2; bonus bFlee,3; bonus2 bAddEff2,Eff_Curse,5; },{},{ sc_end SC_CLOAKING; /*FIXME: Because the combo has Cloaking skill*/ } +28372,Imperial_Ring,Imperial Ring,4,0,,500,,3,,1,0xFFFFFFFF,63,2,136,,50,0,,{ bonus bStr,1; bonus bInt,1; bonus bMaxHPRate,3; bonus bMaxSPRate,3; },{},{} 28374,Foxtail_Ring,Foxtail Ring,4,20,,100,,0,,0,0x80000000,7,2,136,,1,0,,{ bonus2 bExpAddRace,RC_All,5; .@lvl = min(BaseLevel/5,10); bonus bAtk,2*.@lvl; bonus bMatk,2*.@lvl; bonus bMaxHP,10*.@lvl; bonus bMaxSP,5*.@lvl; },{},{} -28377,Magical_Ring,Magical Ring,4,0,,100,,,,1,0xFFFFFFFF,63,2,136,0,20,0,,{ bonus2 bMagicAddEle,Ele_Fire,5; bonus2 bMagicAddEle,Ele_Water,5; bonus2 bMagicAddEle,Ele_Earth,5; bonus2 bMagicAddEle,Ele_Wind,5; if (BaseLevel > 4) { bonus2 bSkillAtk,"MG_FIREBOLT",BaseLevel/5; bonus2 bSkillAtk,"MG_COLDBOLT",BaseLevel/5; bonus2 bSkillAtk,"MG_LIGHTNINGBOLT",BaseLevel/5; bonus2 bSkillAtk,"WZ_EARTHSPIKE",BaseLevel/5; } },{},{} +28377,Magical_Ring,Magical Ring,4,0,,100,,,,1,0xFFFFFFFF,63,2,136,,20,0,,{ bonus2 bMagicAddEle,Ele_Fire,5; bonus2 bMagicAddEle,Ele_Water,5; bonus2 bMagicAddEle,Ele_Earth,5; bonus2 bMagicAddEle,Ele_Wind,5; if (BaseLevel > 4) { bonus2 bSkillAtk,"MG_FIREBOLT",BaseLevel/5; bonus2 bSkillAtk,"MG_COLDBOLT",BaseLevel/5; bonus2 bSkillAtk,"MG_LIGHTNINGBOLT",BaseLevel/5; bonus2 bSkillAtk,"WZ_EARTHSPIKE",BaseLevel/5; } },{},{} 28380,Fresh_Grass_Necklace,Fresh Grass Necklace,4,20,,100,,0,,1,0x80000000,7,2,136,,100,0,,{ bonus bFlee2,5; bonus2 bSkillCooldown,"SU_SCAROFTAROU",-5000; },{},{} 28381,Cute_Grass_Necklace,Cute Grass Necklace,4,20,,10,,0,,1,0x80000000,7,2,136,,100,0,,{ bonus bHealPower,5; bonus2 bSkillCooldown,"SU_TUNAPARTY",-7000; },{},{} 28382,Charm_Grass_Necklace,Charm Grass Necklace,4,20,,10,,0,,1,0x80000000,7,2,136,,100,0,,{ bonus bMdef,5; bonus2 bVariableCastrate,"SU_CN_METEOR",-1000; },{},{} -28386,Fallen_Monk_Rosary,Fallen Monk Rosary,4,0,,100,,,,1,0xFFFFFFFF,63,2,136,0,20,0,,{ bonus bAspdRate,5; bonus bCritical,5; bonus2 bSkillUseSP,"CH_SOULCOLLECT",-5; if (BaseLevel > 14) bonus2 bSkillAtk,"SR_DRAGONCOMBO",BaseLevel/15; if (BaseLevel > 19) bonus2 bSkillAtk,"SR_KNUCKLEARROW",BaseLevel/20; if (BaseLevel > 29) bonus2 bSkillAtk,"SR_SKYNETBLOW",BaseLevel/30; },{},{} +28386,Fallen_Monk_Rosary,Fallen Monk Rosary,4,0,,100,,,,1,0xFFFFFFFF,63,2,136,,20,0,,{ bonus bAspdRate,5; bonus bCritical,5; bonus2 bSkillUseSP,"CH_SOULCOLLECT",-5; if (BaseLevel > 14) bonus2 bSkillAtk,"SR_DRAGONCOMBO",BaseLevel/15; if (BaseLevel > 19) bonus2 bSkillAtk,"SR_KNUCKLEARROW",BaseLevel/20; if (BaseLevel > 29) bonus2 bSkillAtk,"SR_SKYNETBLOW",BaseLevel/30; },{},{} 28391,S_Thief_Earring,Thief Shadow Earring,12,0,,0,,,,0,0xFFFFFFFF,63,2,1048576,,1,1,,{ .@r = getrefine(); autobonus3 "{ bonus bBaseAtk,30+(.@r*10); bonus bFlee,30+(.@r*10); }",200,5000,"TF_THROWSTONE","{ specialeffect2 EF_ENHANCE; }"; },{},{} 28392,S_Archer_Earring,Archer Shadow Earring,12,0,,0,,,,0,0xFFFFFFFF,63,2,1048576,,1,1,,{ .@r = getrefine(); autobonus3 "{ bonus bBaseAtk,30+(.@r*10); bonus bHit,30+(.@r*10); }",200,5000,"AC_DOUBLE","{ specialeffect2 EF_ENHANCE; }"; },{},{} -28410,Sapphire_Wrist,Sapphire Wrist,4,0,,500,,3,,1,0xFFFFFFFF,63,2,136,0,50,0,,{ bonus bDex,5; bonus bLuk,5; bonus bInt,5; bonus2 bSkillAtk,"GN_SPORE_EXPLOSION",BaseLevel/5; bonus2 bVariableCastrate,"CR_ACIDDEMONSTRATION",-(BaseLevel/4); .@n = getskilllv("CR_SLIMPITCHER"); bonus bDex,.@n/2; bonus bLuk,.@n/2; bonus bInt,.@n/2; bonus bMatk,(.@n/2)*20; },{},{} -28411,Emerald_Earring,Emerald Earring,4,0,,500,,3,,1,0xFFFFFFFF,63,2,136,0,50,0,,{ bonus bDex,5; bonus bAgi,5; bonus bInt,5; bonus2 bSkillAtk,"CG_ARROWVULCAN",BaseLevel; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",BaseLevel; bonus2 bSkillAtk,"DC_THROWARROW",BaseLevel; bonus2 bSkillAtk,"WM_METALICSOUND",2*(BaseLevel/5); .@n = getskilllv("WM_METALICSOUND"); bonus2 bVariableCastrate,"WM_METALICSOUND",.@n/2; bonus bDex,.@n/2; bonus bAgi,.@n/2; bonus bInt,.@n/2; bonus bMatk,(.@n/2)*20; },{},{} +28410,Sapphire_Wrist,Sapphire Wrist,4,0,,500,,3,,1,0xFFFFFFFF,63,2,136,,50,0,,{ bonus bDex,5; bonus bLuk,5; bonus bInt,5; bonus2 bSkillAtk,"GN_SPORE_EXPLOSION",BaseLevel/5; bonus2 bVariableCastrate,"CR_ACIDDEMONSTRATION",-(BaseLevel/4); .@n = getskilllv("CR_SLIMPITCHER"); bonus bDex,.@n/2; bonus bLuk,.@n/2; bonus bInt,.@n/2; bonus bMatk,(.@n/2)*20; },{},{} +28411,Emerald_Earring,Emerald Earring,4,0,,500,,3,,1,0xFFFFFFFF,63,2,136,,50,0,,{ bonus bDex,5; bonus bAgi,5; bonus bInt,5; bonus2 bSkillAtk,"CG_ARROWVULCAN",BaseLevel; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",BaseLevel; bonus2 bSkillAtk,"DC_THROWARROW",BaseLevel; bonus2 bSkillAtk,"WM_METALICSOUND",2*(BaseLevel/5); .@n = getskilllv("WM_METALICSOUND"); bonus2 bVariableCastrate,"WM_METALICSOUND",.@n/2; bonus bDex,.@n/2; bonus bAgi,.@n/2; bonus bInt,.@n/2; bonus bMatk,(.@n/2)*20; },{},{} 28413,Lesser_Mackerel_Talisman,Lesser Mackerel Talisman,4,0,,100,,1,,1,0x80000000,63,2,136,,100,,,{ bonus bVit,1; },{},{} 28414,Intermediate_Mackerel_Talisman,Intermediate Mackerel Talisman,4,0,,100,,1,,1,0x80000000,63,2,136,,140,,,{ bonus bVit,2; },{},{} 28415,Greater_Mackerel_Talisman,Greater Mackerel Talisman,4,0,,100,,1,,1,0x80000000,63,2,136,,175,,,{ bonus bVit,3; },{},{} @@ -11544,13 +11554,13 @@ 28900,Guardsmen's_Shield,Guardsmen's Shield,4,20,,3000,,30,,1,0xFFFFFFFF,63,2,32,,100,1,1,{ .@r = getrefine(); skill "LG_SHIELDSPELL",1; bonus3 bAutoSpellWhenHit,"HP_ASSUMPTIO",3,(10+(.@r*10)); bonus bDef,(.@r*10); bonus bMdef,.@r; },{},{} 28901,Cursed_Mad_Bunny,Cursed Mad Bunny,4,20,,100,,0,,0,0xFFFFFFFF,63,2,32,,1,1,1,{ bonus bAspd,3; bonus2 bAddRace,RC_All,5; bonus2 bMagicAddRace,RC_All,5; bonus bShortWeaponDamageReturn,10; autobonus2 "{ bonus bMagicDamageReturn,60; }",10,2000,BF_MAGIC,"{ specialeffect2 EF_WIND; }"; .@r = getrefine(); if(.@r>=7) { bonus bBaseAtk,5; bonus bMatk,5; } if(.@r>=9) { bonus bBaseAtk,15; bonus bMatk,15; } if(.@r>=12) { bonus bCritical,10; bonus bNoCastCancel,0; } },{},{} 28902,Mad_Bunny_,Mad Bunny,4,20,,100,,0,,1,0xFFFFFFFF,63,2,32,,1,1,1,{ bonus2 bAddRace,RC_All,5; bonus2 bMagicAddRace,RC_All,5; bonus bShortWeaponDamageReturn,10; autobonus2 "{ bonus bMagicDamageReturn,60; }",10,2000,BF_MAGIC,"{ specialeffect2 EF_WIND; }"; .@r = getrefine(); if(.@r>=7) { bonus bBaseAtk,5; bonus bMatk,5; } if(.@r>=9) { bonus bBaseAtk,15; bonus bMatk,15; } if(.@r>=12) { bonus bCritical,10; bonus bNoCastCancel,0; } },{},{} -28903,Scutum,Scutum,4,0,,500,,1,,1,0xFFFFFFFF,63,2,32,1,1,1,,{ .@r = getrefine(); bonus bFlee,5+(.@r*3); bonus bFlee2,1+(.@r*2); if (.@r > 10) { bonus bMaxHPrate,10; bonus bMaxSPrate,10; } },{},{} +28903,Scutum,Scutum,4,0,,500,,1,,1,0xFFFFFFFF,63,2,32,,1,1,1,{ .@r = getrefine(); bonus bFlee,5+(.@r*3); bonus bFlee2,1+(.@r*2); if (.@r > 10) { bonus bMaxHPrate,10; bonus bMaxSPrate,10; } },{},{} 28904,Unity_Guard,Unity Guard,4,20,,300,,60,,1,0xFFFFFFFF,63,2,32,,100,1,1,{ if(BaseLevel<100) { bonus bDef,12*getrefine(); } },{},{} 28905,Unity_Buckler,Unity Buckler,4,20,,300,,60,,1,0xFFFFFFFF,63,2,32,,100,1,1,{ if(BaseLevel<100) { bonus bMaxSPrate,2*getrefine(); } },{},{} -28906,Shield_Of_Flame,Shield Of Flame,4,0,,500,,80,,1,0xFFFFFFFF,63,2,32,1,90,1,,{ bonus2 bSubEle,Ele_Fire,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); } },{},{} -28907,Shield_Of_Gust,Shield Of Gust,4,0,,500,,80,,1,0xFFFFFFFF,63,2,32,1,90,1,,{ bonus2 bSubEle,Ele_Wind,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); } },{},{} -28908,Shield_Of_Water,Shield Of Water,4,0,,500,,80,,1,0xFFFFFFFF,63,2,32,1,90,1,,{ bonus2 bSubEle,Ele_Water,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); } },{},{} -28909,Shield_Of_Earth,Shield Of Earth,4,0,,500,,80,,1,0xFFFFFFFF,63,2,32,1,90,1,,{ bonus2 bSubEle,Ele_Earth,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); } },{},{} +28906,Shield_Of_Flame,Shield Of Flame,4,0,,500,,80,,1,0xFFFFFFFF,63,2,32,,90,1,1,{ bonus2 bSubEle,Ele_Fire,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); } },{},{} +28907,Shield_Of_Gust,Shield Of Gust,4,0,,500,,80,,1,0xFFFFFFFF,63,2,32,,90,1,1,{ bonus2 bSubEle,Ele_Wind,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); } },{},{} +28908,Shield_Of_Water,Shield Of Water,4,0,,500,,80,,1,0xFFFFFFFF,63,2,32,,90,1,1,{ bonus2 bSubEle,Ele_Water,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); } },{},{} +28909,Shield_Of_Earth,Shield Of Earth,4,0,,500,,80,,1,0xFFFFFFFF,63,2,32,,90,1,1,{ bonus2 bSubEle,Ele_Earth,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); } },{},{} 28910,Rectangular_Large_Sleeve,Rectangular Large Sleeve,4,20,,800,,80,,1,0xFFFFFFFF,63,2,32,,100,1,1,{ bonus bLongAtkDef,5; .@r = getrefine(); if(.@r>=5) { bonus bLongAtkDef,5; } if(.@r>=7) { bonus bLongAtkDef,10; } if(.@r>=9) { bonus bLongAtkDef,15; } },{},{} 28913,Ultralight_Magic_Shield,Ultralight Magic Shield,4,20,,100,,50,,1,0xFFFFFFFF,63,2,32,,100,1,1,{ bonus bAspdRate,5; bonus2 bIgnoreDefClassRate,Class_Normal,10; bonus2 bSubEle,Ele_Neutral,5; .@r = getrefine(); if(.@r>=7) { bonus2 bIgnoreDefClassRate,Class_Normal,2; bonus bAspdRate,2; } if(.@r>=9) { bonus2 bIgnoreDefClassRate,Class_Normal,3; bonus bAspdRate,3; } },{},{} 28915,Bunker_Shield,Bunker Shield,4,20,,3500,,90,,1,0xFFFFFFFF,63,2,32,,50,1,1,{ bonus2 bAddRace,RC_All,4; bonus bAspdRate,5; .@r = getrefine(); if(.@r>=5) { bonus2 bAddRace,RC_All,.@r; } },{},{} @@ -11559,6 +11569,18 @@ //=================================================================== // Enchantment stones //=================================================================== +29000,Rune_of_Intellect_Lv_1,Rune of Intellect Lv 1,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bInt,5; } if (.@r>=10) { bonus bMatkRate,5; } },{},{} +29001,Rune_of_Intellect_Lv_2,Rune of Intellect Lv 2,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bInt,6; } if (.@r>=11) { bonus bInt,1; bonus bMatkRate,7; } },{},{} +29002,Rune_of_Intellect_Lv_3,Rune of Intellect Lv 3,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bInt,7; } if (.@r>=12) { bonus bInt,1; bonus bMatkRate,8; } if (.@r>=13) { bonus bInt,1; bonus bMatkRate,2; } },{},{} +29003,Rune_of_Dexterity_Lv_1,Rune of Dexterity Lv 1,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bDex,5; } if (.@r>=10) { bonus bLongAtkRate,5; } },{},{} +29004,Rune_of_Dexterity_Lv_2,Rune of Dexterity Lv 2,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bDex,6; } if (.@r>=11) { bonus bDex,1; bonus bLongAtkRate,7; } },{},{} +29005,Rune_of_Dexterity_Lv_3,Rune of Dexterity Lv 3,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bDex,7; } if (.@r>=12) { bonus bDex,1; bonus bLongAtkRate,8; } if (.@r>=13) { bonus bDex,1; bonus bLongAtkRate,2; } },{},{} +29006,Rune_of_Luck_Lv_1,Rune of Luck Lv 1,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bLuk,5; } if (.@r>=10) { bonus bCritAtkRate,5; } },{},{} +29007,Rune_of_Luck_Lv_2,Rune of Luck Lv 2,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bLuk,6; } if (.@r>=11) { bonus bLuk,1; bonus bCritAtkRate,7; } },{},{} +29008,Rune_of_Luck_Lv_3,Rune of Luck Lv 3,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bLuk,7; } if (.@r>=12) { bonus bLuk,1; bonus bCritAtkRate,8; } if (.@r>=13) { bonus bLuk,1; bonus bCritAtkRate,6; } },{},{} +29009,Rune_of_Vitality_Lv_1,Rune of Vitality Lv 1,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bVit,5; } if (.@r>=10) { bonus bMaxHPrate,5; } },{},{} +29010,Rune_of_Vitality_Lv_2,Rune of Vitality Lv 2,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bVit,6; } if (.@r>=11) { bonus bVit,1; bonus bMaxHPrate,7; } },{},{} +29011,Rune_of_Vitality_Lv_3,Rune of Vitality Lv 3,6,20,,,,,,,,,,,,,,,{ .@r = getrefine(); if (.@r>=7) { bonus bVit,7; } if (.@r>=12) { bonus bVit,1; bonus bMaxHPrate,8; } if (.@r>=13) { bonus bVit,1; bonus bMaxHPrate,2; } },{},{} 29061,Ambition1Lv,Ambition1Lv,6,10,,0,,,,,,,,,,,,,{ bonus2 bAddClass,Class_All,3; bonus bHit,3; },{},{} 29062,Ambition2Lv,Ambition2Lv,6,10,,0,,,,,,,,,,,,,{ bonus2 bAddClass,Class_All,6; bonus bHit,6; },{},{} 29063,Ambition3Lv,Ambition3Lv,6,10,,0,,,,,,,,,,,,,{ bonus2 bAddClass,Class_All,9; bonus bHit,9; },{},{} diff --git a/db/re/item_flag.txt b/db/re/item_flag.txt index 37d081b862..b68c97c2c0 100644 --- a/db/re/item_flag.txt +++ b/db/re/item_flag.txt @@ -7,6 +7,7 @@ // 4 - GUID Item: When this item is obtained, will generates GUID that cannot be stacked even same or stackable item // 8 - Item will be bound item when equipped // 16 - Special Broadcast: When item dropped by monster and player loot it, will be broadcasted! +// 32 - Item will not be removed on consumption. Also supports 'itemskill' // NOTE: For removing flag by import file, use "-" to remove the flag. Example, 604,-1 will removes flag 1 from Branch_Of_Dead_Tree // Logged as Dead Branch item @@ -1772,3 +1773,8 @@ // Special Broadcast 7782,16 //Gold_Key77 7783,16 //Silver_Key77 + +// Not removed after consumption +12622,32 //Boarding_Halter +12887,32 //C_Wing_Of_Fly +22508,32 //Para_Team_Mark_ diff --git a/db/re/item_trade.txt b/db/re/item_trade.txt index bb44666654..e3547420cd 100644 --- a/db/re/item_trade.txt +++ b/db/re/item_trade.txt @@ -914,7 +914,7 @@ 6916,499,100 // Piece_Of_Soul_Monkey 6917,499,100 // Piece_Of_Soul_Chicken 6919,499,100 // Honor_Proof -//6920,467,100 // +6920,499,100 // Rune_Magic_Powder 6923,499,100 // Bright_Fire_Lights 6925,499,100 // Letter_Of_Prisoner 6926,499,100 // Rune-Midgard_History_Book diff --git a/db/re/mob_db.txt b/db/re/mob_db.txt index f88d39a1f8..23509d25a6 100644 --- a/db/re/mob_db.txt +++ b/db/re/mob_db.txt @@ -2102,20 +2102,20 @@ //2945,J_MUMMY //2946,J_ANUBIS //2947,J_EGGYRA -//2948,CURSED_SOLDIER -//2949,CURSED_SENTINEL -//2950,BROKEN_MIND -//2951,FLOATING_WORD -//2952,LIKE_LOVE -//2953,CURSED_MEMORY -//2954,COLORLESS_VOW -//2955,OLD_FRIENDSHIP -//2956,SWEET_SLAUGHTER -//2957,FORGOTTEN_NAME -//2958,FATAL_DAYS -//2959,TORTUROUS_REDEEMER +2948,CURSED_SOLDIER,Cursed Soldier,Cursed Soldier,110,18574,1,1907,1851,9,1258,1791,85,35,81,50,64,56,178,23,10,12,1,1,69,0x3885,150,1960,576,420,0,0,0,0,0,0,0,6672,1000,957,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2949,CURSED_SENTINEL,Cursed Sentinel,Cursed Sentinel,110,14099,1,1634,1346,2,1347,1906,84,41,120,65,66,41,107,26,10,12,2,7,67,0x3885,175,914,1344,384,0,0,0,0,0,0,0,6672,1000,934,2500,1097,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2950,BROKEN_MIND,Broken Mind,Broken Mind,110,13520,1,1545,1557,1,1259,1799,67,27,69,37,36,10,64,5,10,12,1,6,67,0x2003885,200,920,720,200,0,0,0,0,0,0,0,6672,1000,6086,2500,683,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2951,FLOATING_WORD,Floating Word,Floating Word,110,11276,1,1166,1034,1,1080,1509,93,40,111,90,60,70,139,65,10,12,0,6,68,0x2003885,150,972,648,432,0,0,0,0,0,0,0,6672,1000,938,3000,947,2500,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2952,LIKE_LOVE,Like Love,Like Love,110,14008,1,1505,1667,2,1182,1183,64,51,62,27,25,55,102,20,10,12,1,6,64,0x2003885,150,1056,1056,336,0,0,0,0,0,0,0,6672,1000,929,2500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2953,CURSED_MEMORY,Cursed Memory,Cursed Memory,110,18045,1,1802,1623,1,1310,1867,89,28,87,39,58,5,82,10,10,12,1,1,69,0x3885,350,1768,500,192,0,0,0,0,0,0,0,6672,1000,957,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2954,COLORLESS_VOW,Colorless Vow,Colorless Vow,110,19194,0,1939,1881,1,1478,2121,95,41,84,35,60,20,85,15,10,12,1,1,69,0x3885,350,0,500,0,0,0,0,0,0,0,0,6672,1000,958,3500,1063,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2955,OLD_FRIENDSHIP,Old Friendship,Old Friendship,110,12614,0,1306,1328,0,1147,1638,78,5,56,12,19,11,30,10,10,12,1,1,49,0x3885,250,2460,912,0,0,0,0,0,0,0,0,6672,1000,932,3500,1098,2500,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2956,SWEET_SLAUGHTER,Sweet Slaughter,Sweet Slaughter,110,13986,0,1960,1587,0,1216,1709,125,10,121,48,40,31,125,32,10,12,2,1,29,0x3885,350,1538,1000,396,0,0,0,0,0,0,0,6672,1000,929,2000,682,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2957,FORGOTTEN_NAME,Forgotten Name,Forgotten Name,120,19546,1,1505,1485,2,1093,1520,111,38,121,29,51,43,100,3,10,12,1,1,49,0x3885,155,1169,1152,480,0,0,0,0,0,0,0,6672,1500,682,5000,683,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2958,FATAL_DAYS,Fatal Days,Fatal Days,120,24240,1,2052,2026,2,1025,1428,72,15,100,71,63,85,115,37,10,12,1,6,67,0x2003885,190,720,384,480,0,0,0,0,0,0,0,6672,1500,1050,2500,1038,2500,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +2959,TORTUROUS_REDEEMER,Torturous Redeemer,Torturous Redeemer,120,103342,0,10590,8378,0,1253,1753,144,28,133,69,72,55,165,44,10,12,1,7,62,0x3885,200,672,420,360,0,0,0,0,0,0,0,6672,10000,6672,10000,923,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //2960,MM_FLAMECROSS -//2961,E_TORTUROUS_REDEEMER +2961,E_TORTUROUS_REDEEMER,Torturous Redeemer,Torturous Redeemer,120,103342,1,10590,8378,1,1253,1753,144,28,133,69,72,55,165,44,10,12,1,7,62,0x3885,200,672,420,360,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 //2962,E_DEVILING //2963,WOODIE //2964,EXP_1000 @@ -3034,7 +3034,17 @@ //3874,AB_MOB_048 //3875,AB_MOB_049 //3876,AB_MOB_050 - +//3877,E_NYAIL_PIG +//3878,E_PIT +//3879,E_SEA_WORMS +//3880,E_SMALL_SWIRL +//3881,E_RIPE_WATERMELON +//3882,E_MD_NYAILO +//3883,E_MD_NYAILO_LEG +//3884,E_MD_S_TREASURE_BOX +//3885,E_MD_B_TREASURE_BOX +//3886,E_MD_BOX_PUPPET +//3887,E_MD_DEPRESS_SOUL //3888,TW_I_QUEEN_SCARABA //3889,TW_GIOIA //3890,TW_TIMEHOLDER @@ -3051,3 +3061,42 @@ //3901,MD_ORK_HERO //3902,MD_ORC_LORD //3903,MD_ORC_FLOWER + +//3910,E_EMPEL_1 +//3911,E_GIBBET +//3912,E_LOLI_RURI +//3913,E_DULLAHAN +//3914,E_BLOODY_MURDERER +//3915,E_EMPEL_1B +//3916,JP_E_MONSTER_74 +//3917,JP_E_MONSTER_75 +//3918,JP_E_MONSTER_76 +//3919,JP_E_MONSTER_77 +//3920,JP_E_MONSTER_78 +//3921,JP_E_MONSTER_79 +//3922,JP_E_MONSTER_80 +//3923,JP_E_MONSTER_81 +//3924,JP_E_MONSTER_82 +//3925,JP_E_MONSTER_83 +//3926,JP_E_MONSTER_84 +//3927,JP_E_MONSTER_85 +//3928,JP_E_MONSTER_86 +//3929,JP_E_MONSTER_87 +//3930,JP_E_MONSTER_88 +//3931,JP_E_MONSTER_89 +//3932,JP_E_MONSTER_90 +//3933,JP_E_MONSTER_91 +//3934,JP_E_MONSTER_92 +//3935,JP_E_MONSTER_93 +//3936,JP_E_MONSTER_94 +//3937,JP_E_MONSTER_95 +//3938,JP_E_MONSTER_96 +//3939,JP_E_MONSTER_97 +//3940,JP_E_MONSTER_98 +//3941,JP_E_MONSTER_99 +//3942,JP_E_MONSTER_100 +//3943,JP_E_MONSTER_101 +//3944,JP_E_MONSTER_102 +//3945,JP_E_MONSTER_103 +//3946,JP_E_MONSTER_104 +//3947,JP_E_MONSTER_105 diff --git a/db/re/mob_drop.txt b/db/re/mob_drop.txt index cd45806656..3f866df901 100644 --- a/db/re/mob_drop.txt +++ b/db/re/mob_drop.txt @@ -46,11 +46,11 @@ 2700,28705,250,RDMOPTG_Crimson_Weapon // C2_PORCELLIO 2745,13127,250,RDMOPTG_None // C2_MOLE 2746,1939,250,RDMOPTG_Crimson_Weapon // C3_MIYABI_NINGYO -1102,2009,50,RDMOPTG_None // BATHORY +1102,1680,50,RDMOPTG_None // BATHORY 1155,16040,50,RDMOPTG_Crimson_Weapon // PETIT 2714,16040,250,RDMOPTG_Crimson_Weapon // C1_PETIT 2715,16040,250,RDMOPTG_Crimson_Weapon // C2_PETIT -2885,2009,250,RDMOPTG_None // C4_BATHORY +2885,1680,250,RDMOPTG_None // C4_BATHORY 2199,28705,50,RDMOPTG_Crimson_Weapon // SIORAVA 1143,16040,50,RDMOPTG_Crimson_Weapon // MARIONETTE 1413,1995,50,RDMOPTG_Crimson_Weapon // WILD_GINSENG @@ -106,9 +106,9 @@ 1653,28705,50,RDMOPTG_Crimson_Weapon // WHIKEBAIN 1655,1839,50,RDMOPTG_Crimson_Weapon // EREND 1655,16040,50,RDMOPTG_Crimson_Weapon // EREND -1657,2009,50,RDMOPTG_None // RAWREL +1657,1680,50,RDMOPTG_None // RAWREL 1829,21015,50,RDMOPTG_Crimson_Weapon // SWORD_GUARDIAN -2692,2009,250,RDMOPTG_None // C3_RAWREL +2692,1680,250,RDMOPTG_None // C3_RAWREL 1654,13454,50,RDMOPTG_Crimson_Weapon // ARMAIA 1654,28106,50,RDMOPTG_Crimson_Weapon // ARMAIA 1656,1939,50,RDMOPTG_Crimson_Weapon // KAVAC diff --git a/db/re/mob_skill_db.txt b/db/re/mob_skill_db.txt index 510ad74480..94a9b2fd8a 100644 --- a/db/re/mob_skill_db.txt +++ b/db/re/mob_skill_db.txt @@ -10916,6 +10916,54 @@ 2923,Owl Marquees@NPC_EMOTION,idle,197,1,2000,0,5000,yes,self,always,0,6,0x3695,,,,, 2923,Owl Marquees@NPC_SUMMONSLAVE,idle,196,2,10000,2000,60000,no,self,slavele,0,2922,,,,,, +// Ghost Palace Memorial +2948,Cursed Soldier@NPC_BLINDATTACK,attack,177,5,500,0,5000,no,target,always,0,,,,,,, +2948,Cursed Soldier@AC_DOUBLE,attack,46,5,500,0,5000,no,target,always,0,,,,,,, +2948,Cursed Soldier@NPC_MAGICALATTACK,attack,192,1,500,800,5000,yes,target,always,0,,,,,,, +2948,Cursed Soldier@AC_SHOWER,attack,47,3,500,0,5000,no,target,always,0,,,,,,, +2949,Cursed Sentinel@AS_SONICBLOW,attack,136,7,500,800,5000,yes,target,always,0,,,,,,29, +2949,Cursed Sentinel@NPC_CURSEATTACK,attack,181,5,500,800,5000,yes,target,always,0,,,,,,29, +2950,Broken Mind@NPC_BLINDATTACK,attack,177,3,1500,0,5000,no,target,always,0,,,,,,1, +2950,Broken Mind@NPC_BLINDATTACK,chase,177,3,1500,0,5000,no,target,always,0,,,,,,1, +2950,Broken Mind@NPC_BLOODDRAIN,attack,199,1,500,0,5000,no,target,always,0,,,,,,26, +2950,Broken Mind@NPC_CURSEATTACK,attack,181,3,500,800,5000,yes,target,always,0,,,,,,0, +2950,Broken Mind@NPC_CURSEATTACK,chase,181,3,500,800,5000,yes,target,always,0,,,,,,0, +2950,Broken Mind@CR_REFLECTSHIELD,attack,252,2,500,0,300000,yes,self,always,0,,,,,,7, +2950,Broken Mind@NPC_PETRIFYATTACK,attack,180,3,500,500,5000,yes,target,always,0,,,,,,2, +2950,Broken Mind@NPC_PETRIFYATTACK,chase,180,3,500,500,5000,yes,target,always,0,,,,,,2, +2951,Floating Word@NPC_BLOODDRAIN,attack,199,1,500,0,5000,no,target,always,0,,,,,,2, +2951,Floating Word@NPC_EMOTION,idle,197,1,2000,0,5000,no,self,always,0,29,,,,,, +2951,Floating Word@MG_FIREBALL,chase,17,5,1500,500,5000,yes,target,always,0,,,,,,, +2951,Floating Word@MO_BODYRELOCATION,chase,264,1,2000,500,5000,yes,target,always,0,,,,,,, +2952,Like Love@HT_SHOCKWAVE,idle,118,5,500,0,300000,no,around2,always,0,,,,,,29, +2952,Like Love@MG_LIGHTNINGBOLT,attack,20,5,500,1500,5000,no,target,always,0,,,,,,6, +2952,Like Love@MG_LIGHTNINGBOLT,chase,20,5,500,1500,5000,no,target,always,0,,,,,,6, +2952,Like Love@NPC_EMOTION,idle,197,1,2000,0,5000,no,self,always,0,29,,,,,, +2952,Like Love@NPC_MAGICALATTACK,attack,192,1,500,1000,5000,yes,target,always,0,,,,,,9, +2952,Like Love@NPC_UNDEADATTACK,attack,347,2,2000,0,5000,no,target,always,0,,,,,,, +2952,Like Love@WZ_JUPITEL,attack,84,3,500,1500,5000,no,target,always,0,,,,,,6, +2952,Like Love@WZ_JUPITEL,chase,84,3,500,1500,5000,no,target,always,0,,,,,,6, +2953,Cursed Memory@NPC_POISON,attack,176,3,500,800,5000,yes,target,always,0,,,,,,, +2953,Cursed Memory@NPC_POISONATTACK,attack,188,3,500,800,5000,yes,target,always,0,,,,,,, +2953,Cursed Memory@NPC_UNDEADATTACK,attack,347,2,500,500,5000,yes,target,always,0,,,,,,, +2954,Colorless Vow@NPC_CRITICALSLASH,attack,170,1,500,500,5000,yes,target,always,0,,,,,,, +2954,Colorless Vow@NPC_SPLASHATTACK,attack,174,1,2000,0,5000,no,target,always,0,,,,,,, +2955,Old Friendship@NPC_POISON,attack,176,3,500,800,5000,yes,target,always,0,,,,,,, +2955,Old Friendship@NPC_POISON,angry,176,3,500,800,5000,yes,target,always,0,,,,,,, +2956,Sweet Slaughter@AS_GRIMTOOTH,chase,137,5,2000,0,5000,no,target,always,0,,,,,,, +2956,Sweet Slaughter@BS_MAXIMIZE,attack,114,5,500,1000,5000,yes,self,always,0,,,,,,, +2956,Sweet Slaughter@BS_MAXIMIZE,chase,114,5,500,1000,5000,yes,self,always,0,,,,,,, +2956,Sweet Slaughter@NPC_SPLASHATTACK,attack,174,1,2000,0,5000,no,target,always,0,,,,,,9, +2956,Sweet Slaughter@NPC_STUNATTACK,attack,179,3,500,1500,5000,yes,target,always,0,,,,,,, +2957,Forgotten Name@NPC_CRITICALSLASH,attack,170,1,1000,500,5000,yes,target,always,0,,,,,,, +2957,Forgotten Name@NPC_DARKNESSATTACK,attack,190,3,500,500,5000,yes,target,always,0,,,,,,6, +2958,Fatal Days@MG_SOULSTRIKE,chase,13,5,2000,0,3000,no,target,always,0,,,,,,, +2958,Fatal Days@AS_GRIMTOOTH,attack,137,5,10000,0,700,no,target,always,0,,,,,,, +2959,Torturous Redeemer@SM_MAGNUM,attack,7,5,500,0,10000,no,self,always,0,,,,,,, +2959,Torturous Redeemer@NPC_FIREATTACK,attack,186,3,1000,1000,200000,yes,target,always,0,,,,,,, +2959,Torturous Redeemer@WZ_FIREPILLAR,attack,80,5,500,0,10000,no,around2,always,0,,,,,,, +2959,Torturous Redeemer@SM_BASH,attack,5,5,500,0,5000,no,target,always,0,,,,,,, + // Horror Toy Factory 2987,Decorated Evil Tree@AS_GRIMTOOTH,chase,137,5,2000,0,5000,yes,target,always,0,,,,,,, 2987,Decorated Evil Tree@NPC_CURSEATTACK,attack,181,3,1000,0,5000,yes,target,always,0,,,,,,6, diff --git a/db/re/quest_db.txt b/db/re/quest_db.txt index 5f90d5f1a7..c87d7b9e32 100644 --- a/db/re/quest_db.txt +++ b/db/re/quest_db.txt @@ -136,6 +136,10 @@ 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" + 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" diff --git a/db/readme.md b/db/readme.md new file mode 100644 index 0000000000..eeddb1faed --- /dev/null +++ b/db/readme.md @@ -0,0 +1,106 @@ +# Import Directories + +## What is the import directory for? + +The `import/` directory provides a way for you to change your config settings without the need to even touch the main `/conf/` and `/db/` files. + +By placing your custom entries into the `import/` directory within these two locations, your core files will not need to have any conflicts resolved when you update your server. You store your changes, and the rest is updated with rAthena. + +## How does this work? + +Think of "import" as in "override". Place only the settings you have changed in the import files, or settings you are "overriding". + +For example, when setting up a server there are always a few config settings that users would like to change in order for rAthena to suit their needs. The following example will show you how to use the `/db/import/` directory correctly. (for `/conf/import/` examples, see [/conf/readme.md](/conf/readme.md)) + +### Achievements +--- +We want to add our own custom achievement that can be given to a player via an NPC Script and another that we can give to our GMs. + +#### /db/import/achievement_db.yml + + + Achievements: + - ID: 280000 + Group: "AG_GOAL_ACHIEVE" + Name: "Emperio" + Reward: + TitleID: 1035 + Score: 50 + - ID: 280001 + Group: "AG_GOAL_ACHIEVE" + Name: "Staff" + Reward: + TitleID: 1036 + Score: 50 + + +### Instances +--- +We want to add our own customized Housing Instance. + +#### /db/import/instance_db.txt + + // ID,Name,LimitTime,IdleTimeOut,EnterMap,EnterX,EnterY,Map2,Map3,...,Map255 + 35,Home,3600,900,1@home,24,6,2@home,3@home + + +### Mob Alias +--- +We want to give a custom mob a Novice player sprite. + +#### /db/import/mob_avail.txt + + // Structure of Database: + // MobID,SpriteID{,Equipment} + 3850,0 + + +### Custom Maps +--- +We want to add our own custom maps. For this we need to add our map names to `import/map_index.txt` and then to the `import/map_cache.dat` file for the Map Server to load. + +#### /db/import/map_index.txt + + 1@home 1250 + 2@home + 3@home + ev_has + shops + prt_pvp + + +### Item Trade Restrictions +--- +We want to ensure that specific items cannot be traded, sold, dropped, placed in storage, etc. + +#### /db/import/item_trade.txt + + // Legend for 'TradeMask' field (bitmask): + // 1 - item can't be dropped + // 2 - item can't be traded (nor vended) + // 4 - wedded partner can override restriction 2 + // 8 - item can't be sold to npcs + // 16 - item can't be placed in the cart + // 32 - item can't be placed in the storage + // 64 - item can't be placed in the guild storage + // 128 - item can't be attached to mail + // 256 - item can't be auctioned + // Full outright value = 511 + 34000,511,100 // Old Green Box + 34001,511,100 // House Keys + 34002,511,100 // Reputation Journal + + +### Custom Quests +--- +We want to add our own custom quests to the quest_db. + +#### /db/import/quest_db.txt + + // Quest ID,Time Limit,Target1,Val1,Target2,Val2,Target3,Val3,MobID1,NameID1,Rate1,MobID2,NameID2,Rate2,MobID3,NameID3,Rate3,Quest Title + 89001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reputation Quest" + 89002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"Reputation Quest" + + + +We cannot stress enough how helpful this system is for everyone. The majority of git conflicts will simply go away if users make use of the `import/` system. diff --git a/doc/achievements.txt b/doc/achievements.txt new file mode 100644 index 0000000000..70c9ad2a46 --- /dev/null +++ b/doc/achievements.txt @@ -0,0 +1,102 @@ +//===== rAthena Documentation ================================ +//= Achievement Database Structure +//===== By: ================================================== +//= rAthena Dev Team +//===== Last Updated: ======================================== +//= 20170531 +//===== Description: ========================================= +//= Explanation of the achievements_db.yml file and structure. +//============================================================ + +--------------------------------------- + +ID: Unique achievement ID. + +--------------------------------------- + +Group: Achievement group type. Each achievement type calls a specific objective check. +Valid groups: + AG_ADD_FRIEND - Triggered when a player adds a friend. + AG_ADVENTURE - Does not trigger automatically. These are triggered by the achievementcomplete script command. + AG_BABY - Triggered when a player becomes a baby job. + AG_BATTLE - Triggered when a player kills a monster. + AG_CHATTING - Unknown. + AG_CHATTING_COUNT - Triggered when a player has a chatroom open and others join. + AG_CHATTING_CREATE - Triggered when a player creates a chatroom. + AG_CHATTING_DYING - Triggered when a player creates a chatroom and dies with it open. + AG_EAT - Unknown. + AG_GET_ITEM - Triggered when a player gets an item that has a specific sell value. + AG_GET_ZENY - Triggered when a player gets a specific amount of zeny at once. + AG_GOAL_ACHIEVE - Triggered when a player's achievement rank levels up. + AG_GOAL_LEVEL - Triggered when a player's base level or job level changes. + AG_GOAL_STATUS - Triggered when a player's base stats changes. + AG_HEAR - Unknown. + AG_JOB_CHANGE - Triggered when a player's job changes. + AG_MARRY - Triggered when two players get married. + AG_PARTY - Triggered when a player creates a party. + AG_ENCHANT_FAIL - Triggered when a player fails to refine an equipment. + AG_ENCHANT_SUCCESS - Triggered when a player successfully refines an equipment. + AG_SEE - Unknown. + AG_SPEND_ZENY - Triggered when a player spends any amount of zeny on vendors. + AG_TAMING - Triggered when a player tames a monster. + +--------------------------------------- + +Name: Achievement name. Not read into source but used for quick look ups. + +--------------------------------------- + +Target: A list of monster ID and count values that the achievement requires. + The target count can also be used for achievements that keep a counter while not being related to monster kills. + Capped at MAX_ACHIEVEMENT_OBJECTIVES. + +Example: + // Player must kill 5 Scorpions and 10 Poring. + Target: + - MobID: 1001 + Count: 5 + - MobID: 1002 + Count: 10 + +Example 2: + // Player must have 100 or more of ARG0 value. Using the count target value is useful for achievements that are increased in increments + // and not checked for a total (UI_Type = 1). + // IE: In the achievement_list.lub file, UI_Type 0 is displayed as non-incremental while 1 shows a progress bar of completion for the achievement. + Condition: " ARG0 >= 100 " + Target: + Count: 100 + +--------------------------------------- + +Condition: A conditional statement that must be met for the achievement to be considered complete. Accepts script constants, player variables, and + ARGX (where X is the argument vector value). The ARGX values are sent from the server to the achievement script engine on special events. + Below are two examples of how the ARGX feature works. + +Example: + // This function will send 1 argument (ARG0) with a value of i + 1 when a friend is added. + achievement_update_objective(f_sd, AG_ADD_FRIEND, 1, i + 1); + +Example 2: + // This function will send 2 arguments (ARG0 and ARG1) with values of weapon level and refine level, respectively, when an equipment is + // successfully refined. + achievement_update_objective(sd, AG_REFINE_SUCCESS, 2, sd->inventory_data[i]->wlv, sd->inventory.u.items_inventory[i].refine); + +--------------------------------------- + +Map: A map name that is used for the AG_CHATTING type which increments the counter based on the player's map. + +--------------------------------------- + +Dependent: A list of achievement IDs that need to be completed before this achievement is considered complete. + +--------------------------------------- + +Reward: A list of rewards that are given on completion. All fields are optional. + ItemID: Item ID + Amount: Amount of Item ID (default 1) + Script: Bonus Script + TitleID: Title ID + +--------------------------------------- + +Score: Achievement points that are given on completion. diff --git a/doc/atcommands.txt b/doc/atcommands.txt index e7b9e488f7..d310424c48 100644 --- a/doc/atcommands.txt +++ b/doc/atcommands.txt @@ -1320,12 +1320,12 @@ This will also send a packet to clients causing them to close. @reloadmobdb @reloadmotd @reloadmsgconf -@reloadpacketdb @reloadpcdb @reloadquestdb @reloadscript @reloadskilldb @reloadstatusdb +@reloadachievementdb Reloads a database or configuration file. @@ -1333,10 +1333,10 @@ Databases: -- instancedb: Instance Database -- itemdb: Item Database -- mobdb: Monster Database --- packetdb: Packet Database -- questdb: Quest Database -- script: NPC Scripts -- skilldb: Skill Database +-- achievementdb: Achievement Database Configuration files: -- atcommand: Atcommand Settings @@ -1354,12 +1354,12 @@ Affected files: -- mobdb: mob_db.txt, mob_item_ratio.txt, mob_chat_db.txt, mob_avail.txt, mob_race2_db.txt, mob_branch.txt, mob_poring.txt, mob_boss.txt, mob_pouch.txt, mob_classchange.txt, pet_db.txt, homunculus_db.txt, homun_skill_tree.txt, exp_homun.txt, mercenary_db.txt, mercenary_skill_db.txt, elemental_db.txt, elemental_skill_db.txt -- motd: motd.txt -- msgconf: atcommand_athena.conf --- packetdb: packet_db.txt -- 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 --- statusdb: attr_fix.txt, size_fix.txt, refine_db.tx +-- statusdb: attr_fix.txt, size_fix.txt, refine_db.txt +-- achievementdb: achievement_db.conf Restriction: - Used from 'atcommand' or 'useatcmd'. For @reload & @reloadscript diff --git a/doc/packet_interserv.txt b/doc/packet_interserv.txt index 28afd7ad6e..4718eb61e1 100644 --- a/doc/packet_interserv.txt +++ b/doc/packet_interserv.txt @@ -47,9 +47,9 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket. 0x2713: Type: AH - Structure: .W .L .L .L .B .B .L .L .B - index: 0,2,6,10,14,15,16,20,24 - len: 25 + Structure: .W .L .L .L .B .B .L .B + index: 0,2,6,10,14,15,16,20 + len: 21 parameter: - cmd : packet identification (0x2713) - aid : account identification @@ -58,7 +58,6 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket. - sex: the sex of the account - ok : 1=auth failed, 1=ok - request_id: unknown @FIXME - - version: client version, (clientinfo version) - clienttype: unknown @FIXME desc: - Acknowledge the authentication request from char-serv @@ -1190,6 +1189,27 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket. desc: - Requests to the inter server to save a character's quest log entries. +0x3062 + Type: ZI + Structure: .W .L + index: 0,2 + len: 6 + parameter: + - cmd : packet identification (0x3062) + - cid + desc: + - Requests a character's achievement log entries to the inter server. + +0x3063 + Type: ZI + Structure: .W .W .L .?B + index: 0,2,4,8 + len: variable: 8+count + parameter: + - cmd : packet identification (0x3063) + desc: + - Requests to the inter server to save a character's achievement log entries. + 0x3070 Type: ZI Structure: .W .W .?B @@ -2769,16 +2789,15 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket. 0x2b02 Type: ZA - Structure: .W .L .L .L .L .B - index: 0,2,6,10,14,18 - len: 19 + Structure: .W .L .L .L .L + index: 0,2,6,10,14 + len: 18 parameter: - cmd : packet identification (0x2b02) - id - login_id1 - login_id2 - s_ip - - packet_ver desc: - chrif_charselectreq diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 47e262dda5..78cd0961d7 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -1037,6 +1037,7 @@ From here on, we will have the commands sorted as follow: 12.- Mercenary commands. 13.- Party commands. 14.- Channel commands. +15.- Achievement commands. ===================== |1.- Basic commands.| @@ -3018,10 +3019,10 @@ It will only return numbers. If another type is supplied -1 will be returned. --------------------------------------- -*gettimestr(,) +*gettimestr(<"time format">,{,}) This function will return a string containing time data as specified by the -format string. +time format. This uses the C function 'strfmtime', which obeys special format characters. For a full description see, for example, the description of 'strfmtime' at @@ -3033,7 +3034,11 @@ The example given in rAthena sample scripts works like this: mes gettimestr("%Y-%m/%d %H:%M:%S",21); -This will print a full date and time like 'YYYY-MM/DD HH:MM:SS'. +The example above will print the current date and time like 'YYYY-MM/DD HH:MM:SS'. +The following example will print the date and time when the player's VIP status +expires by the given : + + mes gettimestr("%Y-%m/%d %H:%M:%S",21,vip_status(VIP_STATUS_EXPIRE)); --------------------------------------- @@ -3723,18 +3728,6 @@ The renewal feature to check is determined by type. 4 - RENEWAL_LVDMG (renewal level modifier on damage) 5 - RENEWAL_ASPD (renewal ASPD) ---------------------------------------- - -*is_clientver(,{,}) - -Checks a character's client version against a specified value. If no char id is -given, the command will run for the invoking character. The function will return -1 if the player's version is greater than or equal to the value, and 0 otherwise. - -Available types are: - 0 - version number (packet_db_ver) - 1 - client date (YYYYMMDD) - --------------------------------------- \\ 3,1.- Item-related commands @@ -5169,7 +5162,7 @@ window, to avoid any disruption when both windows overlap. *openstorage2 ,{,}; Just like the 'openstorage' command, except this command can open additional storages -by the specified . For , please read the conf/inter_server.conf +by the specified . For , please read the conf/inter_server.yml for storage groups. Values for are: @@ -5323,10 +5316,11 @@ Used in reset NPC's (duh!) --------------------------------------- -*sc_start ,,{,,{,}}; -*sc_start2 ,,,{,,{,}}; -*sc_start4 ,,,,,{,,{,}}; -*sc_end {,}; +*sc_start ,,{,,{,}}; +*sc_start2 ,,,{,,{,}}; +*sc_start4 ,,,,,{,,{,}}; +*sc_end {,}; +*sc_end_class {}; These commands will bestow a status effect on a character. @@ -5364,6 +5358,9 @@ and theirs val1, val2, val3, and val4 usage in source. 'sc_end' will remove a specified status effect. If SC_ALL (-1) is given, it will perform a complete removal of all statuses (although permanent ones will re-apply). +'sc_end_class' works like 'sc_end' but will remove all status effects from any learned +skill on the invoking character. + Examples: // This will poison the invoking character for 10 minutes at 50% chance. sc_start SC_POISON,600000,0,5000; @@ -6404,9 +6401,22 @@ This command works almost like sleep2, but displays a progress bar above the head of the currently attached character (like cast bar). Once the given amount of seconds passes, the script resumes. If the character moves while the progress bar progresses, it is aborted and -the script ends. The color format is in RGB (0xRRGGBB). The color is +the script ends. The color format is in RGB (RRGGBB). The color is currently ignored by the client and appears always green. +--------------------------------------- + +*progressbar_npc "",{,<"NPC Name">}; + +This command works like progressbar, but displays a progress bar +above the head of the currently attached (or given) NPC. Once the +given amount of seconds passes, the script resumes. The color format +is in RGB (RRGGBB). The color is currently ignored by the client and +appears always green. + +Note: If a player is attached to the NPC, they are detached from the NPC +as soon as the progress bar activates. + --------------------------------------- // 5,1.- End of time-related commands @@ -7350,12 +7360,17 @@ Examples: *unitattack ,{,}; *unitattack ,""{,}; -This command will make a attack the specified target. It returns 1 upon -success and 0 for all failures. +This command will make a attack the specified target. It returns true upon +success and false for all failures. If is a player and a non-zero is given, the unit will perform a continuous attack instead of a single attack. +Note: +Using unitattack with 0 means that it will use the currently attached unit. +For players any attack requests will fail, because talking to an NPC prevents attacking a monster. +Therefore you need to detach the player from the NPC before using this command. + --------------------------------------- *unitkill ; @@ -7382,7 +7397,7 @@ This command will make a stop attacking. --------------------------------------- -*unitstopwalk ; +*unitstopwalk {,}; This command will make a stop moving. @@ -7390,6 +7405,14 @@ Note: If this is called from OnTouch, then the walktimer attached to the unit is removed from OnTouch which causes this command to not stop the unit from walking. Suggest to use 'unitblockmove' to forcefully stop the unit with OnTouch. +The value affects how the unit is stopped. The following flags are bitwise +values (can be combined using the pipe operator): + USW_NONE = Unit will keep walking to their original destination. + USW_FIXPOS = Issue a fixpos packet afterwards. + USW_MOVE_ONCE = Force the unit to move one cell if it hasn't yet. + USW_MOVE_FULL_CELL = Enable moving to the next cell when unit was already half-way there (may cause on-touch/place side-effects, such as a scripted map change). + USW_FORCE_STOP = Force stop moving. + --------------------------------------- *unittalk ,""{,flag}; @@ -9724,3 +9747,83 @@ local map channel. Returns 0 on success. --------------------------------------- + +============================ +|15.- Achievement commands.| +============================ +--------------------------------------- + +*achievementadd({,}) + +This function will add an achievement to the player's log for the attached +player or the supplied . The objective requirements are not ignored +when using this function. +Returns true on success and false on failure. + +--------------------------------------- + +*achievementremove({,}) + +This function will remove an achievement from the player's log for the attached +player or the supplied . +Returns true on success and false on failure. + +--------------------------------------- + +*achievementinfo(,{,}) + +This function will return the specified value for an achievement of the +attached player or the supplied . If the player doesn't have the +achievement active (no progress has been made): if the achievement doesn't +exist -1 will be returned, or -2 will be returned on any other error such as +an invalid . + +Valid types: +- ACHIEVEINFO_COUNT1 +- ACHIEVEINFO_COUNT2 +- ACHIEVEINFO_COUNT3 +- ACHIEVEINFO_COUNT4 +- ACHIEVEINFO_COUNT5 +- ACHIEVEINFO_COUNT6 +- ACHIEVEINFO_COUNT7 +- ACHIEVEINFO_COUNT8 +- ACHIEVEINFO_COUNT9 +- ACHIEVEINFO_COUNT10 +- ACHIEVEINFO_COMPLETE +- ACHIEVEINFO_COMPLETEDATE +- ACHIEVEINFO_GOTREWARD +- ACHIEVEINFO_LEVEL ( is useless for this) +- ACHIEVEINFO_SCORE ( is useless for this) + +--------------------------------------- + +*achievementcomplete({,}) + +This function will complete an achievement for the attached player or the supplied +. The objective requirements are ignored when using this function. +Returns true on success and false on failure. + +--------------------------------------- + +*achievementexists({,}); + +This function will return if the achievement exists on the player or the supplied +. +Returns true on success and false on failure. + +--------------------------------------- + +*achievementupdate(,,{,}) + +This function will update an achievement's value for an achievement of the attached +player or the supplied . If the player does not have the achievement active +(no progress has been made) it will be added to the player's log first before updating +the value. +Returns true on success and false on failure. + +See 'achievementinfo' for valid values. +- ACHIEVEINFO_COMPLETE, ACHIEVEINFO_COMPLETEDATE, and ACHIEVEINFO_GOTREWARD require the + specific value returned from 'gettimetick(2)'. +- Excludes ACHIEVEINFO_LEVEL and ACHIEVEINFO_SCORE. + +--------------------------------------- diff --git a/npc/custom/quests/hunting_missions.txt b/npc/custom/quests/hunting_missions.txt index 98ad6c1f54..8b6d0db869 100644 --- a/npc/custom/quests/hunting_missions.txt +++ b/npc/custom/quests/hunting_missions.txt @@ -287,7 +287,7 @@ OnNPCKillEvent: if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) { set .@Mission_Count, getvar(#Mission_Count, $@partymembercid[.@i]); set .@Mission0, getvar(Mission0, $@partymembercid[.@i]); - set .@HP, getvar(HP, $@partymembercid[.@i]); + set .@HP, readparam(HP, $@partymembercid[.@i]); if (.@Mission_Count && .@Mission0 && .@HP > 0) { getmapxy(.@map2$,.@x2,.@y2,UNITTYPE_PC); diff --git a/npc/custom/resetnpc.txt b/npc/custom/resetnpc.txt index aa6bc14b2d..e3c902cb0a 100644 --- a/npc/custom/resetnpc.txt +++ b/npc/custom/resetnpc.txt @@ -1,11 +1,5 @@ //===== rAthena Script ======================================= //= Reset NPC -//===== By: ================================================== -//= rAthena Dev Team -//===== Current Version: ===================================== -//= 1.4 -//===== Compatible With: ===================================== -//= rAthena Project //===== Description: ========================================= //= Resets skills, stats, or both. //===== Additional Comments: ================================= @@ -15,6 +9,7 @@ //= 1.3 All statuses removed upon skill reset. [Euphy] //= 1.4 Compressed Script, Added limit use option [Stolao] //= Changed set -> setarray, Improved text with F_InsertPlural +//= 1.5 Added sc_end_class to reset related status changes [sader1992] //============================================================ prontera,150,193,4 script Reset Girl 124,{ // Skills, Stats, Both, Limit @@ -44,7 +39,7 @@ prontera,150,193,4 script Reset Girl 124,{ } set Zeny, Zeny-.@Reset[.@i-1]; if(.@i&1){ - sc_end SC_ALL;// TODO make a sc_end current classes sc only + sc_end_class; ResetSkill; } if(.@i&2) ResetStatus; diff --git a/npc/merchants/old_pharmacist.txt b/npc/merchants/old_pharmacist.txt index ef653609d8..3f549686e0 100644 --- a/npc/merchants/old_pharmacist.txt +++ b/npc/merchants/old_pharmacist.txt @@ -36,9 +36,9 @@ alberta_in,16,28,4 script Pharmacist 61,{ mes "[Old Pharmacist]"; mes "Ummmm..."; mes "What brings you here...?"; + next; switch(select("Make Potion:Talk.:Mixing Information:Cancel")) { case 1: - next; if (MaxWeight - Weight < 5000) { mes "[Old Pharmacist]"; mes "Why are you carrying these so many!"; @@ -51,11 +51,11 @@ alberta_in,16,28,4 script Pharmacist 61,{ } else { mes "[Old Pharmacist]"; mes "You have all the stuff ready, right? Which one would you like?"; + next; switch(select("Red Potion.:Orange Potion.:Yellow Potion.:White Potion.:Blue Potion.:Green Potion.:Actually, I don't want anything.")) { case 1: callsub L_Making,507,3,501; case 2: - next; mes "[Old Pharmacist]"; if (countitem(507) < countitem(713)) { set .@max,countitem(507); @@ -77,9 +77,9 @@ alberta_in,16,28,4 script Pharmacist 61,{ close; } mes "How many?"; + next; switch(select("Make as many as I can.:I want to choose an amount.:Actually, I don't want anything.")) { case 1: - next; if ((countitem(507) < .@max) || (countitem(508) < .@max) || (countitem(713) < .@max) || (Zeny < .@max*3)) { mes "[Old Pharmacist]"; mes "You rascal! You don't even have all the materials and you want me to make you potions?!"; @@ -92,24 +92,21 @@ alberta_in,16,28,4 script Pharmacist 61,{ getitem 502,.@max; //Orange_Potion break; case 2: - next; mes "[Old Pharmacist]"; mes "Then pick a number below 100. If you don't want any, just enter '0'. With the materials you have, you can make about "+.@max+" potions."; + next; input .@amount,0,101; if (.@amount == 0) { - next; mes "[Old Pharmacist]"; mes "Make up your mind, will you?!"; close; } if (.@amount > 100) { - next; mes "[Old Pharmacist]"; mes "Are you deaf? I said less than 100!"; close; } if ((countitem(507) < .@amount) || (countitem(508) < .@amount) || (countitem(713) < .@amount) || (Zeny < .@amount*3)) { - next; mes "[Old Pharmacist]"; mes "You rascal! You don't even have all the materials and you want me to make you potions?!"; close; @@ -122,7 +119,6 @@ alberta_in,16,28,4 script Pharmacist 61,{ getitem 502,.@amount; //Orange_Potion break; case 3: - next; mes "[Old Pharmacist]"; mes "What?!"; mes "Grrr..."; @@ -188,7 +184,6 @@ L_Making: .@item_req = getarg(0); .@req_amount = getarg(1); - next; mes "[Old Pharmacist]"; if ((countitem(.@item_req)/2) < countitem(713)) { .@max = countitem(.@item_req) /2; @@ -206,9 +201,9 @@ L_Making: close; } mes "How many?"; + next; switch(select("Make as many as I can.:I want to choose an amount.:Actually, I don't want anything.")) { case 1: - next; if ((countitem(.@item_req) < .@max*2) || countitem(713) < .@max || (Zeny < .@max*.@req_amount)) { mes "[Old Pharmacist]"; mes "You rascal! You don't even have all the materials and you want me to make you potions?!"; @@ -220,11 +215,10 @@ L_Making: getitem getarg(2),.@max; break; case 2: - next; mes "[Old Pharmacist]"; mes "Then pick a number below 100. If you don't want any, just enter '0'. With the materials you have, you can make about "+.@max+" potions."; - input .@amount; next; + input .@amount; if (.@amount == 0) { mes "[Old Pharmacist]"; mes "Make up your mind, will you?!"; @@ -246,7 +240,6 @@ L_Making: getitem getarg(2),.@amount; break; case 3: - next; mes "[Old Pharmacist]"; mes "What?!"; mes "Grrr..."; diff --git a/npc/quests/quests_moscovia.txt b/npc/quests/quests_moscovia.txt index 0699bf26b6..1b3f7a86ec 100644 --- a/npc/quests/quests_moscovia.txt +++ b/npc/quests/quests_moscovia.txt @@ -9075,7 +9075,7 @@ OnTouch_: } } emotion e_what,1; - close; + end; } mosk_que,45,131,0 script Stone Furnace#rus28 HIDDEN_NPC,{ @@ -9124,7 +9124,7 @@ mosk_que,45,131,0 script Stone Furnace#rus28 HIDDEN_NPC,{ } } emotion e_what,1; - close; + end; OnMyMobDead: stopnpctimer; @@ -9173,7 +9173,7 @@ mosk_que,56,202,0 script Occult Apple Tree#rus29 HIDDEN_NPC,{ } } emotion e_what,1; - close; + end; } mosk_que,47,217,0 warp Escape#rus30 3,3,mosk_fild02,237,266 diff --git a/npc/re/custom/lasagna/lasagna_npcs.txt b/npc/re/custom/lasagna/lasagna_npcs.txt index 20e4c0cccd..3a393b0552 100644 --- a/npc/re/custom/lasagna/lasagna_npcs.txt +++ b/npc/re/custom/lasagna/lasagna_npcs.txt @@ -1628,12 +1628,18 @@ lasagna,208,188,3 script Cat Paw Service#lasagna 4_M_MERCAT1,4,4,{ savepoint "lasagna",193,183,1,1; close; case 2: - if (getskilllv("SU_BASIC_SKILL") < 1) { + if (!callfunc("F_CanOpenStorage")) { mes "[Cat Paw Commerce Group]"; mes "I'm sorry, but..."; - mes "You should learn some basic skills first if you want to use the warehouse."; - mes "Go and learn the skills until you reach the level to use the warehouse."; - mes "I believe it should be ^4d4dffbasic level 6^000000 for humans."; + if (Class == Job_Summoner) { + mes "You should learn the new basic skill first."; + mes "Go and learn the skill if you want to use the warehouse."; + } + else { + mes "You should learn some basic skills first if you want to use the warehouse."; + mes "Go and learn the skills until you reach the level to use the warehouse."; + mes "I believe it should be ^4d4dffbasic level 6^000000 for humans."; + } close; } if (countitem(7059) > 0)// Free Ticket for Kafra Storage diff --git a/npc/re/guides/navigation.txt b/npc/re/guides/navigation.txt index 8ab9d833ad..ff749c42e0 100644 --- a/npc/re/guides/navigation.txt +++ b/npc/re/guides/navigation.txt @@ -13,11 +13,12 @@ //===== Additional Comments: ================================= //= 1.0 First version. //= 1.1 Added 'is_clientver' command. [Euphy] +//= 1.2 Dropped 'is_clientver' command. [Lemongrass] //============================================================ function script F_Navi { - if (!is_clientver(1,20111010)) + if ( PACKETVER < 20111010 ) set .@disabled,1; // This function takes 0 ~ 3 parameters. diff --git a/npc/re/instances/GhostPalace.txt b/npc/re/instances/GhostPalace.txt new file mode 100644 index 0000000000..af243957ea --- /dev/null +++ b/npc/re/instances/GhostPalace.txt @@ -0,0 +1,991 @@ +//===== rAthena Script ======================================= +//= Ghost Palace +//===== Description: ========================================= +//= [Walkthrough Conversion] +//= Ghost Palace Instance +//===== Changelogs: ========================================== +//= 1.0 First version. [Capuche] +//============================================================ + +dali02,43,129,5 script Unpleasant Royal Guard# 4_M_SAKRAYROYAL,{ + if (BaseLevel < 120) { + mes "[Unpleasant Royal Guard]"; + mes "Althought I need help with a task, you are not strong enough to assist me, noob~!"; + next; + mes "[Unpleasant Royal Guard]"; + mes "Come back later when you have done some training and are at least level 120!"; + close; + } + .@party_id = getcharid(1); + if (getcharid(0) != getpartyleader(.@party_id,2) || .@party_id < 1) { + mes "[Unpleasant Royal Guard]"; + mes "I can only open the secret passage for party leaders. Please have your party leader talk to me."; + close; + } + switch( checkquest(1261,PLAYTIME) ) { + case -1: + break; + case 0: + case 1: + mes "[Unpleasant Royal Guard]"; + mes "Have you found the princess yet?! Is she safe?"; + close; + case 2: + mes "[Unpleasant Royal Guard]"; + mes "The monsters around the secret passage have disappeared. Now is our chance to save the princess!"; + erasequest 1261;// Cursed Swordman + close; + } + mes "[Unpleasant Royal Guard]"; + mes "I need help, even from the likes of you."; + next; + mes "[Unpleasant Royal Guard]"; + mes "In the middle of battle the princess disappeared while I was guarding the palace."; + next; + mes "[Unpleasant Royal Guard]"; + mes "You run ahead and I will catch up. We must save her."; + next; + if (select( "I will help.", "This is not a good time." ) == 2) { + mes "[Unpleasant Royal Guard]"; + mes "Even now all the royal guards are fighting and dying from the monsters."; + next; + mes "[Unpleasant Royal Guard]"; + mes "We must, no matter how much fear grips our hearts, save the princess!"; + close; + } + instance_create("Ghost Palace"); + mes "[Unpleasant Royal Guard]"; + mes "Thank you.."; + mes "I will open the secret passage to the ^0000ffGhost Palace^000000."; + mes "Please be ready!"; + close; +} + +dali02,40,134,5 script Interdimensional Device#dk PORTAL,{ + if (BaseLevel < 120) { + mes "[Unpleasant Royal Guard]"; + mes "Althought I need help with a task, you are not strong enough to assist me, noob~!"; + next; + mes "[Unpleasant Royal Guard]"; + mes "Come back later when you have done some training and are at least level 120!"; + close; + } + mes "[Unpleasant Royal Guard]"; + mes "I can see the secret passage into the palace. Are you ready to save the princess?!"; + next; + if (select( "Enter", "Stop" ) == 2) { + mes "[Unpleasant Royal Guard]"; + mes "Even now all the royal guards are fighting and dying from the monsters."; + next; + mes "[Unpleasant Royal Guard]"; + mes "We must, no matter how much fear grips our hearts, save the princess!"; + close; + } + switch( checkquest(1261,PLAYTIME) ) { + case -1: + break; + case 0: + case 1: + mes "[Unpleasant Royal Guard]"; + mes "The monsters that attacked the palace are wandering around the secret entrance. It would be very bad if they spotted us... Please wait."; + next; + mes "When the time limit for the entrance is up"; + mes "let's try to re-enter."; + close; + case 2: + mes "^0000ffThe time limit for entering to the Curse of the Swordsman is finished. Please try to talk to the Unpleasent Royal Guard again..^000000"; + erasequest 1261;// Cursed Swordman + close; + } + .@party_id = getcharid(1); + if (getcharid(0) != getpartyleader(.@party_id,2) || .@party_id < 1) { + mes "[Unpleasant Royal Guard]"; + mes "I can only open the secret passage for party leaders. Please have your party leader talk to me."; + close; + } + + .@md_name$ = "Ghost Palace"; + switch( instance_enter(.@md_name$) ) { + case IE_OTHER: + mes "An unknown error occurred."; + close; + case IE_NOINSTANCE: + mes "^ff0000Inside the devices you see a dark hole. If you wish to enter you must to talk to the Unpleasent Royal Guard first.^000000"; + close; + case IE_NOMEMBER: + mes "Only registered members can enter the " + .@md_name$ + " instance."; + close; + case IE_OK: + mapannounce "dali", "" + strcharinfo(0) + " of the party, " + getpartyname(.@party_id) + ", is entering the Ghost Palace.", bc_map, 0x00ff99; + // warp "1@spa",42,196; + setquest 1261;// Cursed Swordman + end; + } +} + +// 1st floor +1@spa,41,204,5 script King#dk 4_M_RUSKING,{ + mes "[King]"; + mes "You are hereby appointed as the personal guard to Princess Tiara. I trust your loyalty above all else."; + npctalk "King: You are hereby appointed as the personal guard to Princess Tiara. I trust your loyalty above all else."; + next; + mes "[Lurid Royal Guard]"; + mes "I will protect the princess with my life."; + npctalk "Lurid Royal Guard: I will protect the princess with my life.", instance_npcname("Lurid Royal Guard#dk"); + next; + mes "[King]"; + mes "The marriage arrangements are going as planned. The prince is here to meet with the princess."; + npctalk "King: The marriage arrangements are going as planned. The prince is here to meet with the princess."; + next; + mes "[Lurid Royal Guard]"; + mes "...Yes, your majesty."; + npctalk "Lurid Royal Guard: ...Yes, your majesty.", instance_npcname("Lurid Royal Guard#dk"); + next; + mes "[King]"; + mes "My gods, there are monsters in the castle! Get rid of them now!"; + npctalk "King: My gods, there are monsters in the castle! Get rid of them now!"; + close2; + donpcevent instance_npcname("#gp_control_1") + "::OnStart"; + end; + +OnInstanceInit: + // 1: enabled potential double spawn (official), 0: disabled + 'bool_double_spawn = 1; + + 'map_spa$ = instance_mapname("1@spa"); + + // warps + disablenpc instance_npcname("The second floor of Palace"); + disablenpc instance_npcname("3rd floor in the palace"); + disablenpc instance_npcname("4th floor in the palace"); + disablenpc instance_npcname("5th floor of Palace"); + disablenpc instance_npcname("Way out of Palace"); + + // first floor + disablenpc instance_npcname("#gp_control_1"); + + // second floor + disablenpc instance_npcname("Lurid Royal Guard#dk1"); + disablenpc instance_npcname("Princess Tiara#dk"); + disablenpc instance_npcname("#gp_control_2"); + + // 3rd floor + disablenpc instance_npcname("King#dk1"); + disablenpc instance_npcname("Lurid Royal Guard#dk2"); + disablenpc instance_npcname("Captain of the Guard#dk"); + disablenpc instance_npcname("Soldier#dk1"); + disablenpc instance_npcname("Soldier#dk2"); + disablenpc instance_npcname("Soldier#dk3"); + disablenpc instance_npcname("Lurid Royal Guard#dk3"); + disablenpc instance_npcname("Thanatos Magic Trace#dk1"); + disablenpc instance_npcname("#gp_control_3"); + + // 4th floor + disablenpc instance_npcname("#gp_control_4"); + disablenpc instance_npcname("#gp_control_5"); + disablenpc instance_npcname("Thanatos Magic Trace#dk2"); + disablenpc instance_npcname("Visiting Prince#dk"); + disablenpc instance_npcname("Lurid Royal Guard#dk4"); + disablenpc instance_npcname("King's Corpse#dk"); + disablenpc instance_npcname("Captain's Corpse#dk"); + disablenpc instance_npcname("Soldier's Corpse#dk"); + disablenpc instance_npcname("Soldier's Corpse#dk1"); + disablenpc instance_npcname("Soldier's Corpse#dk2"); + disablenpc instance_npcname("Soldier's Corpse#dk3"); + disablenpc instance_npcname("Soldier's Corpse#dk4"); + + // 5th floor + disablenpc instance_npcname("#gp_control_6"); + disablenpc instance_npcname("Princess Tiara#dk1"); + disablenpc instance_npcname("Lurid Royal Guard#dk5"); + disablenpc instance_npcname("King#dk11"); + disablenpc instance_npcname("Sakray#dk"); + disablenpc instance_npcname("Thanatos Magic Trace#dk3"); + disablenpc instance_npcname("#tb"); + disablenpc instance_npcname("#sv"); + disablenpc instance_npcname("#tv"); + end; +} + +1@spa,42,201,1 script Lurid Royal Guard#dk 4_M_SAKRAYROYAL,{ end; } + +1@spa,1,1,1 script #gp_control_1 HIDDEN_WARP_NPC,{ + end; +OnStart: + enablenpc instance_npcname("#gp_control_1"); + disablenpc instance_npcname("King#dk"); + disablenpc instance_npcname("Lurid Royal Guard#dk"); + initnpctimer; + end; +OnTimer2000: + .@label$ = instance_npcname("#gp_control_1") + "::OnMyMobDead1"; + monster 'map_spa$,50,194,"Cursed Soldier",2948,1, .@label$; // CURSED_SOLDIER + monster 'map_spa$,34,208,"Cursed Soldier",2948,1, .@label$; // CURSED_SOLDIER + monster 'map_spa$,32,194,"Cursed Gatekeeper",2949,1, .@label$; // CURSED_SENTINEL + monster 'map_spa$,52,209,"Cursed Gatekeeper",2949,1, .@label$; // CURSED_SENTINEL + stopnpctimer; + end; +OnMyMobDead1: + if (mobcount('map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead1") < (1 + 'bool_double_spawn)) { + deltimer instance_npcname("#gp_control_1") + "::OnSpawn1"; // stop double spawn if timer is running + addtimer 2000, instance_npcname("#gp_control_1") + "::OnSpawn1"; + } + end; +OnSpawn1: + .@label$ = instance_npcname("#gp_control_1") + "::OnMyMobDead2"; + monster 'map_spa$,37,182,"Cursed Soldier",2948,1, .@label$; // CURSED_SOLDIER + monster 'map_spa$,46,182,"Cursed Gatekeeper",2949,1, .@label$; // CURSED_SENTINEL + end; +OnMyMobDead2: + if (mobcount('map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead2") < 1) { + deltimer instance_npcname("#gp_control_1") + "::OnSpawn1"; // stop double spawn if timer is running + deltimer instance_npcname("#gp_control_1") + "::OnSpawn2"; + addtimer 2000, instance_npcname("#gp_control_1") + "::OnSpawn2"; + } + end; +OnSpawn2: + .@label$ = instance_npcname("#gp_control_1") + "::OnMyMobDead3"; + monster 'map_spa$,30,200,"Cursed Soldier",2948,1, .@label$; // CURSED_SOLDIER + monster 'map_spa$,51,200,"Cursed Gatekeeper",2949,1, .@label$; // CURSED_SENTINEL + monster 'map_spa$,53,199,"Cursed Gatekeeper",2949,1, .@label$; // CURSED_SENTINEL + end; +OnMyMobDead3: + if (mobcount('map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead3") < 1) { + mapannounce 'map_spa$, "The passage on the 2nd floor in the palace of ghost is open .", bc_map,0xFFFF00; + enablenpc instance_npcname("The second floor of Palace"); + enablenpc instance_npcname("Lurid Royal Guard#dk1"); + enablenpc instance_npcname("Princess Tiara#dk"); + } + end; +} + +// 2nd floor +1@spa,132,122,7 script Lurid Royal Guard#dk1 4_M_SAKRAYROYAL,{ + .@tiara$ = instance_npcname("Princess Tiara#dk"); + cutin "npc-tiara.bmp",3; + mes "[Lurid Royal Guard]"; + mes "Your highness, the King has invited a prince from a neighboring country to be your betrothed. Be ready to meet him..."; + npctalk "Lurid Royal Guard: Your highness, the King has invited a prince from a neighboring country to be your betrothed. Be ready to meet him..."; + next; + mes "[Princess Tiara]"; + mes "If...If a marriage is arranged what should I do?"; + npctalk "Princess Tiara: If...If a marriage is arranged what should I do?", .@tiara$; + next; + mes "[Lurid Royal Guard]"; + mes "The only thing I can do is protect you from physical harm."; + npctalk "Lurid Royal Guard: The only thing I can do is protect you from physical harm."; + next; + mes "[Princess Tiara]"; + mes "Then, what can I do?"; + npctalk "Princess Tiara: Then, what can I do?", .@tiara$; + next; + mes "[Lurid Royal Guard]"; + mes "You must decide that for yourself your highness..."; + npctalk "Lurid Royal Guard: You must decide that for yourself your highness..."; + next; + mes "[Princess Tiara]"; + mes "Would it be easier for you if I were married and sent off to another country?"; + npctalk "Princess Tiara: Would it be easier for you if I were married and sent off to another country?", .@tiara$; + next; + mes "[Lurid Royal Guard]"; + mes "I will always stand by you and protect you forever."; + npctalk "Lurid Royal Guard: I will always stand by you and protect you forever."; + cutin "npc-tiara.bmp",255; + next; + mes "[Princess Tiara]"; + mes "Monsters have gotten inside the castle? Please, protect me!"; + npctalk "Princess Tiara: Monsters have gotten inside the castle? Please, protect me!", .@tiara$; + next; + mes "[Lurid Royal Guard]"; + mes "Stay behind me. Let's go!"; + npctalk "Lurid Royal Guard: Stay behind me. Let's go!"; + close2; + donpcevent instance_npcname("#gp_control_2") + "::OnStart"; + end; +} + +1@spa,135,125,3 duplicate(Lurid Royal Guard#dk) Princess Tiara#dk 4_F_MAYSEL + +1@spa,1,1,1 script #gp_control_2 HIDDEN_WARP_NPC,{ + end; +OnStart: + enablenpc instance_npcname("#gp_control_2"); + disablenpc instance_npcname("Lurid Royal Guard#dk1"); + disablenpc instance_npcname("Princess Tiara#dk"); + disablenpc instance_npcname("The second floor of Palace"); + + killmonster 'map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead1"; + killmonster 'map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead2"; + killmonster 'map_spa$, instance_npcname("#gp_control_1") + "::OnMyMobDead3"; + disablenpc instance_npcname("#gp_control_1"); + initnpctimer; + end; +OnTimer2000: + .@label$ = instance_npcname("#gp_control_2") + "::OnMyMobDead1"; + monster 'map_spa$,135,116,"Broken Promise",2950,1, .@label$; // BROKEN_MIND + monster 'map_spa$,110,120,"Broken Promise",2950,1, .@label$; // BROKEN_MIND + monster 'map_spa$,122,112,"Floating Sorrow",2951,1, .@label$; // FLOATING_WORD + monster 'map_spa$,121,129,"Unfulfilled Love",2952,1, .@label$; // LIKE_LOVE + stopnpctimer; + end; +OnMyMobDead1: + if (mobcount('map_spa$, instance_npcname("#gp_control_2") + "::OnMyMobDead1") < 1) { + sleep 2000; + .@label$ = instance_npcname("#gp_control_2") + "::OnMyMobDead2"; + monster 'map_spa$,120,103,"Broken Promise",2950,1, .@label$; // BROKEN_MIND + monster 'map_spa$,115,137,"Floating Sorrow",2951,1, .@label$; // FLOATING_WORD + monster 'map_spa$,103,130,"Unfulfilled Love",2952,1, .@label$; // LIKE_LOVE + } + end; +OnMyMobDead2: + if (mobcount('map_spa$, instance_npcname("#gp_control_2") + "::OnMyMobDead2") < 1) { + sleep 2000; + .@label$ = instance_npcname("#gp_control_2") + "::OnMyMobDead3"; + monster 'map_spa$,98,119,"Floating Sorrow",2951,1, .@label$; // FLOATING_WORD + monster 'map_spa$,98,120,"Floating Sorrow",2951,1, .@label$; // FLOATING_WORD + monster 'map_spa$,103,109,"Unfulfilled Love",2952,1, .@label$; // LIKE_LOVE + } + end; +OnMyMobDead3: + if (mobcount('map_spa$, instance_npcname("#gp_control_2") + "::OnMyMobDead3") < 1) { + mapannounce 'map_spa$, "The passage on the 3rd floor of the palace is open.", bc_map,0xFFFF00; + enablenpc instance_npcname("3rd floor in the palace"); + enablenpc instance_npcname("King#dk1"); + enablenpc instance_npcname("Lurid Royal Guard#dk2"); + enablenpc instance_npcname("Captain of the Guard#dk"); + enablenpc instance_npcname("Soldier#dk1"); + enablenpc instance_npcname("Soldier#dk2"); + enablenpc instance_npcname("Soldier#dk3"); + disablenpc instance_npcname("#gp_control_2"); + } + end; +} + +// 3rd floor +1@spa,32,54,1 script King#dk1 4_M_RUSKING,{ + mes "[King]"; + mes "It was you who brought the monsters here! You want to get rid of me and have the princess for yourself?"; + npctalk "King: It was you who brought the monsters here! You want to get rid of me and have the princess for yourself?"; + next; + mes "[Lurid Royal Guard]"; + mes "It is a trap your majesty! You must trust me!"; + npctalk "Lurid Royal Guard: It is a trap your majesty! You must trust me!", instance_npcname("Lurid Royal Guard#dk2"); + next; + mes "[King]"; + mes "Shut up! You've betrayed me! I trusted you... you must pay for your disgrace."; + npctalk "King: Shut up! You've betrayed me! I trusted you... you must pay for your disgrace."; + next; + mes "[King]"; + mes "You will suffer for the rest of your life."; + npctalk "King: You will suffer for the rest of your life."; + close2; + disablenpc instance_npcname("3rd floor in the palace"); + disablenpc instance_npcname("King#dk1"); + disablenpc instance_npcname("Captain of the Guard#dk"); + disablenpc instance_npcname("Soldier#dk1"); + disablenpc instance_npcname("Soldier#dk2"); + disablenpc instance_npcname("Soldier#dk3"); + disablenpc instance_npcname("Lurid Royal Guard#dk2"); + donpcevent instance_npcname("Thanatos Magic Trace#dk1") + "::OnStart"; + end; +} + +1@spa,35,56,5 script Thanatos Magic Trace#dk1 4_TRACE,{ + end; +OnStart: + enablenpc instance_npcname("Thanatos Magic Trace#dk1"); + enablenpc instance_npcname("Lurid Royal Guard#dk3"); + initnpctimer; + end; +OnTimer5000: + npctalk "Ominous Voice: Oh, faithful royal guard, you are trapped."; + end; +OnTimer8000: + npctalk "Ominous Voice: The conspiracy in the palace has your princess in grave danger..."; + end; +OnTimer12000: + npctalk "Lurid Royal Guard: Who are you? Show yourself!", instance_npcname("Lurid Royal Guard#dk3"); + end; +OnTimer15000: + npctalk "Ominous Voice: Ah... so you do you hear me?"; + end; +OnTimer20000: + npctalk "Lurid Royal Guard: ...?", instance_npcname("Lurid Royal Guard#dk3"); + end; +OnTimer23000: + npctalk "Ominous Voice: I can give you unlimited power. If you make a pact with me."; + end; +OnTimer28000: + npctalk "Lurid Royal Guard: I..I...", instance_npcname("Lurid Royal Guard#dk3"); + end; +OnTimer33000: + npctalk "Thanatos Magic Trace: Kukuku... What do you want boy?"; + end; +OnTimer34000: + stopnpctimer; + disablenpc instance_npcname("Thanatos Magic Trace#dk1"); + disablenpc instance_npcname("Lurid Royal Guard#dk3"); + donpcevent instance_npcname("#gp_control_3") + "::OnStart"; + end; +} + +1@spa,28,52,7 duplicate(Lurid Royal Guard#dk) Captain of the Guard#dk 4_M_KY_KNT +1@spa,25,53,7 duplicate(Lurid Royal Guard#dk) Soldier#dk1 4_M_CRU_SOLD +1@spa,34,53,1 duplicate(Lurid Royal Guard#dk) Soldier#dk2 4_M_CRU_SOLD +1@spa,30,52,7 duplicate(Lurid Royal Guard#dk) Soldier#dk3 4_M_KY_SOLD +1@spa,30,58,5 duplicate(Lurid Royal Guard#dk) Lurid Royal Guard#dk2 4_M_SAKRAY_TIED +1@spa,31,57,5 duplicate(Lurid Royal Guard#dk) Lurid Royal Guard#dk3 4_M_SAKRAY_TIED + +1@spa,1,1,1 script #gp_control_3 HIDDEN_WARP_NPC,{ + end; +OnStart: + enablenpc instance_npcname("#gp_control_3"); + initnpctimer; + end; +OnTimer2000: + .@label$ = instance_npcname("#gp_control_3") + "::OnMyMobDead1"; + monster 'map_spa$,31,57, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + monster 'map_spa$,59,24, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + monster 'map_spa$,23,40, "Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + monster 'map_spa$,54,45, "Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + monster 'map_spa$,26,20, "Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + stopnpctimer; + end; +OnMyMobDead1: + if (mobcount('map_spa$, instance_npcname("#gp_control_3") + "::OnMyMobDead1") < 1) + addtimer 2000, instance_npcname("#gp_control_3") + "::OnSpawn1"; + end; +OnSpawn1: + .@label$ = instance_npcname("#gp_control_3") + "::OnMyMobDead2"; + monster 'map_spa$,30,52, "Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + monster 'map_spa$,58,58, "Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + monster 'map_spa$,54,24, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + end; +OnMyMobDead2: + if (mobcount('map_spa$, instance_npcname("#gp_control_3") + "::OnMyMobDead2") < (1 + 'bool_double_spawn)) { + deltimer instance_npcname("#gp_control_3") + "::OnAnnounce"; + addtimer 500, instance_npcname("#gp_control_3") + "::OnAnnounce"; + } + end; +OnAnnounce: + mapannounce 'map_spa$, "The passage on the 4th floor of the palace is open.", bc_map,0xFFFF00; + enablenpc instance_npcname("4th floor in the palace"); + deltimer instance_npcname("#gp_control_3") + "::OnSpawn2"; // stop double spawn if timer is running + addtimer 2000, instance_npcname("#gp_control_3") + "::OnSpawn2"; + end; +OnSpawn2: + donpcevent instance_npcname("#gp_control_4") + "::OnStart"; + // 35 mobs + .@label$ = instance_npcname("#gp_control_3") + "::OnMyMobDead3"; + monster 'map_spa$,67,46, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "You are trapped..."; + monster 'map_spa$,62,48, "Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Run away!"; + monster 'map_spa$,57,46, "Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + unittalk $@mobid[0], "Run away quickly!"; + monster 'map_spa$,51,48, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "Faithful royal guard..."; + monster 'map_spa$,56,55, "Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Run away!"; + monster 'map_spa$,62,56, "Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + unittalk $@mobid[0], "You are trapped..."; + monster 'map_spa$,66,58, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "You put your princess in grave danger..."; + monster 'map_spa$,66,64, "Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Faithful royal guard..."; + monster 'map_spa$,62,65, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "Run away quickly!"; + monster 'map_spa$,57,67, "Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "You are trapped..."; + monster 'map_spa$,49,66, "Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + unittalk $@mobid[0], "Run away!"; + monster 'map_spa$,44,66, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "Run away quickly!"; + monster 'map_spa$,45,20, "Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Run away!"; + monster 'map_spa$,38,20, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "You are trapped..."; + monster 'map_spa$,32,20, "Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + unittalk $@mobid[0], "Run away quickly!"; + monster 'map_spa$,51,22, "Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + unittalk $@mobid[0], "Run away quickly!"; + monster 'map_spa$,26,34,"Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + unittalk $@mobid[0], "Run away!"; + monster 'map_spa$,21,37,"Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Faithful royal guard..."; + monster 'map_spa$,18,39,"Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "Run away quickly!"; + monster 'map_spa$,21,45,"Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Run away!"; + monster 'map_spa$,23,49,"Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "You are trapped..."; + monster 'map_spa$,25,54,"Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + unittalk $@mobid[0], "Run away quickly!"; + monster 'map_spa$,29,54,"Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "You put your princess in grave danger..."; + monster 'map_spa$,56,39,"Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "Run away!"; + monster 'map_spa$,61,36,"Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Faithful royal guard..."; + monster 'map_spa$,66,38,"Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + unittalk $@mobid[0], "Run away quickly!"; + monster 'map_spa$,42,54,"Wasted Friendship",2955,1, .@label$; // OLD_FRIENDSHIP + unittalk $@mobid[0], "Run away!"; + monster 'map_spa$,35,54,"Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "You are trapped..."; + monster 'map_spa$,43,60,"Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Faithful royal guard..."; + monster 'map_spa$,30,25,"Tarnished Oath",2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "You put your princess in grave danger..."; + monster 'map_spa$,30,31,"Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + unittalk $@mobid[0], "You are trapped..."; + monster 'map_spa$,65,64, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + monster 'map_spa$,65,67, "Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + monster 'map_spa$,18,43,"Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + monster 'map_spa$,21,43,"Regretful Memory",2953,1, .@label$; // CURSED_MEMORY + end; +OnMyMobDead3: + end; +} + +// 4th floor +1@spa,1,1,1 script #gp_control_4 HIDDEN_WARP_NPC,{ + end; +OnStart: + enablenpc instance_npcname("#gp_control_4"); + .@label$ = instance_npcname("#gp_control_4") + "::OnMyMobDead1"; + monster 'map_spa$,215,194, "Sweet Slaughter",2956,1, .@label$; // SWEET_SLAUGHTER + monster 'map_spa$,194,178, "Sweet Slaughter",2956,1, .@label$; // SWEET_SLAUGHTER + monster 'map_spa$,191,211, "Sweet Slaughter",2956,1, .@label$; // SWEET_SLAUGHTER + monster 'map_spa$,185,203, "Cursed Gatekeeper",2949,1, .@label$; // CURSED_SENTINEL + monster 'map_spa$,209,218, "Cursed Gatekeeper",2949,1, .@label$; // CURSED_SENTINEL + end; +OnMyMobDead1: + if (mobcount('map_spa$, instance_npcname("#gp_control_4") + "::OnMyMobDead1") < (1 + 'bool_double_spawn)) { + deltimer instance_npcname("#gp_control_4") + "::OnSpawn1"; + addtimer 2000, instance_npcname("#gp_control_4") + "::OnSpawn1"; + } + end; +OnSpawn1: + .@label$ = instance_npcname("#gp_control_4") + "::OnMyMobDead2"; + monster 'map_spa$,189,192, "Cursed Gatekeeper",2949,1, .@label$; // CURSED_SENTINEL + monster 'map_spa$,211,209, "Sweet Slaughter",2956,1, .@label$; // SWEET_SLAUGHTER + end; +OnMyMobDead2: + if (mobcount('map_spa$, instance_npcname("#gp_control_4") + "::OnMyMobDead2") < 1) { + enablenpc instance_npcname("Thanatos Magic Trace#dk2"); + enablenpc instance_npcname("Visiting Prince#dk"); + enablenpc instance_npcname("Lurid Royal Guard#dk4"); + enablenpc instance_npcname("King's Corpse#dk"); + enablenpc instance_npcname("Captain's Corpse#dk"); + enablenpc instance_npcname("Soldier's Corpse#dk"); + enablenpc instance_npcname("Soldier's Corpse#dk1"); + enablenpc instance_npcname("Soldier's Corpse#dk2"); + enablenpc instance_npcname("Soldier's Corpse#dk3"); + enablenpc instance_npcname("Soldier's Corpse#dk4"); + } + end; +} + +1@spa,199,214,1 script Lurid Royal Guard#dk4 4_M_SAKRAYROYAL,{ + .@prince$ = instance_npcname("Visiting Prince#dk"); + mes "[Lurid Royal Guard]"; + mes "Where is Princess Tiara?"; + npctalk "Lurid Royal Guard: Where is Princess Tiara?"; + next; + mes "[Visiting Prince]"; + mes "You are too late... but you brought what I was looking for. Thanks for your help."; + npctalk "Visiting Prince: You are too late... but you brought what I was looking for. Thanks for your help.", .@prince$; + next; + mes "[Visiting Prince]"; + mes "Cursed Thanatos Magic Trace! Are you ready to have a new master?"; + npctalk "Visiting Prince: Cursed Thanatos Magic Trace! Are you ready to have a new master?", .@prince$; + next; + cutin "tartanos.bmp",3; + mes "[Thanatos Magic Trace]"; + mes "How dare you!"; + npctalk "Thanatos Magic Trace: How dare you!", instance_npcname("Thanatos Magic Trace#dk2"); + next; + mes "[Visiting Prince]"; + mes "aah, aah !!!"; + npctalk "Visiting Prince: Aah, aah!!!", .@prince$; + donpcevent instance_npcname("#gp_control_5") + "::OnStart"; + close2; + cutin "",255; + end; +} +1@spa,201,214,1 duplicate(Lurid Royal Guard#dk) Thanatos Magic Trace#dk2 CLEAR_NPC +1@spa,197,218,5 duplicate(Lurid Royal Guard#dk) Visiting Prince#dk 4_M_KNIGHT_SILVER +1@spa,194,214,5 duplicate(Lurid Royal Guard#dk) King's Corpse#dk 4_M_TRISTAN +1@spa,211,194,3 duplicate(Lurid Royal Guard#dk) Captain's Corpse#dk 4_M_LIEMAN +1@spa,201,198,1 duplicate(Lurid Royal Guard#dk) Soldier's Corpse#dk 4_M_DIEMAN +1@spa,197,190,1 duplicate(Lurid Royal Guard#dk) Soldier's Corpse#dk1 4_M_DIEMAN +1@spa,191,207,7 duplicate(Lurid Royal Guard#dk) Soldier's Corpse#dk2 4_M_DIEMAN +1@spa,206,209,7 duplicate(Lurid Royal Guard#dk) Soldier's Corpse#dk3 4_M_DIEMAN +1@spa,189,195,1 duplicate(Lurid Royal Guard#dk) Soldier's Corpse#dk4 4_M_DIEMAN + +1@spa,1,1,1 script #gp_control_5 HIDDEN_WARP_NPC,{ + end; +OnStart: + enablenpc instance_npcname("#gp_control_5"); + disablenpc instance_npcname("Thanatos Magic Trace#dk2"); + disablenpc instance_npcname("Visiting Prince#dk"); + disablenpc instance_npcname("Lurid Royal Guard#dk4"); + disablenpc instance_npcname("King's Corpse#dk"); + disablenpc instance_npcname("Captain's Corpse#dk"); + disablenpc instance_npcname("Soldier's Corpse#dk"); + disablenpc instance_npcname("Soldier's Corpse#dk1"); + disablenpc instance_npcname("Soldier's Corpse#dk2"); + disablenpc instance_npcname("Soldier's Corpse#dk3"); + disablenpc instance_npcname("Soldier's Corpse#dk4"); + sleep 1000; + .@label$ = instance_npcname("#gp_control_5") + "::OnMyMobDead"; + monster 'map_spa$,198,218, "Torturous Redeemer",2959,1, .@label$; // TORTUROUS_REDEEMER + monster 'map_spa$,198,182, "Sweet Slaughter",2956,1, .@label$; // SWEET_SLAUGHTER + end; +OnMyMobDead: + if (mobcount('map_spa$, instance_npcname("#gp_control_5") + "::OnMyMobDead") < 1) { + deltimer instance_npcname("#gp_control_4") + "::OnSpawn1"; // stop double spawn if timer is running + mapannounce 'map_spa$, "The passage on the 5th floor of the palace is open.", bc_map,0xFFFF00; + disablenpc instance_npcname("4th floor in the palace"); + enablenpc instance_npcname("5th floor of Palace"); + enablenpc instance_npcname("Princess Tiara#dk1"); + enablenpc instance_npcname("Lurid Royal Guard#dk5"); + + killmonster 'map_spa$, instance_npcname("#gp_control_3") + "::OnMyMobDead2"; + killmonster 'map_spa$, instance_npcname("#gp_control_3") + "::OnMyMobDead3"; + disablenpc instance_npcname("#gp_control_3"); + } + end; +} + +// 5th floor +1@spa,216,43,3 script Princess Tiara#dk1 4_F_MAYSEL,{ + .@guard$ = instance_npcname("Lurid Royal Guard#dk5"); + mes "[Princess Tiara]"; + mes "You kept your promise."; + npctalk "Princess Tiara: You kept your promise."; + next; + mes "[Lurid Royal Guard]"; + mes "princess!"; + npctalk "Lurid Royal Guard: Princess!", .@guard$; + next; + cutin "npc-tiara.bmp",3; + mes "[Princess Tiara]"; + mes "Thank you... now I can rest beside you..."; + npctalk "Princess Tiara: Thank you... now I can rest beside you..."; + next; + mes "[Lurid Royal Guard]"; + mes "No..No!!!!!"; + npctalk "Lurid Royal Guard: No..No!!!!!", .@guard$; + next; + mes "[The voice of Princess Tiara]"; + mes "I want to be with you forever in peace...forever..."; + npctalk "Princess Tiara: I want to be with you forever in peace...forever..."; + next; + cutin "b-tiara.BMP",3; + mes "[Lurid Royal Guard]"; + mes "no.....Ahh ahh ahh!!!!~!"; + npctalk "Lurid Royal Guard: no.....Ahh ahh ahh!!!!~!", .@guard$; + next; + mes "[The voice of Princess Tiara]"; + mes "I love you..."; + npctalk "Princess Tiara: I love you..."; + cutin "",255; + close2; + donpcevent instance_npcname("#gp_control_6") + "::OnStart"; + end; +} + +1@spa,213,42,7 duplicate(Lurid Royal Guard#dk) Lurid Royal Guard#dk5 4_M_SAKRAYROYAL + +1@spa,1,1,1 script #gp_control_6 HIDDEN_WARP_NPC,{ + end; +OnStart: + enablenpc instance_npcname("#gp_control_6"); + disablenpc instance_npcname("Princess Tiara#dk1"); + disablenpc instance_npcname("Lurid Royal Guard#dk5"); + + killmonster 'map_spa$, instance_npcname("#gp_control_4") + "::OnMyMobDead1"; + killmonster 'map_spa$, instance_npcname("#gp_control_4") + "::OnMyMobDead2"; + killmonster 'map_spa$, instance_npcname("#gp_control_5") + "::OnMyMobDead"; + disablenpc instance_npcname("#gp_control_4"); + disablenpc instance_npcname("#gp_control_5"); + disablenpc instance_npcname("5th floor of Palace"); + sleep 2000; + .@label$ = instance_npcname("#gp_control_6") + "::OnMyMobDead1"; + monster 'map_spa$,217,52, "Forgotten Name" ,2957,1, .@label$; // FORGOTTEN_NAME + unittalk $@mobid[0], "Wake up! look at us... We are monsters?"; + monster 'map_spa$,190,21, "Tarnished Oath" ,2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Sakray killed the King and tried to kill us!"; + monster 'map_spa$,198,49, "Tarnished Oath" ,2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "What is this..??"; + monster 'map_spa$,212,28, "Fatal Days" ,2958,1, .@label$; // FATAL_DAYS + unittalk $@mobid[0], "Sakray killed a princess!"; + end; +OnMyMobDead1: + if (mobcount('map_spa$, instance_npcname("#gp_control_6") + "::OnMyMobDead1") < 1) { + sleep 2000; + .@label$ = instance_npcname("#gp_control_6") + "::OnMyMobDead2"; + monster 'map_spa$,217,43, "Forgotten Name" ,2957,1, .@label$; // FORGOTTEN_NAME + unittalk $@mobid[0], "Wake up! look at us... We are monsters?"; + monster 'map_spa$,193,24, "Forgotten Name" ,2957,1, .@label$; // FORGOTTEN_NAME + unittalk $@mobid[0], "Sakray..?? why.....Sakray!"; + monster 'map_spa$,216,59, "Tarnished Oath" ,2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Sakray killed the King and tried to kill us!"; + monster 'map_spa$,197,57, "Fatal Days" ,2958,1, .@label$; // FATAL_DAYS + unittalk $@mobid[0], "Sakray killed a princess!"; + } + end; +OnMyMobDead2: + if (mobcount('map_spa$, instance_npcname("#gp_control_6") + "::OnMyMobDead2") < 1) { + sleep 2000; + .@label$ = instance_npcname("#gp_control_6") + "::OnMyMobDead3"; + monster 'map_spa$,193,39, "Forgotten Name" ,2957,1, .@label$; // FORGOTTEN_NAME + unittalk $@mobid[0], "Wake up! look at us... We are monsters?"; + monster 'map_spa$,212,34, "Forgotten Name" ,2957,1, .@label$; // FORGOTTEN_NAME + unittalk $@mobid[0], "Sakray..?? why.....Sakray!"; + monster 'map_spa$,201,64, "Tarnished Oath" ,2954,1, .@label$; // COLORLESS_VOW + unittalk $@mobid[0], "Sakray killed the King and tried to kill us!"; + monster 'map_spa$,175,44, "Fatal Days" ,2958,1, .@label$; // FATAL_DAYS + unittalk $@mobid[0], "Sakray killed a princess!"; + } + end; +OnMyMobDead3: + if (mobcount('map_spa$, instance_npcname("#gp_control_6") + "::OnMyMobDead3") < 1) { + sleep 2000; + monster 'map_spa$,200,45, "Torturous Redeemer" ,2961,1, instance_npcname("#gp_control_6") + "::OnMyMobDead4"; // E_TORTUROUS_REDEEMER + unittalk $@mobid[0], "Thanatos Magic Trace! I will destroy you if I can't have you... Oh no! How could this be?"; + sleep 5000; + killmonster 'map_spa$, instance_npcname("#gp_control_6") + "::OnMyMobDead4"; + enablenpc instance_npcname("Sakray#dk"); + enablenpc instance_npcname("Thanatos Magic Trace#dk3"); + disablenpc instance_npcname("#gp_control_6"); + } + end; +OnMyMobDead4: + end; +} + +1@spa,196,44,5 script Sakray#dk 4_M_SAKRAY,{ + mes "[Lurid Royal Guard]"; + mes "Are you satisfied..? Thanatos Magic Trace?"; + npctalk "Lurid Royal Guard: Are you satisfied..? Thanatos Magic Trace?"; + next; + mes "[Thanatos Magic Trace]"; + mes "I need more blood..Sakray, offer me his blood."; + npctalk "Thanatos Magic Trace: I need more blood..Sakray, offer me his blood.", instance_npcname("Thanatos Magic Trace#dk3"); + next; + mes "[Sakray]"; + mes "Okay, that is good. A traveller. Did you see?"; + npctalk "Sakray: Okay, that is good. A traveller. Did you see?"; + next; + mes "[" + strcharinfo(0) + "]"; + mes "Sakray, what do you want? Sympathy? Or is it a trap?"; + unittalk getcharid(3), "" + strcharinfo(0) + " : Sakray, what do you want? Sympathy? Or is it a trap?"; + next; + mes "[Sakray]"; + mes "No... I do not need to make any effort to catch a novice."; + npctalk "Sakray: No... I do not need to make any effort to catch a novice."; + next; + mes "[" + strcharinfo(0) + "]"; + mes "If so... then why...?"; + unittalk getcharid(3), "" + strcharinfo(0) + " : If so... then why...?"; + next; + cutin "cry-b.bmp",2; + mes "[Sakray]"; + mes "I wanted to get rid of a piece of humanity inside of me through you."; + npctalk "Sakray: I wanted to get rid of a piece of humanity inside of me through you."; + next; + mes "[Sakray]"; + mes "I am quite satisfied with the result."; + npctalk "Sakray: I am quite satisfied with the result."; + next; + mes "[Thanatos Magic Trace]"; + mes "Sakray, offer the blood to me now!"; + npctalk "Thanatos Magic Trace: Sakray, offer the blood to me now!", instance_npcname("Thanatos Magic Trace#dk3"); + next; + mes "[Sakray]"; + mes "If you were me, what would you do?"; + npctalk "Sakray: If you were me, what would you do?"; + next; + mes "[Sakray]"; + mes "Can you set yourself free from this curse?"; + npctalk "Sakray: Can you set yourself free from this curse?"; + next; + mes "[" + strcharinfo(0) + "]"; + mes "..."; + unittalk getcharid(3), "" + strcharinfo(0) + " : ..."; + next; + mes "[Sakray]"; + mes "Heh heh... I will keep watching you until the day comes when you are old enough."; + npctalk "Sakray: Heh heh... I will keep watching you until the day comes when you are old enough."; + next; + mes "[Sakray]"; + mes "I am willing to hunt you later for Thanatos."; + npctalk "Sakray: I am willing to hunt you later for Thanatos."; + cutin "",255; + next; + mes "[Sakray]"; + mes "Farewell then."; + npctalk "Sakray: Farewell then."; + close2; + donpcevent instance_npcname("#tb") + "::OnStart"; + end; +} + +1@spa,196,46,1 script #tb CLEAR_NPC,{ + end; +OnStart: + disablenpc instance_npcname("Sakray#dk"); + disablenpc instance_npcname("Thanatos Magic Trace#dk3"); + enablenpc instance_npcname("#tb"); + enablenpc instance_npcname("#sv"); + enablenpc instance_npcname("#tv"); + initnpctimer; + end; +OnTimer3000: + npctalk "Voice of Princess Tiara : What can I do for you?"; + end; +OnTimer8000: + npctalk "Voice of Sakray : I will always stand by you. Please rest beside me.", instance_npcname("#sv"); + end; +OnTimer13000: + npctalk "Thanatos Magic Trace: Sakray, do not forget the covenant of blood between us.", instance_npcname("#tv"); + end; +OnTimer17000: + npctalk "Thanatos Magic Trace: Your soul is mine until you find the blood that satisfies me...", instance_npcname("#tv"); + end; +OnTimer22000: + npctalk "Voice of Sakray : Rest in the shadow with me.", instance_npcname("#sv"); + end; +OnTimer25000: + npctalk "Voice of Sakray : In the dark forever...", instance_npcname("#sv"); + end; +OnTimer28500: + disablenpc instance_npcname("#tb"); + disablenpc instance_npcname("#sv"); + disablenpc instance_npcname("#tv"); + mapannounce 'map_spa$, "It is time to leave the Ghost Palace.", bc_map,0xFFFF00; + enablenpc instance_npcname("Way out of Palace"); + enablenpc instance_npcname("King#dk11"); + end; +} + +1@spa,195,41,1 duplicate(Lurid Royal Guard#dk) Thanatos Magic Trace#dk3 CLEAR_NPC +1@spa,198,43,1 duplicate(Lurid Royal Guard#dk) #sv CLEAR_NPC +1@spa,196,41,1 duplicate(Lurid Royal Guard#dk) #tv CLEAR_NPC + +1@spa,204,29,1 script King#dk11 4_M_RUSKING,{ + disable_items; + mes "[King]"; + mes "Hey there, are you alive?"; + mes "I did not expect to meet someone who is still alive."; + next; + mes "[King]"; + mes "Do you possibly have the ^006400Gray Shard^000000?"; + mes "Can you give it to me?"; + mes "The memories of the faithful royal guard"; + mes "and the memories of everyone he loved"; + mes "are contained inside of these shards."; + next; + mes "[King]"; + mes "Will you give the ^006400Gray Shard^000000 to me?"; + mes "The guilt is eating my soul."; + mes "My soul is stuck within the Ghost Palace."; + next; + mes "[King]"; + mes "I am collecting Sakray's abandoned memories from these shards."; + next; + mes "[King]"; + mes "If you give any ^006400Gray Shard^000000s to me, I can make equipment for you."; + next; + mes "[King]"; + mes "The cursed knight..."; + mes "Please help me save the soul of Sakray."; + next; + setarray .@item_name$[0], + "Thanatos Sword", "Thanatos Great Sword", "Thanatos Spear", "Thanatos Long Spear", "Thanatos Staff", + "Thanatos Two-handed Staff", "Thanatos Bow", "Thanatos Dagger", "Thanatos Katar", "Thanatos Knuckle", + "Thanatos Hammer", "Thanatos Axe", "Thanatos Violin", "Thanatos Whip", + "Gray Shield", "Gray Armor", "Gray Robe", "Gray Cloak", "Gray Shoes", "Gray Helmet"; + setarray .@items_list[0],13441,21009,1438,1496,1669,2023,18119,13093,28000,1836,16028,28100,1933,1988,2187,15090,15091,20721,22033,18820; + + for ( .@i = 0; .@i < 20; .@i++ ) + .@menu$ += .@item_name$[.@i] + ":"; + .@menu$ += "Cancel"; + + while(true) { + .@s = select(.@menu$) - 1; + if (.@s == 20) { + mes "[King]"; + mes "Someday, Sakray will"; + mes "get out of this curse for sure."; + mes "I believe"; + mes "^006400Gray Shard^000000s are the only method"; + mes "to save him...."; + close; + } + .@cost = ( .@s > 13 ? 100 : 200 ); + mes "[King]"; + mes "To make a ^FF0000" + .@item_name$[.@s] + "^000000"; + mes "I need " + .@cost + " ^006400Gray Shard^000000."; + next; + if (select( "Cancel", "Hand over " + .@cost + " Gray Shard." ) == 1) { + mes "[King]"; + mes "Someday, Sakray will"; + mes "get out of this curse for sure."; + next; + continue; + } + if (countitem(6672) < .@cost) { + mes "[King]"; + mes "You do not have enough ^006400Gray Shard^000000"; + mes "to make a ^FF0000" + .@item_name$[.@s] + "^000000."; + mes "I need " + .@cost + " ^006400Gray Shard^000000."; + next; + continue; + } + mes "[King]"; + mes "I will make a ^FF0000" + .@item_name$[.@s] + "^000000"; + mes "with " + .@cost + " ^006400Gray Shard^000000."; + next; + mes "You see a light through the folded hands of the king and it gradually takes on a shape."; + next; + mes "[King]"; + mes "All right, it is done."; + mes "Take this ^FF0000" + .@item_name$[.@s] + "^000000"; + mes "to confront Sakray and Thanatos."; + next; + mes "[King]"; + mes "The power requires a sacrifice."; + mes "Please be careful..."; + delitem 6672,.@cost;// Gray Shard + getitem .@items_list[.@s],1; + close; + } +} + +1@spa,210,28,0 script Way out of Palace WARPNPC,2,2,{ + end; +OnTouch_: + mes "It is time to leave the Ghost Palace."; + mes "Everything is now complete"; + mes "and will vanish.."; + close2; + if (isbegin_quest(1263) == 2) + getitem 6672,1;// Gray Shard + else { + setquest 1263;// Cursed Swordman + completequest 1263; + getexp 900000,500000; + getitem 6672,2;// Gray Shard + } + warp "dali02",46,129; + end; +} + +1@spa,41,217,0 warp The second floor of Palace 2,2,1@spa,114,120 +1@spa,117,137,0 warp 3rd floor in the palace 2,2,1@spa,60,43 +1@spa,54,28,0 warp 4th floor in the palace 2,2,1@spa,218,186 +1@spa,178,186,0 warp 5th floor of Palace 2,2,1@spa,186,57 diff --git a/npc/re/other/achievements.txt b/npc/re/other/achievements.txt new file mode 100644 index 0000000000..fadad9a392 --- /dev/null +++ b/npc/re/other/achievements.txt @@ -0,0 +1,278 @@ +//===== rAthena Script ======================================= +//= Adventure Achievements +//===== Description: ========================================= +//= Spawns Adventure group type treasure chests. +//===== Changelogs: ========================================== +//= 1.0 Initial release. [Aleos] +//============================================================ + +- script ach_treasure#core -1,{ + if (strnpcinfo(3) == "") + end; + achievementcomplete(atoi(strnpcinfo(3))); + classchange HIDDEN_WARP_NPC; + initnpctimer; + end; + +OnTouch: + if (getnpctimer(1)) // Don't trigger touch if the delay timer is active. + end; + if (achievementexists(atoi(strnpcinfo(3)))) // Don't trigger if the player has already completed. + end; + classchange 4_TREASURE_BOX,"",bc_self; + end; + +OnTimer5000: + stopnpctimer; + end; +} + +//----------------- +// --- Dungeons --- +//----------------- + +// Abbey Underground +abbey03,26,72,0 duplicate(ach_treasure#core) #abb_ach1::120110 HIDDEN_WARP_NPC,5,5 + +// Abyss Lake +abyss_03,86,55,0 duplicate(ach_treasure#core) #aby_ach1::120111 HIDDEN_WARP_NPC,5,5 + +// Amatsu Dungeon +ama_dun03,60,163,0 duplicate(ach_treasure#core) #ama_ach1::120113 HIDDEN_WARP_NPC,5,5 + +// Ant Hell +anthell02,253,41,0 duplicate(ach_treasure#core) #ant_ach1::120114 HIDDEN_WARP_NPC,5,5 + +// Ayothaya Dungeon +ayo_dun02,150,256,0 duplicate(ach_treasure#core) #ayo_ach1::120115 HIDDEN_WARP_NPC,5,5 + +// Bifrost +ecl_tdun04,37,37,0 duplicate(ach_treasure#core) #ecl_ach1::120121 HIDDEN_WARP_NPC,5,5 + +// Brasilis Dungeon +bra_dun02,171,121,0 duplicate(ach_treasure#core) #bra_ach1::120117 HIDDEN_WARP_NPC,5,5 + +// Byalan Dungeon +iz_dun05,64,223,0 duplicate(ach_treasure#core) #iz_ach2::120141 HIDDEN_WARP_NPC,5,5 + +// Clock Tower +c_tower4,37,158,0 duplicate(ach_treasure#core) #ct_ach1::120112 HIDDEN_WARP_NPC,5,5 +alde_dun04,90,107,0 duplicate(ach_treasure#core) #ct_ach2::120118 HIDDEN_WARP_NPC,5,5 + +// Coal Mine +mjo_dun03,76,220,0 duplicate(ach_treasure#core) #mjo_ach1::120136 HIDDEN_WARP_NPC,5,5 + +// Comodo Dungeon +beach_dun3,102,71,0 duplicate(ach_treasure#core) #bea_ach1::120116 HIDDEN_WARP_NPC,5,5 + +// Einbech +ein_dun02,31,255,0 duplicate(ach_treasure#core) #eind_ach1::120122 HIDDEN_WARP_NPC,5,5 + +// Geffen Dungeon +gef_dun02,222,163,0 duplicate(ach_treasure#core) #gefd_ach1::120123 HIDDEN_WARP_NPC,5,5 + +// Glastheim +gl_cas02,53,151,0 duplicate(ach_treasure#core) #gl_ach1::120124 HIDDEN_WARP_NPC,5,5 +gl_sew04,288,6,0 duplicate(ach_treasure#core) #gl_ach2::120125 HIDDEN_WARP_NPC,5,5 +gl_knt02,126,235,0 duplicate(ach_treasure#core) #gl_ach3::120126 HIDDEN_WARP_NPC,5,5 +gl_prison1,125,159,0 duplicate(ach_treasure#core) #gl_ach4:120127 HIDDEN_WARP_NPC,5,5 + +// Gonryun Dungeon +gon_dun03,167,232,0 duplicate(ach_treasure#core) #gon_ach1::120128 HIDDEN_WARP_NPC,5,5 + +// Istana +dew_dun02,87,272,0 duplicate(ach_treasure#core) #dew_ach1::120119 HIDDEN_WARP_NPC,5,5 + +// Labyrinth +prt_maze03,11,14,0 duplicate(ach_treasure#core) #maze_ach1::120140 HIDDEN_WARP_NPC,5,5 + +// Louyang Dungeon +lou_dun03,29,228,0 duplicate(ach_treasure#core) #lou_ach1::120134 HIDDEN_WARP_NPC,5,5 + +// Nogg Road +mag_dun02,192,72,0 duplicate(ach_treasure#core) #mag_ach1::120135 HIDDEN_WARP_NPC,5,5 + +// Orc Dungeon +orcsdun02,32,72,0 duplicate(ach_treasure#core) #orc_ach1::120138 HIDDEN_WARP_NPC,5,5 + +// Payon Dungeon +pay_dun04,120,124,0 duplicate(ach_treasure#core) #payd_ach1::120139 HIDDEN_WARP_NPC,5,5 + +// Prontera Culvert +prt_sewb4,19,183,0 duplicate(ach_treasure#core) #iz_ach1::120131 HIDDEN_WARP_NPC,5,5 + +// Pyramid +moc_pryd06,102,121,0 duplicate(ach_treasure#core) #pyr_ach1::120137 HIDDEN_WARP_NPC,5,5 + +// Rachel Dungeon +ice_dun03,44,261,0 duplicate(ach_treasure#core) #rad_ach1::120129 HIDDEN_WARP_NPC,5,5 + +// Robot Factory +kh_dun02,70,106,0 duplicate(ach_treasure#core) #jup_ach1::120132 HIDDEN_WARP_NPC,5,5 + +// Scaraba Hall +dic_dun03,216,211,0 duplicate(ach_treasure#core) #dic_ach1::120120 HIDDEN_WARP_NPC,5,5 + +// Somatology Lab +lhz_dun03,240,221,0 duplicate(ach_treasure#core) #lhzd_ach1::120133 HIDDEN_WARP_NPC,5,5 + +// Sphinx +in_sphinx5,154,107,0 duplicate(ach_treasure#core) #sph_ach1::120130 HIDDEN_WARP_NPC,5,5 + +// Sunken Ship +treasure02,18,142,0 duplicate(ach_treasure#core) #iz_ach3::120144 HIDDEN_WARP_NPC,5,5 + +// Thanatos Tower +tha_t06,150,176,0 duplicate(ach_treasure#core) #tha_ach1::120142 HIDDEN_WARP_NPC,5,5 + +// Thors Volcano +thor_v03,220,221,0 duplicate(ach_treasure#core) #thor_ach1::120143 HIDDEN_WARP_NPC,5,5 + +// Toy Factory +xmas_dun02,120,224,0 duplicate(ach_treasure#core) #xmas_ach1::120146 HIDDEN_WARP_NPC,5,5 + +// Turtle Island Dungeon +tur_dun04,134,130,0 duplicate(ach_treasure#core) #tur_ach1::120145 HIDDEN_WARP_NPC,5,5 + +//--------------- +// --- Fields --- +//--------------- + +// Comodo +cmd_fild01,112,200,0 duplicate(ach_treasure#core) #cmd_ach1::120044 HIDDEN_WARP_NPC,5,5 +cmd_fild02,86,94,0 duplicate(ach_treasure#core) #cmd_ach2::120045 HIDDEN_WARP_NPC,5,5 +cmd_fild03,144,190,0 duplicate(ach_treasure#core) #cmd_ach3::120046 HIDDEN_WARP_NPC,5,5 +cmd_fild04,151,191,0 duplicate(ach_treasure#core) #cmd_ach4::120047 HIDDEN_WARP_NPC,5,5 +cmd_fild06,221,108,0 duplicate(ach_treasure#core) #cmd_ach5::120048 HIDDEN_WARP_NPC,5,5 +cmd_fild07,269,322,0 duplicate(ach_treasure#core) #cmd_ach6::120049 HIDDEN_WARP_NPC,5,5 +cmd_fild08,181,136,0 duplicate(ach_treasure#core) #cmd_ach7::120050 HIDDEN_WARP_NPC,5,5 +cmd_fild09,211,266,0 duplicate(ach_treasure#core) #cmd_ach8::120051 HIDDEN_WARP_NPC,5,5 + +// Einbroch +ein_fild01,266,277,0 duplicate(ach_treasure#core) #ein_ach1::120067 HIDDEN_WARP_NPC,5,5 +ein_fild03,99,332,0 duplicate(ach_treasure#core) #ein_ach2::120068 HIDDEN_WARP_NPC,5,5 +ein_fild04,334,305,0 duplicate(ach_treasure#core) #ein_ach3::120069 HIDDEN_WARP_NPC,5,5 +ein_fild05,337,233,0 duplicate(ach_treasure#core) #ein_ach4::120070 HIDDEN_WARP_NPC,5,5 +ein_fild06,174,245,0 duplicate(ach_treasure#core) #ein_ach5::120071 HIDDEN_WARP_NPC,5,5 +ein_fild07,188,50,0 duplicate(ach_treasure#core) #ein_ach6::120072 HIDDEN_WARP_NPC,5,5 +ein_fild08,258,78,0 duplicate(ach_treasure#core) #ein_ach7::120073 HIDDEN_WARP_NPC,5,5 +ein_fild09,330,76,0 duplicate(ach_treasure#core) #ein_ach8::120074 HIDDEN_WARP_NPC,5,5 + +// Geffen +gef_fild00,74,119,0 duplicate(ach_treasure#core) #gef_ach1::120011 HIDDEN_WARP_NPC,5,5 +gef_fild01,223,223,0 duplicate(ach_treasure#core) #gef_ach2::120012 HIDDEN_WARP_NPC,5,5 +gef_fild05,202,292,0 duplicate(ach_treasure#core) #gef_ach3::120013 HIDDEN_WARP_NPC,5,5 +gef_fild06,279,104,0 duplicate(ach_treasure#core) #gef_ach4::120014 HIDDEN_WARP_NPC,5,5 +gef_fild07,181,250,0 duplicate(ach_treasure#core) #gef_ach5::120015 HIDDEN_WARP_NPC,5,5 +gef_fild09,170,73,0 duplicate(ach_treasure#core) #gef_ach6::120016 HIDDEN_WARP_NPC,5,5 +gef_fild11,238,249,0 duplicate(ach_treasure#core) #gef_ach7::120017 HIDDEN_WARP_NPC,5,5 + +// Hugel +hu_fild01,347,312,0 duplicate(ach_treasure#core) #hu_ach1::120062 HIDDEN_WARP_NPC,5,5 +hu_fild02,80,152,0 duplicate(ach_treasure#core) #hu_ach2::120063 HIDDEN_WARP_NPC,5,5 +hu_fild04,322,313,0 duplicate(ach_treasure#core) #hu_ach3::120064 HIDDEN_WARP_NPC,5,5 +hu_fild06,204,228,0 duplicate(ach_treasure#core) #hu_ach4::120065 HIDDEN_WARP_NPC,5,5 +hu_fild05,197,210,0 duplicate(ach_treasure#core) #hu_ach5::120066 HIDDEN_WARP_NPC,5,5 + +// Laphine +ecl_fild01,155,322,0 duplicate(ach_treasure#core) #ecl_ach1::120090 HIDDEN_WARP_NPC,5,5 +bif_fild01,147,64,0 duplicate(ach_treasure#core) #ecl_ach2::120091 HIDDEN_WARP_NPC,5,5 +bif_fild02,155,322,0 duplicate(ach_treasure#core) #ecl_ach3::120092 HIDDEN_WARP_NPC,5,5 +spl_fild01,335,315,0 duplicate(ach_treasure#core) #ecl_ach4::120093 HIDDEN_WARP_NPC,5,5 +spl_fild02,153,358,0 duplicate(ach_treasure#core) #ecl_ach5::120094 HIDDEN_WARP_NPC,5,5 +spl_fild03,61,286,0 duplicate(ach_treasure#core) #ecl_ach6::120095 HIDDEN_WARP_NPC,5,5 + +// Lighthalzen +lhz_fild01,118,73,0 duplicate(ach_treasure#core) #lhz_ach1::120075 HIDDEN_WARP_NPC,5,5 +lhz_fild02,239,243,0 duplicate(ach_treasure#core) #lhz_ach2::120076 HIDDEN_WARP_NPC,5,5 +lhz_fild03,313,132,0 duplicate(ach_treasure#core) #lhz_ach3::120077 HIDDEN_WARP_NPC,5,5 + +// Manuk +man_fild01,41,172,0 duplicate(ach_treasure#core) #man_ach1::120096 HIDDEN_WARP_NPC,5,5 +man_fild02,268,355,0 duplicate(ach_treasure#core) #man_ach2::120097 HIDDEN_WARP_NPC,5,5 +man_fild03,198,91,0 duplicate(ach_treasure#core) #man_ach3::120098 HIDDEN_WARP_NPC,5,5 +dic_fild01,227,82,0 duplicate(ach_treasure#core) #man_ach4::120099 HIDDEN_WARP_NPC,5,5 +dic_fild02,147,196,0 duplicate(ach_treasure#core) #man_ach5::120100 HIDDEN_WARP_NPC,5,5 + +// Misc +ama_fild01,187,337,0 duplicate(ach_treasure#core) #misc_ach1::120101 HIDDEN_WARP_NPC,5,5 +gon_fild01,171,332,0 duplicate(ach_treasure#core) #misc_ach2::120102 HIDDEN_WARP_NPC,5,5 +lou_fild01,104,232,0 duplicate(ach_treasure#core) #misc_ach3::120103 HIDDEN_WARP_NPC,5,5 +ayo_fild01,289,70,0 duplicate(ach_treasure#core) #misc_ach4::120104 HIDDEN_WARP_NPC,5,5 +mosk_fild02,176,77,0 duplicate(ach_treasure#core) #misc_ach5::120105 HIDDEN_WARP_NPC,5,5 +bra_fild01,99,193,0 duplicate(ach_treasure#core) #misc_ach6::120106 HIDDEN_WARP_NPC,5,5 +dew_fild01,175,287,0 duplicate(ach_treasure#core) #misc_ach7::120107 HIDDEN_WARP_NPC,5,5 +ma_fild01,308,206,0 duplicate(ach_treasure#core) #misc_ach8::120108 HIDDEN_WARP_NPC,5,5 +ma_fild02,176,77,0 duplicate(ach_treasure#core) #misc_ach9::120109 HIDDEN_WARP_NPC,5,5 + +// Mjolnir +mjolnir_01,47,60,0 duplicate(ach_treasure#core) #nmjo_ach1::120032 HIDDEN_WARP_NPC,5,5 +mjolnir_02,77,49,0 duplicate(ach_treasure#core) #nmjo_ach2::120033 HIDDEN_WARP_NPC,5,5 +mjolnir_03,190,200,0 duplicate(ach_treasure#core) #nmjo_ach3::120034 HIDDEN_WARP_NPC,5,5 +mjolnir_04,201,146,0 duplicate(ach_treasure#core) #nmjo_ach4::120035 HIDDEN_WARP_NPC,5,5 +mjolnir_05,43,327,0 duplicate(ach_treasure#core) #nmjo_ach5::120036 HIDDEN_WARP_NPC,5,5 +mjolnir_06,162,290,0 duplicate(ach_treasure#core) #smjo_ach1::120037 HIDDEN_WARP_NPC,5,5 +mjolnir_07,321,127,0 duplicate(ach_treasure#core) #smjo_ach2::120038 HIDDEN_WARP_NPC,5,5 +mjolnir_08,175,225,0 duplicate(ach_treasure#core) #smjo_ach3::120039 HIDDEN_WARP_NPC,5,5 +mjolnir_09,299,123,0 duplicate(ach_treasure#core) #smjo_ach4::120040 HIDDEN_WARP_NPC,5,5 +mjolnir_10,353,371,0 duplicate(ach_treasure#core) #smjo_ach5::120041 HIDDEN_WARP_NPC,5,5 +mjolnir_11,329,182,0 duplicate(ach_treasure#core) #smjo_ach6::120042 HIDDEN_WARP_NPC,5,5 +mjolnir_12,110,298,0 duplicate(ach_treasure#core) #smjo_ach7::120043 HIDDEN_WARP_NPC,5,5 + +// Morocc +moc_fild11,188,218,0 duplicate(ach_treasure#core) #moc_ach1::120018 HIDDEN_WARP_NPC,5,5 +moc_fild12,234,96,0 duplicate(ach_treasure#core) #moc_ach2::120019 HIDDEN_WARP_NPC,5,5 +moc_fild13,290,207,0 duplicate(ach_treasure#core) #moc_ach3::120020 HIDDEN_WARP_NPC,5,5 +moc_fild16,196,108,0 duplicate(ach_treasure#core) #moc_ach4::120021 HIDDEN_WARP_NPC,5,5 +moc_fild17,269,105,0 duplicate(ach_treasure#core) #moc_ach5::120022 HIDDEN_WARP_NPC,5,5 +moc_fild18,54,284,0 duplicate(ach_treasure#core) #moc_ach6::120023 HIDDEN_WARP_NPC,5,5 + +// Payon +pay_fild01,167,243,0 duplicate(ach_treasure#core) #pay_ach1::120024 HIDDEN_WARP_NPC,5,5 +pay_fild02,105,240,0 duplicate(ach_treasure#core) #pay_ach2::120025 HIDDEN_WARP_NPC,5,5 +pay_fild03,144,97,0 duplicate(ach_treasure#core) #pay_ach3::120026 HIDDEN_WARP_NPC,5,5 +pay_fild04,257,95,0 duplicate(ach_treasure#core) #pay_ach4::120027 HIDDEN_WARP_NPC,5,5 +pay_fild07,365,37,0 duplicate(ach_treasure#core) #pay_ach5::120028 HIDDEN_WARP_NPC,5,5 +pay_fild08,237,345,0 duplicate(ach_treasure#core) #pay_ach6::120029 HIDDEN_WARP_NPC,5,5 +pay_fild09,251,42,0 duplicate(ach_treasure#core) #pay_ach7::120030 HIDDEN_WARP_NPC,5,5 +pay_fild10,196,38,0 duplicate(ach_treasure#core) #pay_ach8::120031 HIDDEN_WARP_NPC,5,5 + +// Prontera +prt_fild01,147,126,0 duplicate(ach_treasure#core) #prt_ach1::120001 HIDDEN_WARP_NPC,5,5 +prt_fild02,140,219,0 duplicate(ach_treasure#core) #prt_ach2::120002 HIDDEN_WARP_NPC,5,5 +prt_fild03,172,139,0 duplicate(ach_treasure#core) #prt_ach3::120003 HIDDEN_WARP_NPC,5,5 +prt_fild04,119,291,0 duplicate(ach_treasure#core) #prt_ach4::120004 HIDDEN_WARP_NPC,5,5 +prt_fild05,190,291,0 duplicate(ach_treasure#core) #prt_ach5::120005 HIDDEN_WARP_NPC,5,5 +prt_fild06,296,303,0 duplicate(ach_treasure#core) #prt_ach6::120006 HIDDEN_WARP_NPC,5,5 +prt_fild07,45,104,0 duplicate(ach_treasure#core) #prt_ach7::120007 HIDDEN_WARP_NPC,5,5 +prt_fild08,203,223,0 duplicate(ach_treasure#core) #prt_ach8::120008 HIDDEN_WARP_NPC,5,5 +prt_fild09,37,354,0 duplicate(ach_treasure#core) #prt_ach9::120009 HIDDEN_WARP_NPC,5,5 +prt_fild10,177,206,0 duplicate(ach_treasure#core) #prt_ach10::12010 HIDDEN_WARP_NPC,5,5 + +// Rachel +ra_fild01,138,166,0 duplicate(ach_treasure#core) #ra_ach1::120078 HIDDEN_WARP_NPC,5,5 +ra_fild03,224,275,0 duplicate(ach_treasure#core) #ra_ach2::120079 HIDDEN_WARP_NPC,5,5 +ra_fild08,326,45,0 duplicate(ach_treasure#core) #ra_ach3::120080 HIDDEN_WARP_NPC,5,5 +ra_fild12,352,165,0 duplicate(ach_treasure#core) #ra_ach4::120081 HIDDEN_WARP_NPC,5,5 +ra_fild04,92,302,0 duplicate(ach_treasure#core) #ra_ach5::120082 HIDDEN_WARP_NPC,5,5 +ra_fild05,59,59,0 duplicate(ach_treasure#core) #ra_ach6::120083 HIDDEN_WARP_NPC,5,5 +ra_fild06,362,230,0 duplicate(ach_treasure#core) #ra_ach7::120084 HIDDEN_WARP_NPC,5,5 + +// Veins +ve_fild01,180,234,0 duplicate(ach_treasure#core) #ve_ach1::120085 HIDDEN_WARP_NPC,5,5 +ve_fild02,65,194,0 duplicate(ach_treasure#core) #ve_ach2::120086 HIDDEN_WARP_NPC,5,5 +ve_fild03,197,242,0 duplicate(ach_treasure#core) #ve_ach3::120087 HIDDEN_WARP_NPC,5,5 +ve_fild04,288,279,0 duplicate(ach_treasure#core) #ve_ach4::120088 HIDDEN_WARP_NPC,5,5 +ve_fild07,33,113,0 duplicate(ach_treasure#core) #ve_ach5::120089 HIDDEN_WARP_NPC,5,5 + +// Yuno +yuno_fild01,284,138,0 duplicate(ach_treasure#core) #yuno_ach1::120052 HIDDEN_WARP_NPC,5,5 +yuno_fild12,76,268,0 duplicate(ach_treasure#core) #yuno_ach2::120053 HIDDEN_WARP_NPC,5,5 +yuno_fild02,142,191,0 duplicate(ach_treasure#core) #yuno_ach3::120054 HIDDEN_WARP_NPC,5,5 +yuno_fild03,135,329,0 duplicate(ach_treasure#core) #yuno_ach4::120055 HIDDEN_WARP_NPC,5,5 +yuno_fild04,35,369,0 duplicate(ach_treasure#core) #yuno_ach5::120056 HIDDEN_WARP_NPC,5,5 +yuno_fild06,262,220,0 duplicate(ach_treasure#core) #yuno_ach6::120057 HIDDEN_WARP_NPC,5,5 +yuno_fild07,113,339,0 duplicate(ach_treasure#core) #yuno_ach7::120058 HIDDEN_WARP_NPC,5,5 +yuno_fild08,179,209,0 duplicate(ach_treasure#core) #yuno_ach8::120059 HIDDEN_WARP_NPC,5,5 +yuno_fild09,166,228,0 duplicate(ach_treasure#core) #yuno_ach9::120060 HIDDEN_WARP_NPC,5,5 +yuno_fild11,141,357,0 duplicate(ach_treasure#core) #yuno_ach10::120061 HIDDEN_WARP_NPC,5,5 diff --git a/npc/re/quests/quests_eclage.txt b/npc/re/quests/quests_eclage.txt index 4aac99ca2a..2b29c9da8d 100644 --- a/npc/re/quests/quests_eclage.txt +++ b/npc/re/quests/quests_eclage.txt @@ -2105,11 +2105,10 @@ ecl_fild01,97,315,4 script Traveler#ep14_2 4_M_JOB_HUNTER,{ mes "Oh, you came to ask me about the feather, too?"; mes "It's just a plain old decoration, but everyone really likes to bother me about it."; next; - mes "Traveler#ep14_2fl"; mes "[Traveler]"; mes "If you are thinking about selling it, you should just give up."; - next; mes "I have no wishes to sell it no matter how much you beg."; + next; mes "[Traveler]"; mes "This feather.."; } diff --git a/npc/re/scripts_athena.conf b/npc/re/scripts_athena.conf index 1d355b6749..3013b7871a 100644 --- a/npc/re/scripts_athena.conf +++ b/npc/re/scripts_athena.conf @@ -55,6 +55,7 @@ npc: npc/re/instances/BakonawaLake.txt npc: npc/re/instances/BangungotHospital.txt npc: npc/re/instances/BuwayaCave.txt npc: npc/re/instances/FacewormsNest.txt +npc: npc/re/instances/GhostPalace.txt npc: npc/re/instances/HazyForest.txt npc: npc/re/instances/HorrorToyFactory.txt npc: npc/re/instances/MalangdoCulvert.txt @@ -99,6 +100,7 @@ npc: npc/re/merchants/shops.txt npc: npc/re/merchants/te_merchant.txt // --------------------------- Others --------------------------- +npc: npc/re/other/achievements.txt npc: npc/re/other/adven_boards.txt npc: npc/re/other/bulletin_boards.txt npc: npc/re/other/Global_Functions.txt diff --git a/rAthena.sln b/rAthena.sln index 3c95e03e27..410c2620fc 100644 --- a/rAthena.sln +++ b/rAthena.sln @@ -21,6 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Config", "Config", "{60D331 src\config\const.h = src\config\const.h src\config\core.h = src\config\core.h src\config\classes\general.h = src\config\classes\general.h + src\config\packets.h = src\config\packets.h src\config\renewal.h = src\config\renewal.h src\config\secure.h = src\config\secure.h EndProjectSection @@ -42,6 +43,7 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "char-server", "src\char\char-server.vcxproj", "{FED3A941-0AF7-49FE-85CF-E1DFDC0EBB23}" ProjectSection(ProjectDependencies) = postProject {F8FD7B1E-8E1C-4CC3-9CD1-2E28F77B6559} = {F8FD7B1E-8E1C-4CC3-9CD1-2E28F77B6559} + {61D6A599-6BED-4154-A9FC-40553BD972E0} = {61D6A599-6BED-4154-A9FC-40553BD972E0} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "map-server", "src\map\map-server.vcxproj", "{B4114A9C-EEA4-433C-A830-56119A984F24}" @@ -75,6 +77,7 @@ Global {F8FD7B1E-8E1C-4CC3-9CD1-2E28F77B6559}.Release|Win32.ActiveCfg = Release|Win32 {F8FD7B1E-8E1C-4CC3-9CD1-2E28F77B6559}.Release|Win32.Build.0 = Release|Win32 {F8FD7B1E-8E1C-4CC3-9CD1-2E28F77B6559}.Release|x64.ActiveCfg = Release|x64 + {F8FD7B1E-8E1C-4CC3-9CD1-2E28F77B6559}.Release|x64.Build.0 = Release|x64 {F6CC5F60-BD13-41B1-81D3-822A45EC0DBD}.Debug|Win32.ActiveCfg = Debug|Win32 {F6CC5F60-BD13-41B1-81D3-822A45EC0DBD}.Debug|Win32.Build.0 = Debug|Win32 {F6CC5F60-BD13-41B1-81D3-822A45EC0DBD}.Debug|x64.ActiveCfg = Debug|x64 @@ -82,6 +85,7 @@ Global {F6CC5F60-BD13-41B1-81D3-822A45EC0DBD}.Release|Win32.ActiveCfg = Release|Win32 {F6CC5F60-BD13-41B1-81D3-822A45EC0DBD}.Release|Win32.Build.0 = Release|Win32 {F6CC5F60-BD13-41B1-81D3-822A45EC0DBD}.Release|x64.ActiveCfg = Release|x64 + {F6CC5F60-BD13-41B1-81D3-822A45EC0DBD}.Release|x64.Build.0 = Release|x64 {7AE31676-6137-4FB3-AE9C-AD47D8A861CF}.Debug|Win32.ActiveCfg = Debug|Win32 {7AE31676-6137-4FB3-AE9C-AD47D8A861CF}.Debug|Win32.Build.0 = Debug|Win32 {7AE31676-6137-4FB3-AE9C-AD47D8A861CF}.Debug|x64.ActiveCfg = Debug|x64 @@ -89,6 +93,7 @@ Global {7AE31676-6137-4FB3-AE9C-AD47D8A861CF}.Release|Win32.ActiveCfg = Release|Win32 {7AE31676-6137-4FB3-AE9C-AD47D8A861CF}.Release|Win32.Build.0 = Release|Win32 {7AE31676-6137-4FB3-AE9C-AD47D8A861CF}.Release|x64.ActiveCfg = Release|x64 + {7AE31676-6137-4FB3-AE9C-AD47D8A861CF}.Release|x64.Build.0 = Release|x64 {864805EA-FD39-453D-9248-C581951BA058}.Debug|Win32.ActiveCfg = Debug|Win32 {864805EA-FD39-453D-9248-C581951BA058}.Debug|Win32.Build.0 = Debug|Win32 {864805EA-FD39-453D-9248-C581951BA058}.Debug|x64.ActiveCfg = Debug|x64 @@ -96,6 +101,7 @@ Global {864805EA-FD39-453D-9248-C581951BA058}.Release|Win32.ActiveCfg = Release|Win32 {864805EA-FD39-453D-9248-C581951BA058}.Release|Win32.Build.0 = Release|Win32 {864805EA-FD39-453D-9248-C581951BA058}.Release|x64.ActiveCfg = Release|x64 + {864805EA-FD39-453D-9248-C581951BA058}.Release|x64.Build.0 = Release|x64 {FED3A941-0AF7-49FE-85CF-E1DFDC0EBB23}.Debug|Win32.ActiveCfg = Debug|Win32 {FED3A941-0AF7-49FE-85CF-E1DFDC0EBB23}.Debug|Win32.Build.0 = Debug|Win32 {FED3A941-0AF7-49FE-85CF-E1DFDC0EBB23}.Debug|x64.ActiveCfg = Debug|x64 @@ -103,6 +109,7 @@ Global {FED3A941-0AF7-49FE-85CF-E1DFDC0EBB23}.Release|Win32.ActiveCfg = Release|Win32 {FED3A941-0AF7-49FE-85CF-E1DFDC0EBB23}.Release|Win32.Build.0 = Release|Win32 {FED3A941-0AF7-49FE-85CF-E1DFDC0EBB23}.Release|x64.ActiveCfg = Release|x64 + {FED3A941-0AF7-49FE-85CF-E1DFDC0EBB23}.Release|x64.Build.0 = Release|x64 {B4114A9C-EEA4-433C-A830-56119A984F24}.Debug|Win32.ActiveCfg = Debug|Win32 {B4114A9C-EEA4-433C-A830-56119A984F24}.Debug|Win32.Build.0 = Debug|Win32 {B4114A9C-EEA4-433C-A830-56119A984F24}.Debug|x64.ActiveCfg = Debug|x64 @@ -110,6 +117,7 @@ Global {B4114A9C-EEA4-433C-A830-56119A984F24}.Release|Win32.ActiveCfg = Release|Win32 {B4114A9C-EEA4-433C-A830-56119A984F24}.Release|Win32.Build.0 = Release|Win32 {B4114A9C-EEA4-433C-A830-56119A984F24}.Release|x64.ActiveCfg = Release|x64 + {B4114A9C-EEA4-433C-A830-56119A984F24}.Release|x64.Build.0 = Release|x64 {352B45B3-FE88-4431-9D89-48CF811446DB}.Debug|Win32.ActiveCfg = Debug|Win32 {352B45B3-FE88-4431-9D89-48CF811446DB}.Debug|Win32.Build.0 = Debug|Win32 {352B45B3-FE88-4431-9D89-48CF811446DB}.Debug|x64.ActiveCfg = Debug|x64 @@ -117,6 +125,7 @@ Global {352B45B3-FE88-4431-9D89-48CF811446DB}.Release|Win32.ActiveCfg = Release|Win32 {352B45B3-FE88-4431-9D89-48CF811446DB}.Release|Win32.Build.0 = Release|Win32 {352B45B3-FE88-4431-9D89-48CF811446DB}.Release|x64.ActiveCfg = Release|x64 + {352B45B3-FE88-4431-9D89-48CF811446DB}.Release|x64.Build.0 = Release|x64 {FC4C071B-2C26-4B03-948A-335C94A88B5E}.Debug|Win32.ActiveCfg = Debug|Win32 {FC4C071B-2C26-4B03-948A-335C94A88B5E}.Debug|Win32.Build.0 = Debug|Win32 {FC4C071B-2C26-4B03-948A-335C94A88B5E}.Debug|x64.ActiveCfg = Debug|x64 @@ -124,6 +133,7 @@ Global {FC4C071B-2C26-4B03-948A-335C94A88B5E}.Release|Win32.ActiveCfg = Release|Win32 {FC4C071B-2C26-4B03-948A-335C94A88B5E}.Release|Win32.Build.0 = Release|Win32 {FC4C071B-2C26-4B03-948A-335C94A88B5E}.Release|x64.ActiveCfg = Release|x64 + {FC4C071B-2C26-4B03-948A-335C94A88B5E}.Release|x64.Build.0 = Release|x64 {61D6A599-6BED-4154-A9FC-40553BD972E0}.Debug|Win32.ActiveCfg = Debug|Win32 {61D6A599-6BED-4154-A9FC-40553BD972E0}.Debug|Win32.Build.0 = Debug|Win32 {61D6A599-6BED-4154-A9FC-40553BD972E0}.Debug|x64.ActiveCfg = Debug|x64 diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 2b910cda3d..7f1e31e0ab 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -816,7 +816,7 @@ REPLACE INTO `item_db_re` VALUES (1439,'Half_BF_Spear1','Half BF Spear1',5,20,NU REPLACE INTO `item_db_re` VALUES (1440,'Battle_Hook_','Battle Hook',5,20,NULL,900,'140',NULL,3,3,0x00004082,18,2,2,4,'65',1,4,'bonus2 bAddEff,Eff_Stun,500; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bAddRace,RC_Player,20; skill "KN_PIERCE",3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1441,'Blue_Spear','Blue Spear',5,10,NULL,1200,'180:170',NULL,3,1,0x00004000,56,2,2,3,'100',1,4,'bonus bDex,5; bonus bInt,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1442,'Ru_Gold_Spear','Ru Gold Spear',5,0,NULL,1200,'180',NULL,3,2,0x00004000,56,2,2,3,'120',1,4,'bonus bStr,8; bonus bAgi,8;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1443,'Crimson_Spear','Crimson Spear',5,20,NULL,900,'90',NULL,3,2,0x00004082,56,2,2,3,'70',1,4,'.@r = getrefine(); bonus bBaseAtk,((BaseLevel/10)*5)+(.@r<=15?pow(.@r,2):225);',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1443,'Crimson_Spear','Crimson Spear',5,20,NULL,900,'90',NULL,3,2,0x00004082,63,2,2,3,'70',1,4,'.@r = getrefine(); bonus bBaseAtk,((BaseLevel/10)*5)+(.@r<=15?pow(.@r,2):225);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1446,'Requiem_Spear','Requiem Spear',5,20,NULL,1000,'130',NULL,3,NULL,0x00004080,63,2,2,4,'100',1,4,'.@r = getrefine(); .@b = 40; bonus bUnbreakableWeapon,1; if(.@r>=5){ .@b += (.@r-5)*15+20; } bonus2 bAddRace2,RC2_BioLab,.@b;',NULL,NULL); #=================================================================== # 2-Handed Spears @@ -1411,12 +1411,12 @@ REPLACE INTO `item_db_re` VALUES (2173,'Crescent_Armguard','Crescent Wrist Guard REPLACE INTO `item_db_re` VALUES (2174,'Lumiere_Shield','Lumiere Shield',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 (2175,'Esprit_Shield','Spirit Shield',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 (2176,'Dark_Book','Black Book',4,20,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,NULL,'65',1,5,'bonus bMdef,5; .@r = getrefine(); bonus3 bAutoSpellWhenHit,"NPC_DRAGONFEAR",1,(.@r<=6)?(10):((.@r<=8)?(20):(30));',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2177,'Shield_Of_Death','Shield Of Death',4,20,NULL,2000,NULL,150,NULL,1,0xFFFFFFFF,63,2,32,NULL,'90',1,3,'bonus2 bAddClass,Class_Boss,2; bonus2 bMagicAddClass,Class_Boss,2; bonus2 bAddClass,Class_Normal,10; bonus2 bMagicAddClass,Class_Normal,10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2178,'TE_Woe_Buckler','TE Woe Buckler',4,0,NULL,0,NULL,15,NULL,0,0xFFFFFFFF,63,2,32,1,'40',1,2,'bonus bMdef,15; bonus bMaxHP,100; bonus bMaxSP,100; bonus2 bSubRace,RC_Player,15;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2179,'TE_Woe_Shield','TE Woe Shield',4,0,NULL,0,NULL,25,NULL,0,0x000444A2,63,2,32,1,'40',1,3,'bonus bMdef,5; bonus bMaxHP,200; bonus2 bSubRace,RC_Player,20;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2180,'TE_Woe_Magic_Guard','TE Woe Magic Guard',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,32,1,'40',1,1,'bonus bMdef,25; bonus bMaxSP,200; bonus2 bSubRace,RC_Player,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2177,'Shield_Of_Death','Shield Of Death',4,20,NULL,2000,NULL,150,NULL,1,0xFFFFFFFF,63,2,32,NULL,'90',1,3,'bonus2 bAddClass,Class_Boss,2; bonus2 bMagicAddClass,Class_Boss,2; bonus2 bSubClass,Class_Normal,-10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2178,'TE_Woe_Buckler','TE Woe Buckler',4,0,NULL,0,NULL,15,NULL,0,0xFFFFFFFF,63,2,32,NULL,'40',1,2,'bonus bMdef,15; bonus bMaxHP,100; bonus bMaxSP,100; bonus2 bSubRace,RC_Player,15;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2179,'TE_Woe_Shield','TE Woe Shield',4,0,NULL,0,NULL,25,NULL,0,0x000444A2,63,2,32,NULL,'40',1,3,'bonus bMdef,5; bonus bMaxHP,200; bonus2 bSubRace,RC_Player,20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2180,'TE_Woe_Magic_Guard','TE Woe Magic Guard',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,32,NULL,'40',1,1,'bonus bMdef,25; bonus bMaxSP,200; bonus2 bSubRace,RC_Player,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2181,'Hervor','Hervor',4,10,NULL,1500,NULL,100,NULL,0,0xFFFFFFFF,63,2,32,NULL,'1',NULL,2,'bonus bMdef,5; bonus2 bSubRace,RC_All,30; bonus bUnbreakableArmor,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2182,'Hervor_Alvitr','Hervor Alvitr',4,0,NULL,3000,NULL,150,NULL,0,0x000FDF80,56,2,32,1,'100',0,2,'bonus bMdef,10; bonus bVit,20; bonus2 bSubRace,RC_All,30; bonus bUnbreakableShield,1; autobonus2 "{ sc_end SC_STUN; sc_end SC_SLEEP; sc_end SC_CURSE; sc_end SC_STONE; sc_end SC_POISON; sc_end SC_BLIND; sc_end SC_SILENCE; sc_end SC_BLEEDING; sc_end SC_CONFUSION; sc_end SC_FREEZE; bonus2 bResEff,Eff_Stun,10000; bonus2 bResEff,Eff_Sleep,10000; bonus2 bResEff,Eff_Curse,10000; bonus2 bResEff,Eff_Stone,10000; bonus2 bResEff,Eff_Poison,10000; bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Silence,10000; bonus2 bResEff,Eff_Bleeding,10000; bonus2 bResEff,Eff_Confusion,10000; bonus2 bResEff,Eff_Freeze,10000; }",10,60000,BF_SHORT;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2182,'Hervor_Alvitr','Hervor Alvitr',4,0,NULL,3000,NULL,150,NULL,0,0x000FDF80,56,2,32,NULL,'100',0,2,'bonus bMdef,10; bonus bVit,20; bonus2 bSubRace,RC_All,30; bonus bUnbreakableShield,1; autobonus2 "{ sc_end SC_STUN; sc_end SC_SLEEP; sc_end SC_CURSE; sc_end SC_STONE; sc_end SC_POISON; sc_end SC_BLIND; sc_end SC_SILENCE; sc_end SC_BLEEDING; sc_end SC_CONFUSION; sc_end SC_FREEZE; bonus2 bResEff,Eff_Stun,10000; bonus2 bResEff,Eff_Sleep,10000; bonus2 bResEff,Eff_Curse,10000; bonus2 bResEff,Eff_Stone,10000; bonus2 bResEff,Eff_Poison,10000; bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Silence,10000; bonus2 bResEff,Eff_Bleeding,10000; bonus2 bResEff,Eff_Confusion,10000; bonus2 bResEff,Eff_Freeze,10000; }",10,60000,BF_SHORT;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2183,'Impr_Angel\'s_Safeguard','Advanced Angelic Guard',4,10000,NULL,400,NULL,30,NULL,1,0x00000001,63,2,32,NULL,'99',1,1,'bonus2 bSubRace,RC_Demon,5; bonus2 bSubEle,Ele_All,5; bonus2 bSubEle,Ele_Neutral,-5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2185,'Magic_Reflect','Magic Reflect',4,10,NULL,1000,NULL,50,NULL,1,0xFFFFFFFF,63,2,32,NULL,'99',1,3,'bonus bMdef,10; bonus bMagicDamageReturn,3+((getrefine()>=9) ? 3 : 0);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2186,'Great_Encyclopedia_Revision','Great Encyclopedia Revision',4,10,NULL,200,'0:5',50,NULL,1,0x00810100,63,2,32,NULL,'99',1,4,'bonus bInt,3; bonus bDex,2; .@r = getrefine(); bonus bCritical,3+((.@r >= 7) ? 2 : 0); if(.@r >= 9) bonus bMatk,5;',NULL,NULL); @@ -1424,7 +1424,7 @@ REPLACE INTO `item_db_re` VALUES (2187,'Shield_of_Gray','Shield of Gray',4,10,NU REPLACE INTO `item_db_re` VALUES (2188,'Svalinn_J','Svalinn',4,10,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,NULL,'65',1,3,'.@r = getrefine(); bonus bMaxHP,9+.@r/3; bonus2 bAddEle,Ele_Water,4+.@r/3*5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2189,'Mad_Bunny','Mad Bunny Shield',4,10,NULL,100,NULL,40,NULL,1,0xFFFFFFFF,63,2,32,NULL,'30',1,6,'bonus2 bSubEle,Ele_All,5; bonus bMdef,6; bonus bDex,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2190,'Ancient_Shield_Of_Aeon','Ancient Shield Of Aeon',4,0,NULL,200,NULL,5,NULL,0,0x000FDF80,63,2,32,NULL,'130',1,2,'bonus2 bSubEle,Ele_Neutral,10; bonus2 bSubEle,Ele_Fire,10; bonus2 bSubEle,Ele_Water,10; bonus2 bSubEle,Ele_Wind,10; bonus2 bSubEle,Ele_Earth,10; bonus2 bSubEle,Ele_Dark,10; bonus2 bSubEle,Ele_Holy,10; bonus2 bSubEle,Ele_Ghost,10; bonus bMaxHP,500; bonus bMaxSP,50; if(getrefine()>=14) skill "MG_STONECURSE",5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2195,'Lian_Shield','Lian Shield',4,0,NULL,1300,NULL,50,NULL,1,0xFFFFFFFF,63,2,32,1,'65',1,NULL,'bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubRace,RC_Formless,-5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2195,'Lian_Shield','Lian Shield',4,0,NULL,1300,NULL,50,NULL,1,0xFFFFFFFF,63,2,32,NULL,'65',1,NULL,'bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubRace,RC_Formless,-5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2196,'White_Gold_Shield','White Gold Shield',4,0,NULL,1800,NULL,140,NULL,1,0xFFFFFFFF,63,2,32,NULL,NULL,1,NULL,'autobonus2 "{ bonus bMagicDamageReturn,20; }",100,2000,BF_MAGIC; /* Confirm: Success rate? */',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2198,'Lapine_Shield','Lapine Shield',4,0,NULL,1000,NULL,25,NULL,1,0xFFFFFFFF,63,2,32,NULL,'100',1,NULL,'bonus bMdef,10; if (getrefine() > 7) { bonus bMatk,20; }',NULL,NULL); # GM Shield @@ -1730,9 +1730,9 @@ REPLACE INTO `item_db_re` VALUES (2492,'Bayani_Bangungot_Boots','Bayani Bangungo REPLACE INTO `item_db_re` VALUES (2493,'Goibne\'s_Combat_Boots_','Goibne\'s Greaves',4,30000,NULL,700,NULL,13,NULL,1,0xFFFFFFFE,63,2,64,NULL,'54',1,0,'bonus bMdef,3; bonus bMaxHPrate,5; bonus bMaxSPrate,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2494,'Chrystal_Pumps_','Crystal Pumps',4,20,NULL,100,NULL,5,NULL,1,0xFFFFFFFE,63,0,64,NULL,'0',1,0,'bonus bMdef,10; bonus bLuk,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2495,'Egir_Shoes','Egir Shoes',4,200000,NULL,300,NULL,13,NULL,1,0xFFFFFFFF,63,2,64,NULL,'110',1,0,'if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus bMaxHP,BaseLevel*5; else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus bMaxSP,JobLevel*2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2496,'TE_Woe_Shoes','TE Woe Shoes',4,0,NULL,0,NULL,5,NULL,0,0xFFFFFFFF,63,2,64,0,'40',1,NULL,'bonus bMdef,5; bonus bMaxHP,150; bonus bMaxSP,150; bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2497,'TE_Woe_Boots','TE Woe Boots',4,0,NULL,0,NULL,10,NULL,0,0x000444A2,63,2,64,0,'40',1,NULL,'bonus bMaxHP,200; bonus bMaxSP,100; bonus2 bAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2498,'TE_Woe_Magic_Sandal','TE Woe Magic Sandal',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,64,1,'40',1,NULL,'bonus bMdef,5; bonus bMaxHP,100; bonus bMaxSP,200; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2496,'TE_Woe_Shoes','TE Woe Shoes',4,0,NULL,0,NULL,5,NULL,0,0xFFFFFFFF,63,2,64,NULL,'40',1,NULL,'bonus bMdef,5; bonus bMaxHP,150; bonus bMaxSP,150; bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2497,'TE_Woe_Boots','TE Woe Boots',4,0,NULL,0,NULL,10,NULL,0,0x000444A2,63,2,64,NULL,'40',1,NULL,'bonus bMaxHP,200; bonus bMaxSP,100; bonus2 bAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2498,'TE_Woe_Magic_Sandal','TE Woe Magic Sandal',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,64,NULL,'40',1,NULL,'bonus bMdef,5; bonus bMaxHP,100; bonus bMaxSP,200; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2499,'Temporal_Boots','Temporal Boots',4,400,NULL,600,NULL,20,NULL,0,0xFFFFFFFF,63,2,64,NULL,'10',1,NULL,'.@r = getrefine(); bonus bMaxHP,300; bonus bMaxSP,30; bonus bMaxHP,100*(.@r/3); bonus bMaxSP,10*(.@r/3);',NULL,NULL); #=================================================================== # Garments @@ -2169,15 +2169,15 @@ REPLACE INTO `item_db_re` VALUES (2940,'Ninja_Manual','Ninja Manual',4,0,NULL,10 REPLACE INTO `item_db_re` VALUES (2941,'Gunslinger_Manual','Gunslinger Manual',4,0,NULL,100,NULL,0,NULL,0,0x00000001,63,2,136,NULL,'0',0,0,'bonus bMaxSP,100; skill "GS_GLITTERING",1; skill "GS_ADJUSTMENT",1; skill "GS_MADNESSCANCEL",1; skill "GS_INCREASING",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2942,'Taekwon_Manual','Taekwon Manual',4,0,NULL,100,NULL,0,NULL,0,0x00000001,63,2,136,NULL,'0',0,0,'bonus bMaxSP,100; skill "TK_SEVENWIND",4; skill "TK_JUMPKICK",5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2943,'Critical_Ring_','Critical Ring',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,NULL,0,NULL,'bonus bCritical,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2944,'TE_Ring_Of_Protection','TE Ring Of Protection',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,1,'40',0,NULL,'bonus bMaxHP,100; bonus2 bSubRace,RC_Player,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2945,'TE_Ring_Of_Rage','TE Ring Of Rage',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,1,'40',0,NULL,'bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2946,'TE_Ring_Of_Defiance','TE Ring Of Defiance',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,1,'40',0,NULL,'bonus bMdef,5; bonus2 bSubRace,RC_Player,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2944,'TE_Ring_Of_Protection','TE Ring Of Protection',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'40',0,NULL,'bonus bMaxHP,100; bonus2 bSubRace,RC_Player,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2945,'TE_Ring_Of_Rage','TE Ring Of Rage',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'40',0,NULL,'bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2946,'TE_Ring_Of_Defiance','TE Ring Of Defiance',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'40',0,NULL,'bonus bMdef,5; bonus2 bSubRace,RC_Player,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2948,'Demon_Wing','Demon Wing',4,10,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'70',NULL,NULL,'bonus bFlee,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2949,'Silversmith_Bracelet','Silversmith Bracelet',4,10,NULL,100,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,NULL,'60',NULL,NULL,'bonus bAllStats,1; bonus bMdef,3; skill "SA_SPELLBREAKER",5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2950,'Rune_Ring','Rune Ring',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,1,'1',0,NULL,'bonus2 bExpAddClass,Class_Normal,10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2951,'Kvasir_Ring_Blue','Kvasir Ring Blue',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,1,'1',0,NULL,'bonus bMaxSP,30; skill "ECL_SNOWFLIP",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2952,'Kvasir_Ring_Red','Kvasir Ring Red',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,1,'1',0,NULL,'bonus bMaxSP,30; skill "ECL_PEONYMAMY",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2953,'Kvasir_Ring_Green','Kvasir Ring Green',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,1,'1',0,NULL,'bonus bMaxHP,100; skill "ECL_SADAGUI",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2950,'Rune_Ring','Rune Ring',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus2 bExpAddClass,Class_Normal,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2951,'Kvasir_Ring_Blue','Kvasir Ring Blue',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus bMaxSP,30; skill "ECL_SNOWFLIP",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2952,'Kvasir_Ring_Red','Kvasir Ring Red',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus bMaxSP,30; skill "ECL_PEONYMAMY",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2953,'Kvasir_Ring_Green','Kvasir Ring Green',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus bMaxHP,100; skill "ECL_SADAGUI",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2954,'Kvasir_Ring_Brown','Kvasir Ring Brown',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',NULL,NULL,'bonus bMaxHP,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2956,'Safety_Ring_','Advanced Safety Ring',4,75000,NULL,100,NULL,10,NULL,1,0xFFFFFFFE,63,2,136,NULL,'50',0,0,'bonus bMdef,5; bonus bAllStats,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2957,'Good_Ring_Of_Flame_Lord','Advanced Ring Of Flame Lord',4,20,NULL,100,NULL,0,NULL,0,0x7CCFDF80,63,2,136,NULL,'85',0,0,'bonus bStr,3; bonus bVit,2; bonus bBaseAtk,20; bonus2 bSubEle,Ele_Fire,10; bonus3 bAutoSpell,"CH_SOULCOLLECT",1,30; bonus3 bAutoSpell,"MO_EXPLOSIONSPIRITS",1,10; bonus3 bAutoSpell,"PA_PRESSURE",2,30; bonus3 bAutoSpell,"MG_FIREBALL",1,150; bonus3 bAutoSpell,"KN_BOWLINGBASH",5,20;',NULL,NULL); @@ -2210,7 +2210,7 @@ REPLACE INTO `item_db_re` VALUES (2992,'Pendant_of_Maelstrom','Pendant of Maelst REPLACE INTO `item_db_re` VALUES (2995,'Supplement_Part_Dex','Supplement Part Dex',4,25000,NULL,100,NULL,0,NULL,1,0x00000400,56,2,136,NULL,'100',0,0,'bonus bUseSPrate,-10; bonus bDelayrate,-10; bonus bVariableCastrate,-10; bonus2 bSkillVariableCast,"NC_AXEBOOMERANG",-2000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2996,'Reinforced_Parts_Gun_Barrel','Reinforced Parts - Gun Barrel',4,10,NULL,500,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'100',NULL,NULL,'bonus2 bAddClass,Class_All,4; bonus bHit,10; bonus2 bSkillAtk,"NC_BOOSTKNUCKLE",25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2997,'RWC_Gold_Brooch','RWC Gold Brooch',4,10,NULL,200,NULL,0,NULL,1,0xFFFFFFFF,63,2,136,NULL,'0',0,NULL,'bonus bBaseAtk,25; bonus bMatk,20;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2998,'Shining_Trapezohedron','Shining Trapezohedron',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,1,'90',1,NULL,'bonus2 bSubEle,Ele_Holy,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2998,'Shining_Trapezohedron','Shining Trapezohedron',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'90',1,NULL,'bonus2 bSubEle,Ele_Holy,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2999,'RWC_Brooch','RWC Brooch',4,10,NULL,200,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'0',0,NULL,'bonus bMaxHP,300; bonus bMaxSP,30;',NULL,NULL); #=================================================================== # Cards @@ -3150,6 +3150,12 @@ REPLACE INTO `item_db_re` VALUES (4947,'Thrift3','Economy Lv3',6,10,NULL,0,NULL, REPLACE INTO `item_db_re` VALUES (4948,'Skill_Delay1','After Skill Delay Lv1',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus bDelayrate,-2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4949,'Skill_Delay2','After Skill Delay Lv2',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus bDelayrate,-4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4950,'Skill_Delay3','After Skill Delay Lv3',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus bDelayrate,-6;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4994,'Rune_of_Strength_Lv_1','Rune of Strength Lv 1',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bStr,5; } if (.@r>=10) { bonus bAtkRate,5; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4995,'Rune_of_Strength_Lv_2','Rune of Strength Lv 2',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bStr,6; } if (.@r>=11) { bonus bStr,1; bonus bAtkRate,7; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4996,'Rune_of_Strength_Lv_3','Rune of Strength_Lv 3',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bStr,7; } if (.@r>=12) { bonus bStr,1; bonus bAtkRate,8; } if (.@r>=13) { bonus bStr,1; bonus bAtkRate,2; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4997,'Rune_of_Agility_Lv_1','Rune of Agility Lv 1',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bAgi,5; } if (.@r>=10) { bonus bFlee2,5; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4998,'Rune_of_Agility_Lv_2','Rune of Agility Lv 2',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bAgi,6; } if (.@r>=11) { bonus bAgi,1; bonus bFlee2,7; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4999,'Rune_of_Agility_Lv_3','Rune of Agility Lv 3',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bAgi,7; } if (.@r>=12) { bonus bAgi,1; bonus bFlee2,5; } if (.@r>=13) { bonus bAgi,1; bonus bFlee2,5; }',NULL,NULL); #=================================================================== # More Headgears #=================================================================== @@ -4032,23 +4038,23 @@ REPLACE INTO `item_db_re` VALUES (5893,'RCC2013_2ND_CROWN','RCC2013 2ND CROWN',4 REPLACE INTO `item_db_re` VALUES (5894,'RCC2013_3RD_CROWN','RCC2013 3RD CROWN',4,20,NULL,2500,NULL,7,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',0,1108,'bonus bAllStats,3; skill "AL_TELEPORT",1;','sc_start SC_SPEEDUP0,-1,25;','sc_end SC_SPEEDUP0;'); REPLACE INTO `item_db_re` VALUES (5895,'RCC2013_ANV_Hat','RCC2013 ANV Hat',4,20,NULL,2500,NULL,7,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',0,1109,'bonus bAllStats,1; bonus2 bAddClass,Class_All,2; bonus bMatkRate,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5906,'Oni_Horns_','Oni Horns',4,0,NULL,20,NULL,10,NULL,1,0x00001000,63,2,256,NULL,'100',1,1127,'bonus2 bSkillAtk,"GC_COUNTERSLASH",(10*getskilllv("GC_WEAPONBLOCKING")); .@r = getrefine(); if(.@r > 6){ bonus bAtk,20; bonus bHit,5; } if(.@r > 9){ bonus3 bAutoSpell,"GC_CROSSIMPACT",1,10; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5914,'C_Flutter_Butterfly','C Flutter Butterfly',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,1,'1',0,1378,'hateffect HAT_EF_FLUTTER_BUTTERFLY,true;',NULL,'hateffect HAT_EF_FLUTTER_BUTTERFLY,false;'); -REPLACE INTO `item_db_re` VALUES (5917,'Yellow_Scarf','Yellow Scarf',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,0,'90',0,1170,'bonus bLongAtkDef,3;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5914,'C_Flutter_Butterfly','C Flutter Butterfly',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',0,1378,'hateffect HAT_EF_FLUTTER_BUTTERFLY,true;',NULL,'hateffect HAT_EF_FLUTTER_BUTTERFLY,false;'); +REPLACE INTO `item_db_re` VALUES (5917,'Yellow_Scarf','Yellow Scarf',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,NULL,'90',0,1170,'bonus bLongAtkDef,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5918,'Gambler_Seal','Gambler Seal',4,0,NULL,500,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,NULL,NULL,0,1202,'bonus bCritical,3; bonus bCritAtkRate,3; bonus2 bSubSkill,"RA_ARROWSTORM",10; bonus2 bSubSkill,"SR_GATEOFHELL",10; .@dex = readparam(bDex); .@luk = readparam(bLuk); bonus bCritAtkRate,-(.@dex/10)*2; bonus bCritical,.@luk/10; bonus bBaseAtk,(.@luk/10)*2; bonus bMatk,(.@luk/10)*2; if (.@luk > 120) { bonus bCritical,10; bonus bCritAtkRate,10; bonus2 bSubSkill,"RA_ARROWSTORM",30; bonus2 bSubSkill,"SR_GATEOFHELL",30; } else if (.@luk > 108) { bonus bCritical,5; bonus bCritAtkRate,10; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5919,'Camellia_Hair_Pin','Camellia Hair Pin',4,0,NULL,1000,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,256,0,'50',1,1203,'bonus bMdef,20; bonus3 bAutoSpell,"AL_PNEUMA",1,30+getrefine()*5; /* CONFIRM The Rate*/',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5919,'Camellia_Hair_Pin','Camellia Hair Pin',4,0,NULL,1000,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,256,NULL,'50',1,1203,'bonus bMdef,20; bonus3 bAutoSpell,"AL_PNEUMA",1,30+getrefine()*5; /* CONFIRM The Rate*/',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5920,'Medical_Boots','Medical Boots',4,0,NULL,300,NULL,10,NULL,0,0xFFFFFFFF,63,2,64,NULL,'10',1,NULL,'.@r = getrefine(); bonus bHealPower,10+((.@r/2) * 2); bonus2 bSkillUseSP,"AB_CHEAL",(.@r * 5);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5943,'Owlviscount_Silk_Hat','Owl Viscount Silk Hat',4,0,NULL,500,NULL,15,NULL,1,0xFFFFFFFF,63,2,256,0,'70',1,1323,'bonus bInt,1; bonus bAspdRate,10; .@r = getrefine(); bonus bMatk,7*.@r; autobonus "{ .@r = getrefine(); bonus bAspdRate,(.@r >= 9 ? 40 : ((.@r >= 7) ? 10 : ((.@r >= 5) ? 5 : 1))); }",.@r*20,30000,BF_MAGIC,"{ specialeffect2 EF_SPELLBREAKER }";',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5966,'KarduiEar','KarduiEar',4,0,NULL,300,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,0,'70',0,1357,'.@dex = readparam(bDex); bonus bMatk,(.@dex > 10) ? .@dex/10*2 : 0; if (.@dex > 107) { bonus bVariableCastrate,-10; bonus bMatk,60; } if (.@dex > 119) { bonus bVariableCastrate,-5; bonus bMatk,100; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5967,'Flying Galapago','Flying Galapago',4,0,NULL,500,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,0,'110',0,1358,'bonus bAgi,1; bonus2 bSkillAtk,"HT_BLITZBEAT",getskilllv("HT_STEELCROW")*40;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5968,'DVAngelNurseCap','DVAngelNurseCap',4,0,NULL,500,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,0,'50',1,1359,'if (BaseClass == Job_Acolyte) bonus bHealPower,3; bonus bNoCastCancel,1; .@r = getrefine(); bonus bHealPower,(.@r > 8) ? 12 : ((.@r > 6) ? 9 : ((.@r > 4) ? 6 : 0));',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5969,'QueenAnzRevenge','QueenAnzRevenge',4,0,NULL,400,NULL,7,NULL,1,0xFFFFFFFF,63,2,256,0,'100',1,1360,'bonus bStr,5; .@r = getrefine(); bonus2 bAddClass,Class_All,7+(.@r > 8 ? 4 : (.@r > 6 ? 3 : (.@r > 4 ? 2 : 0))); bonus bNoSizeFix,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5971,'Moon_Eyepatch','Moon Eyepatch',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,512,0,'10',0,1370,'bonus2 bSubEle,Ele_Water,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5972,'Chatty_Parrot','Chatty Parrot',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,0,'80',0,1116,'bonus bMatkRate,BaseLevel/50; bonus bVariableCast,-readparam(bInt)/30;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5973,'Ancient_Elven_Ear_J','Ancient Elven Ear J',4,0,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,0,'70',0,665,'bonus bLuk,10; bonus bMdef,10; bonus bFlee2,2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5978,'Syringe_Toy','Toy Syringe',4,0,NULL,100,NULL,3,NULL,0,0xFFFFFFFF,63,2,1,1,'70',0,842,'bonus bMdef,3; bonus2 bAddItemHealRate,545,150; bonus2 bAddItemHealRate,546,150; bonus2 bAddItemHealRate,547,150;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5979,'C_Angel_Fluttering','C Angel Fluttering',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,0,'1',0,1380,'hateffect HAT_EF_ANGEL_FLUTTERING,true;',NULL,'hateffect HAT_EF_ANGEL_FLUTTERING,false;'); -REPLACE INTO `item_db_re` VALUES (5980,'C_Classical_Fhat','C Classical Fhat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,0,'1',0,1381,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5985,'Noble_Mask','Noble Mask',4,0,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,256,0,'30',0,1409,'bonus2 bSkillAtk,"PA_SACRIFICE",BaseLevel*2; bonus2 bSkillVariableCast,"PA_PRESSURE",-2000; bonus2 bSkillVariableCast,"CR_DEVOTION",-2000; if (BaseLevel > 149) { bonus bMaxHPrate,3; bonus bAspdRate,3; } else if (BaseLevel > 99) { bonus bMaxHPrate,2; bonus bAspdRate,2; } else { bonus bMaxHPrate,1; bonus bAspdRate,1; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5943,'Owlviscount_Silk_Hat','Owl Viscount Silk Hat',4,0,NULL,500,NULL,15,NULL,1,0xFFFFFFFF,63,2,256,NULL,'70',1,1323,'bonus bInt,1; bonus bAspdRate,10; .@r = getrefine(); bonus bMatk,7*.@r; autobonus "{ .@r = getrefine(); bonus bAspdRate,(.@r >= 9 ? 40 : ((.@r >= 7) ? 10 : ((.@r >= 5) ? 5 : 1))); }",.@r*20,30000,BF_MAGIC,"{ specialeffect2 EF_SPELLBREAKER }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5966,'KarduiEar','KarduiEar',4,0,NULL,300,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,NULL,'70',0,1357,'.@dex = readparam(bDex); bonus bMatk,(.@dex > 10) ? .@dex/10*2 : 0; if (.@dex > 107) { bonus bVariableCastrate,-10; bonus bMatk,60; } if (.@dex > 119) { bonus bVariableCastrate,-5; bonus bMatk,100; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5967,'Flying Galapago','Flying Galapago',4,0,NULL,500,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,NULL,'110',0,1358,'bonus bAgi,1; bonus2 bSkillAtk,"HT_BLITZBEAT",getskilllv("HT_STEELCROW")*40;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5968,'DVAngelNurseCap','DVAngelNurseCap',4,0,NULL,500,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,'50',1,1359,'if (BaseClass == Job_Acolyte) bonus bHealPower,3; bonus bNoCastCancel,1; .@r = getrefine(); bonus bHealPower,(.@r > 8) ? 12 : ((.@r > 6) ? 9 : ((.@r > 4) ? 6 : 0));',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5969,'QueenAnzRevenge','QueenAnzRevenge',4,0,NULL,400,NULL,7,NULL,1,0xFFFFFFFF,63,2,256,NULL,'100',1,1360,'bonus bStr,5; .@r = getrefine(); bonus2 bAddClass,Class_All,7+(.@r > 8 ? 4 : (.@r > 6 ? 3 : (.@r > 4 ? 2 : 0))); bonus bNoSizeFix,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5971,'Moon_Eyepatch','Moon Eyepatch',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,512,NULL,'10',0,1370,'bonus2 bSubEle,Ele_Water,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5972,'Chatty_Parrot','Chatty Parrot',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,NULL,'80',0,1116,'bonus bMatkRate,BaseLevel/50; bonus bVariableCast,-readparam(bInt)/30;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5973,'Ancient_Elven_Ear_J','Ancient Elven Ear J',4,0,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,NULL,'70',0,665,'bonus bLuk,10; bonus bMdef,10; bonus bFlee2,2;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5978,'Syringe_Toy','Toy Syringe',4,0,NULL,100,NULL,3,NULL,0,0xFFFFFFFF,63,2,1,NULL,'70',0,842,'bonus bMdef,3; bonus2 bAddItemHealRate,545,150; bonus2 bAddItemHealRate,546,150; bonus2 bAddItemHealRate,547,150;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5979,'C_Angel_Fluttering','C Angel Fluttering',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',0,1380,'hateffect HAT_EF_ANGEL_FLUTTERING,true;',NULL,'hateffect HAT_EF_ANGEL_FLUTTERING,false;'); +REPLACE INTO `item_db_re` VALUES (5980,'C_Classical_Fhat','C Classical Fhat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,1381,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5985,'Noble_Mask','Noble Mask',4,0,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,256,NULL,'30',0,1409,'bonus2 bSkillAtk,"PA_SACRIFICE",BaseLevel*2; bonus2 bSkillVariableCast,"PA_PRESSURE",-2000; bonus2 bSkillVariableCast,"CR_DEVOTION",-2000; if (BaseLevel > 149) { bonus bMaxHPrate,3; bonus bAspdRate,3; } else if (BaseLevel > 99) { bonus bMaxHPrate,2; bonus bAspdRate,2; } else { bonus bMaxHPrate,1; bonus bAspdRate,1; }',NULL,NULL); #=================================================================== # More Etc Items #=================================================================== @@ -4871,7 +4877,8 @@ REPLACE INTO `item_db_re` VALUES (6914,'Black_Horn','Black Horn',3,10,NULL,0,NUL REPLACE INTO `item_db_re` VALUES (6915,'Captured_Soul','Captured Soul',3,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (6916,'Piece_Of_Soul_Monkey','Piece Of Soul Monkey',3,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (6917,'Piece_Of_Soul_Chicken','Piece Of Soul Chicken',3,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (6919,'Honor_Proof','Honor Proof',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 (6919,'Honor_Proof','Honor Token',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 (6920,'Rune_Magic_Powder','Rune Magic Powder',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 (6921,'Dehumidifiers','Dehumidifiers',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 (6922,'Sandpaper','Sandpaper',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 (6923,'Bright_Fire_Lights','Bright Fire Lights',3,10,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); @@ -6784,7 +6791,7 @@ REPLACE INTO `item_db_re` VALUES (12618,'Bgrade_Pocket','B Grade Coin Bag',2,20, REPLACE INTO `item_db_re` VALUES (12619,'Cgrade_Pocket','C Grade Coin Bag',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getgroupitem(IG_Cgrade_Pocket);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12620,'Dgrade_Pocket','D Grade Coin Bag',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getgroupitem(IG_Dgrade_Pocket);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12621,'Egrade_Pocket','E Grade Coin Bag',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getgroupitem(IG_Egrade_Pocket);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12622,'Boarding_Halter','Reins Of Mount',11,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'setmounting();',NULL,'if (ismounting()) setmounting();'); +REPLACE INTO `item_db_re` VALUES (12622,'Boarding_Halter','Reins Of Mount',2,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'setmounting();',NULL,'if (ismounting()) setmounting();'); REPLACE INTO `item_db_re` VALUES (12623,'High_Weapon_Box','Advanced Weapons Box',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getrandgroupitem(IG_Advanced_Weapons_Box,1);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12624,'Delicious_Jelly','Delicious Jelly',0,20,NULL,50,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'percentheal 3,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12625,'Sapa_Feat_Cert_Pack','Sapa Feat Cert Pack',2,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); @@ -6795,7 +6802,7 @@ REPLACE INTO `item_db_re` VALUES (12629,'Salamander_Scroll','Salamander Scroll', REPLACE INTO `item_db_re` VALUES (12630,'Teddy_Bear_Scroll','Teddy Bear Scroll',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'mercenary_create 2217,1800000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12631,'Macro_Stone_A','Macro Stone A',2,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12632,'Macro_Stone_B','Macro Stone B',2,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12633,'Malang_Cat_Can','Malangdo Cat Can',2,20,NULL,50,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'specialeffect2 EF_MAGICALATTHIT; bonus_script "{ bonus2 bExpAddRace,RC_All,10; }",1200; sc_start SC_ITEMBOOST,1200000,20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12633,'Malang_Cat_Can','Malangdo Cat Can',2,20,NULL,50,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'specialeffect2 EF_MAGICALATTHIT; bonus_script "{ bonus2 bExpAddRace,RC_All,10; bonus2 bDropAddRace,RC_All,20; }",1200,1,0,SI_OVERLAPEXPUP;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12634,'Macro_Stone_A1','Macro Stone A1',2,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12635,'Macro_Stone_A2','Macro Stone A2',2,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12636,'Malang_Sp_Can','Malangdo Canned Specialties',2,20,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'warp "malangdo",140,114;',NULL,NULL); @@ -6839,8 +6846,8 @@ REPLACE INTO `item_db_re` VALUES (12673,'Lucky_Egg_C10','Lucky Egg C10',2,20,NUL REPLACE INTO `item_db_re` VALUES (12674,'God_Material_Box','God Material Box',2,20,NULL,500,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getgroupitem(IG_God_Material_Box);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12675,'Sg_Weapon_Supply_Box','WoE Weapon Supply Box',2,20,NULL,500,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getgroupitem(IG_Sg_Weapon_Supply_Box);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12676,'Sg_Violet_Potion_Box','Siege Violet Potion Box',2,20,NULL,500,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 11547,50;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12677,'Siege_Arrow_Quiver_S','Siege Arrow Quiver S',2,2,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,'130',NULL,NULL,'getitem 1776,200;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12678,'Siege_Arrow_Quiver_A','Siege Arrow Quiver A',2,2,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,'95',NULL,NULL,'getitem 1775,200;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12677,'Siege_Arrow_Quiver_S','Siege Arrow Quiver S',2,2,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,'130',NULL,NULL,'getitem 1775,200;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12678,'Siege_Arrow_Quiver_A','Siege Arrow Quiver A',2,2,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,'95',NULL,NULL,'getitem 1776,200;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12679,'Sg_White_Potion_Box','Siege White Potion Box',2,20,NULL,200,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 11548,30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12680,'Sg_Blue_Potion_Box','Siege Blue Potion Box',2,20,NULL,200,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 11549,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12681,'Nestea_Lemon','Nestea Lemon',2,0,NULL,50,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); @@ -7039,7 +7046,7 @@ REPLACE INTO `item_db_re` VALUES (12883,'Almighty','Almighty',2,20,NULL,10,NULL, REPLACE INTO `item_db_re` VALUES (12884,'Infinite_Concentration_Potion','Infinite Concentration Potion',11,10,NULL,0,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 (12885,'Infinite_Awakening_Potion','Infinite Awakening Potion',11,10,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_ASPDPOTION1,1800000,6;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12886,'Infinite_Berserk_Potion','Infinite Berserk Potion',11,10,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'sc_start SC_ASPDPOTION2,1800000,9;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12887,'C_Wing_Of_Fly','Infinite Flywing',11,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'unitskilluseid getcharid(3),"AL_TELEPORT",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12887,'C_Wing_Of_Fly','Infinite Flywing',2,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'itemskill "AL_TELEPORT",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12888,'Siege_Kit_Box','Siege Kit Box',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12889,'Weapon_Box_Spear','Weapon Box(Spear)',2,10,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12890,'Weapon_Box_Mace','Weapon Box(Mace)',2,10,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); @@ -7328,8 +7335,8 @@ REPLACE INTO `item_db_re` VALUES (13194,'Peace_Breaker','Peace Breaker',5,195000 REPLACE INTO `item_db_re` VALUES (13195,'RAG203_','RAG203',5,1800000,NULL,1300,'260',NULL,9,0,0x40000000,63,2,34,3,'140',1,18,'bonus bHit,10; bonus bCriticalRate,15; bonus4 bAutoSpell,"AL_DECAGI",1,10,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (13196,'Peace_Breaker_','Peace Breaker',5,1950000,NULL,1400,'250',NULL,9,1,0x41000000,63,2,34,3,'140',1,20,'bonus bHit,-25; bonus bAspdRate,25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (13197,'Mini_Mei','Mini Mei',5,1600000,NULL,2500,'220',NULL,9,2,0x41000000,63,2,34,2,'106',1,19,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (13198,'Tempest_','Tempest',5,2200000,NULL,2500,'250',NULL,9,0,0x41000000,63,2,34,2,'140',1,19,'bonus bHit,-25; bonus bCritical,10; bonus bLongAtkRate,20;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (13199,'Tempest','Tempest',5,2200000,NULL,2500,'250',NULL,9,1,0x41000000,63,2,34,2,'140',1,19,'bonus bHit,-25; bonus bCritical,10; bonus bLongAtkRate,20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (13198,'Tempest_','Tempest',5,2200000,NULL,2500,'250',NULL,9,0,0x41000000,63,2,34,4,'140',1,19,'bonus bHit,-25; bonus bCritical,10; bonus bLongAtkRate,20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (13199,'Tempest','Tempest',5,2200000,NULL,2500,'250',NULL,9,1,0x41000000,63,2,34,4,'140',1,19,'bonus bHit,-25; bonus bCritical,10; bonus bLongAtkRate,20;',NULL,NULL); #=================================================================== # Bullets #=================================================================== @@ -8630,11 +8637,11 @@ REPLACE INTO `item_db_re` VALUES (15058,'Rider_Suit','Rider Suit',4,20,NULL,1000 REPLACE INTO `item_db_re` VALUES (15059,'2011Love_Daddy','2011Love Daddy',4,20,NULL,100,'0',80,0,1,0xFFFFFFFF,63,2,16,NULL,'0',1,0,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (15060,'Sky_Blue_Smock','Sky Blue Smock',4,20,NULL,300,'0',1,0,1,0xFFFFFFFF,63,2,16,NULL,'0',1,0,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (15061,'Egir_Armor','Egir Armor',4,200000,NULL,2600,NULL,55,NULL,1,0xFFFFFFFF,63,2,16,NULL,'110',1,0,'bonus bAllStats,1; if(BaseClass==Job_Mage||BaseClass==Job_Archer||BaseClass==Job_Acolyte) bonus2 bResEff,Eff_Silence,5000; else if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief) bonus2 bResEff,Eff_Stun,5000;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (15062,'TE_Woe_Coat','TE Woe Coat',4,0,NULL,0,NULL,15,NULL,0,0xFFFFFFFF,63,2,16,0,'40',1,NULL,'bonus bMdef,15; bonus bMaxHP,250; bonus bMaxSP,250; bonus2 bSubRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (15063,'TE_Woe_Chain_Mail','TE Woe Chain Mail',4,0,NULL,0,NULL,25,NULL,0,0x000444A2,63,2,16,0,'40',1,NULL,'bonus bMdef,5; bonus bMaxHP,450; bonus bMaxSP,50; bonus2 bSubRace,RC_Player,15; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (15064,'TE_Woe_Mage_Coat','TE Woe Mage Coat',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,16,0,'40',1,NULL,'bonus bMdef,25; bonus bMaxHP,200; bonus bMaxSP,200; bonus2 bSubRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (15062,'TE_Woe_Coat','TE Woe Coat',4,0,NULL,0,NULL,15,NULL,0,0xFFFFFFFF,63,2,16,NULL,'40',1,NULL,'bonus bMdef,15; bonus bMaxHP,250; bonus bMaxSP,250; bonus2 bSubRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (15063,'TE_Woe_Chain_Mail','TE Woe Chain Mail',4,0,NULL,0,NULL,25,NULL,0,0x000444A2,63,2,16,NULL,'40',1,NULL,'bonus bMdef,5; bonus bMaxHP,450; bonus bMaxSP,50; bonus2 bSubRace,RC_Player,15; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (15064,'TE_Woe_Mage_Coat','TE Woe Mage Coat',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,16,NULL,'40',1,NULL,'bonus bMdef,25; bonus bMaxHP,200; bonus bMaxSP,200; bonus2 bSubRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (15066,'Engraved_Plate_Armor','Engraved Plate Armor',4,100000,NULL,3000,NULL,120,NULL,1,0x00004082,63,2,16,NULL,'150',1,NULL,'bonus bMdef,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (15067,'Rune_Suit','Rune Suit',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,16,0,'1',1,NULL,'bonus2 bExpAddRace,RC_All,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (15067,'Rune_Suit','Rune Suit',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,16,NULL,'1',1,NULL,'bonus2 bExpAddRace,RC_All,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (15068,'Im_Angel\'s_Protection','Advanced Angelic Protection',4,10000,NULL,600,NULL,40,NULL,1,0x00000001,63,2,16,NULL,'99',1,0,'bonus bMdef,30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (15069,'Suit_Of_Sid','Suit Of Sid',4,20,NULL,1000,NULL,30,NULL,0,0xFFFFFFFF,63,2,16,NULL,'0',1,0,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (15070,'Clothes_of_Happiness','Clothes of Happiness',4,10,NULL,1000,NULL,5,NULL,1,0xFFFFFFFF,63,2,16,NULL,'1',1,NULL,'bonus bMdef,5; bonus bLuk,getrefine();',NULL,NULL); @@ -9691,10 +9698,10 @@ REPLACE INTO `item_db_re` VALUES (18727,'Sedora_Hat','Sedora Hat',4,20,NULL,300, REPLACE INTO `item_db_re` VALUES (18728,'Egir_Helm','Egir Helm',4,200000,NULL,800,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,'110',1,870,'bonus bMdef,5; bonus bUnbreakableHelm,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18729,'MVP_Basketball','MVP Basketball',4,20,NULL,150,NULL,6,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,871,'bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10; bonus2 bAddItemHealRate,522,30; .@r = getrefine(); bonus bVariableCastrate,(.@r>=12)?(-5):((.@r>=10)?(-4):(-3));',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18730,'Cryptura_Academy_Hat','Cryptura Academy Hat',4,0,NULL,200,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,872,'bonus bMaxHP,15; bonus bMaxSP,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18732,'TE_Woe_Cap','TE Woe Cap',4,0,NULL,0,NULL,5,NULL,0,0xFFFFFFFF,63,2,256,0,'40',1,14,'bonus bMdef,5; bonus bBaseAtk,5; bonus bMatk,5; bonus2 bAddRace,RC_Player,10; bonus2 bMagicAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18733,'TE_Woe_Bone_Helm','TE Woe Bone Helm',4,0,NULL,0,NULL,10,NULL,0,0x000444A2,63,2,256,0,'40',1,103,'bonus bBaseAtk,10; bonus2 bAddRace,RC_Player,20; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18734,'TE_Woe_Magic_Eyes','TE Woe Magic Eyes',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,256,0,'40',1,209,'bonus bMdef,5; bonus bMatk,10; bonus2 bMagicAddRace,RC_Player,20; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18736,'Censor_Bar_','Censor Bar',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,0,'1',0,229,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18732,'TE_Woe_Cap','TE Woe Cap',4,0,NULL,0,NULL,5,NULL,0,0xFFFFFFFF,63,2,256,NULL,'40',1,14,'bonus bMdef,5; bonus bBaseAtk,5; bonus bMatk,5; bonus2 bAddRace,RC_Player,10; bonus2 bMagicAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18733,'TE_Woe_Bone_Helm','TE Woe Bone Helm',4,0,NULL,0,NULL,10,NULL,0,0x000444A2,63,2,256,NULL,'40',1,103,'bonus bBaseAtk,10; bonus2 bAddRace,RC_Player,20; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18734,'TE_Woe_Magic_Eyes','TE Woe Magic Eyes',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,256,NULL,'40',1,209,'bonus bMdef,5; bonus bMatk,10; bonus2 bMagicAddRace,RC_Player,20; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18736,'Censor_Bar_','Censor Bar',4,0,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,NULL,'1',0,229,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18737,'Fortier_Mask','Fortier Masque',4,20,NULL,200,NULL,0,NULL,0,0xFFFFFFFF,63,2,512,NULL,'10',0,876,'bonus bUnbreakableHelm,1; bonus2 bMagicAtkEle,Ele_Fire,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18739,'Carnation_Hairband','Carnation Hairband',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',1,878,'bonus bLuk,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18740,'Hair_Of_The_Strong','RMSC2012 Special Costume',4,20,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'0',0,879,NULL,NULL,NULL); @@ -9711,7 +9718,7 @@ REPLACE INTO `item_db_re` VALUES (18750,'Poker_Card_In_Mouth','Poker Card In Mou REPLACE INTO `item_db_re` VALUES (18752,'Cursed_Book','Cursed Book',4,20,NULL,300,NULL,3,NULL,1,0xFFFFFFFE,63,2,256,NULL,'99',1,890,'.@r = getrefine(); bonus2 bHPLossRate,.@r,5000; bonus2 bHPDrainRate,40,4+(.@r/2); bonus2 bSPDrainRate,10,1+(.@r/3);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18753,'Tw_Rice_Ball','Tw Rice Ball',4,20,NULL,100,NULL,6,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',0,892,'bonus bLuk,1; bonus2 bAddMonsterDropItem,564,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18754,'Blood_Sucker','Blood Sucker',4,20,NULL,300,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'40',0,893,'bonus bUnbreakableHelm,1; bonus2 bHPDrainRate,30,5; bonus bHPrecovRate,-100; bonus bSPrecovRate,-100;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18755,'Feather_Beret_','Feather Beret',4,0,NULL,600,NULL,1,NULL,1,0xFFFFFFFF,63,2,256,0,'1',1,224,'bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18755,'Feather_Beret_','Feather Beret',4,0,NULL,600,NULL,1,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,224,'bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Player,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18756,'Black_Shiba_Inu_Hat','Black Shiba Inu Hat',4,20,NULL,400,NULL,6,NULL,1,0xFFFFFFFF,63,2,256,NULL,'50',1,894,'bonus bBaseAtk,30; bonus2 bAddRace,RC_Brute,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18758,'Hat_Of_Scrat','Hat Of Scrat',4,20,NULL,200,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,896,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18759,'Stretched_Nose_M','Wood Goblin\'s Nose',4,20,NULL,200,NULL,0,NULL,0,0xFFFFFFFF,63,2,512,NULL,'50',0,737,'bonus bUnbreakableHelm,1; bonus2 bAddMonsterDropItem,1032,400; bonus2 bAddMonsterDropItem,1033,100; bonus3 bAddMonsterDropItem,576,RC_Plant,40;',NULL,NULL); @@ -9791,7 +9798,7 @@ REPLACE INTO `item_db_re` VALUES (18861,'Zaha_Doll_J_Hat','Zaha Doll J Hat',4,10 REPLACE INTO `item_db_re` VALUES (18863,'Exorcist_Robe','Exorcist Robe',4,10,NULL,1700,NULL,57,NULL,1,0xFFFFFFFF,63,2,16,NULL,'60',1,NULL,'bonus bMdef,5; .@r = getrefine(); if (.@r >= 3) { bonus2 bAddRace,RC_Undead,.@r/3*5; } if (BaseClass==Job_Acolyte) bonus2 bAddRace,RC_Undead,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18864,'Earth_Goddess_Flower','Earth Goddess Flower',4,10,NULL,250,NULL,6,NULL,0,0xFFFFFFFF,63,2,256,NULL,'1',1,864,'bonus2 bAddEle,Ele_Earth,15; skill "WZ_EARTHSPIKE",5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18865,'Sword_Master_Crown','Sword Master Crown',4,10,NULL,1000,NULL,30,NULL,1,0xFFFFFFFF,63,2,256,NULL,'50',1,981,'.@i = BaseLevel; bonus bBaseAtk,(.@i>150)?(15):((.@i>100)?(10):((.@i>50)?(5):(0))); if(getskilllv("SM_SWORD")==10) bonus bHit,10; if(getskilllv("SM_TWOHAND")==10) bonus bUseSPrate,-5; if(getskilllv("AM_AXEMASTERY")==10) bonus bVariableCastrate,-5; if(getskilllv("AS_KATAR")==10) bonus bCritAtkRate,20; if(getskilllv("PR_MACEMASTERY")==10) bonus bAspdRate,10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18867,'Vajra','Vajra',4,0,NULL,300,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,0,'48',0,983,'bonus bDex,1; bonus bLongAtkRate,2;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18867,'Vajra','Vajra',4,0,NULL,300,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,NULL,'48',0,983,'bonus bDex,1; bonus bLongAtkRate,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18868,'Assassin_Skull_Mask','Assassin Skull Mask',4,10,NULL,500,NULL,2,NULL,0,0xFFFFFFFF,63,2,513,NULL,'70',NULL,984,'bonus bCritical,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18870,'Very_Sweet_Candy_Bar','Very Sweet Candy Bar',4,10,NULL,10,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',1,446,'bonus bAllStats,2; bonus bBaseAtk,10; bonus bMatk,10; bonus2 bExpAddClass,Class_All,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18871,'Very_Sweet_Candy','Very Sweet Candy',4,10,NULL,10,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',1,446,'bonus bAllStats,1; bonus bBaseAtk,5; bonus bMatk,5;',NULL,NULL); @@ -9860,7 +9867,7 @@ REPLACE INTO `item_db_re` VALUES (19019,'Elemental_Crown','Elemental Crown',4,0, REPLACE INTO `item_db_re` VALUES (19020,'Survive_Circlet','Survive Circlet',4,0,NULL,500,NULL,10,NULL,0,0xFFFFFFFF,63,2,256,NULL,NULL,1,1220,'.@r = getrefine(); bonus bInt,(3 + (.@r/2)+ (BaseLevel > 130 ? .@r : 0)); bonus bMatkRate,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19021,'Gigant_Helm','Gigant Helm',4,0,NULL,500,NULL,10,NULL,0,0xFFFFFFFF,63,2,256,NULL,NULL,1,1221,'bonus bStr,3+((BaseLevel > 130) ? getrefine() : 0); bonus2 bAddClass,Class_All,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19022,'Floating_Stone_Of_Intelligence','Floating Stone Of Intelligence',4,NULL,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,256,NULL,NULL,NULL,1230,NULL,'sc_start SC_FSTONE,-1,0;','sc_end SC_FSTONE;'); -REPLACE INTO `item_db_re` VALUES (19024,'Protect_Feathers','Protect Feathers',4,0,NULL,500,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,0,'70',0,1232,'bonus2 bSubRace,RC_DemiHuman,2; bonus2 bSubRace,RC_Player,2; bonus bAspdRate,-5; .@vit = readparam(bVit); if (.@vit >= 108) { bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3; bonus bAspdRate,-5; } if (.@vit >= 120) { bonus bMaxHPRate,3; bonus bMdef,3; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19024,'Protect_Feathers','Protect Feathers',4,0,NULL,500,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,NULL,'70',0,1232,'bonus2 bSubRace,RC_DemiHuman,2; bonus2 bSubRace,RC_Player,2; bonus bAspdRate,-5; .@vit = readparam(bVit); if (.@vit >= 108) { bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3; bonus bAspdRate,-5; } if (.@vit >= 120) { bonus bMaxHPRate,3; bonus bMdef,3; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19026,'Aegir_Helm','Aegir Helm',4,10,NULL,800,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,'40',1,870,'bonus bVit,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19030,'Pretty_Rabbit_Hood','Pretty Rabbit Hood',4,10,NULL,100,NULL,20,NULL,1,0xFFFFFFFF,63,2,769,NULL,'1',1,1085,'bonus bMaxHP,(15*BaseLevel);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19031,'Fallen_Angel_Blessing','Fallen Angel Blessing',4,0,NULL,200,NULL,1,NULL,0,0xFFFFFFFF,63,2,512,NULL,NULL,1,1250,'bonus2 bAddRace,RC_Angel,5; bonus2 bSubRace,RC_Angel,5;',NULL,NULL); @@ -9872,7 +9879,7 @@ REPLACE INTO `item_db_re` VALUES (19048,'Elemental_Clothe','Elemental Clothes',4 REPLACE INTO `item_db_re` VALUES (19051,'Warrior_Moon_Cat','Warrior Moon Cat',4,20,NULL,100,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,1308,'/*Enables use of Level 1 Monster\'s Cry*/ bonus bAllStats,3; bonus2 bHPDrainRate,40,5; bonus2 bSPDrainRate,10,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19052,'Sigruns_Wing','Rental Sigrun\'s Wing',4,10,NULL,0,NULL,2,NULL,0,0xFFFFFFFF,63,2,512,NULL,'1',0,568,'if (Class == Job_Swordman || Class == Job_Thief || Class == Job_Merchant || Class == Job_Taekwon || Class == Job_Star_Gladiator || Class == Job_Star_Gladiator2) bonus bAspd,1; else if (Class == Job_Mage || Class == Job_Acolyte || Class == Job_Ninja || Class == Job_Soul_Linker) { bonus bMatk,5; bonus bHealPower,2; } else if (Class == Job_Archer || Class == Job_Gunslinger) bonus bLongAtkRate,2; else if (Class == Job_Novice || Class == Job_SuperNovice) { bonus bMaxHP,120; bonus bMaxSP,60; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19053,'Fighter_Moon_Cat','Fighter Moon Cat',4,20,NULL,100,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,1308,'/*Enables use of Level 1 Monster\'s Cry*/ .@r = getrefine(); bonus bAllStats,3; bonus2 bAddEff,Eff_Stun,500+(.@r*100);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19082,'Bio_Protector','Bio Protector',4,0,NULL,500,NULL,3,NULL,0,0xFFFFFFFF,63,2,512,1,'50',1,1366,'bonus bHit,10; bonus bVariableCastrate,-5; bonus bPerfectHitRate,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19082,'Bio_Protector','Bio Protector',4,0,NULL,500,NULL,3,NULL,0,0xFFFFFFFF,63,2,512,NULL,'50',1,1366,'bonus bHit,10; bonus bVariableCastrate,-5; bonus bPerfectHitRate,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19083,'Mask_of_Hero','Mask of Hero',4,20,NULL,200,NULL,0,NULL,0,0xFFFFFFFF,63,2,512,NULL,'70',0,1367,'bonus bVit,10; bonus bMdef,10; bonus bShortWeaponDamageReturn,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19084,'Parfaille_Vigilante_Hat','Parfaille Vigilante Hat',4,0,NULL,100,NULL,2,NULL,0,0x80000000,63,2,256,NULL,'20',1,1368,'bonus bLuk,1; bonus3 bAutoSpell,"AL_BLESSING",3,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19085,'Sigrun\'s_Wings_','Sigrun\'s Wings',4,20,NULL,100,NULL,2,NULL,1,0xFFFFFFFF,63,2,512,NULL,'1',0,568,'if(BaseClass==Job_Swordman||BaseClass==Job_Merchant||BaseClass==Job_Thief||(BaseJob==Job_Taekwon&&Class!=Job_Soul_Linker)) { bonus bAspd,1; bonus bAgi,-2; } else if(BaseClass==Job_Mage||BaseClass==Job_Acolyte||Class==Job_Ninja||Class==Job_Soul_Linker){ bonus bMatk,3; bonus bHealPower,2; } else if(BaseClass==Job_Archer||BaseClass==Job_Gunslinger) bonus bLongAtkRate,1; else if(BaseJob==Job_Novice||BaseJob==Job_SuperNovice) { bonus bMaxHP,60; bonus bMaxSP,30; }',NULL,NULL); @@ -9886,9 +9893,9 @@ REPLACE INTO `item_db_re` VALUES (19092,'Machoman_Glasses_','Machoman\'s Glasses 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 (19109,'Valhalla_Idol','Valhalla Idol',4,0,NULL,300,NULL,2,NULL,0,0xFFFFFFFF,63,2,512,0,'70',0,1423,'bonus bMaxSP,50; bonus3 bAutoSpell,"MG_SAFETYWALL",10,50;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19111,'Laser_Of_Eagle','Laser of Eagle',4,0,NULL,400,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,0,'100',1,1424,'bonus bDex,2; bonus bLongAtkRate,10; bonus4 bAutoSpell,"PR_LEXAETERNA",1,50,BF_LONG; /*TODO: Chance to transform become Shechil while attacking.*/',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19116,'Red_Baby_Dragon','Red Baby Dragon',4,0,NULL,700,NULL,NULL,1,1,0xFFFFFFFF,63,2,256,0,'90',1,1463,'.@r=getrefine(); bonus bMaxHPrate,5; bonus bMaxSPrate,5; bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; if (.@r>=6) { bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; } if (.@r>=8) { bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; }',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; bonus3 bAutoSpell,"MG_SAFETYWALL",10,50;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19111,'Laser_Of_Eagle','Laser of Eagle',4,0,NULL,400,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,NULL,'100',1,1424,'bonus bDex,2; bonus bLongAtkRate,10; bonus4 bAutoSpell,"PR_LEXAETERNA",1,50,BF_LONG; /*TODO: Chance to transform become Shechil while attacking.*/',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19116,'Red_Baby_Dragon','Red Baby Dragon',4,0,NULL,700,NULL,NULL,1,1,0xFFFFFFFF,63,2,256,NULL,'90',1,1463,'.@r=getrefine(); bonus bMaxHPrate,5; bonus bMaxSPrate,5; bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; if (.@r>=6) { bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; } if (.@r>=8) { bonus2 bSkillAtk,"RK_DRAGONBREATH",15; bonus2 bSkillAtk,"RK_DRAGONBREATH_WATER",15; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19117,'Poring_Sunglasses','Poring Sunglasses',4,0,NULL,10,NULL,0,NULL,0,0xFFFFFFFF,63,2,512,NULL,'1',0,954,'bonus2 bDropAddRace,RC_All,5; bonus2 bExpAddRace,RC_All,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19118,'Poring_Sunglasses_','Poring Sunglasses',4,0,NULL,10,NULL,0,NULL,1,0xFFFFFFFF,63,2,512,NULL,'1',0,954,'bonus2 bDropAddRace,RC_All,4; bonus2 bExpAddRace,RC_All,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19126,'Shadow_Booster_','Magical Booster',4,10,NULL,300,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,512,NULL,'1',1,873,'bonus bAspd,1; bonus bDelayrate,-1;',NULL,NULL); @@ -10421,7 +10428,7 @@ REPLACE INTO `item_db_re` VALUES (20095,'C_Red_Ribbon','Costume Red Ribbon',4,0, REPLACE INTO `item_db_re` VALUES (20096,'C_Blue_Ribbon','Costume Blue Ribbon',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,441,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20097,'C_White_Ribbon','Costume White Ribbon',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,442,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20098,'C_Vampire_Hairband','Costume Vampire Hairband',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1238,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20099,'C_Ljosalfar','Flying Ljosalfar',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,1,'1',1,1239,NULL,'sc_start SC_LJOSALFAR,-1,0;','sc_end SC_LJOSALFAR;'); +REPLACE INTO `item_db_re` VALUES (20099,'C_Ljosalfar','Flying Ljosalfar',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1239,NULL,'sc_start SC_LJOSALFAR,-1,0;','sc_end SC_LJOSALFAR;'); REPLACE INTO `item_db_re` VALUES (20100,'C_Volume_Fhat','Costume Volume Fhat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1240,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20101,'C_Bragi_Wing_Ears','Costume Bragi Wing Ears',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1241,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20102,'C_Horse_King_J','Costume Horse King J',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,7168,NULL,'1',1,1189,NULL,NULL,NULL); @@ -10437,9 +10444,9 @@ REPLACE INTO `item_db_re` VALUES (20111,'C_Coiledup_Snake_Hat2','Costume Coiledu REPLACE INTO `item_db_re` VALUES (20112,'C_Aqua_Ten_Gallon_Hat','Costume Aqua Ten Gallon Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1256,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20113,'C_Star_Reading_Hat','Costume Star Reading Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1253,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20114,'C_Funeral_Hat','Costume Funeral Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,77,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20115,'C_Under_Rim_Glasses','Under Rim Glasses',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,1,'1',1,1255,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20116,'C_Mermaid_Headphone','Mermaid Headphone',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,1,'1',1,1254,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20117,'C_Raspberry_Mousse_Hat','Raspberry Mousse Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,1,'1',1,1257,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20115,'C_Under_Rim_Glasses','Under Rim Glasses',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,1255,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20116,'C_Mermaid_Headphone','Mermaid Headphone',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,1254,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20117,'C_Raspberry_Mousse_Hat','Raspberry Mousse Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1257,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20118,'C_Cake_Hat','Costume Cake Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,109,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20119,'C_Beanie','Costume Beanie',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,160,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20120,'C_Aerial','Costume Aerial',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,97,NULL,NULL,NULL); @@ -10540,9 +10547,9 @@ REPLACE INTO `item_db_re` VALUES (20214,'C_Evil_Marcher_Hat_J','Costume Evil Mar REPLACE INTO `item_db_re` VALUES (20215,'C_Black_Devil_Mask','Costume Black Devil Mask',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,760,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20216,'C_Rideword_Hat','Costume Rideword Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,890,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20217,'C_Arabian_Veil','Costume Arabian Veil',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1300,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20218,'C_Spell_Circuit','Costume Spell Circuit',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,1,'1',1,1301,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20218,'C_Spell_Circuit','Costume Spell Circuit',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1301,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20219,'C_Angel_Marcher_Hat','Costume Angel Marcher Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1302,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20220,'C_Dark_Night_Veil','Costume Dark Night Veil',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,3072,1,'1',1,1303,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20220,'C_Dark_Night_Veil','Costume Dark Night Veil',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,3072,NULL,'1',1,1303,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20221,'C_Eyes_Of_Ifrit','C Eyes Of Ifrit',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,886,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20222,'C_Blue_Pigtail_Santa_Hat','Costume Blue Pigtail Santa Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,NULL,1,395,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20223,'C_Romantic_Leaf','Costume Romantic Leaf',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',1,57,NULL,NULL,NULL); @@ -10626,8 +10633,8 @@ REPLACE INTO `item_db_re` VALUES (20311,'C_Magical_Booster','Costume Magical Boo REPLACE INTO `item_db_re` VALUES (20312,'C_Barons_Evil_Eye','Costume Baron\'s Evil Eye',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,989,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20313,'C_CD_in_Mouth','Costume CD in Mouth',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',1,815,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20314,'C_New_Wave_Sunglasses','Costume New Wave Sunglasses',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,856,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20315,'C_Analyze_Eye','Costume Analyze Eye',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,1,'1',1,1351,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20316,'C_Seraph_Wing_Helm','Costume Seraph Wing Helm',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,1,'1',1,1352,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20315,'C_Analyze_Eye','Costume Analyze Eye',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',1,1351,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20316,'C_Seraph_Wing_Helm','Costume Seraph Wing Helm',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1352,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20317,'C_Nekomimi_Cyber_Headphone','Costume Nekomimi Cyber Headphone',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1353,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20318,'C_Charleston_Antenna','Costume Charleston Antenna',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,1354,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20319,'C_Crimson_Booster','Costume Crimson Booster',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,1355,NULL,NULL,NULL); @@ -10635,8 +10642,8 @@ REPLACE INTO `item_db_re` VALUES (20320,'C_Red_Bandana','Costume Red Bandana',4, REPLACE INTO `item_db_re` VALUES (20321,'C_Pterios_Fins','Costume Pterios Fins',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,1009,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20322,'C_Seal_Hat','Costume Seal Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,540,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20323,'C_Sparkling_Sound','Costume Sparkling Sound',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',1,1074,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20324,'C_Pigeon_Hat','Costume Pigeon Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,1,'1',1,1362,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20325,'C_Little_Aquarium','Costume Little Aquarium',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,1,'1',1,1363,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20324,'C_Pigeon_Hat','Costume Pigeon Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1362,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20325,'C_Little_Aquarium','Costume Little Aquarium',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,2048,NULL,'1',1,1363,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20326,'C_Sailor_Collar','Costume Sailor Collar',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',1,1364,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20327,'C_Marine_Cap','Costume Marine Cap',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1365,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20328,'C_Mackerel_Pike','Costume Mackerel Pike',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',1,1081,NULL,NULL,NULL); @@ -10778,12 +10785,12 @@ REPLACE INTO `item_db_re` VALUES (20509,'C_Wings_of_Uriel','Costume Wings of Uri REPLACE INTO `item_db_re` VALUES (20510,'C_SwordWing','Costume Sword Wing',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,8192,NULL,'1',0,19,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20600,'Fantastic_Aura','Fantastic Aura',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,8192,NULL,'1',0,0,'/*TODO: View ID*/ bonus bUnbreakableHelm,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20700,'Egir_Manteau','Egir Manteau',4,200000,NULL,300,NULL,10,NULL,1,0xFFFFFFFF,63,2,4,NULL,'110',1,0,'bonus bUnbreakableGarment,1; .@r = getrefine(); if (.@r > 10) .@r = 10; if (BaseClass == Job_Mage || BaseClass == Job_Archer || BaseClass == Job_Acolyte) { bonus bFlee2,5+(.@r*2); } else if (BaseClass == Job_Swordman || BaseClass == Job_Merchant || BaseClass == Job_Thief) { bonus bShortWeaponDamageReturn,5+(.@r*2); }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20702,'TE_Woe_Muffler','TE Woe Muffler',4,0,NULL,0,NULL,5,NULL,0,0xFFFFFFFF,63,2,4,1,'40',1,NULL,'bonus bMdef,5; bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20703,'TE_Woe_Manteau','TE Woe Manteau',4,0,NULL,0,NULL,10,NULL,0,0x000444A2,63,2,4,1,'40',1,NULL,'bonus2 bAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20704,'TE_Woe_Magic_Manteau','TE Woe Magic Manteau',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,4,1,'40',1,NULL,'bonus2 bMagicAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20702,'TE_Woe_Muffler','TE Woe Muffler',4,0,NULL,0,NULL,5,NULL,0,0xFFFFFFFF,63,2,4,NULL,'40',1,NULL,'bonus bMdef,5; bonus2 bAddRace,RC_Player,5; bonus2 bMagicAddRace,RC_Player,5; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20703,'TE_Woe_Manteau','TE Woe Manteau',4,0,NULL,0,NULL,10,NULL,0,0x000444A2,63,2,4,NULL,'40',1,NULL,'bonus2 bAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20704,'TE_Woe_Magic_Manteau','TE Woe Magic Manteau',4,0,NULL,0,NULL,5,NULL,0,0x00818315,63,2,4,NULL,'40',1,NULL,'bonus2 bMagicAddRace,RC_Player,10; bonus2 bResEff,Eff_Freeze,25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20706,'Amistr_Bag','Amistr Bag',4,10,NULL,500,NULL,18,NULL,0,0xFFFFFFFF,63,2,4,NULL,'1',NULL,4,'bonus bAllStats,1; bonus2 bSubEle,Ele_All,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20707,'Kirin_Wing','Kirin Wing',4,20,NULL,0,NULL,18,NULL,0,0xFFFFFFFF,63,2,4,NULL,'0',1,6,'bonus bAllStats,1; bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20709,'Mana_Manteau','Mana Manteau',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4,0,'1',1,NULL,'bonus2 bExpAddRace,RC_All,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20709,'Mana_Manteau','Mana Manteau',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4,NULL,'1',1,NULL,'bonus2 bExpAddRace,RC_All,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20710,'Impr_Angel\'s_Warmth','Advanced Angelic Cardigan',4,10000,NULL,400,NULL,6,NULL,1,0x00000001,63,2,4,NULL,'99',1,0,'bonus bHPrecovRate,50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20711,'Manteau_Of_Diego','Manteau Of Diego',4,20,NULL,600,NULL,15,NULL,1,0xFFFFFFFF,63,2,4,NULL,'0',1,0,'bonus bInt,1; bonus bDex,1; bonus bMdef,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20717,'Gigant_Snake_Skin','Gigant Snake Skin',4,10,NULL,400,NULL,38,NULL,0,0xFFFFFFFF,63,2,4,NULL,'1',1,0,'bonus bMdef,10;',NULL,NULL); @@ -10801,7 +10808,7 @@ REPLACE INTO `item_db_re` VALUES (20744,'Tarlock\'s_Cloak','Tarlock\'s Cloak',4, REPLACE INTO `item_db_re` VALUES (20746,'C_Rudra_Wings','Costume Rudra Wings',4,10,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,8192,NULL,'1',0,8,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20748,'Cloak_Of_Casualties','Cloak Of Casualties',4,10,NULL,600,NULL,20,NULL,0,0xFFFFFFFF,63,2,4,NULL,'120',1,NULL,'.@r = getrefine(); bonus bAgi,5; bonus bFlee,10; if(readparam(bStr)>=90) bonus bBaseAtk,10+(.@r*2); if(readparam(bInt)>=90) bonus bMatk,20+(.@r*3); if(readparam(bVit)>=90) bonus2 bSubEle,Ele_Neutral,3+((.@r>=8)?3:0)+((.@r>=10)?4:0); if(readparam(bAgi)>=90){ bonus bAspdRate,3+(.@r/2); bonus bAspd,((.@r>=10)?1:0); } if(readparam(bDex)>=90) bonus bLongAtkRate,3+(.@r/2); if(readparam(bLuk)>=90) bonus bCriticalRate,5+.@r;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20749,'Cloak_Of_Casualties_','Cloak Of Casualties',4,10,NULL,600,NULL,30,NULL,1,0xFFFFFFFF,63,2,4,NULL,'170',1,NULL,'.@r = getrefine(); bonus bMaxHPrate,.@r/2; bonus bMaxSPrate,.@r/2; bonus bAgi,5; bonus bFlee,10; if(readparam(bStr)>=90) bonus bBaseAtk,10+(.@r*2); if(readparam(bInt)>=90) bonus bMatk,20+(.@r*3); if(readparam(bVit)>=90) bonus2 bSubEle,Ele_Neutral,3+((.@r>=8)?3:0)+((.@r>=10)?4:0); if(readparam(bAgi)>=90){ bonus bAspdRate,3+(.@r/2); bonus bAspd,((.@r>=10)?1:0); } if(readparam(bDex)>=90) bonus bLongAtkRate,3+(.@r/2); if(readparam(bLuk)>=90) bonus bCriticalRate,5+.@r;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20753,'Lian_Robe','Lian Robe',4,0,NULL,700,NULL,20,1,1,0xFFFFFFFF,63,2,4,0,'65',1,NULL,'bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubRace,RC_Formless,-5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20753,'Lian_Robe','Lian Robe',4,0,NULL,700,NULL,20,1,1,0xFFFFFFFF,63,2,4,NULL,'65',1,NULL,'bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubRace,RC_Formless,-5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20756,'Aegir_Cloak','Aegir Cloak',4,10,NULL,300,NULL,10,NULL,1,0xFFFFFFFF,63,2,4,NULL,'40',1,NULL,'bonus bUnbreakableGarment,1; bonus bMaxHP,500; bonus bMaxSP,50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20761,'C_Happiness_Wings','Costume Happiness Wings',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,8192,NULL,'1',0,9,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20762,'C_Great_Devil_Wings','Costume Great Devil Wings',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,8192,NULL,'1',0,10,NULL,NULL,NULL); @@ -10811,12 +10818,12 @@ REPLACE INTO `item_db_re` VALUES (20779,'Rift_Manteau','Rift Manteau',4,20,NULL, REPLACE INTO `item_db_re` VALUES (20780,'Unity_STR_Manteau','Unity STR Manteau',4,32000,NULL,300,NULL,20,NULL,1,0xFFFFFFFF,63,2,4,NULL,'1',1,0,'.@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bMaxHPrate,2*(.@r/2); }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20781,'Unity_AGI_Manteau','Unity AGI Manteau',4,32000,NULL,300,NULL,20,NULL,1,0xFFFFFFFF,63,2,4,NULL,'1',1,0,'.@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bFlee,3*(.@r/2); }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20782,'Unity_INT_Muffler','Unity INT Muffler',4,32000,NULL,300,NULL,20,NULL,1,0xFFFFFFFF,63,2,4,NULL,'1',1,0,'.@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bUseSPrate,-(.@r/2); }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20783,'Hero_Cape','Hero Cape',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,4,1,'10',1,NULL,'.@r = getrefine(); bonus2 bSubEle,Ele_Neutral,1+(.@r/3); bonus bFlee,1+(.@r/3); if (.@r > 9) { bonus2 bSubEle,Ele_Neutral,20; bonus bFlee,20; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20783,'Hero_Cape','Hero Cape',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,4,NULL,'10',1,NULL,'.@r = getrefine(); bonus2 bSubEle,Ele_Neutral,1+(.@r/3); bonus bFlee,1+(.@r/3); if (.@r > 9) { bonus2 bSubEle,Ele_Neutral,20; bonus bFlee,20; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20787,'Unity_Exquisite_Muffler','Unity Exquisite Muffler',4,32000,NULL,300,NULL,20,NULL,1,0xFFFFFFFF,63,2,4,NULL,'1',1,0,'.@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bCritical,2*(.@r/2); }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20788,'Private_Doram_Manteau','Private Doram Manteau',4,20,NULL,300,NULL,20,NULL,1,0x80000000,7,2,4,NULL,'100',1,NULL,'bonus bFlee,5; bonus2 bSubEle,Ele_Neutral,2; bonus bFlee2,getrefine()/3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20789,'Luxury_Doram_Manteau','Luxury Doram Manteau',4,20,NULL,400,NULL,25,NULL,1,0x80000000,7,2,4,NULL,'140',1,NULL,'bonus bFlee,7; bonus2 bSubEle,Ele_Neutral,3; .@r = getrefine()/3; bonus bFlee2,.@r; bonus bLuk,.@r;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20790,'Elegant_Doram_Manteau','Elegant Doram Manteau',4,20,NULL,500,NULL,30,NULL,1,0x80000000,7,2,4,NULL,'175',1,NULL,'bonus bFlee,10; bonus2 bSubEle,Ele_Neutral,5; .@r = getrefine()/2; bonus bFlee2,.@r; bonus bInt,.@r; bonus bDex,.@r; bonus bLuk,.@r;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20797,'Etran_Shirt','Etran Shirt',4,0,NULL,150,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,4,1,'1',1,NULL,'bonus bMdef,10; bonus bMaxHPrate,2; .@r = getrefine(); if (.@r >= 6) bonus bMaxHPrate,4; if (.@r >= 7) bonus bMaxHPrate,6; if (.@r >= 8) bonus bMaxHPrate,8; if (.@r >= 9) bonus bNoKnockback,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20797,'Etran_Shirt','Etran Shirt',4,0,NULL,150,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,4,NULL,'1',1,NULL,'bonus bMdef,10; bonus bMaxHPrate,2; .@r = getrefine(); if (.@r >= 6) bonus bMaxHPrate,4; if (.@r >= 7) bonus bMaxHPrate,6; if (.@r >= 8) bonus bMaxHPrate,8; if (.@r >= 9) bonus bNoKnockback,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20798,'C_Grim_Reaper_Protection','Costume Grim Reaper Protection',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',0,1450,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20815,'SeraphimRobe','Seraphim Robe',4,0,NULL,300,NULL,18,NULL,1,0xFFFFFFFF,63,2,4,NULL,'1',1,NULL,'bonus bMaxHPrate,10; bonus2 bMagicAtkEle,Ele_Neutral,5; .@r = getrefine(); if (.@r > 6) { bonus2 bSubEle,Ele_Dark,20; bonus2 bSubEle,Ele_Holy,20; bonus bMatkRate,10; } if (.@r > 8) { bonus2 bSubEle,Ele_Dark,10; bonus2 bSubEle,Ele_Holy,10; bonus bVariableCastrate,-5; } if (getskilllv("CR_TRUST") > 0) { bonus2 bSubEle,Ele_Holy,.@r*3; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20819,'Oxygen_Bottle','Oxygen Bottle',4,0,NULL,500,NULL,0,NULL,1,0xFFFFFFFF,63,2,4,NULL,'40',0,0,'bonus bFlee,12+getrefine(); bonus bHit,getrefine();',NULL,NULL); @@ -10862,7 +10869,7 @@ REPLACE INTO `item_db_re` VALUES (22008,'Temporal_DEX_Boots_','Temporal Boots Of REPLACE INTO `item_db_re` VALUES (22009,'Temporal_INT_Boots_','Temporal Boots Of Intelligence',4,20,NULL,600,NULL,20,NULL,1,0xFFFFFFFF,56,2,64,NULL,'99',1,NULL,'.@r = getrefine(); bonus bMdef,5; bonus bMaxHP,300+(100*(.@r/3)); bonus bMaxSP,30+(10*(.@r/3)); bonus bMatk,10*(.@r/3); if(readparam(bInt)>=120) bonus bMatk,60;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22010,'Temporal_AGI_Boots_','Temporal Boots Of Agility',4,20,NULL,600,NULL,25,NULL,1,0xFFFFFFFF,56,2,64,NULL,'99',1,NULL,'.@r = getrefine(); bonus bMaxHP,300+(100*(.@r/3)); bonus bMaxSP,30+(10*(.@r/3)); bonus bAspdRate,3*(.@r/3); if(readparam(bAgi)>=120) bonus bAspd,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22011,'Temporal_LUK_Boots_','Temporal Boots Of Luck',4,20,NULL,600,NULL,20,NULL,1,0xFFFFFFFF,56,2,64,NULL,'99',1,NULL,'.@r = getrefine(); bonus bMaxHP,300+(100*(.@r/3)); bonus bMaxSP,30+(10*(.@r/3)); bonus bMdef,5; bonus bCritAtkRate,2*(.@r/3); if(readparam(bLuk)>=120) bonus bCritAtkRate,30;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22012,'Mana_Boots','Mana Boots',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,64,0,'1',1,NULL,'bonus2 bExpAddRace,RC_All,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22012,'Mana_Boots','Mana Boots',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,64,NULL,'1',1,NULL,'bonus2 bExpAddRace,RC_All,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22014,'Enhanced_Variant_Shoes','Enhanced Variant Shoes',4,20,NULL,500,NULL,13,NULL,1,0x7CCFDF80,63,2,64,NULL,'85',1,0,'bonus bMaxHPrate,12; bonus bMaxSPrate,12; .@r = getrefine(); bonus bDef,.@r; bonus bMdef,.@r;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22015,'Impr_Angel\'s_Arrival','Advanced Angel\'s Reincarnation',4,10000,NULL,300,NULL,8,NULL,1,0x00000001,63,2,64,NULL,'99',1,0,'bonus bMaxHP,500; bonus bMaxSP,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22018,'Shoes_Of_Wise_Man','Shoes Of Wise Man',4,10,NULL,300,NULL,15,NULL,1,0xFFFFFFFF,63,2,64,NULL,'50',1,NULL,'.@r = getrefine(); if(.@r>5){ bonus bInt,.@r-5; bonus bMaxHPrate,-(.@r-5); }',NULL,NULL); @@ -10880,8 +10887,8 @@ REPLACE INTO `item_db_re` VALUES (22047,'Tarlock\'s_Boots','Tarlock\'s Boots',4, REPLACE INTO `item_db_re` VALUES (22059,'Aegir_Shoes','Aegir Shoes',4,10,NULL,300,NULL,13,NULL,1,0xFFFFFFFF,63,2,64,NULL,'40',1,NULL,'bonus bUnbreakableShoes,1; bonus bMaxHP,500; bonus bMaxSP,50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22064,'Thorny_Shoes','Thorny Shoes',4,0,NULL,1000,NULL,25,NULL,1,0xFFFFFFFF,63,2,64,NULL,NULL,1,NULL,'bonus bShortWeaponDamageReturn,getrefine()/2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22067,'Shoe_of_Witch','Shoe of Witch',4,10,NULL,400,NULL,10,NULL,0,0xFFFFFFFE,63,2,64,NULL,'1',1,NULL,'skill "ALL_CATCRY",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22069,'Lian_Shoes','Lian Shoes',4,0,NULL,250,NULL,12,NULL,1,0xFFFFFFFF,63,2,64,1,'90',1,NULL,'bonus bMdef,3; bonus2 bSubEle,Ele_Neutral,5; .@r = getrefine(); bonus bMaxHPrate,.@r; bonus bMaxSPrate,.@r;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22072,'Hikingboots','Hikingboots',4,0,NULL,500,NULL,10,NULL,1,0xFFFFFFFF,63,2,64,0,'100',1,NULL,'.@r = getrefine(); bonus bMaxHPRate,4+(.@r/3); bonus bMaxSPRate,4+(.@r/3); if (.@r > 9) bonus bSpeedRate,25;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22069,'Lian_Shoes','Lian Shoes',4,0,NULL,250,NULL,12,NULL,1,0xFFFFFFFF,63,2,64,NULL,'90',1,NULL,'bonus bMdef,3; bonus2 bSubEle,Ele_Neutral,5; .@r = getrefine(); bonus bMaxHPrate,.@r; bonus bMaxSPrate,.@r;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22072,'Hikingboots','Hikingboots',4,0,NULL,500,NULL,10,NULL,1,0xFFFFFFFF,63,2,64,NULL,'100',1,NULL,'.@r = getrefine(); bonus bMaxHPRate,4+(.@r/3); bonus bMaxSPRate,4+(.@r/3); if (.@r > 9) bonus bSpeedRate,25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22075,'Rift_Shoes','Rift Shoes',4,20,NULL,250,NULL,12,NULL,1,0xFFFFFFFF,63,2,64,NULL,'100',1,NULL,'.@r = getrefine(); bonus bMaxHP,(.@r >= 9 ? 1300 : .@r >= 7 ? 700 : 300); bonus bMaxSP,-50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22076,'Wooden_Slipper','Wooden Slipper',4,20,NULL,50,NULL,10,NULL,1,0x80000000,7,2,64,NULL,'9',1,NULL,'bonus2 bHPRegenRate,2,10000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22077,'Red_Eco-Friendly_Shoes','Red Eco-Friendly Shoes',4,20,NULL,100,NULL,20,NULL,1,0x80000000,7,2,64,NULL,'18',1,NULL,'bonus bCritical,5; bonus2 bHPRegenRate,4,10000; bonus2 bSPRegenRate,1,10000;',NULL,NULL); @@ -10889,13 +10896,13 @@ REPLACE INTO `item_db_re` VALUES (22078,'Unity_STR_Boots','Unity STR Boots',4,10 REPLACE INTO `item_db_re` VALUES (22079,'Unity_AGI_Boots','Unity AGI Boots',4,10,NULL,300,NULL,20,NULL,1,0xFFFFFFFF,63,2,64,NULL,'1',1,NULL,'.@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bAgi,.@r/2; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22080,'Unity_DEX_Boots','Unity DEX Boots',4,10,NULL,300,NULL,20,NULL,1,0xFFFFFFFF,63,2,64,NULL,'1',1,NULL,'.@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bDex,.@r/2; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22081,'Unity_INT_Boots','Unity INT Boots',4,10,NULL,300,NULL,20,NULL,1,0xFFFFFFFF,63,2,64,NULL,'1',1,NULL,'.@r = getrefine(); if(BaseLevel<100) { bonus2 bExpAddRace,RC_All,4; bonus bInt,.@r/2; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22082,'Polyhedron_Shoes','Polyhedron Shoes',4,0,NULL,500,NULL,12,NULL,1,0xFFFFFFFF,63,2,64,0,'90',1,NULL,'.@r = getrefine(); bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubEle,Ele_Fire,5; bonus2 bSubEle,Ele_Water,5; bonus2 bSubEle,Ele_Wind,5; if (.@r > 4) { .@b = (.@r > 6) ? 10 : 5; bonus2 bAddEle,Ele_Neutral,.@b; bonus2 bAddEle,Ele_Fire,.@b; bonus2 bAddEle,Ele_Water,.@b; bonus2 bAddEle,Ele_Wind,.@b; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22082,'Polyhedron_Shoes','Polyhedron Shoes',4,0,NULL,500,NULL,12,NULL,1,0xFFFFFFFF,63,2,64,NULL,'90',1,NULL,'.@r = getrefine(); bonus2 bSubEle,Ele_Neutral,5; bonus2 bSubEle,Ele_Fire,5; bonus2 bSubEle,Ele_Water,5; bonus2 bSubEle,Ele_Wind,5; if (.@r > 4) { .@b = (.@r > 6) ? 10 : 5; bonus2 bAddEle,Ele_Neutral,.@b; bonus2 bAddEle,Ele_Fire,.@b; bonus2 bAddEle,Ele_Water,.@b; bonus2 bAddEle,Ele_Wind,.@b; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22083,'Private_Doram_Shoes','Private Doram Shoes',4,20,NULL,500,NULL,25,NULL,1,0x80000000,7,2,64,NULL,'100',1,NULL,'bonus bMaxHP,100; bonus bMaxSP,50; .@r = getrefine()/3; bonus bHPrecovRate,.@r*10; bonus bSPrecovRate,.@r*10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22084,'Luxury_Doram_Shoes','Luxury Doram Shoes',4,20,NULL,600,NULL,30,NULL,1,0x80000000,7,2,64,NULL,'140',1,NULL,'bonus bMaxHP,300; bonus bMaxSP,100; .@r = getrefine()/3; bonus bHPrecovRate,20*.@r; bonus bSPrecovRate,20*.@r;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22085,'Elegant_Doram_Shoes','Elegant Doram Shoes',4,20,NULL,700,NULL,35,NULL,1,0x80000000,7,2,64,NULL,'175',1,NULL,'bonus bMaxHPrate,10; bonus bMaxSPrate,5; .@r = getrefine()/2; bonus bMaxHP,100*.@r; bonus bMaxSP,20*.@r; if(.@r >= 4) bonus2 bSkillUseSP,"SU_LOPE",5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22089,'Crimson_Gaiter_','Crimson Gaiter',4,0,NULL,500,NULL,10,NULL,1,0xFFFFFFFF,63,2,64,NULL,'50',1,NULL,'bonus bCritical,2; bonus bCritAtkRate,2; if(getrefine()>=7){ bonus bCritical,3; bonus bCritAtkRate,3; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22101,'Angel_Poring_Boots','Angel Poring Boots',4,10,NULL,300,NULL,15,NULL,1,0xFFFFFFFF,63,2,64,NULL,'1',1,NULL,'bonus bAllStats,1; skill "AL_HEAL",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22103,'Excelion_Leg','Excelion Leg',4,0,NULL,500,NULL,13,NULL,0,0xFFFFFFFF,63,2,64,1,'100',1,NULL,'.@r = getrefine(); bonus bMaxHP,5+((BaseLevel > 129) ? 4 : 0)+(.@r/3)*3; bonus bMaxSP,5+((BaseLevel > 129) ? 4 : 0)+(.@r/3)*3;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22103,'Excelion_Leg','Excelion Leg',4,0,NULL,500,NULL,13,NULL,0,0xFFFFFFFF,63,2,64,NULL,'100',1,NULL,'.@r = getrefine(); bonus bMaxHP,5+((BaseLevel > 129) ? 4 : 0)+(.@r/3)*3; bonus bMaxSP,5+((BaseLevel > 129) ? 4 : 0)+(.@r/3)*3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22106,'Giant_Boots','Giant Boots',4,0,NULL,500,NULL,13,NULL,1,0xFFFFFFFF,63,2,64,NULL,'1',1,NULL,'bonus2 bSubRace,RC_All,1; bonus bMaxHPrate,2; bonus bMaxSPrate,2; .@r = getrefine(); if (.@r > 4) { bonus bDefRate,2; bonus bMaxHPrate,4; bonus bMaxSPrate,4; } if (.@r > 6) { bonus bDefRate,2; bonus bMaxHPrate,4; bonus bMaxSPrate,4; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22122,'Para_Team_Boots100','Awakened Eden Group Boots I',4,0,NULL,0,NULL,22,NULL,0,0xFFFFFFFF,63,2,64,NULL,'100',1,NULL,'bonus bAllStats,1; bonus bHPrecovRate,30; bonus bSPrecovRate,14;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22123,'Para_Team_Boots115','Awakened Eden Group Boots II',4,0,NULL,0,NULL,25,NULL,0,0xFFFFFFFF,63,2,64,NULL,'115',1,NULL,'bonus bAllStats,1; bonus bHPrecovRate,36; bonus bSPrecovRate,18;',NULL,NULL); @@ -10905,7 +10912,7 @@ REPLACE INTO `item_db_re` VALUES (22126,'Para_Team_Boots160','Awakened Eden Grou #=================================================================== # New Usable items #=================================================================== -REPLACE INTO `item_db_re` VALUES (22508,'Para_Team_Mark_','Eden Group Mark',11,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'warp "moc_para01",171,115;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22508,'Para_Team_Mark_','Eden Group Mark',2,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'warp "moc_para01",171,115;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22507,'ShabbyOldScroll','Old Scroll',2,10,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'callfunc "F_22507";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22510,'King_Wolf_Scroll','King Wolf Scroll',2,10,NULL,10,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*TODO, confirm the rates*/ getitem callfunc("F_Rand",6635,19598,5658,6238,6239),1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22511,'Fenrirs_Power_Scroll','Fenrir\'s Power Scroll',2,10,NULL,10,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'bonus_script "bonus bMatk,25; bonus bFixedCastRate,-50;",300,1025;',NULL,NULL); @@ -11089,9 +11096,9 @@ REPLACE INTO `item_db_re` VALUES (22843,'Superstar_Snack','Superstar Snack',2,10 REPLACE INTO `item_db_re` VALUES (22844,'Sealed_Dracula_Card_Album','Sealed Dracula Card Album',2,10,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'/*No Info*/',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22845,'Sealed_Fortune_Egg','Sealed Fortune Egg',2,10,NULL,10,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,NULL,NULL,'1',NULL,NULL,'getitem callfunc("F_Rand",4488,4497,4486,4480,4485,4539,4487,4494,4538,4489,4490,4482,4503,22846),1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22846,'Sealed_Dracula_Card_','Sealed Dracula Card',2,10,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'bonus_script "{ bonus2 bSPDrainRate,50,5; }",300;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22847,'Prontera_Medal','Prontera Medal',2,10,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'warp "prontera",0,0; /*No coord info*/',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22847,'Prontera_Medal','Prontera Medal',2,10,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'warp "prontera",159,192; /*No coord info*/',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22848,'Prison_Key','Prison Key',2,10,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'warp "prt_prison",0,0; /*No coord info*/',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22849,'Prontera_Time_Crystal','Prontera Time Crystal',2,10,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'warp "prt_lib_q",0,0; /*No map+coord info*/',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22849,'Prontera_Time_Crystal','Prontera Time Crystal',2,10,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'warp "prt_q",155,27;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22850,'January_Gift_Box_','January Gift Box',2,10,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'rentitem 19052,604800;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22851,'February_Gift_Box_','February Gift Box',2,10,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 12105,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22852,'March_Gift_Box_','March Gift Box',2,10,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*2 Lucky Eggs*/',NULL,NULL); @@ -11110,7 +11117,7 @@ REPLACE INTO `item_db_re` VALUES (22870,'Christmas_Package','Christmas Package', REPLACE INTO `item_db_re` VALUES (22873,'Sealed_Beelzebub_Scroll_II','Sealed Beelzebub Scroll II',2,10,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem callfunc("F_Rand",22875,6238,6239,6228,6232,24231,24232,17474,6635),1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22874,'Sealed_Beelzebub_Card_Album','Sealed Beelzebub Card Album',2,10,NULL,50,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*No Info*/',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22875,'Sealed_Beelzebub_Card','Sealed Beelzebub Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bVariableCastrate,-15; /*Item removed on 2014-12-17*/',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22876,'Old_Money_Pocket','Old Money Pocket',3,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22876,'Old_Money_Pocket','Old Money Pocket',3,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'Zeny += rand(500,550);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22881,'Rope_Gallows','Rope Gallows',2,10,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*Used to catch a Lost Sheep*/',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22882,'Chocolate_Rice_Cake_Soup','Chocolate Rice Cake Soup',2,10,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'percentheal 10,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22883,'September_Gift_Box_','September Gift Box',2,10,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*2 Lucky Eggs*/',NULL,NULL); @@ -11487,27 +11494,30 @@ REPLACE INTO `item_db_re` VALUES (28315,'RCC2013_ARMLET','RCC2013_ARMLET',4,200, REPLACE INTO `item_db_re` VALUES (28316,'RCC2013_ARMLET_','RCC2013_ARMLET_',4,200,NULL,200,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus2 bAddClass,Class_All,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28317,'RCC2013_RING','RCC2013_RING',4,200,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus2 bAddClass,Class_All,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28318,'RCC2013_RING_','RCC2013_RING_',4,200,NULL,200,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus2 bAddClass,Class_All,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28310,'Sarah\'s_Left_Earring','Sarah\'s Left Earring',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,128,NULL,'145',0,NULL,'skill "AL_HEAL",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28311,'Sarah\'s_Right_Earring','Sarah\'s Right Earring',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,8,NULL,'145',0,NULL,'skill "AL_TELEPORT",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28321,'Falconer_Claw','Falconer Claw',4,0,NULL,100,NULL,5,NULL,1,0x00000800,63,2,136,0,'80',0,NULL,'bonus bDex,1; bonus2 bSkillAtk,"HT_BLITZBEAT",getskilllv("HT_STEELCROW")*10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28322,'Falconer_Glove','Falconer Glove',4,0,NULL,100,NULL,5,NULL,1,0x00000800,63,2,136,0,'80',0,NULL,'bonus bDex,1; bonus bUseSPrate,-5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28310,'Sarah\'s_Left_Earring','Sarah\'s Left Earring',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,8,NULL,'145',0,NULL,'skill "AL_HEAL",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28311,'Sarah\'s_Right_Earring','Sarah\'s Right Earring',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,128,NULL,'145',0,NULL,'skill "AL_TELEPORT",1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28321,'Falconer_Claw','Falconer Claw',4,0,NULL,100,NULL,5,NULL,1,0x00000800,63,2,136,NULL,'80',0,NULL,'bonus bDex,1; bonus2 bSkillAtk,"HT_BLITZBEAT",getskilllv("HT_STEELCROW")*10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28322,'Falconer_Glove','Falconer Glove',4,0,NULL,100,NULL,5,NULL,1,0x00000800,63,2,136,NULL,'80',0,NULL,'bonus bDex,1; bonus bUseSPrate,-5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28326,'Broken_Chips_01','Broken Chips 01',4,10,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'100',0,NULL,'bonus bStr,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28327,'Broken_Chips_02','Broken Chips 02',4,10,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'100',0,NULL,'bonus bInt,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28332,'Jewerly_Ring','Jewerly Ring',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus bLuk,20; autobonus "{ bonus bAspd,2; }",50,2000,BF_WEAPON|BF_MAGIC;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28333,'Gold_PC_Room_Ring','Gold PC Room Ring',4,10,NULL,0,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus bMaxHPrate,3; bonus bMaxSPrate,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28342,'Critical_Anklet','Critical Anklet',4,0,NULL,200,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,NULL,NULL,0,NULL,'bonus bCritical,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28358,'Cursed_Lucky_Clover','Cursed Lucky Clover',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,0,'100',0,NULL,'bonus bLuk,2; bonus bFlee,3; bonus2 bAddEff2,Eff_Curse,5;',NULL,'sc_end SC_CLOAKING; /*FIXME: Because the combo has Cloaking skill*/'); -REPLACE INTO `item_db_re` VALUES (28372,'Imperial_Ring','Imperial Ring',4,0,NULL,500,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,0,'50',0,NULL,'bonus bStr,1; bonus bInt,1; bonus bMaxHPRate,3; bonus bMaxSPRate,3;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28354,'City_Map','City Map',4,0,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,63,2,136,NULL,'1',0,0,'/* todo */',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28355,'Shining_Holy_Water','Shining Holy Water',4,0,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,63,2,136,NULL,'1',0,0,'/* todo */',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28356,'Prontera_Badge','Prontera Badge',4,0,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,0,'/*warp "prontera",159,192; 15 mins cooldown */',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28358,'Cursed_Lucky_Clover','Cursed Lucky Clover',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'100',0,NULL,'bonus bLuk,2; bonus bFlee,3; bonus2 bAddEff2,Eff_Curse,5;',NULL,'sc_end SC_CLOAKING; /*FIXME: Because the combo has Cloaking skill*/'); +REPLACE INTO `item_db_re` VALUES (28372,'Imperial_Ring','Imperial Ring',4,0,NULL,500,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,NULL,'50',0,NULL,'bonus bStr,1; bonus bInt,1; bonus bMaxHPRate,3; bonus bMaxSPRate,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28374,'Foxtail_Ring','Foxtail Ring',4,20,NULL,100,NULL,0,NULL,0,0x80000000,7,2,136,NULL,'1',0,NULL,'bonus2 bExpAddRace,RC_All,5; .@lvl = min(BaseLevel/5,10); bonus bAtk,2*.@lvl; bonus bMatk,2*.@lvl; bonus bMaxHP,10*.@lvl; bonus bMaxSP,5*.@lvl;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28377,'Magical_Ring','Magical Ring',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,0,'20',0,NULL,'bonus2 bMagicAddEle,Ele_Fire,5; bonus2 bMagicAddEle,Ele_Water,5; bonus2 bMagicAddEle,Ele_Earth,5; bonus2 bMagicAddEle,Ele_Wind,5; if (BaseLevel > 4) { bonus2 bSkillAtk,"MG_FIREBOLT",BaseLevel/5; bonus2 bSkillAtk,"MG_COLDBOLT",BaseLevel/5; bonus2 bSkillAtk,"MG_LIGHTNINGBOLT",BaseLevel/5; bonus2 bSkillAtk,"WZ_EARTHSPIKE",BaseLevel/5; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28377,'Magical_Ring','Magical Ring',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'20',0,NULL,'bonus2 bMagicAddEle,Ele_Fire,5; bonus2 bMagicAddEle,Ele_Water,5; bonus2 bMagicAddEle,Ele_Earth,5; bonus2 bMagicAddEle,Ele_Wind,5; if (BaseLevel > 4) { bonus2 bSkillAtk,"MG_FIREBOLT",BaseLevel/5; bonus2 bSkillAtk,"MG_COLDBOLT",BaseLevel/5; bonus2 bSkillAtk,"MG_LIGHTNINGBOLT",BaseLevel/5; bonus2 bSkillAtk,"WZ_EARTHSPIKE",BaseLevel/5; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28380,'Fresh_Grass_Necklace','Fresh Grass Necklace',4,20,NULL,100,NULL,0,NULL,1,0x80000000,7,2,136,NULL,'100',0,NULL,'bonus bFlee2,5; bonus2 bSkillCooldown,"SU_SCAROFTAROU",-5000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28381,'Cute_Grass_Necklace','Cute Grass Necklace',4,20,NULL,10,NULL,0,NULL,1,0x80000000,7,2,136,NULL,'100',0,NULL,'bonus bHealPower,5; bonus2 bSkillCooldown,"SU_TUNAPARTY",-7000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28382,'Charm_Grass_Necklace','Charm Grass Necklace',4,20,NULL,10,NULL,0,NULL,1,0x80000000,7,2,136,NULL,'100',0,NULL,'bonus bMdef,5; bonus2 bVariableCastrate,"SU_CN_METEOR",-1000;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28386,'Fallen_Monk_Rosary','Fallen Monk Rosary',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,0,'20',0,NULL,'bonus bAspdRate,5; bonus bCritical,5; bonus2 bSkillUseSP,"CH_SOULCOLLECT",-5; if (BaseLevel > 14) bonus2 bSkillAtk,"SR_DRAGONCOMBO",BaseLevel/15; if (BaseLevel > 19) bonus2 bSkillAtk,"SR_KNUCKLEARROW",BaseLevel/20; if (BaseLevel > 29) bonus2 bSkillAtk,"SR_SKYNETBLOW",BaseLevel/30;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28386,'Fallen_Monk_Rosary','Fallen Monk Rosary',4,0,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'20',0,NULL,'bonus bAspdRate,5; bonus bCritical,5; bonus2 bSkillUseSP,"CH_SOULCOLLECT",-5; if (BaseLevel > 14) bonus2 bSkillAtk,"SR_DRAGONCOMBO",BaseLevel/15; if (BaseLevel > 19) bonus2 bSkillAtk,"SR_KNUCKLEARROW",BaseLevel/20; if (BaseLevel > 29) bonus2 bSkillAtk,"SR_SKYNETBLOW",BaseLevel/30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28391,'S_Thief_Earring','Thief Shadow Earring',12,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1048576,NULL,'1',1,NULL,'.@r = getrefine(); autobonus3 "{ bonus bBaseAtk,30+(.@r*10); bonus bFlee,30+(.@r*10); }",200,5000,"TF_THROWSTONE","{ specialeffect2 EF_ENHANCE; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28392,'S_Archer_Earring','Archer Shadow Earring',12,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1048576,NULL,'1',1,NULL,'.@r = getrefine(); autobonus3 "{ bonus bBaseAtk,30+(.@r*10); bonus bHit,30+(.@r*10); }",200,5000,"AC_DOUBLE","{ specialeffect2 EF_ENHANCE; }";',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28410,'Sapphire_Wrist','Sapphire Wrist',4,0,NULL,500,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,0,'50',0,NULL,'bonus bDex,5; bonus bLuk,5; bonus bInt,5; bonus2 bSkillAtk,"GN_SPORE_EXPLOSION",BaseLevel/5; bonus2 bVariableCastrate,"CR_ACIDDEMONSTRATION",-(BaseLevel/4); .@n = getskilllv("CR_SLIMPITCHER"); bonus bDex,.@n/2; bonus bLuk,.@n/2; bonus bInt,.@n/2; bonus bMatk,(.@n/2)*20;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28411,'Emerald_Earring','Emerald Earring',4,0,NULL,500,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,0,'50',0,NULL,'bonus bDex,5; bonus bAgi,5; bonus bInt,5; bonus2 bSkillAtk,"CG_ARROWVULCAN",BaseLevel; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",BaseLevel; bonus2 bSkillAtk,"DC_THROWARROW",BaseLevel; bonus2 bSkillAtk,"WM_METALICSOUND",2*(BaseLevel/5); .@n = getskilllv("WM_METALICSOUND"); bonus2 bVariableCastrate,"WM_METALICSOUND",.@n/2; bonus bDex,.@n/2; bonus bAgi,.@n/2; bonus bInt,.@n/2; bonus bMatk,(.@n/2)*20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28410,'Sapphire_Wrist','Sapphire Wrist',4,0,NULL,500,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,NULL,'50',0,NULL,'bonus bDex,5; bonus bLuk,5; bonus bInt,5; bonus2 bSkillAtk,"GN_SPORE_EXPLOSION",BaseLevel/5; bonus2 bVariableCastrate,"CR_ACIDDEMONSTRATION",-(BaseLevel/4); .@n = getskilllv("CR_SLIMPITCHER"); bonus bDex,.@n/2; bonus bLuk,.@n/2; bonus bInt,.@n/2; bonus bMatk,(.@n/2)*20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28411,'Emerald_Earring','Emerald Earring',4,0,NULL,500,NULL,3,NULL,1,0xFFFFFFFF,63,2,136,NULL,'50',0,NULL,'bonus bDex,5; bonus bAgi,5; bonus bInt,5; bonus2 bSkillAtk,"CG_ARROWVULCAN",BaseLevel; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",BaseLevel; bonus2 bSkillAtk,"DC_THROWARROW",BaseLevel; bonus2 bSkillAtk,"WM_METALICSOUND",2*(BaseLevel/5); .@n = getskilllv("WM_METALICSOUND"); bonus2 bVariableCastrate,"WM_METALICSOUND",.@n/2; bonus bDex,.@n/2; bonus bAgi,.@n/2; bonus bInt,.@n/2; bonus bMatk,(.@n/2)*20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28413,'Lesser_Mackerel_Talisman','Lesser Mackerel Talisman',4,0,NULL,100,NULL,1,NULL,1,0x80000000,63,2,136,NULL,'100',NULL,NULL,'bonus bVit,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28414,'Intermediate_Mackerel_Talisman','Intermediate Mackerel Talisman',4,0,NULL,100,NULL,1,NULL,1,0x80000000,63,2,136,NULL,'140',NULL,NULL,'bonus bVit,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28415,'Greater_Mackerel_Talisman','Greater Mackerel Talisman',4,0,NULL,100,NULL,1,NULL,1,0x80000000,63,2,136,NULL,'175',NULL,NULL,'bonus bVit,3;',NULL,NULL); @@ -11576,13 +11586,13 @@ REPLACE INTO `item_db_re` VALUES (28706,'Dagger_of_Vicious_Mind','Dagger of Vici REPLACE INTO `item_db_re` VALUES (28900,'Guardsmen\'s_Shield','Guardsmen\'s Shield',4,20,NULL,3000,NULL,30,NULL,1,0xFFFFFFFF,63,2,32,NULL,'100',1,1,'.@r = getrefine(); skill "LG_SHIELDSPELL",1; bonus3 bAutoSpellWhenHit,"HP_ASSUMPTIO",3,(10+(.@r*10)); bonus bDef,(.@r*10); bonus bMdef,.@r;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28901,'Cursed_Mad_Bunny','Cursed Mad Bunny',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,32,NULL,'1',1,1,'bonus bAspd,3; bonus2 bAddRace,RC_All,5; bonus2 bMagicAddRace,RC_All,5; bonus bShortWeaponDamageReturn,10; autobonus2 "{ bonus bMagicDamageReturn,60; }",10,2000,BF_MAGIC,"{ specialeffect2 EF_WIND; }"; .@r = getrefine(); if(.@r>=7) { bonus bBaseAtk,5; bonus bMatk,5; } if(.@r>=9) { bonus bBaseAtk,15; bonus bMatk,15; } if(.@r>=12) { bonus bCritical,10; bonus bNoCastCancel,0; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28902,'Mad_Bunny_','Mad Bunny',4,20,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,63,2,32,NULL,'1',1,1,'bonus2 bAddRace,RC_All,5; bonus2 bMagicAddRace,RC_All,5; bonus bShortWeaponDamageReturn,10; autobonus2 "{ bonus bMagicDamageReturn,60; }",10,2000,BF_MAGIC,"{ specialeffect2 EF_WIND; }"; .@r = getrefine(); if(.@r>=7) { bonus bBaseAtk,5; bonus bMatk,5; } if(.@r>=9) { bonus bBaseAtk,15; bonus bMatk,15; } if(.@r>=12) { bonus bCritical,10; bonus bNoCastCancel,0; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28903,'Scutum','Scutum',4,0,NULL,500,NULL,1,NULL,1,0xFFFFFFFF,63,2,32,1,'1',1,NULL,'.@r = getrefine(); bonus bFlee,5+(.@r*3); bonus bFlee2,1+(.@r*2); if (.@r > 10) { bonus bMaxHPrate,10; bonus bMaxSPrate,10; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28903,'Scutum','Scutum',4,0,NULL,500,NULL,1,NULL,1,0xFFFFFFFF,63,2,32,NULL,'1',1,1,'.@r = getrefine(); bonus bFlee,5+(.@r*3); bonus bFlee2,1+(.@r*2); if (.@r > 10) { bonus bMaxHPrate,10; bonus bMaxSPrate,10; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28904,'Unity_Guard','Unity Guard',4,20,NULL,300,NULL,60,NULL,1,0xFFFFFFFF,63,2,32,NULL,'100',1,1,'if(BaseLevel<100) { bonus bDef,12*getrefine(); }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28905,'Unity_Buckler','Unity Buckler',4,20,NULL,300,NULL,60,NULL,1,0xFFFFFFFF,63,2,32,NULL,'100',1,1,'if(BaseLevel<100) { bonus bMaxSPrate,2*getrefine(); }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28906,'Shield_Of_Flame','Shield Of Flame',4,0,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,1,'90',1,NULL,'bonus2 bSubEle,Ele_Fire,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28907,'Shield_Of_Gust','Shield Of Gust',4,0,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,1,'90',1,NULL,'bonus2 bSubEle,Ele_Wind,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28908,'Shield_Of_Water','Shield Of Water',4,0,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,1,'90',1,NULL,'bonus2 bSubEle,Ele_Water,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (28909,'Shield_Of_Earth','Shield Of Earth',4,0,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,1,'90',1,NULL,'bonus2 bSubEle,Ele_Earth,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28906,'Shield_Of_Flame','Shield Of Flame',4,0,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,NULL,'90',1,1,'bonus2 bSubEle,Ele_Fire,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28907,'Shield_Of_Gust','Shield Of Gust',4,0,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,NULL,'90',1,1,'bonus2 bSubEle,Ele_Wind,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28908,'Shield_Of_Water','Shield Of Water',4,0,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,NULL,'90',1,1,'bonus2 bSubEle,Ele_Water,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28909,'Shield_Of_Earth','Shield Of Earth',4,0,NULL,500,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,NULL,'90',1,1,'bonus2 bSubEle,Ele_Earth,25; .@r = getrefine(); if(.@r > 4) { bonus bAspd,1+((.@r > 6) ? 1 : 0); }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28910,'Rectangular_Large_Sleeve','Rectangular Large Sleeve',4,20,NULL,800,NULL,80,NULL,1,0xFFFFFFFF,63,2,32,NULL,'100',1,1,'bonus bLongAtkDef,5; .@r = getrefine(); if(.@r>=5) { bonus bLongAtkDef,5; } if(.@r>=7) { bonus bLongAtkDef,10; } if(.@r>=9) { bonus bLongAtkDef,15; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28913,'Ultralight_Magic_Shield','Ultralight Magic Shield',4,20,NULL,100,NULL,50,NULL,1,0xFFFFFFFF,63,2,32,NULL,'100',1,1,'bonus bAspdRate,5; bonus2 bIgnoreDefClassRate,Class_Normal,10; bonus2 bSubEle,Ele_Neutral,5; .@r = getrefine(); if(.@r>=7) { bonus2 bIgnoreDefClassRate,Class_Normal,2; bonus bAspdRate,2; } if(.@r>=9) { bonus2 bIgnoreDefClassRate,Class_Normal,3; bonus bAspdRate,3; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28915,'Bunker_Shield','Bunker Shield',4,20,NULL,3500,NULL,90,NULL,1,0xFFFFFFFF,63,2,32,NULL,'50',1,1,'bonus2 bAddRace,RC_All,4; bonus bAspdRate,5; .@r = getrefine(); if(.@r>=5) { bonus2 bAddRace,RC_All,.@r; }',NULL,NULL); @@ -11591,6 +11601,18 @@ REPLACE INTO `item_db_re` VALUES (28920,'Diamond_Shield','Diamond Shield',4,20,N #=================================================================== # Enchantment stones #=================================================================== +REPLACE INTO `item_db_re` VALUES (29000,'Rune_of_Intellect_Lv_1','Rune of Intellect Lv 1',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bInt,5; } if (.@r>=10) { bonus bMatkRate,5; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29001,'Rune_of_Intellect_Lv_2','Rune of Intellect Lv 2',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bInt,6; } if (.@r>=11) { bonus bInt,1; bonus bMatkRate,7; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29002,'Rune_of_Intellect_Lv_3','Rune of Intellect Lv 3',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bInt,7; } if (.@r>=12) { bonus bInt,1; bonus bMatkRate,8; } if (.@r>=13) { bonus bInt,1; bonus bMatkRate,2; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29003,'Rune_of_Dexterity_Lv_1','Rune of Dexterity Lv 1',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bDex,5; } if (.@r>=10) { bonus bLongAtkRate,5; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29004,'Rune_of_Dexterity_Lv_2','Rune of Dexterity Lv 2',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bDex,6; } if (.@r>=11) { bonus bDex,1; bonus bLongAtkRate,7; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29005,'Rune_of_Dexterity_Lv_3','Rune of Dexterity Lv 3',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bDex,7; } if (.@r>=12) { bonus bDex,1; bonus bLongAtkRate,8; } if (.@r>=13) { bonus bDex,1; bonus bLongAtkRate,2; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29006,'Rune_of_Luck_Lv_1','Rune of Luck Lv 1',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bLuk,5; } if (.@r>=10) { bonus bCritAtkRate,5; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29007,'Rune_of_Luck_Lv_2','Rune of Luck Lv 2',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bLuk,6; } if (.@r>=11) { bonus bLuk,1; bonus bCritAtkRate,7; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29008,'Rune_of_Luck_Lv_3','Rune of Luck Lv 3',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bLuk,7; } if (.@r>=12) { bonus bLuk,1; bonus bCritAtkRate,8; } if (.@r>=13) { bonus bLuk,1; bonus bCritAtkRate,6; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29009,'Rune_of_Vitality_Lv_1','Rune of Vitality Lv 1',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bVit,5; } if (.@r>=10) { bonus bMaxHPrate,5; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29010,'Rune_of_Vitality_Lv_2','Rune of Vitality Lv 2',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bVit,6; } if (.@r>=11) { bonus bVit,1; bonus bMaxHPrate,7; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (29011,'Rune_of_Vitality_Lv_3','Rune of Vitality Lv 3',6,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'.@r = getrefine(); if (.@r>=7) { bonus bVit,7; } if (.@r>=12) { bonus bVit,1; bonus bMaxHPrate,8; } if (.@r>=13) { bonus bVit,1; bonus bMaxHPrate,2; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (29061,'Ambition1Lv','Ambition1Lv',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus2 bAddClass,Class_All,3; bonus bHit,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (29062,'Ambition2Lv','Ambition2Lv',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus2 bAddClass,Class_All,6; bonus bHit,6;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (29063,'Ambition3Lv','Ambition3Lv',6,10,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'bonus2 bAddClass,Class_All,9; bonus bHit,9;',NULL,NULL); diff --git a/sql-files/main.sql b/sql-files/main.sql index cc58bc690f..78cff49c03 100644 --- a/sql-files/main.sql +++ b/sql-files/main.sql @@ -24,6 +24,29 @@ CREATE TABLE IF NOT EXISTS `acc_reg_str` ( KEY `account_id` (`account_id`) ) ENGINE=MyISAM; +-- +-- Table structure for table `achievement` +-- + +CREATE TABLE IF NOT EXISTS `achievement` ( + `char_id` int(11) unsigned NOT NULL default '0', + `id` bigint(11) unsigned NOT NULL, + `count1` mediumint(8) unsigned NOT NULL default '0', + `count2` mediumint(8) unsigned NOT NULL default '0', + `count3` mediumint(8) unsigned NOT NULL default '0', + `count4` mediumint(8) unsigned NOT NULL default '0', + `count5` mediumint(8) unsigned NOT NULL default '0', + `count6` mediumint(8) unsigned NOT NULL default '0', + `count7` mediumint(8) unsigned NOT NULL default '0', + `count8` mediumint(8) unsigned NOT NULL default '0', + `count9` mediumint(8) unsigned NOT NULL default '0', + `count10` mediumint(8) unsigned NOT NULL default '0', + `completed` datetime, + `rewarded` datetime, + PRIMARY KEY (`char_id`,`id`), + KEY `char_id` (`char_id`) +) ENGINE=MyISAM; + -- -- Table structure for table `auction` -- @@ -231,6 +254,8 @@ CREATE TABLE IF NOT EXISTS `char` ( `hotkey_rowshift` 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', + `show_equip` tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (`char_id`), UNIQUE KEY `name_key` (`name`), KEY `account_id` (`account_id`), diff --git a/sql-files/mob_db_re.sql b/sql-files/mob_db_re.sql index 819d47134c..faa3a614b0 100644 --- a/sql-files/mob_db_re.sql +++ b/sql-files/mob_db_re.sql @@ -2168,20 +2168,20 @@ REPLACE INTO `mob_db_re` VALUES (2936,'E_GHOSTRING','Ghostring','Ghostring',1,10 #2945,J_MUMMY #2946,J_ANUBIS #2947,J_EGGYRA -#2948,CURSED_SOLDIER -#2949,CURSED_SENTINEL -#2950,BROKEN_MIND -#2951,FLOATING_WORD -#2952,LIKE_LOVE -#2953,CURSED_MEMORY -#2954,COLORLESS_VOW -#2955,OLD_FRIENDSHIP -#2956,SWEET_SLAUGHTER -#2957,FORGOTTEN_NAME -#2958,FATAL_DAYS -#2959,TORTUROUS_REDEEMER +REPLACE INTO `mob_db_re` VALUES (2948,'CURSED_SOLDIER','Cursed Soldier','Cursed Soldier',110,18574,1,1907,1851,9,1258,1791,85,35,81,50,64,56,178,23,10,12,1,1,69,0x3885,150,1960,576,420,0,0,0,0,0,0,0,6672,1000,957,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2949,'CURSED_SENTINEL','Cursed Sentinel','Cursed Sentinel',110,14099,1,1634,1346,2,1347,1906,84,41,120,65,66,41,107,26,10,12,2,7,67,0x3885,175,914,1344,384,0,0,0,0,0,0,0,6672,1000,934,2500,1097,1500,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2950,'BROKEN_MIND','Broken Mind','Broken Mind',110,13520,1,1545,1557,1,1259,1799,67,27,69,37,36,10,64,5,10,12,1,6,67,0x2003885,200,920,720,200,0,0,0,0,0,0,0,6672,1000,6086,2500,683,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2951,'FLOATING_WORD','Floating Word','Floating Word',110,11276,1,1166,1034,1,1080,1509,93,40,111,90,60,70,139,65,10,12,0,6,68,0x2003885,150,972,648,432,0,0,0,0,0,0,0,6672,1000,938,3000,947,2500,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2952,'LIKE_LOVE','Like Love','Like Love',110,14008,1,1505,1667,2,1182,1183,64,51,62,27,25,55,102,20,10,12,1,6,64,0x2003885,150,1056,1056,336,0,0,0,0,0,0,0,6672,1000,929,2500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2953,'CURSED_MEMORY','Cursed Memory','Cursed Memory',110,18045,1,1802,1623,1,1310,1867,89,28,87,39,58,5,82,10,10,12,1,1,69,0x3885,350,1768,500,192,0,0,0,0,0,0,0,6672,1000,957,3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2954,'COLORLESS_VOW','Colorless Vow','Colorless Vow',110,19194,0,1939,1881,1,1478,2121,95,41,84,35,60,20,85,15,10,12,1,1,69,0x3885,350,0,500,0,0,0,0,0,0,0,0,6672,1000,958,3500,1063,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2955,'OLD_FRIENDSHIP','Old Friendship','Old Friendship',110,12614,0,1306,1328,0,1147,1638,78,5,56,12,19,11,30,10,10,12,1,1,49,0x3885,250,2460,912,0,0,0,0,0,0,0,0,6672,1000,932,3500,1098,2500,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2956,'SWEET_SLAUGHTER','Sweet Slaughter','Sweet Slaughter',110,13986,0,1960,1587,0,1216,1709,125,10,121,48,40,31,125,32,10,12,2,1,29,0x3885,350,1538,1000,396,0,0,0,0,0,0,0,6672,1000,929,2000,682,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2957,'FORGOTTEN_NAME','Forgotten Name','Forgotten Name',120,19546,1,1505,1485,2,1093,1520,111,38,121,29,51,43,100,3,10,12,1,1,49,0x3885,155,1169,1152,480,0,0,0,0,0,0,0,6672,1500,682,5000,683,5000,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2958,'FATAL_DAYS','Fatal Days','Fatal Days',120,24240,1,2052,2026,2,1025,1428,72,15,100,71,63,85,115,37,10,12,1,6,67,0x2003885,190,720,384,480,0,0,0,0,0,0,0,6672,1500,1050,2500,1038,2500,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +REPLACE INTO `mob_db_re` VALUES (2959,'TORTUROUS_REDEEMER','Torturous Redeemer','Torturous Redeemer',120,103342,0,10590,8378,0,1253,1753,144,28,133,69,72,55,165,44,10,12,1,7,62,0x3885,200,672,420,360,0,0,0,0,0,0,0,6672,10000,6672,10000,923,2000,0,0,0,0,0,0,0,0,0,0,0,0,0,0); #2960,MM_FLAMECROSS -#2961,E_TORTUROUS_REDEEMER +REPLACE INTO `mob_db_re` VALUES (2961,'E_TORTUROUS_REDEEMER','Torturous Redeemer','Torturous Redeemer',120,103342,1,10590,8378,1,1253,1753,144,28,133,69,72,55,165,44,10,12,1,7,62,0x3885,200,672,420,360,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); #2962,E_DEVILING #2963,WOODIE #2964,EXP_1000 @@ -3100,7 +3100,17 @@ REPLACE INTO `mob_db_re` VALUES (3508,'DR_EGGRING_G','Eggring','Eggring',20,220, #3874,AB_MOB_048 #3875,AB_MOB_049 #3876,AB_MOB_050 - +#3877,E_NYAIL_PIG +#3878,E_PIT +#3879,E_SEA_WORMS +#3880,E_SMALL_SWIRL +#3881,E_RIPE_WATERMELON +#3882,E_MD_NYAILO +#3883,E_MD_NYAILO_LEG +#3884,E_MD_S_TREASURE_BOX +#3885,E_MD_B_TREASURE_BOX +#3886,E_MD_BOX_PUPPET +#3887,E_MD_DEPRESS_SOUL #3888,TW_I_QUEEN_SCARABA #3889,TW_GIOIA #3890,TW_TIMEHOLDER @@ -3118,3 +3128,42 @@ REPLACE INTO `mob_db_re` VALUES (3508,'DR_EGGRING_G','Eggring','Eggring',20,220, #3902,MD_ORC_LORD #3903,MD_ORC_FLOWER +#3910,E_EMPEL_1 +#3911,E_GIBBET +#3912,E_LOLI_RURI +#3913,E_DULLAHAN +#3914,E_BLOODY_MURDERER +#3915,E_EMPEL_1B +#3916,JP_E_MONSTER_74 +#3917,JP_E_MONSTER_75 +#3918,JP_E_MONSTER_76 +#3919,JP_E_MONSTER_77 +#3920,JP_E_MONSTER_78 +#3921,JP_E_MONSTER_79 +#3922,JP_E_MONSTER_80 +#3923,JP_E_MONSTER_81 +#3924,JP_E_MONSTER_82 +#3925,JP_E_MONSTER_83 +#3926,JP_E_MONSTER_84 +#3927,JP_E_MONSTER_85 +#3928,JP_E_MONSTER_86 +#3929,JP_E_MONSTER_87 +#3930,JP_E_MONSTER_88 +#3931,JP_E_MONSTER_89 +#3932,JP_E_MONSTER_90 +#3933,JP_E_MONSTER_91 +#3934,JP_E_MONSTER_92 +#3935,JP_E_MONSTER_93 +#3936,JP_E_MONSTER_94 +#3937,JP_E_MONSTER_95 +#3938,JP_E_MONSTER_96 +#3939,JP_E_MONSTER_97 +#3940,JP_E_MONSTER_98 +#3941,JP_E_MONSTER_99 +#3942,JP_E_MONSTER_100 +#3943,JP_E_MONSTER_101 +#3944,JP_E_MONSTER_102 +#3945,JP_E_MONSTER_103 +#3946,JP_E_MONSTER_104 +#3947,JP_E_MONSTER_105 + diff --git a/sql-files/upgrades/upgrade_20140104.sql b/sql-files/upgrades/upgrade_20140104.sql deleted file mode 100644 index a1f181172a..0000000000 --- a/sql-files/upgrades/upgrade_20140104.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `item_db_re` CHANGE `atk:matk` `atk:matk` VARCHAR( 11 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL diff --git a/sql-files/upgrades/upgrade_20140114.sql b/sql-files/upgrades/upgrade_20140114.sql deleted file mode 100644 index 57dd2a5389..0000000000 --- a/sql-files/upgrades/upgrade_20140114.sql +++ /dev/null @@ -1,20 +0,0 @@ -CREATE TABLE IF NOT EXISTS `vending_items` ( - `vending_id` int(10) unsigned NOT NULL, - `index` smallint(5) unsigned NOT NULL, - `cartinventory_id` int(10) unsigned NOT NULL, - `amount` smallint(5) unsigned NOT NULL, - `price` int(10) unsigned NOT NULL -) ENGINE=MyISAM; - -CREATE TABLE IF NOT EXISTS `vendings` ( - `id` int(10) unsigned NOT NULL, - `account_id` int(11) unsigned NOT NULL, - `char_id` int(10) unsigned NOT NULL, - `sex` enum('F','M') NOT NULL DEFAULT 'M', - `map` varchar(20) NOT NULL, - `x` smallint(5) unsigned NOT NULL, - `y` smallint(5) unsigned NOT NULL, - `title` varchar(80) NOT NULL, - `autotrade` tinyint(4) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM; diff --git a/sql-files/upgrades/upgrade_20140205.sql b/sql-files/upgrades/upgrade_20140205.sql deleted file mode 100644 index a254cb6891..0000000000 --- a/sql-files/upgrades/upgrade_20140205.sql +++ /dev/null @@ -1,21 +0,0 @@ -CREATE TABLE IF NOT EXISTS `buyingstore_items` ( - `buyingstore_id` int(10) unsigned NOT NULL, - `index` smallint(5) unsigned NOT NULL, - `item_id` int(10) unsigned NOT NULL, - `amount` smallint(5) unsigned NOT NULL, - `price` int(10) unsigned NOT NULL -) ENGINE=MyISAM; - -CREATE TABLE IF NOT EXISTS `buyingstores` ( - `id` int(10) unsigned NOT NULL, - `account_id` int(11) unsigned NOT NULL, - `char_id` int(10) unsigned NOT NULL, - `sex` enum('F','M') NOT NULL DEFAULT 'M', - `map` varchar(20) NOT NULL, - `x` smallint(5) unsigned NOT NULL, - `y` smallint(5) unsigned NOT NULL, - `title` varchar(80) NOT NULL, - `limit` int(10) unsigned NOT NULL, - `autotrade` tinyint(4) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM; diff --git a/sql-files/upgrades/upgrade_20140523.sql b/sql-files/upgrades/upgrade_20140523.sql deleted file mode 100644 index 2288d7456b..0000000000 --- a/sql-files/upgrades/upgrade_20140523.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `char` ADD `font` tinyint(3) unsigned NOT NULL default '0'; diff --git a/sql-files/upgrades/upgrade_20140612.sql b/sql-files/upgrades/upgrade_20140612.sql deleted file mode 100644 index 0c4d6da7ad..0000000000 --- a/sql-files/upgrades/upgrade_20140612.sql +++ /dev/null @@ -1,118 +0,0 @@ -UPDATE `auction` SET `card0` = 256 WHERE `card0` = -256; -UPDATE `cart_inventory` SET `card0` = 256 WHERE `card0` = -256; -UPDATE `guild_storage` SET `card0` = 256 WHERE `card0` = -256; -UPDATE `inventory` SET `card0` = 256 WHERE `card0` = -256; -UPDATE `mail` SET `card0` = 256 WHERE `card0` = -256; -UPDATE `storage` SET `card0` = 256 WHERE `card0` = -256; - -UPDATE `auction` SET `card1` = (65536 + `card1`) WHERE `card1` < 0 AND `card0` IN(254,255); -UPDATE `auction` SET `card2` = (65536 + `card2`) WHERE `card2` < 0 AND `card0` IN(254,255); -UPDATE `auction` SET `card3` = (65536 + `card3`) WHERE `card3` < 0 AND `card0` IN(254,255); - -UPDATE `cart_inventory` SET `card1` = (65536 + `card1`) WHERE `card1` < 0 AND `card0` IN(254,255); -UPDATE `cart_inventory` SET `card2` = (65536 + `card2`) WHERE `card2` < 0 AND `card0` IN(254,255); -UPDATE `cart_inventory` SET `card3` = (65536 + `card3`) WHERE `card3` < 0 AND `card0` IN(254,255); - -UPDATE `guild_storage` SET `card1` = (65536 + `card1`) WHERE `card1` < 0 AND `card0` IN(254,255); -UPDATE `guild_storage` SET `card2` = (65536 + `card2`) WHERE `card2` < 0 AND `card0` IN(254,255); -UPDATE `guild_storage` SET `card3` = (65536 + `card3`) WHERE `card3` < 0 AND `card0` IN(254,255); - -UPDATE `inventory` SET `card1` = (65536 + `card1`) WHERE `card1` < 0 AND `card0` IN(254,255); -UPDATE `inventory` SET `card2` = (65536 + `card2`) WHERE `card2` < 0 AND `card0` IN(254,255); -UPDATE `inventory` SET `card3` = (65536 + `card3`) WHERE `card3` < 0 AND `card0` IN(254,255); - -UPDATE `mail` SET `card1` = (65536 + `card1`) WHERE `card1` < 0 AND `card0` IN(254,255); -UPDATE `mail` SET `card2` = (65536 + `card2`) WHERE `card2` < 0 AND `card0` IN(254,255); -UPDATE `mail` SET `card3` = (65536 + `card3`) WHERE `card3` < 0 AND `card0` IN(254,255); - -UPDATE `storage` SET `card1` = (65536 + `card1`) WHERE `card1` < 0 AND `card0` IN(254,255); -UPDATE `storage` SET `card2` = (65536 + `card2`) WHERE `card2` < 0 AND `card0` IN(254,255); -UPDATE `storage` SET `card3` = (65536 + `card3`) WHERE `card3` < 0 AND `card0` IN(254,255); - -ALTER TABLE `auction` MODIFY `nameid` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `auction` MODIFY `card0` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `auction` MODIFY `card1` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `auction` MODIFY `card2` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `auction` MODIFY `card3` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `cart_inventory` MODIFY `nameid` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `cart_inventory` MODIFY `card0` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `cart_inventory` MODIFY `card1` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `cart_inventory` MODIFY `card2` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `cart_inventory` MODIFY `card3` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `guild_storage` MODIFY `nameid` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `guild_storage` MODIFY `card0` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `guild_storage` MODIFY `card1` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `guild_storage` MODIFY `card2` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `guild_storage` MODIFY `card3` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `inventory` MODIFY `nameid` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `inventory` MODIFY `card0` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `inventory` MODIFY `card1` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `inventory` MODIFY `card2` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `inventory` MODIFY `card3` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mail` MODIFY `nameid` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mail` MODIFY `card0` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mail` MODIFY `card1` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mail` MODIFY `card2` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mail` MODIFY `card3` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `pet` MODIFY `egg_id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `storage` MODIFY `nameid` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `storage` MODIFY `card0` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `storage` MODIFY `card1` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `storage` MODIFY `card2` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `storage` MODIFY `card3` smallint(5) unsigned NOT NULL default '0'; - -ALTER TABLE `mob_db` MODIFY `MVP1id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `MVP2id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `MVP3id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `Drop1id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `Drop2id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `Drop3id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `Drop4id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `Drop5id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `Drop6id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `Drop7id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `Drop8id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `Drop9id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db` MODIFY `DropCardid` smallint(5) unsigned NOT NULL default '0'; - -ALTER TABLE `mob_db2` MODIFY `MVP1id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `MVP2id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `MVP3id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `Drop1id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `Drop2id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `Drop3id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `Drop4id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `Drop5id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `Drop6id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `Drop7id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `Drop8id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `Drop9id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2` MODIFY `DropCardid` smallint(5) unsigned NOT NULL default '0'; - -ALTER TABLE `mob_db2_re` MODIFY `MVP1id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `MVP2id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `MVP3id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `Drop1id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `Drop2id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `Drop3id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `Drop4id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `Drop5id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `Drop6id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `Drop7id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `Drop8id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `Drop9id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db2_re` MODIFY `DropCardid` smallint(5) unsigned NOT NULL default '0'; - -ALTER TABLE `mob_db_re` MODIFY `MVP1id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `MVP2id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `MVP3id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `Drop1id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `Drop2id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `Drop3id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `Drop4id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `Drop5id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `Drop6id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `Drop7id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `Drop8id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `Drop9id` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mob_db_re` MODIFY `DropCardid` smallint(5) unsigned NOT NULL default '0'; diff --git a/sql-files/upgrades/upgrade_20140612_log.sql b/sql-files/upgrades/upgrade_20140612_log.sql deleted file mode 100644 index a42a158a0a..0000000000 --- a/sql-files/upgrades/upgrade_20140612_log.sql +++ /dev/null @@ -1,12 +0,0 @@ -UPDATE `picklog` SET `card0` = 256 WHERE `card0` = -256; - -UPDATE `picklog` SET `card1` = (65536 + `card1`) WHERE `card1` < 0 AND `card0` IN(254,255); -UPDATE `picklog` SET `card2` = (65536 + `card2`) WHERE `card2` < 0 AND `card0` IN(254,255); -UPDATE `picklog` SET `card3` = (65536 + `card3`) WHERE `card3` < 0 AND `card0` IN(254,255); - -ALTER TABLE `picklog` MODIFY `nameid` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `picklog` MODIFY `card0` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `picklog` MODIFY `card1` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `picklog` MODIFY `card2` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `picklog` MODIFY `card3` smallint(5) unsigned NOT NULL default '0'; -ALTER TABLE `mvplog` MODIFY `prize` smallint(5) unsigned NOT NULL default '0'; diff --git a/sql-files/upgrades/upgrade_20140616.sql b/sql-files/upgrades/upgrade_20140616.sql deleted file mode 100644 index 0430d2b70c..0000000000 --- a/sql-files/upgrades/upgrade_20140616.sql +++ /dev/null @@ -1,6 +0,0 @@ -UPDATE `auction` SET `card0` = 256 WHERE `card0` = 65280; -UPDATE `cart_inventory` SET `card0` = 256 WHERE `card0` = 65280; -UPDATE `guild_storage` SET `card0` = 256 WHERE `card0` = 65280; -UPDATE `inventory` SET `card0` = 256 WHERE `card0` = 65280; -UPDATE `mail` SET `card0` = 256 WHERE `card0` = 65280; -UPDATE `storage` SET `card0` = 256 WHERE `card0` = 65280; diff --git a/sql-files/upgrades/upgrade_20140627.sql b/sql-files/upgrades/upgrade_20140627.sql deleted file mode 100644 index 2e50d4a424..0000000000 --- a/sql-files/upgrades/upgrade_20140627.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `pet` CHANGE `incuvate` `incubate` int(11) unsigned NOT NULL default '0'; diff --git a/sql-files/upgrades/upgrade_20140713_log.sql b/sql-files/upgrades/upgrade_20140713_log.sql deleted file mode 100644 index b213a48db3..0000000000 --- a/sql-files/upgrades/upgrade_20140713_log.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `zenylog` CHANGE `type` `type` ENUM('T','V','P','M','S','N','D','C','A','E','I','B','K') NOT NULL DEFAULT 'S'; diff --git a/sql-files/upgrades/upgrade_20140723.sql b/sql-files/upgrades/upgrade_20140723.sql deleted file mode 100644 index d215bd115c..0000000000 --- a/sql-files/upgrades/upgrade_20140723.sql +++ /dev/null @@ -1,7 +0,0 @@ -ALTER TABLE `vendings` ADD `body_direction` CHAR( 1 ) NOT NULL DEFAULT '4', -ADD `head_direction` CHAR( 1 ) NOT NULL DEFAULT '0', -ADD `sit` CHAR( 1 ) NOT NULL DEFAULT '1'; - -ALTER TABLE `buyingstores` ADD `body_direction` CHAR( 1 ) NOT NULL DEFAULT '4', -ADD `head_direction` CHAR( 1 ) NOT NULL DEFAULT '0', -ADD `sit` CHAR( 1 ) NOT NULL DEFAULT '1'; diff --git a/sql-files/upgrades/upgrade_20140822.sql b/sql-files/upgrades/upgrade_20140822.sql deleted file mode 100644 index bd8c13d5ff..0000000000 --- a/sql-files/upgrades/upgrade_20140822.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `char` ADD COLUMN `uniqueitem_counter` bigint(20) NOT NULL AFTER `font`; diff --git a/sql-files/upgrades/upgrade_20140826.sql b/sql-files/upgrades/upgrade_20140826.sql deleted file mode 100644 index 9235f4a1e1..0000000000 --- a/sql-files/upgrades/upgrade_20140826.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `char` MODIFY COLUMN `uniqueitem_counter` int(11) unsigned NOT NULL default '0'; diff --git a/sql-files/upgrades/upgrade_20140915.sql b/sql-files/upgrades/upgrade_20140915.sql deleted file mode 100644 index 136c9b245d..0000000000 --- a/sql-files/upgrades/upgrade_20140915.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `mail` ADD `bound` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0'; diff --git a/sql-files/upgrades/upgrade_20140915_log.sql b/sql-files/upgrades/upgrade_20140915_log.sql deleted file mode 100644 index 222e406d80..0000000000 --- a/sql-files/upgrades/upgrade_20140915_log.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `picklog` ADD `bound` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0'; diff --git a/sql-files/upgrades/upgrade_20150103_log.sql b/sql-files/upgrades/upgrade_20150103_log.sql deleted file mode 100644 index 98fda3d397..0000000000 --- a/sql-files/upgrades/upgrade_20150103_log.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `picklog` MODIFY `type` ENUM('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','$') NOT NULL DEFAULT 'S'; diff --git a/sql-files/upgrades/upgrade_20150131.sql b/sql-files/upgrades/upgrade_20150131.sql deleted file mode 100644 index 6ab8d692da..0000000000 --- a/sql-files/upgrades/upgrade_20150131.sql +++ /dev/null @@ -1,6 +0,0 @@ -ALTER TABLE `bonus_script` MODIFY COLUMN `char_id` INT(11) UNSIGNED NOT NULL; -ALTER TABLE `bonus_script` MODIFY COLUMN `script` TEXT NOT NULL; -ALTER TABLE `bonus_script` MODIFY COLUMN `tick` INT(11) UNSIGNED NOT NULL DEFAULT '0'; -ALTER TABLE `bonus_script` MODIFY COLUMN `flag` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0'; -ALTER TABLE `bonus_script` MODIFY COLUMN `type` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0'; -ALTER TABLE `bonus_script` MODIFY COLUMN `icon` SMALLINT(3) NOT NULL DEFAULT '-1'; diff --git a/sql-files/upgrades/upgrade_20150211_skillset.sql b/sql-files/upgrades/upgrade_20150211_skillset.sql deleted file mode 100644 index e60ea411aa..0000000000 --- a/sql-files/upgrades/upgrade_20150211_skillset.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Resetting all `lv` of skills that has `flag` >= 3 (the skill that its `learned_lv` has been changed by script or special case by `learned_lv` + SKILL_FLAG_REPLACED_LV_0) --- If there's ALL_INCCARRY and ALL_BUYING_STORE, set the `flag` to SKILL_FLAG_PERM_GRANTED (new value is 3), those are exclusive skills given in our official scripts! - -UPDATE `skill` SET `lv` = `flag` - 3 WHERE `flag` >= 3; -UPDATE `skill` SET `flag` = 0 WHERE `flag` >= 3; -UPDATE `skill` SET `flag` = 3 WHERE `id` = 681 OR `id` = 2535; diff --git a/sql-files/upgrades/upgrade_20150327_market.sql b/sql-files/upgrades/upgrade_20150327_market.sql deleted file mode 100644 index 8ca000ef16..0000000000 --- a/sql-files/upgrades/upgrade_20150327_market.sql +++ /dev/null @@ -1,12 +0,0 @@ --- --- Table `market` for market shop persistency --- - -CREATE TABLE IF NOT EXISTS `market` ( - `name` varchar(32) NOT NULL DEFAULT '', - `nameid` SMALLINT(5) UNSIGNED NOT NULL, - `price` INT(11) UNSIGNED NOT NULL, - `amount` SMALLINT(5) UNSIGNED NOT NULL, - `flag` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0', - PRIMARY KEY (`name`,`nameid`) -) ENGINE = MyISAM; diff --git a/sql-files/upgrades/upgrade_20150408.sql b/sql-files/upgrades/upgrade_20150408.sql deleted file mode 100644 index 6e251584d9..0000000000 --- a/sql-files/upgrades/upgrade_20150408.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Move `bank_vault` value from `login` to `global_reg_value`. --- Please be careful if you're running multi char-server, better you do this step manually to move the `bank_vault` --- to proper `global_reg_value` tables of char-servers used. -INSERT INTO `global_reg_value` (`char_id`, `str`, `value`, `type`, `account_id`) - SELECT '0', '#BANKVAULT', `bank_vault`, '2', `account_id` - FROM `login` WHERE `bank_vault` != 0; - --- Remove `bank_vault` from `login` table, login-server side. -ALTER TABLE `login` DROP `bank_vault`; diff --git a/sql-files/upgrades/upgrade_20150408_log.sql b/sql-files/upgrades/upgrade_20150408_log.sql deleted file mode 100644 index 0f8d6ed7cc..0000000000 --- a/sql-files/upgrades/upgrade_20150408_log.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `picklog` CHANGE `type` `type` ENUM('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','$','F') NOT NULL DEFAULT 'P'; diff --git a/sql-files/upgrades/upgrade_20150619.sql b/sql-files/upgrades/upgrade_20150619.sql deleted file mode 100644 index 47a3ee8baf..0000000000 --- a/sql-files/upgrades/upgrade_20150619.sql +++ /dev/null @@ -1,68 +0,0 @@ -ALTER TABLE `char` ADD COLUMN `sex` ENUM('M','F','U') NOT NULL default 'U'; - --- --- Table structure for `db_roulette` --- - -CREATE TABLE `db_roulette` ( - `index` int(11) NOT NULL default '0', - `level` smallint(5) unsigned NOT NULL, - `item_id` smallint(5) unsigned NOT NULL, - `amount` smallint(5) unsigned NOT NULL DEFAULT '1', - `flag` smallint(5) unsigned NOT NULL DEFAULT '1', - PRIMARY KEY (`index`) -) ENGINE=MyISAM; - --- ---------------------------- --- Records of db_roulette --- ---------------------------- --- Info: http://ro.gnjoy.com/news/update/View.asp?seq=157&curpage=1 - -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 0, 1, 675, 1, 1 ); -- Silver_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 1, 1, 671, 1, 0 ); -- Gold_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 2, 1, 678, 1, 0 ); -- Poison_Bottle -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 3, 1, 604, 1, 0 ); -- Branch_Of_Dead_Tree -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 4, 1, 522, 1, 0 ); -- Fruit_Of_Mastela -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 5, 1, 671, 1, 0 ); -- Old_Ore_Box -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 6, 1, 12523, 1, 0 ); -- E_Inc_Agi_10_Scroll -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 7, 1, 985, 1, 0 ); -- Elunium -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 8, 1, 984, 1, 0 ); -- Oridecon - -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 9, 2, 675, 1, 1 ); -- Silver_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 10, 2, 671, 1, 0 ); -- Gold_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 11, 2, 603, 1, 0 ); -- Old_Blue_Box -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 12, 2, 608, 1, 0 ); -- Seed_Of_Yggdrasil -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 13, 2, 607, 1, 0 ); -- Yggdrasilberry -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 14, 2, 12522, 1, 0 ); -- E_Blessing_10_Scroll -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 15, 2, 6223, 1, 0 ); -- Carnium -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 16, 2, 6224, 1, 0 ); -- Bradium - -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 17, 3, 675, 1, 1 ); -- Silver_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 18, 3, 671, 1, 0 ); -- Gold_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 19, 3, 12108, 1, 0 ); -- Bundle_Of_Magic_Scroll -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 20, 3, 617, 1, 0 ); -- Old_Violet_Box -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 21, 3, 12514, 1, 0 ); -- E_Abrasive -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 22, 3, 7444, 1, 0 ); -- Treasure_Box -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 23, 3, 969, 1, 0 ); -- Gold - -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 24, 4, 675, 1, 1 ); -- Silver_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 25, 4, 671, 1, 0 ); -- Gold_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 26, 4, 616, 1, 0 ); -- Old_Card_Album -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 27, 4, 12516, 1, 0 ); -- E_Small_Life_Potion -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 28, 4, 22777, 1, 0 ); -- Gift_Buff_Set -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 29, 4, 6231, 1, 0 ); -- Guarantee_Weapon_6Up - -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 30, 5, 671, 1, 1 ); -- Gold_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 31, 5, 12246, 1, 0 ); -- Magic_Card_Album -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 32, 5, 12263, 1, 0 ); -- Comp_Battle_Manual -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 33, 5, 671, 1, 0 ); -- Potion_Box -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 34, 5, 6235, 1, 0 ); -- Guarantee_Armor_6Up - -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 35, 6, 671, 1, 1 ); -- Gold_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 36, 6, 12766, 1, 0 ); -- Reward_Job_BM25 -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 37, 6, 6234, 1, 0 ); -- Guarantee_Armor_7Up -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 38, 6, 6233, 1, 0 ); -- Guarantee_Armor_8Up - -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 39, 7, 671, 1, 1 ); -- Gold_Coin -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 40, 7, 6233, 1, 0 ); -- Guarantee_Armor_8Up -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 41, 7, 6233, 1, 0 ); -- Guarantee_Armor_8Up // KRO lists this twice diff --git a/sql-files/upgrades/upgrade_20150619_log.sql b/sql-files/upgrades/upgrade_20150619_log.sql deleted file mode 100644 index c89434c2af..0000000000 --- a/sql-files/upgrades/upgrade_20150619_log.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `picklog` MODIFY `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','$','F','Y') NOT NULL default 'P'; diff --git a/sql-files/upgrades/upgrade_20150804_log.sql b/sql-files/upgrades/upgrade_20150804_log.sql deleted file mode 100644 index b06fb6cb85..0000000000 --- a/sql-files/upgrades/upgrade_20150804_log.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `picklog` CHANGE `type` `type` ENUM('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','$','F','Z') NOT NULL DEFAULT 'P'; diff --git a/sql-files/upgrades/upgrade_20150828.sql b/sql-files/upgrades/upgrade_20150828.sql deleted file mode 100644 index 22e605a4eb..0000000000 --- a/sql-files/upgrades/upgrade_20150828.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `char` ADD COLUMN `hotkey_rowshift` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0'; diff --git a/sql-files/upgrades/upgrade_20150831.sql b/sql-files/upgrades/upgrade_20150831.sql deleted file mode 100644 index 8ff80eab1c..0000000000 --- a/sql-files/upgrades/upgrade_20150831.sql +++ /dev/null @@ -1,66 +0,0 @@ -ALTER TABLE `mapreg` ADD PRIMARY KEY (`varname`, `index`); -ALTER TABLE `mapreg` DROP INDEX `varname`; -ALTER TABLE `mapreg` DROP INDEX `index`; -ALTER TABLE `mapreg` MODIFY `varname` varchar(32) binary NOT NULL; - -CREATE TABLE IF NOT EXISTS `acc_reg_num` ( - `account_id` int(11) unsigned NOT NULL default '0', - `key` varchar(32) binary NOT NULL default '', - `index` int(11) unsigned NOT NULL default '0', - `value` int(11) NOT NULL default '0', - PRIMARY KEY (`account_id`,`key`,`index`), - KEY `account_id` (`account_id`) -) ENGINE=MyISAM; - -CREATE TABLE IF NOT EXISTS `acc_reg_str` ( - `account_id` int(11) unsigned NOT NULL default '0', - `key` varchar(32) binary NOT NULL default '', - `index` int(11) unsigned NOT NULL default '0', - `value` varchar(254) NOT NULL default '0', - PRIMARY KEY (`account_id`,`key`,`index`), - KEY `account_id` (`account_id`) -) ENGINE=MyISAM; - -CREATE TABLE IF NOT EXISTS `char_reg_num` ( - `char_id` int(11) unsigned NOT NULL default '0', - `key` varchar(32) binary NOT NULL default '', - `index` int(11) unsigned NOT NULL default '0', - `value` int(11) NOT NULL default '0', - PRIMARY KEY (`char_id`,`key`,`index`), - KEY `char_id` (`char_id`) -) ENGINE=MyISAM; - -CREATE TABLE IF NOT EXISTS `char_reg_str` ( - `char_id` int(11) unsigned NOT NULL default '0', - `key` varchar(32) binary NOT NULL default '', - `index` int(11) unsigned NOT NULL default '0', - `value` varchar(254) NOT NULL default '0', - PRIMARY KEY (`char_id`,`key`,`index`), - KEY `char_id` (`char_id`) -) ENGINE=MyISAM; - -CREATE TABLE IF NOT EXISTS `global_acc_reg_num` ( - `account_id` int(11) unsigned NOT NULL default '0', - `key` varchar(32) binary NOT NULL default '', - `index` int(11) unsigned NOT NULL default '0', - `value` int(11) NOT NULL default '0', - PRIMARY KEY (`account_id`,`key`,`index`), - KEY `account_id` (`account_id`) -) ENGINE=MyISAM; - -CREATE TABLE IF NOT EXISTS `global_acc_reg_str` ( - `account_id` int(11) unsigned NOT NULL default '0', - `key` varchar(32) binary NOT NULL default '', - `index` int(11) unsigned NOT NULL default '0', - `value` varchar(254) NOT NULL default '0', - PRIMARY KEY (`account_id`,`key`,`index`), - KEY `account_id` (`account_id`) -) ENGINE=MyISAM; - -INSERT INTO `acc_reg_num` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 2 AND `str` NOT LIKE '%$'; -INSERT INTO `acc_reg_str` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 2 AND `str` LIKE '%$'; -INSERT INTO `char_reg_num` (`char_id`, `key`, `index`, `value`) SELECT `char_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 3 AND `str` NOT LIKE '%$'; -INSERT INTO `char_reg_str` (`char_id`, `key`, `index`, `value`) SELECT `char_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 3 AND `str` LIKE '%$'; -INSERT INTO `global_acc_reg_num` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 1 AND `str` NOT LIKE '%$'; -INSERT INTO `global_acc_reg_str` (`account_id`, `key`, `index`, `value`) SELECT `account_id`, `str`, 0, `value` FROM `global_reg_value` WHERE `type` = 1 AND `str` LIKE '%$'; -# DROP TABLE `global_reg_value`; diff --git a/sql-files/upgrades/upgrade_20150917_log.sql b/sql-files/upgrades/upgrade_20150917_log.sql deleted file mode 100644 index 15715a23f3..0000000000 --- a/sql-files/upgrades/upgrade_20150917_log.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `picklog` MODIFY `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','$','F','Z','Q') NOT NULL default 'P'; diff --git a/sql-files/upgrades/upgrade_20151230_log.sql b/sql-files/upgrades/upgrade_20151230_log.sql deleted file mode 100644 index dd2fe2f38f..0000000000 --- a/sql-files/upgrades/upgrade_20151230_log.sql +++ /dev/null @@ -1,19 +0,0 @@ --- --- Table structure for table `feedinglog` --- - -CREATE TABLE IF NOT EXISTS `feedinglog` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', - `char_id` INT(11) NOT NULL, - `target_id` INT(11) NOT NULL, - `target_class` SMALLINT(11) NOT NULL, - `type` ENUM('P','H','O') NOT NULL, -- P: Pet, H: Homunculus, O: Other - `intimacy` INT(11) UNSIGNED NOT NULL, - `item_id` SMALLINT(5) UNSIGNED NOT NULL, - `map` VARCHAR(11) NOT NULL, - `x` SMALLINT(5) UNSIGNED NOT NULL, - `y` SMALLINT(5) UNSIGNED NOT NULL, - PRIMARY KEY (`id`) -) ENGINE = MyISAM AUTO_INCREMENT = 1; - diff --git a/sql-files/upgrades/upgrade_20170727.sql b/sql-files/upgrades/upgrade_20170727.sql new file mode 100644 index 0000000000..f0dd3b6fc5 --- /dev/null +++ b/sql-files/upgrades/upgrade_20170727.sql @@ -0,0 +1,25 @@ +ALTER TABLE `char` + ADD COLUMN `title_id` int(11) unsigned NOT NULL default '0' AFTER `clan_id`; + +-- +-- Table structure for table `achievement` +-- + +CREATE TABLE IF NOT EXISTS `achievement` ( + `char_id` int(11) unsigned NOT NULL default '0', + `id` bigint(11) unsigned NOT NULL, + `count1` mediumint(8) unsigned NOT NULL default '0', + `count2` mediumint(8) unsigned NOT NULL default '0', + `count3` mediumint(8) unsigned NOT NULL default '0', + `count4` mediumint(8) unsigned NOT NULL default '0', + `count5` mediumint(8) unsigned NOT NULL default '0', + `count6` mediumint(8) unsigned NOT NULL default '0', + `count7` mediumint(8) unsigned NOT NULL default '0', + `count8` mediumint(8) unsigned NOT NULL default '0', + `count9` mediumint(8) unsigned NOT NULL default '0', + `count10` mediumint(8) unsigned NOT NULL default '0', + `completed` datetime, + `rewarded` datetime, + PRIMARY KEY (`char_id`,`id`), + KEY `char_id` (`char_id`) +) ENGINE=MyISAM; diff --git a/sql-files/upgrades/upgrade_20170806.sql b/sql-files/upgrades/upgrade_20170806.sql new file mode 100644 index 0000000000..041474e37d --- /dev/null +++ b/sql-files/upgrades/upgrade_20170806.sql @@ -0,0 +1,2 @@ +ALTER TABLE `char` + ADD COLUMN `show_equip` tinyint(3) unsigned NOT NULL default '0' AFTER `title_id`; diff --git a/src/char/Makefile.in b/src/char/Makefile.in index 1d3dfe9af0..1bd34581f9 100644 --- a/src/char/Makefile.in +++ b/src/char/Makefile.in @@ -18,6 +18,12 @@ CHAR_OBJ = $(shell ls *.c | sed -e "s/\.c/\.o/g") $(shell ls *.cpp | sed -e "s/\ CHAR_DIR_OBJ = $(CHAR_OBJ:%=obj/%) CHAR_H = $(shell ls ../char/*.h) +YAML_CPP_OBJ = $(shell find ../../3rdparty/yaml-cpp/ -type f -name "*.cpp" | sed -e "s/\.cpp/\.o/g" ) +YAML_CPP_DIR_OBJ = $(YAML_CPP_OBJ:%=obj/%) +YAML_CPP_AR = ../../3rdparty/yaml-cpp/obj/yaml-cpp.a +YAML_CPP_H = $(shell find ../../3rdparty/yaml-cpp/ -type f -name "*.h") +YAML_CPP_INCLUDE = -I../../3rdparty/yaml-cpp/include + HAVE_MYSQL=@HAVE_MYSQL@ ifeq ($(HAVE_MYSQL),yes) SERVER_DEPENDS=char-server @@ -26,8 +32,6 @@ else endif ALL_DEPENDS=server -CXXFLAGS=-std=c++11 - @SET_MAKE@ ##################################################################### @@ -51,9 +55,9 @@ help: ##################################################################### -char-server: obj $(CHAR_DIR_OBJ) $(LIBCONFIG_AR) $(COMMON_AR) +char-server: obj $(CHAR_DIR_OBJ) $(LIBCONFIG_AR) $(COMMON_AR) $(YAML_CPP_AR) @echo " LD @OCHR@@EXEEXT@" - @@CXX@ @LDFLAGS@ -o ../../@OCHR@@EXEEXT@ $(CHAR_DIR_OBJ) $(LIBCONFIG_AR) $(COMMON_AR) $(MT19937AR_OBJ) $(LIBCONFIG_OBJ) @LIBS@ @MYSQL_LIBS@ + @@CXX@ @LDFLAGS@ -o ../../@OCHR@@EXEEXT@ $(CHAR_DIR_OBJ) $(LIBCONFIG_AR) $(COMMON_AR) $(MT19937AR_OBJ) $(LIBCONFIG_OBJ) $(YAML_CPP_AR) @LIBS@ @MYSQL_LIBS@ needs_mysql: @echo "MySQL not found or disabled by the configure script" @@ -63,13 +67,13 @@ obj: @echo " MKDIR obj" @-mkdir obj -obj/%.o: %.c $(CHAR_H) $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) +obj/%.o: %.c $(CHAR_H) $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H) @echo " CC $<" - @@CC@ @CFLAGS@ $(COMMON_INCLUDE) $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + @@CC@ @CFLAGS@ $(COMMON_INCLUDE) $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(YAML_CPP_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< -obj/%.o: %.cpp $(CHAR_H) $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) +obj/%.o: %.cpp $(CHAR_H) $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H) @echo " CXX $<" - @@CXX@ @CXXFLAGS@ $(COMMON_INCLUDE) $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + @@CXX@ @CXXFLAGS@ $(COMMON_INCLUDE) $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(YAML_CPP_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< # missing object files $(COMMON_AR): @@ -80,3 +84,6 @@ $(MT19937AR_OBJ): $(LIBCONFIG_AR): @$(MAKE) -C ../../3rdparty/libconfig + +$(YAML_CPP_AR): + @$(MAKE) -C ../../3rdparty/yaml-cpp diff --git a/src/char/char-server.vcxproj b/src/char/char-server.vcxproj index 6c2bf4cd56..18471e7c2c 100644 --- a/src/char/char-server.vcxproj +++ b/src/char/char-server.vcxproj @@ -94,6 +94,7 @@ Disabled $(DefineConstants);WIN32;FD_SETSIZE=4096;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;LIBCONFIG_STATIC;YY_USE_CONST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) MultiThreadedDebug + $(SolutionDir)3rdparty\yaml-cpp\include\ Console @@ -109,6 +110,7 @@ Disabled $(DefineConstants);WIN32;FD_SETSIZE=4096;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;LIBCONFIG_STATIC;YY_USE_CONST;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) MultiThreadedDebug + $(SolutionDir)3rdparty\yaml-cpp\include\ Console @@ -126,6 +128,7 @@ true $(DefineConstants);WIN32;FD_SETSIZE=4096;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;LIBCONFIG_STATIC;YY_USE_CONST;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) MultiThreaded + $(SolutionDir)3rdparty\yaml-cpp\include\ Console @@ -145,6 +148,7 @@ true $(DefineConstants);WIN32;FD_SETSIZE=4096;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_WINSOCK_DEPRECATED_NO_WARNINGS;LIBCONFIG_STATIC;YY_USE_CONST;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) MultiThreaded + $(SolutionDir)3rdparty\yaml-cpp\include\ Console @@ -161,6 +165,7 @@ + @@ -181,7 +186,8 @@ - + + @@ -192,7 +198,7 @@ - + diff --git a/src/char/char-server.vcxproj.filters b/src/char/char-server.vcxproj.filters index 93cd821683..74a9c20510 100644 --- a/src/char/char-server.vcxproj.filters +++ b/src/char/char-server.vcxproj.filters @@ -26,6 +26,9 @@ Header Files + + Header Files + Header Files @@ -79,6 +82,9 @@ Source Files + + Source Files + Source Files @@ -106,10 +112,10 @@ Source Files - + Source Files - + Source Files diff --git a/src/char/char.cpp b/src/char/char.cpp index 3ff791c1af..93ff81a38d 100644 --- a/src/char/char.cpp +++ b/src/char/char.cpp @@ -300,7 +300,8 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){ (p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom) || (p->delete_date != cp->delete_date) || (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->hotkey_rowshift != cp->hotkey_rowshift) || (p->clan_id != cp->clan_id ) || (p->title_id != cp->title_id) || + (p->show_equip != cp->show_equip) ) { //Save status if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `base_level`='%d', `job_level`='%d'," @@ -311,7 +312,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'" + "`hotkey_rowshift`='%d', `clan_id`='%d', `title_id`='%lu', `show_equip`='%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, @@ -323,7 +324,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->hotkey_rowshift, p->clan_id, p->title_id, p->show_equip, p->account_id, p->char_id) ) { Sql_ShowDebug(sql_handle); @@ -917,7 +918,7 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf) { "`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`" + "`robe`,`moves`,`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`title_id`,`show_equip`" " 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) @@ -962,7 +963,9 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf) { || SQL_ERROR == SqlStmt_BindColumn(stmt, 39, SQLDT_UCHAR, &p.font, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 40, SQLDT_UINT, &p.uniqueitem_counter, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 41, SQLDT_ENUM, &sex, sizeof(sex), NULL, NULL) - || SQL_ERROR == SqlStmt_BindColumn(stmt, 42, SQLDT_UCHAR, &p.hotkey_rowshift, 0, NULL, NULL) + || 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) ) { SqlStmt_ShowDebug(stmt); @@ -1026,7 +1029,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`" + "`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`title_id`,`show_equip`" " 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) @@ -1090,6 +1093,8 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev || SQL_ERROR == SqlStmt_BindColumn(stmt, 57, SQLDT_ENUM, &sex, sizeof(sex), NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 58, SQLDT_UCHAR, &p->hotkey_rowshift, 0, NULL, NULL) || 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) ) { SqlStmt_ShowDebug(stmt); @@ -1423,12 +1428,16 @@ int char_make_new_char_sql(struct char_session_data* sd, char* name_, int str, i return -2; // invalid input #endif - // check the number of already existing chars in this account if( SQL_ERROR == Sql_Query(sql_handle, "SELECT 1 FROM `%s` WHERE `account_id` = '%d'", schema_config.char_db, sd->account_id) ) Sql_ShowDebug(sql_handle); +#ifdef VIP_ENABLE + if( Sql_NumRows(sql_handle) >= MAX_CHARS ) + return -2; // character account limit exceeded +#else if( Sql_NumRows(sql_handle) >= sd->char_slots ) return -2; // character account limit exceeded +#endif // check char slot if( SQL_ERROR == Sql_Query(sql_handle, "SELECT 1 FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' LIMIT 1", schema_config.char_db, sd->account_id, slot) ) @@ -1516,22 +1525,34 @@ int char_divorce_char_sql(int partner_id1, int partner_id2){ /* Returns 0 if successful * Returns < 0 for error */ -int char_delete_char_sql(uint32 char_id){ +enum e_char_del_response char_delete(struct char_session_data* sd, uint32 char_id){ char name[NAME_LENGTH]; char esc_name[NAME_LENGTH*2+1]; //Name needs be escaped. uint32 account_id; int party_id, guild_id, hom_id, base_level, partner_id, father_id, mother_id, elemental_id; + time_t delete_date; char *data; size_t len; + int i, k; - if (SQL_ERROR == Sql_Query(sql_handle, "SELECT `name`,`account_id`,`party_id`,`guild_id`,`base_level`,`homun_id`,`partner_id`,`father`,`mother`,`elemental_id` FROM `%s` WHERE `char_id`='%d'", schema_config.char_db, char_id)) + ARR_FIND(0, MAX_CHARS, i, sd->found_char[i] == char_id); + + // Such a character does not exist in the account + if (i == MAX_CHARS) { + ShowInfo("Char deletion aborted: %s, Account ID: %u, Character ID: %u\n", name, sd->account_id, char_id); + return CHAR_DELETE_NOTFOUND; + } + + if (SQL_ERROR == Sql_Query(sql_handle, "SELECT `name`,`account_id`,`party_id`,`guild_id`,`base_level`,`homun_id`,`partner_id`,`father`,`mother`,`elemental_id`,`delete_date` FROM `%s` WHERE `account_id`='%u' AND `char_id`='%u'", schema_config.char_db, sd->account_id, char_id)){ Sql_ShowDebug(sql_handle); + return CHAR_DELETE_DATABASE; + } if( SQL_SUCCESS != Sql_NextRow(sql_handle) ) { - ShowError("delete_char_sql: Unable to fetch character data, deletion aborted.\n"); + ShowInfo("Char deletion aborted: %s, Account ID: %u, Character ID: %u\n", name, sd->account_id, char_id); Sql_FreeResult(sql_handle); - return -1; + return CHAR_DELETE_NOTFOUND; } Sql_GetData(sql_handle, 0, &data, &len); safestrncpy(name, data, NAME_LENGTH); @@ -1544,29 +1565,34 @@ int char_delete_char_sql(uint32 char_id){ Sql_GetData(sql_handle, 7, &data, NULL); father_id = atoi(data); Sql_GetData(sql_handle, 8, &data, NULL); mother_id = atoi(data); Sql_GetData(sql_handle, 9, &data, NULL); elemental_id = atoi(data); + Sql_GetData(sql_handle,10, &data, NULL); delete_date = strtoul(data, NULL, 10); Sql_EscapeStringLen(sql_handle, esc_name, name, zmin(len, NAME_LENGTH)); Sql_FreeResult(sql_handle); //check for config char del condition [Lupus] - // TODO: Move this out to packet processing (0x68/0x1fb). if( ( charserv_config.char_config.char_del_level > 0 && base_level >= charserv_config.char_config.char_del_level ) || ( charserv_config.char_config.char_del_level < 0 && base_level <= -charserv_config.char_config.char_del_level ) ) { ShowInfo("Char deletion aborted: %s, BaseLevel: %i\n", name, base_level); - return -1; + return CHAR_DELETE_BASELEVEL; } if (charserv_config.char_config.char_del_restriction&CHAR_DEL_RESTRICT_GUILD && guild_id) // character is in guild { ShowInfo("Char deletion aborted: %s, Guild ID: %i\n", name, guild_id); - return -1; + return CHAR_DELETE_GUILD; } if (charserv_config.char_config.char_del_restriction&CHAR_DEL_RESTRICT_PARTY && party_id) // character is in party { ShowInfo("Char deletion aborted: %s, Party ID: %i\n", name, party_id); - return -1; + return CHAR_DELETE_PARTY; + } + + if( charserv_config.char_config.char_del_delay > 0 && ( !delete_date || delete_date > time(NULL) ) ){ // not queued or delay not yet passed + ShowInfo("Char deletion aborted: %s, Time was not set or has not been reached ye\n", name ); + return CHAR_DELETE_TIME; } /* Divorce [Wizputer] */ @@ -1580,7 +1606,7 @@ int char_delete_char_sql(uint32 char_id){ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `child`='0' WHERE `char_id`='%d' OR `char_id`='%d'", schema_config.char_db, father_id, mother_id) ) Sql_ShowDebug(sql_handle); - if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `id` = '410'AND (`char_id`='%d' OR `char_id`='%d')", schema_config.skill_db, father_id, mother_id) ) + if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `id` = '410' AND (`char_id`='%d' OR `char_id`='%d')", schema_config.skill_db, father_id, mother_id) ) Sql_ShowDebug(sql_handle); WBUFW(buf,0) = 0x2b25; @@ -1671,6 +1697,10 @@ int char_delete_char_sql(uint32 char_id){ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d'", schema_config.bonus_script_db, char_id) ) Sql_ShowDebug(sql_handle); + /* Achievement Data */ + if (SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d'", schema_config.achievement_table, char_id)) + Sql_ShowDebug(sql_handle); + if (charserv_config.log_char) { if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s`(`time`, `account_id`,`char_num`,`char_msg`,`name`) VALUES (NOW(), '%d', '%d', 'Deleted char (CID %d)', '%s')", schema_config.charlog_db, account_id, 0, char_id, esc_name) ) @@ -1693,7 +1723,14 @@ int char_delete_char_sql(uint32 char_id){ mapif_parse_BreakGuild(0,guild_id); else if( guild_id ) inter_guild_leave(guild_id, account_id, char_id);// Leave your guild. - return 0; + + // refresh character list cache + for(k = i; k < MAX_CHARS-1; k++){ + sd->found_char[k] = sd->found_char[k+1]; + } + sd->found_char[MAX_CHARS-1] = -1; + + return CHAR_DELETE_OK; } /** @@ -2236,7 +2273,7 @@ bool char_checkdb(void){ schema_config.auction_db, schema_config.quest_db, schema_config.homunculus_db, schema_config.skill_homunculus_db, schema_config.mercenary_db, schema_config.mercenary_owner_db, schema_config.elemental_db, schema_config.ragsrvinfo_db, schema_config.skillcooldown_db, schema_config.bonus_script_db, - schema_config.clan_table, schema_config.clan_alliance_table, schema_config.mail_attachment_db + schema_config.clan_table, schema_config.clan_alliance_table, schema_config.mail_attachment_db, schema_config.achievement_table }; ShowInfo("Start checking DB integrity\n"); for (i=0; i= 20151001 +#if defined(PACKETVER_RE) && PACKETVER >= 20151001 WFIFOHEAD(fd, 10); WFIFOW(fd, 0) = 0x9a0; // pages to req / send them all in 1 until mmo_chars_fromsql can split them up @@ -324,21 +323,25 @@ void chclif_charlist_notify( int fd, struct char_session_data* sd ){ // Function to send characters to a player //---------------------------------------- int chclif_mmo_send006b(int fd, struct char_session_data* sd){ - int j, offset = 0; - bool newvers = (sd->version >= date2version(20100413) ); - if(newvers) //20100413 - offset += 3; + int j, offset; + +#if PACKETVER >= 20100413 + offset = 3; +#else + offset = 0; +#endif + if (charserv_config.save_log) ShowInfo("Loading Char Data ("CL_BOLD"%d"CL_RESET")\n",sd->account_id); j = 24 + offset; // offset WFIFOHEAD(fd,j + MAX_CHARS*MAX_CHAR_BUF); WFIFOW(fd,0) = 0x6b; - if(newvers){ //20100413 +#if PACKETVER >= 20100413 WFIFOB(fd,4) = MAX_CHARS; // Max slots. WFIFOB(fd,5) = MIN_CHARS; // Available slots. (PremiumStartSlot) WFIFOB(fd,6) = MIN_CHARS+sd->chars_vip; // Premium slots. (Any existent chars past sd->char_slots but within MAX_CHARS will show a 'Premium Service' in red) - } +#endif memset(WFIFOP(fd,4 + offset), 0, 20); // unknown bytes j+=char_mmo_chars_fromsql(sd, WFIFOP(fd,j)); WFIFOW(fd,2) = j; // packet len @@ -377,16 +380,18 @@ void chclif_mmo_send099d(int fd, struct char_session_data *sd) { * Function to choose wich kind of charlist to send to client depending on his version */ void chclif_mmo_char_send(int fd, struct char_session_data* sd){ - ShowInfo("sd->version = %d\n",sd->version); - if(sd->version >= date2version(20130000) ){ - chclif_mmo_send082d(fd,sd); - chclif_mmo_send006b(fd,sd); - chclif_charlist_notify(fd,sd); - } else - chclif_mmo_send006b(fd,sd); +#if PACKETVER >= 20130000 + chclif_mmo_send082d(fd, sd); + chclif_mmo_send006b(fd, sd); + chclif_charlist_notify(fd, sd); +#else + chclif_mmo_send006b(fd,sd); //@FIXME dump from kro doesn't show 6b transmission - if(sd->version >= date2version(20060819) ) - chclif_block_character(fd,sd); +#endif + +#if PACKETVER >= 20060819 + chclif_block_character(fd,sd); +#endif } /* @@ -432,17 +437,16 @@ void chclif_char_delete2_ack(int fd, uint32 char_id, uint32 result, time_t delet /// 3 (0x719): A database error occurred. /// 4 (0x71d): Deleting not yet possible time. /// 5 (0x71e): Date of birth do not match. +/// 6 Name does not match. +/// 7 Character Deletion has failed because you have entered an incorrect e-mail address. /// Any (0x718): An unknown error has occurred. -/// HC: <082a>.W .L .L +/// HC: <082a>.W .L .L void chclif_char_delete2_accept_ack(int fd, uint32 char_id, uint32 result) { +#if PACKETVER >= 20130000 if(result == 1 ){ - struct char_session_data* sd; - sd = (struct char_session_data*)session[fd]->session_data; - - if( sd->version >= date2version(20130000) ){ - chclif_mmo_char_send(fd, sd); - } + chclif_mmo_char_send(fd, session[fd]->session_data); } +#endif WFIFOHEAD(fd,10); WFIFOW(fd,0) = 0x82a; @@ -561,10 +565,7 @@ int chclif_parse_char_delete2_accept(int fd, struct char_session_data* sd) { FIFOSD_CHECK(12) { char birthdate[8+1]; - uint32 char_id, i, k; - unsigned int base_level; - char* data; - time_t delete_date; + uint32 char_id; char_id = RFIFOL(fd,2); ShowInfo(CL_RED"Request Char Deletion: "CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, char_id); @@ -581,54 +582,36 @@ int chclif_parse_char_delete2_accept(int fd, struct char_session_data* sd) { birthdate[8] = 0; RFIFOSKIP(fd,12); - ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == char_id ); - if( i == MAX_CHARS ) - {// character not found - chclif_char_delete2_accept_ack(fd, char_id, 3); - return 1; - } - - if( SQL_SUCCESS != Sql_Query(sql_handle, "SELECT `base_level`,`delete_date` FROM `%s` WHERE `char_id`='%d'", schema_config.char_db, char_id) || SQL_SUCCESS != Sql_NextRow(sql_handle) ) - {// data error - Sql_ShowDebug(sql_handle); - chclif_char_delete2_accept_ack(fd, char_id, 3); - return 1; - } - - Sql_GetData(sql_handle, 0, &data, NULL); base_level = (unsigned int)strtoul(data, NULL, 10); - Sql_GetData(sql_handle, 1, &data, NULL); delete_date = strtoul(data, NULL, 10); - - if( !delete_date || delete_date>time(NULL) ) - {// not queued or delay not yet passed - chclif_char_delete2_accept_ack(fd, char_id, 4); - return 1; - } - - if (!chclif_delchar_check(sd, birthdate, CHAR_DEL_BIRTHDATE)) { // Only check for birthdate + // Only check for birthdate + if (!chclif_delchar_check(sd, birthdate, CHAR_DEL_BIRTHDATE)) { chclif_char_delete2_accept_ack(fd, char_id, 5); return 1; } - if( ( charserv_config.char_config.char_del_level > 0 && base_level >= (unsigned int)charserv_config.char_config.char_del_level ) - || ( charserv_config.char_config.char_del_level < 0 && base_level <= (unsigned int)(-charserv_config.char_config.char_del_level) ) ) - {// character level config restriction - chclif_char_delete2_accept_ack(fd, char_id, 2); - return 1; + switch( char_delete(sd,char_id) ){ + // success + case CHAR_DELETE_OK: + chclif_char_delete2_accept_ack(fd, char_id, 1); + break; + // data error + case CHAR_DELETE_DATABASE: + // character not found + case CHAR_DELETE_NOTFOUND: + chclif_char_delete2_accept_ack(fd, char_id, 3); + break; + // in a party + case CHAR_DELETE_PARTY: + // in a guild + case CHAR_DELETE_GUILD: + // character level config restriction + case CHAR_DELETE_BASELEVEL: + chclif_char_delete2_accept_ack(fd, char_id, 2); + break; + // not queued or delay not yet passed + case CHAR_DELETE_TIME: + chclif_char_delete2_accept_ack(fd, char_id, 4); + break; } - - // success - if( char_delete_char_sql(char_id) < 0 ){ - chclif_char_delete2_accept_ack(fd, char_id, 3); - return 1; - } - - // refresh character list cache - for(k = i; k < MAX_CHARS-1; k++){ - sd->found_char[k] = sd->found_char[k+1]; - } - sd->found_char[MAX_CHARS-1] = -1; - - chclif_char_delete2_accept_ack(fd, char_id, 1); } return 1; } @@ -751,7 +734,6 @@ int chclif_parse_reqtoconnect(int fd, struct char_session_data* sd,uint32 ipl){ node->login_id2 == login_id2 /*&& node->ip == ipl*/ ) {// authentication found (coming from map server) - sd->version = node->version; idb_remove(auth_db, account_id); char_auth_ok(fd, sd); } @@ -992,7 +974,9 @@ int chclif_parse_createnewchar(int fd, struct char_session_data* sd,int cmd){ * 0x70 B HC_REFUSE_DELETECHAR * @param fd * @param ErrorCode - * 00 = Incorrect Email address + * 00 = Incorrect Email address + * 01 = Invalid Slot + * 02 = In a party or guild */ void chclif_refuse_delchar(int fd, uint8 errCode){ WFIFOHEAD(fd,3); @@ -1007,10 +991,9 @@ int chclif_parse_delchar(int fd,struct char_session_data* sd, int cmd){ else return 0; { char email[40]; - int i, ch; - int cid = RFIFOL(fd,2); + uint32 cid = RFIFOL(fd,2); - ShowInfo(CL_RED"Request Char Deletion: "CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, cid); + ShowInfo(CL_RED"Request Char Deletion: "CL_GREEN"%u (%u)"CL_RESET"\n", sd->account_id, cid); memcpy(email, RFIFOP(fd,6), 40); RFIFOSKIP(fd,( cmd == 0x68) ? 46 : 56); @@ -1019,26 +1002,24 @@ int chclif_parse_delchar(int fd,struct char_session_data* sd, int cmd){ return 1; } - // check if this char exists - ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == cid ); - if( i == MAX_CHARS ) { // Such a character does not exist in the account - chclif_refuse_delchar(fd,0); - return 1; - } - - // remove char from list and compact it - for(ch = i; ch < MAX_CHARS-1; ch++) - sd->found_char[ch] = sd->found_char[ch+1]; - sd->found_char[MAX_CHARS-1] = -1; - /* Delete character */ - if(char_delete_char_sql(cid)<0){ - //can't delete the char - //either SQL error or can't delete by some CONFIG conditions - //del fail - chclif_refuse_delchar(fd,0); - return 1; + switch( char_delete(sd,cid) ){ + case CHAR_DELETE_OK: + break; + case CHAR_DELETE_DATABASE: + case CHAR_DELETE_BASELEVEL: + case CHAR_DELETE_TIME: + chclif_refuse_delchar(fd, 0); + return 1; + case CHAR_DELETE_NOTFOUND: + chclif_refuse_delchar(fd, 1); + return 1; + case CHAR_DELETE_GUILD: + case CHAR_DELETE_PARTY: + chclif_refuse_delchar(fd, 2); + return 1; } + /* Char successfully deleted.*/ WFIFOHEAD(fd,2); WFIFOW(fd,0) = 0x6f; diff --git a/src/char/char_logif.c b/src/char/char_logif.c index a65f0e2b9a..53773b1fa6 100644 --- a/src/char/char_logif.c +++ b/src/char/char_logif.c @@ -295,7 +295,7 @@ int chlogif_parse_ackconnect(int fd, struct char_session_data* sd){ } int chlogif_parse_ackaccreq(int fd, struct char_session_data* sd){ - if (RFIFOREST(fd) < 25) + if (RFIFOREST(fd) < 21) return 0; { uint32 account_id = RFIFOL(fd,2); @@ -304,19 +304,14 @@ int chlogif_parse_ackaccreq(int fd, struct char_session_data* sd){ uint8 sex = RFIFOB(fd,14); uint8 result = RFIFOB(fd,15); int request_id = RFIFOL(fd,16); - uint32 version = RFIFOL(fd,20); - uint8 clienttype = RFIFOB(fd,24); - RFIFOSKIP(fd,25); + uint8 clienttype = RFIFOB(fd,20); + RFIFOSKIP(fd,21); if( session_isActive(request_id) && (sd=(struct char_session_data*)session[request_id]->session_data) && !sd->auth && sd->account_id == account_id && sd->login_id1 == login_id1 && sd->login_id2 == login_id2 && sd->sex == sex ) { int client_fd = request_id; - sd->version = version; sd->clienttype = clienttype; - if(sd->version != date2version(PACKETVER)) - ShowWarning("aid=%d has an incorect version=%d in clientinfo. Server compiled for %d\n", - sd->account_id,sd->version,date2version(PACKETVER)); switch( result ) { @@ -372,8 +367,7 @@ int chlogif_parse_reqaccdata(int fd, struct char_session_data* sd){ // send characters to player chclif_mmo_char_send(u_fd, sd); #if PACKETVER_SUPPORTS_PINCODE - if(sd->version >= date2version(20110309)) - chlogif_pincode_start(u_fd,sd); + chlogif_pincode_start(u_fd,sd); #endif } } diff --git a/src/char/char_mapif.c b/src/char/char_mapif.c index 2479b5fbf1..7274d83f0a 100644 --- a/src/char/char_mapif.c +++ b/src/char/char_mapif.c @@ -453,15 +453,14 @@ void chmapif_charselres(int fd, uint32 aid, uint8 res){ * @return : 0 not enough data received, 1 success */ int chmapif_parse_authok(int fd){ - if( RFIFOREST(fd) < 19 ) + if( RFIFOREST(fd) < 18 ) return 0; else{ uint32 account_id = RFIFOL(fd,2); uint32 login_id1 = RFIFOL(fd,6); uint32 login_id2 = RFIFOL(fd,10); uint32 ip = RFIFOL(fd,14); - int version = RFIFOB(fd,18); - RFIFOSKIP(fd,19); + RFIFOSKIP(fd,18); if( runflag != CHARSERVER_ST_RUNNING ){ chmapif_charselres(fd,account_id,0); @@ -478,7 +477,6 @@ int chmapif_parse_authok(int fd){ node->login_id2 = login_id2; //node->sex = 0; node->ip = ntohl(ip); - node->version = version; //upd version for mapserv //node->expiration_time = 0; // unlimited/unknown time by default (not display in map-server) //node->gmlevel = 0; idb_put(auth_db, account_id, node); diff --git a/src/char/int_achievement.c b/src/char/int_achievement.c new file mode 100644 index 0000000000..738cdc0099 --- /dev/null +++ b/src/char/int_achievement.c @@ -0,0 +1,348 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "../common/db.h" +#include "../common/malloc.h" +#include "../common/mmo.h" +#include "../common/showmsg.h" +#include "../common/socket.h" +#include "../common/sql.h" +#include "../common/strlib.h" + +#include "char.h" +#include "inter.h" +#include "int_achievement.h" +#include "int_mail.h" + +#include +#include +#include + +/** + * Load achievements for a character. + * @param char_id: Character ID + * @param count: Pointer to return the number of found entries. + * @return Array of found entries. It has *count entries, and it is care of the caller to aFree() it afterwards. + */ +struct achievement *mapif_achievements_fromsql(uint32 char_id, int *count) +{ + struct achievement *achievelog = NULL; + struct achievement tmp_achieve; + SqlStmt *stmt; + StringBuf buf; + int i; + + if (!count) + return NULL; + + memset(&tmp_achieve, 0, sizeof(tmp_achieve)); + + StringBuf_Init(&buf); + StringBuf_AppendStr(&buf, "SELECT `id`, COALESCE(UNIX_TIMESTAMP(`completed`),0), COALESCE(UNIX_TIMESTAMP(`rewarded`),0)"); + for (i = 0; i < MAX_ACHIEVEMENT_OBJECTIVES; ++i) + StringBuf_Printf(&buf, ", `count%d`", i + 1); + StringBuf_Printf(&buf, " FROM `%s` WHERE `char_id` = '%u'", schema_config.achievement_table, char_id); + + stmt = SqlStmt_Malloc(sql_handle); + if( SQL_ERROR == SqlStmt_PrepareStr(stmt, StringBuf_Value(&buf)) + || SQL_ERROR == SqlStmt_Execute(stmt) ) + { + SqlStmt_ShowDebug(stmt); + SqlStmt_Free(stmt); + StringBuf_Destroy(&buf); + *count = 0; + return NULL; + } + + SqlStmt_BindColumn(stmt, 0, SQLDT_INT, &tmp_achieve.achievement_id, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 1, SQLDT_INT, &tmp_achieve.completed, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 2, SQLDT_INT, &tmp_achieve.rewarded, 0, NULL, NULL); + for (i = 0; i < MAX_ACHIEVEMENT_OBJECTIVES; ++i) + SqlStmt_BindColumn(stmt, 3 + i, SQLDT_INT, &tmp_achieve.count[i], 0, NULL, NULL); + + *count = (int)SqlStmt_NumRows(stmt); + if (*count > 0) { + i = 0; + + achievelog = (struct achievement *)aCalloc(*count, sizeof(struct achievement)); + while (SQL_SUCCESS == SqlStmt_NextRow(stmt)) { + if (i >= *count) // Sanity check, should never happen + break; + memcpy(&achievelog[i++], &tmp_achieve, sizeof(tmp_achieve)); + } + if (i < *count) { + // Should never happen. Compact array + *count = i; + achievelog = (struct achievement *)aRealloc(achievelog, sizeof(struct achievement) * i); + } + } + + SqlStmt_Free(stmt); + StringBuf_Destroy(&buf); + + ShowInfo("achievement load complete from DB - id: %d (total: %d)\n", char_id, *count); + + return achievelog; +} + +/** + * Deletes an achievement from a character's achievementlog. + * @param char_id: Character ID + * @param achievement_id: Achievement ID + * @return false in case of errors, true otherwise + */ +bool mapif_achievement_delete(uint32 char_id, int achievement_id) +{ + if (SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `id` = '%d' AND `char_id` = '%u'", schema_config.achievement_table, achievement_id, char_id)) { + Sql_ShowDebug(sql_handle); + return false; + } + + return true; +} + +/** + * Adds an achievement to a character's achievementlog. + * @param char_id: Character ID + * @param ad: Achievement data + * @return false in case of errors, true otherwise + */ +bool mapif_achievement_add(uint32 char_id, struct achievement ad) +{ + StringBuf buf; + int i; + + StringBuf_Init(&buf); + StringBuf_Printf(&buf, "INSERT INTO `%s` (`char_id`, `id`, `completed`, `rewarded`", schema_config.achievement_table); + for (i = 0; i < MAX_ACHIEVEMENT_OBJECTIVES; ++i) + StringBuf_Printf(&buf, ", `count%d`", i + 1); + StringBuf_AppendStr(&buf, ")"); + StringBuf_Printf(&buf, " VALUES ('%u', '%d',", char_id, ad.achievement_id, (uint32)ad.completed, (uint32)ad.rewarded); + if( ad.completed ){ + StringBuf_Printf(&buf, "FROM_UNIXTIME('%u'),", (uint32)ad.completed); + }else{ + StringBuf_AppendStr(&buf, "NULL,"); + } + if( ad.rewarded ){ + StringBuf_Printf(&buf, "FROM_UNIXTIME('%u')", (uint32)ad.rewarded); + }else{ + StringBuf_AppendStr(&buf, "NULL"); + } + for (i = 0; i < MAX_ACHIEVEMENT_OBJECTIVES; ++i) + StringBuf_Printf(&buf, ", '%d'", ad.count[i]); + StringBuf_AppendStr(&buf, ")"); + + if (SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf))) { + Sql_ShowDebug(sql_handle); + StringBuf_Destroy(&buf); + return false; + } + + StringBuf_Destroy(&buf); + + return true; +} + +/** + * Updates an achievement in a character's achievementlog. + * @param char_id: Character ID + * @param ad: Achievement data + * @return false in case of errors, true otherwise + */ +bool mapif_achievement_update(uint32 char_id, struct achievement ad) +{ + StringBuf buf; + int i; + + StringBuf_Init(&buf); + StringBuf_Printf(&buf, "UPDATE `%s` SET ", schema_config.achievement_table); + if( ad.completed ){ + StringBuf_Printf(&buf, "`completed` = FROM_UNIXTIME('%u'),", (uint32)ad.completed); + }else{ + StringBuf_AppendStr(&buf, "`completed` = NULL,"); + } + if( ad.rewarded ){ + StringBuf_Printf(&buf, "`rewarded` = FROM_UNIXTIME('%u')", (uint32)ad.rewarded); + }else{ + StringBuf_AppendStr(&buf, "`rewarded` = NULL"); + } + for (i = 0; i < MAX_ACHIEVEMENT_OBJECTIVES; ++i) + StringBuf_Printf(&buf, ", `count%d` = '%d'", i + 1, ad.count[i]); + StringBuf_Printf(&buf, " WHERE `id` = %d AND `char_id` = %u", ad.achievement_id, char_id); + + if (SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf))) { + Sql_ShowDebug(sql_handle); + StringBuf_Destroy(&buf); + return false; + } + + StringBuf_Destroy(&buf); + + return true; +} + +/** + * Notifies the map-server of the result of saving a character's achievementlog. + */ +void mapif_achievement_save( int fd, uint32 char_id, bool success ){ + WFIFOHEAD(fd, 7); + WFIFOW(fd, 0) = 0x3863; + WFIFOL(fd, 2) = char_id; + WFIFOB(fd, 6) = success; + WFIFOSET(fd, 7); +} + +/** + * Handles the save request from mapserver for a character's achievementlog. + * Received achievements are saved, and an ack is sent back to the map server. + * @see inter_parse_frommap + */ +int mapif_parse_achievement_save(int fd) +{ + int i, j, k, old_n, new_n = (RFIFOW(fd, 2) - 8) / sizeof(struct achievement); + uint32 char_id = RFIFOL(fd, 4); + struct achievement *old_ad = NULL, *new_ad = NULL; + bool success = true; + + if (new_n > 0) + new_ad = (struct achievement *)RFIFOP(fd, 8); + + old_ad = mapif_achievements_fromsql(char_id, &old_n); + + for (i = 0; i < new_n; i++) { + ARR_FIND(0, old_n, j, new_ad[i].achievement_id == old_ad[j].achievement_id); + if (j < old_n) { // Update existing achievements + // Only counts, complete, and reward are changable. + ARR_FIND(0, MAX_ACHIEVEMENT_OBJECTIVES, k, new_ad[i].count[k] != old_ad[j].count[k]); + if (k != MAX_ACHIEVEMENT_OBJECTIVES || new_ad[i].completed != old_ad[j].completed || new_ad[i].rewarded != old_ad[j].rewarded) { + if ((success = mapif_achievement_update(char_id, new_ad[i])) == false) + break; + } + + if (j < (--old_n)) { + // Compact array + memmove(&old_ad[j], &old_ad[j + 1], sizeof(struct achievement) * (old_n - j)); + memset(&old_ad[old_n], 0, sizeof(struct achievement)); + } + } else { // Add new achievements + if (new_ad[i].achievement_id) { + if ((success = mapif_achievement_add(char_id, new_ad[i])) == false) + break; + } + } + } + + for (i = 0; i < old_n; i++) { // Achievements not in new_ad but in old_ad are to be erased. + if ((success = mapif_achievement_delete(char_id, old_ad[i].achievement_id)) == false) + break; + } + + if (old_ad) + aFree(old_ad); + + mapif_achievement_save(fd, char_id, success); + + return 0; +} + +/** + * Sends the achievementlog of a character to the map-server. + */ +void mapif_achievement_load( int fd, uint32 char_id ){ + struct achievement *tmp_achievementlog = NULL; + int num_achievements = 0; + + tmp_achievementlog = mapif_achievements_fromsql(char_id, &num_achievements); + + WFIFOHEAD(fd, num_achievements * sizeof(struct achievement) + 8); + WFIFOW(fd, 0) = 0x3862; + WFIFOW(fd, 2) = num_achievements * sizeof(struct achievement) + 8; + WFIFOL(fd, 4) = char_id; + + if (num_achievements > 0) + memcpy(WFIFOP(fd, 8), tmp_achievementlog, sizeof(struct achievement) * num_achievements); + + WFIFOSET(fd, num_achievements * sizeof(struct achievement) + 8); + + if (tmp_achievementlog) + aFree(tmp_achievementlog); +} + +/** + * Sends achievementlog to the map server + * NOTE: Achievements sent to the player are only completed ones + * @see inter_parse_frommap + */ +int mapif_parse_achievement_load(int fd) +{ + mapif_achievement_load( fd, RFIFOL(fd, 2) ); + + return 0; +} + +/** + * Notify the map-server if claiming the reward has succeeded. + */ +void mapif_achievement_reward( int fd, uint32 char_id, int32 achievement_id, time_t rewarded ){ + WFIFOHEAD(fd, 14); + WFIFOW(fd, 0) = 0x3864; + WFIFOL(fd, 2) = char_id; + WFIFOL(fd, 6) = achievement_id; + WFIFOL(fd, 10) = (uint32)rewarded; + WFIFOSET(fd, 14); +} + +/** + * Request of the map-server that a player claimed his achievement rewards. + * @see inter_parse_frommap + */ +int mapif_parse_achievement_reward(int fd){ + time_t current = time(NULL); + uint32 char_id = RFIFOL(fd, 2); + int32 achievement_id = RFIFOL(fd, 6); + + if( Sql_Query( sql_handle, "UPDATE `%s` SET `rewarded` = FROM_UNIXTIME('%u') WHERE `char_id`='%u' AND `id` = '%d' AND `completed` IS NOT NULL AND `rewarded` IS NULL", schema_config.achievement_table, (uint32)current, char_id, achievement_id ) == SQL_ERROR || + Sql_NumRowsAffected(sql_handle) <= 0 ){ + current = 0; + }else if( RFIFOW(fd,10) > 0 ){ // Do not send a mail if no item reward + char mail_sender[NAME_LENGTH]; + char mail_receiver[NAME_LENGTH]; + char mail_title[MAIL_TITLE_LENGTH]; + char mail_text[MAIL_BODY_LENGTH]; + struct item item; + + memset(&item, 0, sizeof(struct item)); + item.nameid = RFIFOW(fd, 10); + item.amount = RFIFOL(fd, 12); + item.identify = 1; + + safesnprintf(mail_sender, NAME_LENGTH, char_msg_txt(227)); // 227: GM + safestrncpy(mail_receiver, RFIFOCP(fd,16), NAME_LENGTH); + safesnprintf(mail_title, MAIL_TITLE_LENGTH, char_msg_txt(228)); // 228: Achievement Reward Mail + safesnprintf(mail_text, MAIL_BODY_LENGTH, char_msg_txt(229), RFIFOCP(fd,16+NAME_LENGTH) ); // 229: [%s] Achievement Reward. + + if( !mail_sendmail(0, mail_sender, char_id, mail_receiver, mail_title, mail_text, 0, &item, 1) ){ + current = 0; + } + } + + mapif_achievement_reward(fd, char_id, achievement_id, current); + + return 0; +} + +/** + * Parses achievementlog related packets from the map server. + * @see inter_parse_frommap + */ +int inter_achievement_parse_frommap(int fd) +{ + switch (RFIFOW(fd, 0)) { + case 0x3062: mapif_parse_achievement_load(fd); break; + case 0x3063: mapif_parse_achievement_save(fd); break; + case 0x3064: mapif_parse_achievement_reward(fd); break; + default: + return 0; + } + return 1; +} diff --git a/src/char/int_achievement.h b/src/char/int_achievement.h new file mode 100644 index 0000000000..1e9e501ab1 --- /dev/null +++ b/src/char/int_achievement.h @@ -0,0 +1,16 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#ifndef _INT_ACHIEVEMENT_SQL_H_ +#define _INT_ACHIEVEMENT_SQL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +int inter_achievement_parse_frommap(int fd); + +#ifdef __cplusplus +} +#endif +#endif /* _INT_ACHIEVEMENT_SQL_H_ */ diff --git a/src/char/int_auction.h b/src/char/int_auction.h index bf26b152c0..83a3428f1c 100644 --- a/src/char/int_auction.h +++ b/src/char/int_auction.h @@ -4,9 +4,17 @@ #ifndef _INT_AUCTION_SQL_H_ #define _INT_AUCTION_SQL_H_ +#ifdef __cplusplus +extern "C" { +#endif + int inter_auction_parse_frommap(int fd); int inter_auction_sql_init(void); void inter_auction_sql_final(void); +#ifdef __cplusplus +} +#endif + #endif /* _INT_AUCTION_SQL_H_ */ diff --git a/src/char/int_clan.h b/src/char/int_clan.h index c21e6ecffa..d698bcd152 100644 --- a/src/char/int_clan.h +++ b/src/char/int_clan.h @@ -4,7 +4,16 @@ #ifndef _INT_CLAN_H_ #define _INT_CLAN_H_ - int inter_clan_parse_frommap( int fd ); - int inter_clan_init(void); - void inter_clan_final(void); +#ifdef __cplusplus +extern "C" { +#endif + +int inter_clan_parse_frommap( int fd ); +int inter_clan_init(void); +void inter_clan_final(void); + +#ifdef __cplusplus +} +#endif + #endif /* _INT_CLAN_H_ */ diff --git a/src/char/int_guild.c b/src/char/int_guild.c index a596b6c67c..3f07208543 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -1096,7 +1096,7 @@ int mapif_guild_master_changed(struct guild *g, int aid, int cid, time_t time) WBUFL(buf,2)=g->guild_id; WBUFL(buf,6)=aid; WBUFL(buf,10)=cid; - WBUFL(buf,14)=time; + WBUFL(buf,14)=(uint32)time; chmapif_sendall(buf,18); return 0; } diff --git a/src/char/int_mail.c b/src/char/int_mail.c index 0420ffed5a..6592692b68 100644 --- a/src/char/int_mail.c +++ b/src/char/int_mail.c @@ -485,7 +485,7 @@ static void mapif_Mail_return(int fd, uint32 char_id, int mail_id) char temp_[MAIL_TITLE_LENGTH]; // swap sender and receiver - swap(msg.send_id, msg.dest_id); + SWAP(msg.send_id, msg.dest_id); safestrncpy(temp_, msg.send_name, NAME_LENGTH); safestrncpy(msg.send_name, msg.dest_name, NAME_LENGTH); safestrncpy(msg.dest_name, temp_, NAME_LENGTH); @@ -578,7 +578,7 @@ static void mapif_parse_Mail_send(int fd) mapif_Mail_new(&msg); // notify recipient } -void mail_sendmail(int send_id, const char* send_name, int dest_id, const char* dest_name, const char* title, const char* body, int zeny, struct item *item, int amount) +bool mail_sendmail(int send_id, const char* send_name, int dest_id, const char* dest_name, const char* title, const char* body, int zeny, struct item *item, int amount) { struct mail_message msg; memset(&msg, 0, sizeof(struct mail_message)); @@ -601,8 +601,12 @@ void mail_sendmail(int send_id, const char* send_name, int dest_id, const char* msg.timestamp = time(NULL); msg.type = MAIL_INBOX_NORMAL; - mail_savemessage(&msg); + if( !mail_savemessage(&msg) ){ + return false; + } + mapif_Mail_new(&msg); + return true; } static void mapif_Mail_receiver_send( int fd, int requesting_char_id, int char_id, int class_, int base_level, const char* name ){ diff --git a/src/char/int_mail.h b/src/char/int_mail.h index 7149e49cb8..766ab9b136 100644 --- a/src/char/int_mail.h +++ b/src/char/int_mail.h @@ -12,7 +12,7 @@ int mail_return_timer( int tid, unsigned int tick, int id, intptr_t data ); int mail_delete_timer( int tid, unsigned int tick, int id, intptr_t data ); int inter_mail_parse_frommap(int fd); -void mail_sendmail(int send_id, const char* send_name, int dest_id, const char* dest_name, const char* title, const char* body, int zeny, struct item *item, int amount); +bool mail_sendmail(int send_id, const char* send_name, int dest_id, const char* dest_name, const char* title, const char* body, int zeny, struct item *item, int amount); int inter_mail_sql_init(void); void inter_mail_sql_final(void); diff --git a/src/char/int_party.c b/src/char/int_party.c index 6a61b2990a..7a1147205e 100644 --- a/src/char/int_party.c +++ b/src/char/int_party.c @@ -31,6 +31,7 @@ int party_check_empty(struct party_data *p); int mapif_parse_PartyLeave(int fd, int party_id, uint32 account_id, uint32 char_id, char *name, enum e_party_member_withdraw type); int party_check_exp_share(struct party_data *p); int mapif_party_optionchanged(int fd,struct party *p, uint32 account_id, int flag); +int party_check_family_share(struct party_data *p); //Updates party's level range and unsets even share if broken. static int int_party_check_lv(struct party_data *p) { @@ -40,9 +41,9 @@ static int int_party_check_lv(struct party_data *p) { p->max_lv = 0; for(i=0;iparty.member[i].online || p->party.member[i].char_id == p->family ) + if (!p->party.member[i].online) continue; lv=p->party.member[i].lv; @@ -69,7 +70,8 @@ static void int_party_calc_state(struct party_data *p) //Check party size for(i=0;iparty.member[i].lv) continue; + if (!p->party.member[i].lv) + continue; p->size++; if(p->party.member[i].online) p->party.count++; @@ -91,11 +93,9 @@ static void int_party_calc_state(struct party_data *p) //max/min levels. for(i=0;iparty.member[i].lv; - if (!lv) continue; - if(p->party.member[i].online && - //On families, the kid is not counted towards exp share rules. - p->party.member[i].char_id != p->family) - { + if (!lv) + continue; + if (p->party.member[i].online) { if( lv < p->min_lv ) p->min_lv=lv; if( p->max_lv < lv ) p->max_lv=lv; } @@ -301,10 +301,45 @@ struct party_data* search_partyname(char* str) return p; } +int party_check_family_share(struct party_data *p) { + int i; + unsigned short map = 0; + if (!p->family) + return 0; + for (i = 0; i < MAX_PARTY; i++) { + if (p->party.member[i].char_id == p->family) { + map = p->party.member[i].map; + break; + } + } + + for (i = 0; i < MAX_PARTY; i++) { + struct party_member * mem = &(p->party.member[i]); + if (mem->lv == 0) + continue; + if (p->family == mem->char_id) { + continue; + } + if (mem->online == 0) { + //everyone should be online to share + return 0; + } + if (mem->map != map) { + //everyone should be on the same map + return 0; + } + if (mem->lv < 70) { + //parents must both be above 70 + return 0; + } + } + return 1; +} + // Returns whether this party can keep having exp share or not. int party_check_exp_share(struct party_data *p) { - return (p->party.count < 2 || p->max_lv - p->min_lv <= party_share_level); + return (p->party.count < 2 || p->max_lv - p->min_lv <= party_share_level || party_check_family_share(p)); } // Is there any member in the party? @@ -521,7 +556,6 @@ static void mapif_parse_PartyInfo(int fd, int party_id, uint32 char_id) { struct party_data *p; p = inter_party_fromsql(party_id); - if (p) mapif_party_info(fd, &p->party, char_id); else @@ -575,7 +609,8 @@ int mapif_parse_PartyChangeOption(int fd,int party_id,uint32 account_id,int exp, if(!p) return 0; - + if (p->size == 2 || p->size == 3) //check family state. Also accept either of their parents. + int_party_calc_state(p); p->party.exp=exp; if( exp && !party_check_exp_share(p) ){ flag|=0x01; @@ -692,6 +727,7 @@ int mapif_parse_PartyChangeMap(int fd, int party_id, uint32 account_id, uint32 c if (p->party.member[i].map != map) { p->party.member[i].map = map; mapif_party_membermoved(&p->party, i); + int_party_check_lv(p); } return 0; } diff --git a/src/char/int_quest.h b/src/char/int_quest.h index b0403f4361..8da9b3efdf 100644 --- a/src/char/int_quest.h +++ b/src/char/int_quest.h @@ -4,7 +4,15 @@ #ifndef _QUEST_H_ #define _QUEST_H_ +#ifdef __cplusplus +extern "C" { +#endif + int inter_quest_parse_frommap(int fd); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/char/int_storage.c b/src/char/int_storage.cpp similarity index 90% rename from src/char/int_storage.c rename to src/char/int_storage.cpp index 99170dc87e..e3cb96c34a 100644 --- a/src/char/int_storage.c +++ b/src/char/int_storage.cpp @@ -1,6 +1,10 @@ // Copyright (c) Athena Dev Teams - Licensed under GNU GPL // For more information, see LICENCE in the main folder +#pragma warning(disable:4800) + +#include "int_storage.h" + #include "../common/malloc.h" #include "../common/mmo.h" #include "../common/showmsg.h" @@ -12,23 +16,13 @@ #include - -#define STORAGE_MEMINC 16 - /** - * Check if sotrage ID is valid + * Check if storage ID is valid * @param id Storage ID * @return True:Valid, False:Invalid **/ bool inter_premiumStorage_exists(uint8 id) { - if (interserv_config.storages && interserv_config.storage_count) { - int i; - for (i = 0; i < interserv_config.storage_count; i++) { - if (interserv_config.storages[i].id == id) - return true; - } - } - return false; + return interserv_config.storages.find(id) != interserv_config.storages.end(); } /** @@ -37,13 +31,8 @@ bool inter_premiumStorage_exists(uint8 id) { * @return Max amount **/ int inter_premiumStorage_getMax(uint8 id) { - if (interserv_config.storages && interserv_config.storage_count) { - int i; - for (i = 0; i < interserv_config.storage_count; i++) { - if (&interserv_config.storages[i] && interserv_config.storages[i].id == id) - return interserv_config.storages[i].max_num; - } - } + if (inter_premiumStorage_exists(id)) + return interserv_config.storages[id]->max_num; return MAX_STORAGE; } @@ -53,13 +42,8 @@ int inter_premiumStorage_getMax(uint8 id) { * @return Table name **/ const char *inter_premiumStorage_getTableName(uint8 id) { - if (interserv_config.storages && interserv_config.storage_count) { - int i; - for (i = 0; i < interserv_config.storage_count; i++) { - if (&interserv_config.storages[i] && interserv_config.storages[i].id == id) - return interserv_config.storages[i].table; - } - } + if (inter_premiumStorage_exists(id)) + return interserv_config.storages[id]->table; return schema_config.storage_db; } @@ -69,13 +53,8 @@ const char *inter_premiumStorage_getTableName(uint8 id) { * @return printable name **/ const char *inter_premiumStorage_getPrintableName(uint8 id) { - if (interserv_config.storages && interserv_config.storage_count) { - int i; - for (i = 0; i < interserv_config.storage_count; i++) { - if (&interserv_config.storages[i] && interserv_config.storages[i].id == id) - return interserv_config.storages[i].name; - } - } + if (inter_premiumStorage_exists(id)) + return interserv_config.storages[id]->name; return "Storage"; } @@ -170,20 +149,18 @@ bool guild_storage_fromsql(int guild_id, struct s_storage* p) } static void inter_storage_checkDB(void) { - int i = 0; // Checking storage tables - for (i = 0; i < interserv_config.storage_count; i++) { - if (!&interserv_config.storages[i] || !interserv_config.storages[i].name || !interserv_config.storages[i].table || *interserv_config.storages[i].table == '\0') - continue; + for (auto storage_table : interserv_config.storages) { if (SQL_ERROR == Sql_Query(sql_handle, "SELECT `id`,`account_id`,`nameid`,`amount`,`equip`,`identify`,`refine`," "`attribute`,`card0`,`card1`,`card2`,`card3`,`option_id0`,`option_val0`,`option_parm0`,`option_id1`,`option_val1`,`option_parm1`," "`option_id2`,`option_val2`,`option_parm2`,`option_id3`,`option_val3`,`option_parm3`,`option_id4`,`option_val4`,`option_parm4`," "`expire_time`,`bound`,`unique_id`" - " FROM `%s` LIMIT 1;", interserv_config.storages[i].table) ){ + " FROM `%s` LIMIT 1;", storage_table.second->table)) { Sql_ShowDebug(sql_handle); + }else{ + Sql_FreeResult(sql_handle); } } - Sql_FreeResult(sql_handle); } //--------------------------------------------------------- @@ -381,7 +358,7 @@ bool mapif_parse_itembound_retrieve(int fd) memcpy(&items[count++], &item, sizeof(struct item)); Sql_FreeResult(sql_handle); - ShowInfo("Found '"CL_WHITE"%d"CL_RESET"' guild bound item(s) from CID = "CL_WHITE"%d"CL_RESET", AID = %d, Guild ID = "CL_WHITE"%d"CL_RESET".\n", count, char_id, account_id, guild_id); + ShowInfo("Found '" CL_WHITE "%d" CL_RESET "' guild bound item(s) from CID = " CL_WHITE "%d" CL_RESET ", AID = %d, Guild ID = " CL_WHITE "%d" CL_RESET ".\n", count, char_id, account_id, guild_id); if (!count) { //No items found - No need to continue StringBuf_Destroy(&buf); SqlStmt_Free(stmt); @@ -393,7 +370,7 @@ bool mapif_parse_itembound_retrieve(int fd) // Delete bound items from player's inventory StringBuf_Clear(&buf); - StringBuf_Printf(&buf, "DELETE FROM `%s` WHERE `bound` = %d",schema_config.inventory_db, BOUND_GUILD); + StringBuf_Printf(&buf, "DELETE FROM `%s` WHERE `char_id` = %d AND `bound` = %d",schema_config.inventory_db, char_id, BOUND_GUILD); if( SQL_ERROR == SqlStmt_PrepareStr(stmt, StringBuf_Value(&buf)) || SQL_ERROR == SqlStmt_Execute(stmt) ) { diff --git a/src/char/int_storage.h b/src/char/int_storage.h index bb7910b3aa..d1435d0ce1 100644 --- a/src/char/int_storage.h +++ b/src/char/int_storage.h @@ -4,6 +4,8 @@ #ifndef _INT_STORAGE_SQL_H_ #define _INT_STORAGE_SQL_H_ +#include "../common/cbasetypes.h" + #ifdef __cplusplus extern "C" { #endif diff --git a/src/char/inter.c b/src/char/inter.cpp similarity index 92% rename from src/char/inter.c rename to src/char/inter.cpp index 8252f7ca2e..a0843e069f 100644 --- a/src/char/inter.c +++ b/src/char/inter.cpp @@ -2,6 +2,7 @@ // For more information, see LICENCE in the main folder #include "../common/mmo.h" +#include "../common/cbasetypes.h" #include "../common/malloc.h" #include "../common/strlib.h" #include "../common/showmsg.h" @@ -22,7 +23,12 @@ #include "int_quest.h" #include "int_elemental.h" #include "int_clan.h" +#include "int_achievement.h" +#include + +#include +#include #include #include // for stat/lstat/fstat - [Dekamaster/Ultimate GM Tool] @@ -51,7 +57,7 @@ int inter_recv_packet_length[] = { -1, 6,-1,-1, 55,19, 6,-1, 14,-1,-1,-1, 18,19,186,-1, // 3030- -1, 9, 0, 0, 0, 0, 0, 0, 8, 6,11,10, 10,-1,6+NAME_LENGTH, 0, // 3040- -1,-1,10,10, 0,-1,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3050- Auction System [Zephyrus] - 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3060- Quest system [Kevin] [Inkfish] + 6,-1, 6,-1, 16+NAME_LENGTH+ACHIEVEMENT_NAME_LENGTH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3060- Quest system [Kevin] [Inkfish] / Achievements [Aleos] -1,10, 6,-1, 0, 0, 0, 0, 0, 0, 0, 0, -1,10, 6,-1, // 3070- Mercenary packets [Zephyrus], Elemental packets [pakpil] 48,14,-1, 6, 0, 0, 0, 0, 0, 0,13,-1, 0, 0, 0, 0, // 3080- Pet System, Storage -1,10,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3090- Homunculus packets [albator] @@ -344,7 +350,7 @@ void geoip_readdb(void){ geoip_cache = (unsigned char *) aMalloc(sizeof(unsigned char) * bufa.st_size); if(fread(geoip_cache, sizeof(unsigned char), bufa.st_size, db) != bufa.st_size) { ShowError("geoip_cache reading didn't read all elements \n"); } fclose(db); - ShowStatus("Finished Reading "CL_GREEN"GeoIP"CL_RESET" Database.\n"); + ShowStatus("Finished Reading " CL_GREEN "GeoIP" CL_RESET " Database.\n"); } /* [Dekamaster/Nightroad] */ /* WHY NOT A DBMAP: There are millions of entries in GeoIP and it has its own algorithm to go quickly through them, a DBMap wouldn't be efficient */ @@ -803,7 +809,7 @@ static int inter_config_read(const char* cfgName) else if(!strcmpi(w1,"log_inter")) charserv_config.log_inter = atoi(w2); else if(!strcmpi(w1,"inter_server_conf")) - strcpy(interserv_config.cfgFile, w2); + interserv_config.cfgFile = w2; else if(!strcmpi(w1,"import")) inter_config_read(w2); } @@ -832,85 +838,102 @@ int inter_log(char* fmt, ...) return 0; } +static void yaml_invalid_warning(const char* fmt, YAML::Node &node, std::string &file) { + YAML::Emitter out; + out << node; + ShowWarning(fmt, file.c_str()); + ShowMessage("%s\n", out.c_str()); +} + /** * Read inter config file **/ static void inter_config_readConf(void) { - int count = 0; - config_setting_t *config = NULL; + std::vector directories = { "conf/", "conf/import/" }; + static const std::string file_name(interserv_config.cfgFile); - if (conf_read_file(&interserv_config.cfg, interserv_config.cfgFile)) - return; + for (auto directory : directories) { + std::string current_file = directory + file_name; + YAML::Node config; + int count = 0; - // Read storages - config = config_lookup(&interserv_config.cfg, "storages"); - if (config && (count = config_setting_length(config))) { - int i; - for (i = 0; i < count; i++) { - int id, max_num; - const char *name, *tablename; - struct s_storage_table table; - config_setting_t *entry = config_setting_get_elem(config, i); - - if (!config_setting_lookup_int(entry, "id", &id)) { - ShowConfigWarning(entry, "inter_config_readConf: Cannot find storage \"id\" in member %d", i); - continue; - } - - if (!config_setting_lookup_string(entry, "name", &name)) { - ShowConfigWarning(entry, "inter_config_readConf: Cannot find storage \"name\" in member %d", i); - continue; - } - - if (!config_setting_lookup_string(entry, "table", &tablename)) { - ShowConfigWarning(entry, "inter_config_readConf: Cannot find storage \"table\" in member %d", i); - continue; - } - - if (!config_setting_lookup_int(entry, "max", &max_num)) - max_num = MAX_STORAGE; - else if (max_num > MAX_STORAGE) { - ShowConfigWarning(entry, "Storage \"%s\" has \"max\" %d, max is MAX_STORAGE (%d)!\n", name, max_num, MAX_STORAGE); - max_num = MAX_STORAGE; - } - - memset(&table, 0, sizeof(struct s_storage_table)); - - RECREATE(interserv_config.storages, struct s_storage_table, interserv_config.storage_count+1); - interserv_config.storages[interserv_config.storage_count].id = id; - safestrncpy(interserv_config.storages[interserv_config.storage_count].name, name, NAME_LENGTH); - safestrncpy(interserv_config.storages[interserv_config.storage_count].table, tablename, DB_NAME_LEN); - interserv_config.storages[interserv_config.storage_count].max_num = max_num; - interserv_config.storage_count++; + try { + config = YAML::LoadFile(current_file); + } + catch (std::exception &e) { + ShowError("Cannot read storage definition file '" CL_WHITE "%s" CL_RESET "' (Caused by : " CL_WHITE "%s" CL_RESET ").\n", current_file.c_str(), e.what()); + return; } - } - ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' storage informations in '"CL_WHITE"%s"CL_RESET"'\n", interserv_config.storage_count, interserv_config.cfgFile); + if (config["Storages"]) { + for (auto node : config["Storages"]) { + unsigned int id; + + if (!node["ID"]) { + yaml_invalid_warning("inter_config_readConf: Storage definition with no ID field in '" CL_WHITE "%s" CL_RESET "', skipping.\n", node, current_file); + continue; + } + + try { + id = node["ID"].as(); + } + catch (std::exception) { + yaml_invalid_warning("inter_config_readConf: Storage definition with invalid ID field in '" CL_WHITE "%s" CL_RESET "', skipping.\n", node, current_file); + continue; + } + + if( id > UINT8_MAX ){ + yaml_invalid_warning("inter_config_readConf: Storage definition with invalid ID field in '" CL_WHITE "%s" CL_RESET "', skipping.\n", node, current_file); + continue; + } + + bool existing = inter_premiumStorage_exists(id); + auto storage_table = existing ? interserv_config.storages[id] : std::make_shared(); + + if (!existing && (!node["Name"] || !node["Table"])) { + yaml_invalid_warning("inter_config_readConf: Invalid storage definition in '" CL_WHITE "%s" CL_RESET "'.\n", node, current_file); + continue; + } + + if (node["Name"]) + safestrncpy(storage_table->name, node["Name"].as().c_str(), NAME_LENGTH); + if(node["Table"]) + safestrncpy(storage_table->table, node["Table"].as().c_str(), DB_NAME_LEN); + if (node["Max"]) { + try { + storage_table->max_num = node["Max"].as(); + } + catch (std::exception) { + yaml_invalid_warning("inter_config_readConf: Storage definition with invalid Max field in '" CL_WHITE "%s" CL_RESET "', skipping.\n", node, current_file); + continue; + } + } + else if (!existing) + storage_table->max_num = MAX_STORAGE; + + if (!existing) { + storage_table->id = (uint8)id; + interserv_config.storages[id] = storage_table; + } + + count++; + } + } + ShowStatus("Done reading '" CL_WHITE "%d" CL_RESET "' storage information in '" CL_WHITE "%s" CL_RESET "'\n", count, current_file.c_str()); + } } void inter_config_finalConf(void) { - if (interserv_config.storages) - aFree(interserv_config.storages); - interserv_config.storages = NULL; - interserv_config.storage_count = 0; - - config_destroy(&interserv_config.cfg); } static void inter_config_defaults(void) { - interserv_config.storage_count = 0; - interserv_config.storages = NULL; - - safestrncpy(interserv_config.cfgFile, "conf/inter_server.conf", sizeof(interserv_config.cfgFile)); + interserv_config.cfgFile = "inter_server.yml"; } // initialize int inter_init_sql(const char *file) { - //int i; - - inter_config_defaults(); inter_config_read(file); @@ -976,15 +999,15 @@ void inter_final(void) * @param fd **/ void inter_Storage_sendInfo(int fd) { - int size = sizeof(struct s_storage_table), len = 4 + interserv_config.storage_count * size, i = 0; + int size = sizeof(struct s_storage_table), len = 4 + interserv_config.storages.size() * size, offset; // Send storage table information WFIFOHEAD(fd, len); WFIFOW(fd, 0) = 0x388c; WFIFOW(fd, 2) = len; - for (i = 0; i < interserv_config.storage_count; i++) { - if (!&interserv_config.storages[i] || !interserv_config.storages[i].name) - continue; - memcpy(WFIFOP(fd, 4 + size*i), &interserv_config.storages[i], size); + offset = 4; + for (auto storage : interserv_config.storages) { + memcpy(WFIFOP(fd, offset), storage.second.get(), size); + offset += size; } WFIFOSET(fd, len); } @@ -1409,6 +1432,7 @@ int inter_parse_frommap(int fd) || inter_auction_parse_frommap(fd) || inter_quest_parse_frommap(fd) || inter_clan_parse_frommap(fd) + || inter_achievement_parse_frommap(fd) ) break; else diff --git a/src/char/inter.h b/src/char/inter.h index e437cd710e..613ecbd64f 100644 --- a/src/char/inter.h +++ b/src/char/inter.h @@ -4,20 +4,23 @@ #ifndef _INTER_SQL_H_ #define _INTER_SQL_H_ -#ifdef __cplusplus -extern "C" { -#endif - +#include "../common/cbasetypes.h" #include "../common/conf.h" #include "../common/mmo.h" #include "../common/sql.h" +#ifdef __cplusplus // C codes can't see this +#include +#include +#include + +extern "C" { + struct Inter_Config { - char cfgFile[128]; ///< Inter-Config file - config_t cfg; ///< Config - struct s_storage_table *storages; ///< Storage name & table information - uint8 storage_count; ///< Number of available storage + std::string cfgFile; ///< Inter-Config file + std::unordered_map< uint8, std::shared_ptr > storages; ///< Storage name & table information }; +#endif extern struct Inter_Config interserv_config; diff --git a/src/common/Makefile.in b/src/common/Makefile.in index 08791a6a6b..3416f614b3 100644 --- a/src/common/Makefile.in +++ b/src/common/Makefile.in @@ -2,7 +2,7 @@ #COMMON_OBJ = $(ls *.c | grep -viw sql.c | sed -e "s/\.c/\.o/g") COMMON_OBJ = core.o socket.o timer.o db.o nullpo.o malloc.o showmsg.o strlib.o utils.o \ grfio.o mapindex.o ers.o md5calc.o minicore.o minisocket.o minimalloc.o random.o des.o \ - conf.o thread.o mutex.o raconf.o mempool.o msg_conf.o cli.o sql.o + conf.o thread.o mutex.o raconf.o mempool.o msg_conf.o cli.o sql.o yamlwrapper.o COMMON_DIR_OBJ = $(COMMON_OBJ:%=obj/%) COMMON_H = $(shell ls ../common/*.h) COMMON_AR = obj/common.a @@ -15,6 +15,12 @@ LIBCONFIG_H = $(shell ls ../../3rdparty/libconfig/*.h) LIBCONFIG_AR = ../../3rdparty/libconfig/obj/libconfig.a LIBCONFIG_INCLUDE = -I../../3rdparty/libconfig +YAML_CPP_OBJ = $(shell find ../../3rdparty/yaml-cpp/ -type f -name "*.cpp" | sed -e "s/\.cpp/\.o/g" ) +YAML_CPP_DIR_OBJ = $(YAML_CPP_OBJ:%=obj/%) +YAML_CPP_AR = ../../3rdparty/yaml-cpp/obj/yaml-cpp.a +YAML_CPP_H = $(shell find ../../3rdparty/yaml-cpp/ -type f -name "*.h") +YAML_CPP_INCLUDE = -I../../3rdparty/yaml-cpp/include + HAVE_MYSQL=@HAVE_MYSQL@ ifeq ($(HAVE_MYSQL),yes) SERVER_DEPENDS=common @@ -23,8 +29,6 @@ else endif ALL_DEPENDS=server -CXXFLAG =-std=c++11 - @SET_MAKE@ ##################################################################### @@ -59,23 +63,23 @@ $(COMMON_AR): $(COMMON_DIR_OBJ) @echo " AR $@" @@AR@ rcs $(COMMON_AR) $(COMMON_DIR_OBJ) -common: obj $(COMMON_DIR_OBJ) $(MT19937AR_OBJ) $(LIBCONFIG_AR) $(COMMON_AR) +common: obj $(COMMON_DIR_OBJ) $(MT19937AR_OBJ) $(LIBCONFIG_AR) $(YAML_CPP_AR) $(COMMON_AR) -obj/%.o: %.c $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) +obj/%.o: %.c $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H) @echo " CC $<" - @@CC@ @CFLAGS_AR@ $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + @@CC@ @CFLAGS_AR@ $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(YAML_CPP_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< -obj/%.o: %.cpp $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) +obj/%.o: %.cpp $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H) @echo " CXX $<" - @@CXX@ $(CXXFLAG) @CFLAGS_AR@ $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + @@CXX@ @CXXFLAGS@ @CFLAGS_AR@ $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(YAML_CPP_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< -obj/mini%.o: %.c $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) +obj/mini%.o: %.c $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H) @echo " CC $<" - @@CC@ @CFLAGS_AR@ $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) @MYSQL_CFLAGS@ -DMINICORE @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + @@CC@ @CFLAGS_AR@ $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(YAML_CPP_INCLUDE) @MYSQL_CFLAGS@ -DMINICORE @CPPFLAGS@ -c $(OUTPUT_OPTION) $< -obj/mini%.o: %.cpp $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) +obj/mini%.o: %.cpp $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H) @echo " CXX $<" - @@CXX@ $(CXXFLAG) @CFLAGS_AR@ $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) @MYSQL_CFLAGS@ -DMINICORE @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + @@CXX@ @CXXFLAGS@ @CFLAGS_AR@ $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(YAML_CPP_INCLUDE) @MYSQL_CFLAGS@ -DMINICORE @CPPFLAGS@ -c $(OUTPUT_OPTION) $< # missing object files $(MT19937AR_OBJ): @@ -83,3 +87,7 @@ $(MT19937AR_OBJ): $(LIBCONFIG_AR): @$(MAKE) -C ../../3rdparty/libconfig + +$(YAML_CPP_AR): + @$(MAKE) -C ../../3rdparty/yaml-cpp + diff --git a/src/common/cbasetypes.h b/src/common/cbasetypes.h index a2c06e8493..d874e6db6e 100644 --- a/src/common/cbasetypes.h +++ b/src/common/cbasetypes.h @@ -249,7 +249,9 @@ typedef uintptr_t uintptr; // keyword replacement #ifdef _MSC_VER // For MSVC (windows) +#ifndef __cplusplus #define inline __inline +#endif #define forceinline __forceinline #define ra_align(n) __declspec(align(n)) #define _chdir chdir @@ -277,15 +279,15 @@ typedef char bool; ////////////////////////////////////////////////////////////////////////// // macro tools -#ifdef swap // just to be sure -#undef swap +#ifdef SWAP // just to be sure +#undef SWAP #endif // hmm only ints? -//#define swap(a,b) { int temp=a; a=b; b=temp;} +//#define SWAP(a,b) { int temp=a; a=b; b=temp;} // if using macros then something that is type independent -//#define swap(a,b) ((a == b) || ((a ^= b), (b ^= a), (a ^= b))) +//#define SWAP(a,b) ((a == b) || ((a ^= b), (b ^= a), (a ^= b))) // Avoid "value computed is not used" warning and generates the same assembly code -#define swap(a,b) if (a != b) ((a ^= b), (b ^= a), (a ^= b)) +#define SWAP(a,b) if (a != b) ((a ^= b), (b ^= a), (a ^= b)) #define swap_ptr(a,b) if ((a) != (b)) ((a) = (void*)((intptr_t)(a) ^ (intptr_t)(b)), (b) = (void*)((intptr_t)(a) ^ (intptr_t)(b)), (a) = (void*)((intptr_t)(a) ^ (intptr_t)(b))) ////////////////////////////////////////////////////////////////////////// diff --git a/src/common/core.cpp b/src/common/core.cpp index 22f5a3d147..a333e8b15b 100644 --- a/src/common/core.cpp +++ b/src/common/core.cpp @@ -148,12 +148,10 @@ void signals_init (void) { } #endif -#ifdef SVNVERSION -const char *get_svn_revision(void) { - return EXPAND_AND_QUOTE(SVNVERSION); - } -#else// not SVNVERSION const char* get_svn_revision(void) { +#ifdef SVNVERSION + return EXPAND_AND_QUOTE(SVNVERSION); +#else// not SVNVERSION static char svn_version_buffer[16] = ""; FILE *fp; @@ -244,11 +242,8 @@ const char* get_svn_revision(void) { // fallback svn_version_buffer[0] = UNKNOWN_VERSION; return svn_version_buffer; -} #endif - -// GIT path -#define GIT_ORIGIN "refs/remotes/origin/master" +} // Grabs the hash from the last time the user updated their working copy (last pull) const char *get_git_hash (void) { @@ -258,7 +253,8 @@ const char *get_git_hash (void) { if( GitHash[0] != '\0' ) return GitHash; - if( (fp = fopen(".git/" GIT_ORIGIN, "r")) != NULL ) { + if( (fp = fopen(".git/refs/remotes/origin/master", "r")) != NULL || // Already pulled once + (fp = fopen(".git/refs/heads/master", "r")) != NULL ) { // Cloned only char line[64]; char *rev = (char*)malloc(sizeof(char) * 50); @@ -381,5 +377,11 @@ int main (int argc, char **argv) malloc_final(); +#if defined(BUILDBOT) + if( buildbotflag ){ + exit(EXIT_FAILURE); + } +#endif + return 0; } diff --git a/src/common/ers.c b/src/common/ers.c index 8903a57934..98d1014c24 100644 --- a/src/common/ers.c +++ b/src/common/ers.c @@ -290,7 +290,7 @@ void ers_cache_size(ERS *self, unsigned int new_size) { } -ERS *ers_new(uint32 size, char *name, enum ERSOptions options) +ERS *ers_new(uint32 size, const char *name, enum ERSOptions options) { struct ers_instance_t *instance; CREATE(instance,struct ers_instance_t, 1); @@ -308,7 +308,7 @@ ERS *ers_new(uint32 size, char *name, enum ERSOptions options) instance->VTable.destroy = ers_obj_destroy; instance->VTable.chunk_size = ers_cache_size; - instance->Name = ( options & ERS_OPT_FREE_NAME ) ? aStrdup(name) : name; + instance->Name = ( options & ERS_OPT_FREE_NAME ) ? (char *)aStrdup(name) : (char *)name; instance->Options = options; instance->Cache = ers_find_cache(size,instance->Options); diff --git a/src/common/ers.h b/src/common/ers.h index 8a1f617540..c54d5999f4 100644 --- a/src/common/ers.h +++ b/src/common/ers.h @@ -162,7 +162,7 @@ typedef struct eri { * @param The requested size of the entry in bytes * @return Interface of the object */ -ERS *ers_new(uint32 size, char *name, enum ERSOptions options); +ERS *ers_new(uint32 size, const char *name, enum ERSOptions options); /** * Print a report about the current state of the Entry Reusage System. diff --git a/src/common/malloc.c b/src/common/malloc.c index 4eb1f29c79..179c73a9e0 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -529,6 +529,7 @@ static void memmgr_log (char *buf) { if( !log_fp ) { + const char* version; time_t raw; struct tm* t; @@ -537,8 +538,14 @@ static void memmgr_log (char *buf) time(&raw); t = localtime(&raw); - fprintf(log_fp, "\nMemory manager: Memory leaks found at %d/%02d/%02d %02dh%02dm%02ds (Revision %s).\n", - (t->tm_year+1900), (t->tm_mon+1), t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, get_svn_revision()); + + if( ( version = get_git_hash() ) && version[0] != UNKNOWN_VERSION ){ + fprintf(log_fp, "\nMemory manager: Memory leaks found at %d/%02d/%02d %02dh%02dm%02ds (Git Hash %s).\n", (t->tm_year+1900), (t->tm_mon+1), t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, version ); + }else if( ( version = get_svn_revision() ) && version[0] != UNKNOWN_VERSION ){ + fprintf(log_fp, "\nMemory manager: Memory leaks found at %d/%02d/%02d %02dh%02dm%02ds (SVN Revision %s).\n", (t->tm_year + 1900), (t->tm_mon + 1), t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, version ); + }else{ + fprintf(log_fp, "\nMemory manager: Memory leaks found at %d/%02d/%02d %02dh%02dm%02ds (Unknown version).\n", (t->tm_year + 1900), (t->tm_mon + 1), t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec ); + } } fprintf(log_fp, "%s", buf); return; diff --git a/src/common/malloc.h b/src/common/malloc.h index 1f273c9335..1660b870cd 100644 --- a/src/common/malloc.h +++ b/src/common/malloc.h @@ -4,10 +4,11 @@ #ifndef _MALLOC_H_ #define _MALLOC_H_ +#include "cbasetypes.h" + #ifdef __cplusplus extern "C" { #endif -#include "cbasetypes.h" #define ALC_MARK __FILE__, __LINE__, __func__ diff --git a/src/common/mapindex.h b/src/common/mapindex.h index cc1f6624db..812a8a9e12 100644 --- a/src/common/mapindex.h +++ b/src/common/mapindex.h @@ -54,6 +54,7 @@ extern "C" { #define MAP_MALAYA "malaya" #define MAP_ECLAGE "eclage" #define MAP_ECLAGE_IN "ecl_in01" +#define MAP_LASAGNA "lasagna" const char* mapindex_getmapname(const char* string, char* output); const char* mapindex_getmapname_ext(const char* string, char* output); diff --git a/src/common/mmo.h b/src/common/mmo.h index 7cbd06035e..d793e162e9 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -9,31 +9,10 @@ #include "db.h" #include -// server->client protocol version -// 0 - pre-? -// 1 - ? - 0x196 -// 2 - ? - 0x78, 0x79 -// 3 - ? - 0x1c8, 0x1c9, 0x1de -// 4 - ? - 0x1d7, 0x1d8, 0x1d9, 0x1da -// 5 - 2003-12-18aSakexe+ - 0x1ee, 0x1ef, 0x1f0, ?0x1c4, 0x1c5? -// 6 - 2004-03-02aSakexe+ - 0x1f4, 0x1f5 -// 7 - 2005-04-11aSakexe+ - 0x229, 0x22a, 0x22b, 0x22c -// see conf/battle/client.conf for other version - #ifndef PACKETVER - #define PACKETVER 20151104 - //#define PACKETVER 20120410 + #error Please define PACKETVER in src/config/packets.h #endif -// Check if the specified packetversion supports the pincode system -#define PACKETVER_SUPPORTS_PINCODE PACKETVER>=20110309 - -/// Check if the client needs delete_date as remaining time and not the actual delete_date (actually it was tested for clients since 2013) -#define PACKETVER_CHAR_DELETEDATE (PACKETVER > 20130000 && PACKETVER < 20141016) || PACKETVER >= 20150513 - -// Check if the specified packetvresion supports the cashshop sale system -#define PACKETVER_SUPPORTS_SALES PACKETVER>=20131223 - ///Remove/Comment this line to disable sc_data saving. [Skotlex] #define ENABLE_SC_SAVING /** Remove/Comment this line to disable server-side hot-key saving support [Skotlex] @@ -162,6 +141,12 @@ #define EL_CLASS_BASE 2114 #define EL_CLASS_MAX (EL_CLASS_BASE+MAX_ELEMENTAL_CLASS-1) +//Achievement System +#define MAX_ACHIEVEMENT_RANK 20 /// Maximum achievement level +#define MAX_ACHIEVEMENT_OBJECTIVES 10 /// Maximum different objectives in achievement_db.conf +#define MAX_ACHIEVEMENT_DEPENDENTS 20 /// Maximum different dependents in achievement_db.conf +#define ACHIEVEMENT_NAME_LENGTH 50 /// Max Achievement Name length + enum item_types { IT_HEALING = 0, IT_UNKNOWN, //1 @@ -201,6 +186,15 @@ struct s_item_randomoption { char param; }; +/// Achievement log entry +struct achievement { + int achievement_id; ///< Achievement ID + int count[MAX_ACHIEVEMENT_OBJECTIVES]; ///< Counters of each achievement objective + time_t completed; ///< Date completed + time_t rewarded; ///< Received reward? + int score; ///< Amount of points achievement is worth +}; + struct item { int id; unsigned short nameid; @@ -226,8 +220,8 @@ enum equip_pos { EQP_ARMOR = 0x000010, // 16 EQP_SHOES = 0x000040, // 64 EQP_GARMENT = 0x000004, // 4 - EQP_ACC_L = 0x000008, // 8 - EQP_ACC_R = 0x000080, // 128 + EQP_ACC_R = 0x000008, // 8 + EQP_ACC_L = 0x000080, // 128 EQP_COSTUME_HEAD_TOP = 0x000400, // 1024 EQP_COSTUME_HEAD_MID = 0x000800, // 2048 EQP_COSTUME_HEAD_LOW = 0x001000, // 4096 @@ -268,12 +262,6 @@ enum e_skill_flag SKILL_FLAG_REPLACED_LV_0 = 10, // temporary skill overshadowing permanent skill of level 'N - SKILL_FLAG_REPLACED_LV_0', }; -enum e_mmo_charstatus_opt { - OPT_NONE = 0x0, - OPT_SHOW_EQUIP = 0x1, - OPT_ALLOW_PARTY = 0x2, -}; - struct s_skill { uint16 id; uint8 lv; @@ -499,6 +487,7 @@ struct mmo_charstatus { uint32 uniqueitem_counter; unsigned char hotkey_rowshift; + unsigned long title_id; }; typedef enum mail_status { diff --git a/src/common/sql.c b/src/common/sql.c index 6533aafebc..38760139be 100644 --- a/src/common/sql.c +++ b/src/common/sql.c @@ -352,6 +352,16 @@ uint64 Sql_NumRows(Sql* self) +/// Returns the number of rows affected by the last query +uint64 Sql_NumRowsAffected(Sql* self) +{ + if( self ) + return (uint64)mysql_affected_rows(&self->handle); + return 0; +} + + + /// Fetches the next row. int Sql_NextRow(Sql* self) { diff --git a/src/common/sql.h b/src/common/sql.h index 828b000654..8b03e1bf34 100644 --- a/src/common/sql.h +++ b/src/common/sql.h @@ -4,14 +4,12 @@ #ifndef _COMMON_SQL_H_ #define _COMMON_SQL_H_ -#ifdef __cplusplus -extern "C" { -#endif - #include "cbasetypes.h" #include // va_list - +#ifdef __cplusplus +extern "C" { +#endif // Return codes #define SQL_ERROR -1 @@ -175,6 +173,13 @@ uint64 Sql_NumRows(Sql* self); +/// Returns the number of rows affected by the last query +/// +/// @return Number of rows +uint64 Sql_NumRowsAffected(Sql* self); + + + /// Fetches the next row. /// The data of the previous row is no longer valid. /// diff --git a/src/common/strlib.h b/src/common/strlib.h index 441d51993e..930f65526d 100644 --- a/src/common/strlib.h +++ b/src/common/strlib.h @@ -4,10 +4,6 @@ #ifndef _STRLIB_H_ #define _STRLIB_H_ -#ifdef __cplusplus -extern "C" { -#endif - #include "cbasetypes.h" #include @@ -21,6 +17,10 @@ extern "C" { #undef __USED_GNU #endif +#ifdef __cplusplus +extern "C" { +#endif + char* jstrescape (char* pt); char* jstrescapecpy (char* pt, const char* spt); int jmemescapecpy (char* pt, const char* spt, int size); diff --git a/src/common/timer.c b/src/common/timer.c index 32a368fe92..0ef2a1c00b 100644 --- a/src/common/timer.c +++ b/src/common/timer.c @@ -198,7 +198,7 @@ unsigned int gettick(void) static void push_timer_heap(int tid) { BHEAP_ENSURE(timer_heap, 1, 256); - BHEAP_PUSH(timer_heap, tid, DIFFTICK_MINTOPCMP, swap); + BHEAP_PUSH(timer_heap, tid, DIFFTICK_MINTOPCMP, SWAP); } /*========================== @@ -335,9 +335,9 @@ int settick_timer(int tid, unsigned int tick) return (int)tick;// nothing to do, already in propper position // pop and push adjusted timer - BHEAP_POPINDEX(timer_heap, i, DIFFTICK_MINTOPCMP, swap); + BHEAP_POPINDEX(timer_heap, i, DIFFTICK_MINTOPCMP, SWAP); timer_data[tid].tick = tick; - BHEAP_PUSH(timer_heap, tid, DIFFTICK_MINTOPCMP, swap); + BHEAP_PUSH(timer_heap, tid, DIFFTICK_MINTOPCMP, SWAP); return (int)tick; } @@ -357,7 +357,7 @@ int do_timer(unsigned int tick) break; // no more expired timers to process // remove timer - BHEAP_POP(timer_heap, DIFFTICK_MINTOPCMP, swap); + BHEAP_POP(timer_heap, DIFFTICK_MINTOPCMP, SWAP); timer_data[tid].type |= TIMER_REMOVE_HEAP; if( timer_data[tid].func ) diff --git a/src/common/utils.c b/src/common/utils.c index 881bae3e67..f4e7adf7aa 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -358,59 +358,6 @@ float GetFloat(const unsigned char* buf) return *((float*)(void*)&val); } -uint32 date2version(int date) { - if(date < 20040906) return 5; - else if(date < 20040920) return 10; - else if(date < 20041005) return 11; - else if(date < 20041025) return 12; - else if(date < 20041129) return 13; - else if(date < 20050110) return 14; - else if(date < 20050509) return 15; - else if(date < 20050628) return 16; - else if(date < 20050718) return 17; - else if(date < 20050719) return 18; - else if(date < 20060327) return 19; - else if(date < 20070108) return 20; - else if(date < 20070212) return 21; - //wtf @FIXME - //else if(date < 20080910) return 22; - else if(date < 20080827) return 23; - else if(date < 20080910) return 24; - //unable to solve from date - else if(date < 20101124) return 25; - else if(date < 20111005) return 26; - else if(date < 20111102) return 27; - else if(date < 20120307) return 28; - else if(date < 20120410) return 29; - else if(date < 20120418) return 30; - else if(date < 20120618) return 31; - else if(date < 20120702) return 32; - else if(date < 20130320) return 33; - else if(date < 20130515) return 34; - else if(date < 20130522) return 35; - else if(date < 20130529) return 36; - else if(date < 20130605) return 37; - else if(date < 20130612) return 38; - else if(date < 20130618) return 39; - else if(date < 20130626) return 40; - else if(date < 20130703) return 41; - else if(date < 20130710) return 42; - else if(date < 20130717) return 43; - else if(date < 20130807) return 44; - else if(date < 20131223) return 45; - else if(date < 20140212) return 46; - //else if(date < 20140613) return 47; - //else if(date < 20141016) return 48; - else if(date < 20141022) return 50; - else if(date < 20150513) return 51; - else if(date < 20150916) return 52; - else if(date < 20151001) return 53; - else if(date < 20151104) return 54; - else if(date >= 20151104) return 55; - - else return 30; //default -} - /// calculates the value of A / B, in percent (rounded down) unsigned int get_percentage(const unsigned int A, const unsigned int B) { diff --git a/src/common/utils.h b/src/common/utils.h index 8dfa9ebb3d..04bea94984 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -50,8 +50,6 @@ extern uint32 GetULong(const unsigned char* buf); extern int32 GetLong(const unsigned char* buf); extern float GetFloat(const unsigned char* buf); -uint32 date2version(int date); - int levenshtein(const char *s1, const char *s2); #ifdef __cplusplus diff --git a/src/common/yamlwrapper.cpp b/src/common/yamlwrapper.cpp index 59838720aa..33ab29f1b4 100644 --- a/src/common/yamlwrapper.cpp +++ b/src/common/yamlwrapper.cpp @@ -31,8 +31,8 @@ yamlwrapper::yamlwrapper(YAML::Node node) { this->root = node; } -yamliterator::yamliterator(YAML::Node sequence) { - this->sequence = sequence; +yamliterator::yamliterator(YAML::Node sequence_) { + this->sequence = sequence_; this->index = 0; } @@ -41,13 +41,23 @@ yamliterator* yamlwrapper::iterator() { } yamlwrapper* yaml_load_file(const char* file_name) { - YAML::Node node = YAML::LoadFile(file_name); - if (!node.IsDefined()) + YAML::Node node; + + try { + node = YAML::LoadFile(file_name); + if (!node.IsDefined() || node.IsNull()) + return NULL; + } catch (YAML::ParserException &e) { + ShowError("YAML Exception Caught: %s\n", e.what()); return NULL; + } catch (YAML::BadFile) { + return NULL; + } + return new yamlwrapper(node); } -extern "C++" YAML::Node yaml_get_node(YAML::Node& node, std::string& key) { +extern "C++" YAML::Node yaml_get_node(const YAML::Node& node,const std::string& key) { if (key.empty()) return node; @@ -107,6 +117,50 @@ bool yaml_get_boolean(yamlwrapper* wrapper, const char* key) { return yaml_get_value(wrapper, key); } +char* yaml_as_c_string(yamlwrapper* wrapper) { + std::string cpp_str = wrapper->root.as(); + const char* c_str = cpp_str.c_str(); + size_t str_size = std::strlen(c_str) + 1; + char* buf = (char*)aCalloc(1, str_size); + strcpy(buf, c_str); + return buf; +} + +extern "C++" { + template + T yaml_as_value(yamlwrapper* wrapper) { + if (wrapper == nullptr) + return {}; + try { + return wrapper->root.as(); + } + catch (const std::exception& e) { + ShowError("Error during YAML node value resolving in node %s.\n", e.what()); + return {}; + } + } +} + +int yaml_as_int(yamlwrapper* wrapper) { + return yaml_as_value(wrapper); +} + +int16 yaml_as_int16(yamlwrapper* wrapper) { + return yaml_as_value(wrapper); +} + +int32 yaml_as_int32(yamlwrapper* wrapper) { + return yaml_as_value(wrapper); +} + +int64 yaml_as_int64(yamlwrapper* wrapper) { + return yaml_as_value(wrapper); +} + +bool yaml_as_boolean(yamlwrapper* wrapper) { + return yaml_as_value(wrapper); +} + bool yaml_node_is_defined(yamlwrapper* wrapper, const char* key) { if (wrapper == nullptr || key == nullptr) return false; diff --git a/src/common/yamlwrapper.h b/src/common/yamlwrapper.h index d6f7069c4a..d00c084d17 100644 --- a/src/common/yamlwrapper.h +++ b/src/common/yamlwrapper.h @@ -42,7 +42,7 @@ class yamliterator { public: YAML::Node sequence; unsigned int index; - yamliterator(YAML::Node sequence); + yamliterator(YAML::Node sequence_); }; class yamlwrapper { @@ -65,6 +65,12 @@ int16 yaml_get_int16(yamlwrapper* wrapper, const char* key); int32 yaml_get_int32(yamlwrapper* wrapper, const char* key); int64 yaml_get_int64(yamlwrapper* wrapper, const char* key); bool yaml_get_boolean(yamlwrapper* wrapper, const char* key); +char* yaml_as_c_string(yamlwrapper* wrapper); +int yaml_as_int(yamlwrapper* wrapper); +int16 yaml_as_int16(yamlwrapper* wrapper); +int32 yaml_as_int32(yamlwrapper* wrapper); +int64 yaml_as_int64(yamlwrapper* wrapper); +bool yaml_as_boolean(yamlwrapper* wrapper); bool yaml_node_is_defined(yamlwrapper* wrapper, const char* key); yamlwrapper* yaml_get_subnode(yamlwrapper* wrapper, const char* key); yamliterator* yaml_get_iterator(yamlwrapper* wrapper); diff --git a/src/config/core.h b/src/config/core.h index e6febaf11f..4f55c6616a 100644 --- a/src/config/core.h +++ b/src/config/core.h @@ -8,6 +8,8 @@ * For detailed guidance on these check http://rathena.org/wiki/SRC/config/ **/ +#include "../custom/defines_pre.h" + /// Max number of items on @autolootid list #define AUTOLOOTITEM_SIZE 10 @@ -76,12 +78,6 @@ #define MAX_CHAR_BILLING 0 // This must be less than MAX_CHARS #endif -/// Comment to disable the official packet obfuscation support. -/// When enabled, make sure there is value for 'packet_keys' of used packet version or -/// defined 'packet_keys_use' in db/[import/]packet_db.txt. -/// This requires PACKETVER 2011-08-17 or newer. -#define PACKET_OBFUSCATION - /// Comment to disable warnings for deprecated script commands #define SCRIPT_COMMAND_DEPRECATION @@ -91,6 +87,7 @@ /** * No settings past this point **/ +#include "./packets.h" #include "./renewal.h" #include "./secure.h" #include "./classes/general.h" @@ -100,4 +97,6 @@ **/ #include "./const.h" +#include "../custom/defines_post.h" + #endif // _CONFIG_CORE_H_ diff --git a/src/config/packets.h b/src/config/packets.h new file mode 100644 index 0000000000..542ca86639 --- /dev/null +++ b/src/config/packets.h @@ -0,0 +1,63 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder +#ifndef _CONFIG_PACKETS_H_ +#define _CONFIG_PACKETS_H_ + +/** + * rAthena configuration file (http://rathena.org) + * For detailed guidance on these check http://rathena.org/wiki/SRC/config/ + **/ + +#ifndef PACKETVER + #define PACKETVER 20151104 +#endif + +#ifndef PACKETVER_RE + /// From this point on only kRO RE clients are supported + #if PACKETVER > 20151104 + #define PACKETVER_RE + #endif +#endif + +#if PACKETVER >= 20110817 + /// Comment to disable the official packet obfuscation support. + /// This requires PACKETVER 2011-08-17 or newer. + #ifndef PACKET_OBFUSCATION + #define PACKET_OBFUSCATION + + // Define these inside src/custom/defines_pre.h or src/custom/defines_post.h + //#define PACKET_OBFUSCATION_KEY1 + //#define PACKET_OBFUSCATION_KEY2 + //#define PACKET_OBFUSCATION_KEY3 + + /// Comment this to disable warnings for missing client side encryption + #define PACKET_OBFUSCATION_WARN + #endif +#else + #if defined(PACKET_OBFUSCATION) + #error You enabled packet obfuscation for a version which is too old. Minimum supported client is 2011-08-17. + #endif +#endif + +#ifndef DUMP_UNKNOWN_PACKET + //#define DUMP_UNKNOWN_PACKET +#endif + +#ifndef DUMP_INVALID_PACKET + //#define DUMP_INVALID_PACKET +#endif + +/** + * No settings past this point + **/ + +/// Check if the specified packetversion supports the pincode system +#define PACKETVER_SUPPORTS_PINCODE PACKETVER >= 20110309 + +/// Check if the client needs delete_date as remaining time and not the actual delete_date (actually it was tested for clients since 2013) +#define PACKETVER_CHAR_DELETEDATE (PACKETVER > 20130000 && PACKETVER <= 20141022) || PACKETVER >= 20150513 + +/// Check if the specified packetvresion supports the cashshop sale system +#define PACKETVER_SUPPORTS_SALES PACKETVER >= 20131223 + +#endif // _CONFIG_PACKETS_H_ diff --git a/src/custom/defines_post.h b/src/custom/defines_post.h new file mode 100644 index 0000000000..33f34d4a77 --- /dev/null +++ b/src/custom/defines_post.h @@ -0,0 +1,13 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder +#ifndef _CONFIG_CUSTOM_DEFINES_POST_H_ +#define _CONFIG_CUSTOM_DEFINES_POST_H_ + +/** + * rAthena configuration file (http://rathena.org) + * For detailed guidance on these check http://rathena.org/wiki/SRC/config/ + **/ + + + +#endif // _CONFIG_CUSTOM_DEFINES_POST_H_ diff --git a/src/custom/defines_pre.h b/src/custom/defines_pre.h new file mode 100644 index 0000000000..ceed7e774c --- /dev/null +++ b/src/custom/defines_pre.h @@ -0,0 +1,13 @@ +// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder +#ifndef _CONFIG_CUSTOM_DEFINES_PRE_H_ +#define _CONFIG_CUSTOM_DEFINES_PRE_H_ + +/** + * rAthena configuration file (http://rathena.org) + * For detailed guidance on these check http://rathena.org/wiki/SRC/config/ + **/ + + + +#endif // _CONFIG_CUSTOM_DEFINES_PRE_H_ diff --git a/src/login/Makefile.in b/src/login/Makefile.in index f6d3ba67a7..7c13d48ef6 100644 --- a/src/login/Makefile.in +++ b/src/login/Makefile.in @@ -23,8 +23,6 @@ else endif ALL_DEPENDS=server -CXXFLAGS=-std=c++11 - @SET_MAKE@ ##################################################################### diff --git a/src/login/login.cpp b/src/login/login.cpp index f525f1d59b..24acaca376 100644 --- a/src/login/login.cpp +++ b/src/login/login.cpp @@ -303,13 +303,6 @@ int login_mmo_auth(struct login_session_data* sd, bool isServer) { } - //Client Version check - if( login_config.check_client_version && sd->version != login_config.client_version_to_connect ){ - ShowNotice("Invalid version (account: '%s', auth_vers: '%d', received version: '%d', ip: %s)\n", - sd->userid, login_config.client_version_to_connect, sd->version, ip); - return 5; - } - len = strnlen(sd->userid, NAME_LENGTH); // Account creation with _M/_F @@ -591,10 +584,6 @@ bool login_config_read(const char* cfgName, bool normal) { login_config.new_acc_length_limit = (bool)config_switch(w2); else if(!strcmpi(w1, "start_limited_time")) login_config.start_limited_time = atoi(w2); - else if(!strcmpi(w1, "check_client_version")) - login_config.check_client_version = (bool)config_switch(w2); - else if(!strcmpi(w1, "client_version_to_connect")) - login_config.client_version_to_connect = strtoul(w2, NULL, 10); else if(!strcmpi(w1, "use_MD5_passwords")) login_config.use_md5_passwds = (bool)config_switch(w2); else if(!strcmpi(w1, "group_id_to_connect")) @@ -701,9 +690,6 @@ void login_set_defaults() { login_config.use_md5_passwds = false; login_config.group_id_to_connect = -1; login_config.min_group_id_to_connect = -1; - login_config.check_client_version = false; - login_config.client_version_to_connect = date2version(PACKETVER); //20120410 => 30 - ShowInfo("loginconfig: client_version_to_connect = %d\n",login_config.client_version_to_connect); login_config.ipban = true; login_config.dynamic_pass_failure_ban = true; diff --git a/src/login/login.h b/src/login/login.h index 670533b295..653b0ac377 100644 --- a/src/login/login.h +++ b/src/login/login.h @@ -46,7 +46,6 @@ struct login_session_data { char lastlogin[24]; ///date when last logged, Y-M-D HH:MM:SS uint8 group_id; ///groupid of account uint8 clienttype; /// ??? - uint32 version; ///version contained in clientinfo uint8 client_hash[16]; ///hash of client int has_client_hash; ///client ha sent an hash @@ -86,8 +85,6 @@ struct Login_Config { bool use_md5_passwds; /// work with password hashes instead of plaintext passwords? int group_id_to_connect; /// required group id to connect int min_group_id_to_connect; /// minimum group id to connect - bool check_client_version; /// check the clientversion set in the clientinfo ? - uint32 client_version_to_connect; /// the client version needed to connect (if checking is enabled) bool ipban; /// perform IP blocking (via contents of `ipbanlist`) ? bool dynamic_pass_failure_ban; /// automatic IP blocking due to failed login attempts ? @@ -143,7 +140,6 @@ struct auth_node { uint32 login_id2; uint32 ip; char sex; - uint32 version; uint8 clienttype; }; extern DBMap* auth_db; // uint32 account_id -> struct auth_node* diff --git a/src/login/loginchrif.c b/src/login/loginchrif.c index 3ef53ff289..49e0dd6c03 100644 --- a/src/login/loginchrif.c +++ b/src/login/loginchrif.c @@ -96,7 +96,7 @@ int logchrif_parse_reqauth(int fd, int id,char* ip){ //ShowStatus("Char-server '%s': authentication of the account %d accepted (ip: %s).\n", server[id].name, account_id, ip); // send ack - WFIFOHEAD(fd,25); + WFIFOHEAD(fd,21); WFIFOW(fd,0) = 0x2713; WFIFOL(fd,2) = account_id; WFIFOL(fd,6) = login_id1; @@ -104,15 +104,14 @@ int logchrif_parse_reqauth(int fd, int id,char* ip){ WFIFOB(fd,14) = sex; WFIFOB(fd,15) = 0;// ok WFIFOL(fd,16) = request_id; - WFIFOL(fd,20) = node->version; - WFIFOB(fd,24) = node->clienttype; - WFIFOSET(fd,25); + WFIFOB(fd,20) = node->clienttype; + WFIFOSET(fd,21); // each auth entry can only be used once idb_remove(auth_db, account_id); }else{// authentication not found ShowStatus("Char-server '%s': authentication of the account %d REFUSED (ip: %s).\n", ch_server[id].name, account_id, ip); - WFIFOHEAD(fd,25); + WFIFOHEAD(fd,21); WFIFOW(fd,0) = 0x2713; WFIFOL(fd,2) = account_id; WFIFOL(fd,6) = login_id1; @@ -120,9 +119,8 @@ int logchrif_parse_reqauth(int fd, int id,char* ip){ WFIFOB(fd,14) = sex; WFIFOB(fd,15) = 1;// auth failed WFIFOL(fd,16) = request_id; - WFIFOL(fd,20) = 0; - WFIFOB(fd,24) = 0; - WFIFOSET(fd,25); + WFIFOB(fd,20) = 0; + WFIFOSET(fd,21); } } return 1; diff --git a/src/login/loginclif.c b/src/login/loginclif.c index 4ae3088d76..d69aa983b8 100644 --- a/src/login/loginclif.c +++ b/src/login/loginclif.c @@ -159,7 +159,6 @@ static void logclif_auth_ok(struct login_session_data* sd) { node->login_id2 = sd->login_id2; node->sex = sd->sex; node->ip = ip; - node->version = sd->version; node->clienttype = sd->clienttype; idb_put(auth_db, sd->account_id, node); { @@ -181,7 +180,7 @@ static void logclif_auth_ok(struct login_session_data* sd) { 3 = Rejected from Server 4 = You have been blocked by the GM Team 5 = Your Game's EXE file is not the latest version - 6 = Your are Prohibited to log in until %s + 6 = You are prohibited to log in until %s 7 = Server is jammed due to over populated 8 = No more accounts may be connected from this company 9 = MSI_REFUSE_BAN_BY_DBA @@ -216,37 +215,33 @@ static void logclif_auth_failed(struct login_session_data* sd, int result) { if( (result == 0 || result == 1) && login_config.dynamic_pass_failure_ban ) ipban_log(ip); // log failed password attempt -//#if PACKETVER >= 20120000 /* not sure when this started */ - if( sd->version >= date2version(20120000) ){ /* not sure when this started */ - WFIFOHEAD(fd,26); - WFIFOW(fd,0) = 0x83e; - WFIFOL(fd,2) = result; - if( result != 6 ) - memset(WFIFOP(fd,6), '\0', 20); - else { // 6 = Your are Prohibited to log in until %s - struct mmo_account acc; - AccountDB* accounts = login_get_accounts_db(); - time_t unban_time = ( accounts->load_str(accounts, &acc, sd->userid) ) ? acc.unban_time : 0; - timestamp2string(WFIFOCP(fd,6), 20, unban_time, login_config.date_format); - } - WFIFOSET(fd,26); +#if PACKETVER >= 20120000 /* not sure when this started */ + WFIFOHEAD(fd,26); + WFIFOW(fd,0) = 0x83e; + WFIFOL(fd,2) = result; + if( result != 6 ) + memset(WFIFOP(fd,6), '\0', 20); + else { // 6 = You are prohibited to log in until %s + struct mmo_account acc; + AccountDB* accounts = login_get_accounts_db(); + time_t unban_time = ( accounts->load_str(accounts, &acc, sd->userid) ) ? acc.unban_time : 0; + timestamp2string(WFIFOCP(fd,6), 20, unban_time, login_config.date_format); } -//#else - else { - WFIFOHEAD(fd,23); - WFIFOW(fd,0) = 0x6a; - WFIFOB(fd,2) = (uint8)result; - if( result != 6 ) - memset(WFIFOP(fd,3), '\0', 20); - else { // 6 = Your are Prohibited to log in until %s - struct mmo_account acc; - AccountDB* accounts = login_get_accounts_db(); - time_t unban_time = ( accounts->load_str(accounts, &acc, sd->userid) ) ? acc.unban_time : 0; - timestamp2string(WFIFOCP(fd,3), 20, unban_time, login_config.date_format); - } - WFIFOSET(fd,23); + WFIFOSET(fd,26); +#else + WFIFOHEAD(fd,23); + WFIFOW(fd,0) = 0x6a; + WFIFOB(fd,2) = (uint8)result; + if( result != 6 ) + memset(WFIFOP(fd,3), '\0', 20); + else { // 6 = You are prohibited to log in until %s + struct mmo_account acc; + AccountDB* accounts = login_get_accounts_db(); + time_t unban_time = ( accounts->load_str(accounts, &acc, sd->userid) ) ? acc.unban_time : 0; + timestamp2string(WFIFOCP(fd,3), 20, unban_time, login_config.date_format); } -//#endif + WFIFOSET(fd,23); +#endif } /** @@ -306,7 +301,6 @@ static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int comm return 0; else { int result; - uint32 version; char username[NAME_LENGTH]; char password[PASSWD_LENGTH]; unsigned char passhash[16]; @@ -320,8 +314,6 @@ static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int comm size_t uAccLen = strlen(accname); size_t uTokenLen = RFIFOREST(fd) - 0x5C; - version = RFIFOL(fd,4); - if(uAccLen > NAME_LENGTH - 1 || uAccLen == 0 || uTokenLen > NAME_LENGTH - 1 || uTokenLen == 0) { logclif_auth_failed(sd, 3); @@ -334,7 +326,6 @@ static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int comm } else { - version = RFIFOL(fd,2); safestrncpy(username, RFIFOCP(fd,6), NAME_LENGTH); if( israwpass ) { @@ -350,11 +341,10 @@ static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int comm RFIFOSKIP(fd,RFIFOREST(fd)); // assume no other packet was sent sd->clienttype = clienttype; - sd->version = version; safestrncpy(sd->userid, username, NAME_LENGTH); if( israwpass ) { - ShowStatus("Request for connection of %s (ip: %s) version=%d\n", sd->userid, ip,sd->version); + ShowStatus("Request for connection of %s (ip: %s)\n", sd->userid, ip); safestrncpy(sd->passwd, password, NAME_LENGTH); if( login_config.use_md5_passwds ) MD5_String(sd->passwd, sd->passwd); @@ -362,7 +352,7 @@ static int logclif_parse_reqauth(int fd, struct login_session_data *sd, int comm } else { - ShowStatus("Request for connection (passwdenc mode) of %s (ip: %s) version=%d\n", sd->userid, ip,sd->version); + ShowStatus("Request for connection (passwdenc mode) of %s (ip: %s)\n", sd->userid, ip); bin2hex(sd->passwd, passhash, 16); // raw binary data here! sd->passwdenc = PASSWORDENC; } @@ -430,7 +420,6 @@ static int logclif_parse_reqcharconnec(int fd, struct login_session_data *sd, ch if( login_config.use_md5_passwds ) MD5_String(sd->passwd, sd->passwd); sd->passwdenc = 0; - sd->version = login_config.client_version_to_connect; // hack to skip version check server_ip = ntohl(RFIFOL(fd,54)); server_port = ntohs(RFIFOW(fd,58)); safestrncpy(server_name, RFIFOCP(fd,60), 20); diff --git a/src/map/Makefile.in b/src/map/Makefile.in index c9775682d9..35d5f368df 100644 --- a/src/map/Makefile.in +++ b/src/map/Makefile.in @@ -11,6 +11,12 @@ LIBCONFIG_H = $(shell ls ../../3rdparty/libconfig/*.h) LIBCONFIG_AR = ../../3rdparty/libconfig/obj/libconfig.a LIBCONFIG_INCLUDE = -I../../3rdparty/libconfig +YAML_CPP_OBJ = $(shell find ../../3rdparty/yaml-cpp/ -type f -name "*.cpp" | sed -e "s/\.cpp/\.o/g" ) +YAML_CPP_DIR_OBJ = $(YAML_CPP_OBJ:%=obj/%) +YAML_CPP_AR = ../../3rdparty/yaml-cpp/obj/yaml-cpp.a +YAML_CPP_H = $(shell find ../../3rdparty/yaml-cpp/ -type f -name "*.h") +YAML_CPP_INCLUDE = -I../../3rdparty/yaml-cpp/include + MAP_OBJ = $(shell ls *.c | sed -e "s/\.c/\.o/g") $(shell ls *.cpp | sed -e "s/\.cpp/\.o/g") MAP_DIR_OBJ = $(MAP_OBJ:%=obj/%) MAP_H = $(shell ls ../map/*.h) \ @@ -31,8 +37,6 @@ else PCRE_CFLAGS= endif -CXXFLAGS=-std=c++11 - @SET_MAKE@ ##################################################################### @@ -67,20 +71,20 @@ obj: # executables -map-server: obj $(MAP_DIR_OBJ) $(COMMON_AR) $(LIBCONFIG_AR) +map-server: obj $(MAP_DIR_OBJ) $(COMMON_AR) $(LIBCONFIG_AR) $(YAML_CPP_AR) @echo " LD @OMAP@@EXEEXT@" - @@CXX@ @LDFLAGS@ -o ../../@OMAP@@EXEEXT@ $(MAP_DIR_OBJ) $(COMMON_AR) $(MT19937AR_OBJ) $(LIBCONFIG_AR) @LIBS@ @PCRE_LIBS@ @MYSQL_LIBS@ + @@CXX@ @LDFLAGS@ -o ../../@OMAP@@EXEEXT@ $(MAP_DIR_OBJ) $(COMMON_AR) $(MT19937AR_OBJ) $(LIBCONFIG_AR) $(YAML_CPP_AR) @LIBS@ @PCRE_LIBS@ @MYSQL_LIBS@ # map object files -obj/%.o: %.c $(MAP_H) $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) +obj/%.o: %.c $(MAP_H) $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H) @echo " CC $<" - @@CC@ @CFLAGS@ $(COMMON_INCLUDE) $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(PCRE_CFLAGS) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + @@CC@ @CFLAGS@ $(COMMON_INCLUDE) $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(PCRE_CFLAGS) $(YAML_CPP_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< -obj/%.o: %.cpp $(MAP_H) $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) +obj/%.o: %.cpp $(MAP_H) $(COMMON_H) $(MT19937AR_H) $(LIBCONFIG_H) $(YAML_CPP_H) @echo " CXX $<" - @@CXX@ @CXXFLAGS@ $(COMMON_INCLUDE) $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(PCRE_CFLAGS) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + @@CXX@ @CXXFLAGS@ $(COMMON_INCLUDE) $(MT19937AR_INCLUDE) $(LIBCONFIG_INCLUDE) $(PCRE_CFLAGS) $(YAML_CPP_INCLUDE) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< # missing object files $(COMMON_AR): @@ -91,3 +95,6 @@ $(MT19937AR_OBJ): $(LIBCONFIG_AR): @$(MAKE) -C ../../3rdparty/libconfig + +$(YAML_CPP_AR): + @$(MAKE) -C ../../3rdparty/yaml-cpp diff --git a/src/map/achievement.c b/src/map/achievement.c new file mode 100644 index 0000000000..177e7aff3a --- /dev/null +++ b/src/map/achievement.c @@ -0,0 +1,1275 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "../common/cbasetypes.h" +#include "../common/malloc.h" +#include "../common/nullpo.h" +#include "../common/showmsg.h" +#include "../common/strlib.h" +#include "../common/utils.h" +#include "../common/yamlwrapper.h" + +#include "achievement.h" +#include "chrif.h" +#include "clif.h" +#include "intif.h" +#include "itemdb.h" +#include "map.h" +#include "pc.h" +#include "script.h" +#include "status.h" + +#include +#include +#include +#include + +static jmp_buf av_error_jump; +static char* av_error_msg; +static const char* av_error_pos; +static int av_error_report; + +static DBMap *achievement_db = NULL; // int achievement_id -> struct achievement_db * +static DBMap *achievementmobs_db = NULL; // Avoids checking achievements on every mob killed +static void achievement_db_free_sub(struct achievement_db *achievement, bool free); + +/** + * Searches an achievement by ID + * @param achievement_id: ID to lookup + * @return Achievement entry (equals to &achievement_dummy if the ID is invalid) + */ +struct achievement_db *achievement_search(int achievement_id) +{ + struct achievement_db *achievement = (struct achievement_db *)idb_get(achievement_db, achievement_id); + + if (!achievement) + return &achievement_dummy; + return achievement; +} + +/** + * Searches for an achievement by monster ID + * @param mob_id: Monster ID to lookup + * @return True on success, false on failure + */ +bool achievement_mobexists(int mob_id) +{ + if (!battle_config.feature_achievement) + return false; + return idb_exists(achievementmobs_db, mob_id); +} + +/** + * Add an achievement to the player's log + * @param sd: Player data + * @param achievement_id: Achievement to add + * @return NULL on failure, achievement data on success + */ +struct achievement *achievement_add(struct map_session_data *sd, int achievement_id) +{ + struct achievement_db *adb = &achievement_dummy; + int i, index; + + nullpo_retr(NULL, sd); + + if ((adb = achievement_search(achievement_id)) == &achievement_dummy) { + ShowError("achievement_add: Achievement %d not found in DB.\n", achievement_id); + return NULL; + } + + ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id); + if (i < sd->achievement_data.count) { + ShowError("achievement_add: Character %d already has achievement %d.\n", sd->status.char_id, achievement_id); + return NULL; + } + + index = sd->achievement_data.incompleteCount; + + sd->achievement_data.count++; + sd->achievement_data.incompleteCount++; + RECREATE(sd->achievement_data.achievements, struct achievement, sd->achievement_data.count); + + // The character has some completed achievements, make room before them so that they will stay at the end of the array + if (sd->achievement_data.incompleteCount != sd->achievement_data.count) + memmove(&sd->achievement_data.achievements[index + 1], &sd->achievement_data.achievements[index], sizeof(struct achievement) * (sd->achievement_data.count - sd->achievement_data.incompleteCount)); + + memset(&sd->achievement_data.achievements[index], 0, sizeof(struct achievement)); + + sd->achievement_data.achievements[index].achievement_id = achievement_id; + sd->achievement_data.achievements[index].score = adb->score; + sd->achievement_data.save = true; + + clif_achievement_update(sd, &sd->achievement_data.achievements[index], sd->achievement_data.count - sd->achievement_data.incompleteCount); + + return &sd->achievement_data.achievements[index]; +} + +/** + * Removes an achievement from a player's log + * @param sd: Player's data + * @param achievement_id: Achievement to remove + * @return True on success, false on failure + */ +bool achievement_remove(struct map_session_data *sd, int achievement_id) +{ + struct achievement dummy; + int i; + + nullpo_retr(false, sd); + + if (achievement_search(achievement_id) == &achievement_dummy) { + ShowError("achievement_delete: Achievement %d not found in DB.\n", achievement_id); + return false; + } + + ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id); + if (i == sd->achievement_data.count) { + ShowError("achievement_delete: Character %d doesn't have achievement %d.\n", sd->status.char_id, achievement_id); + return false; + } + + if (!sd->achievement_data.achievements[i].completed) + sd->achievement_data.incompleteCount--; + + if (i != sd->achievement_data.count - 1) + memmove(&sd->achievement_data.achievements[i], &sd->achievement_data.achievements[i + 1], sizeof(struct achievement) * (sd->achievement_data.count - 1 - i)); + + sd->achievement_data.count--; + if( sd->achievement_data.count == 0 ){ + aFree(sd->achievement_data.achievements); + sd->achievement_data.achievements = NULL; + }else{ + RECREATE(sd->achievement_data.achievements, struct achievement, sd->achievement_data.count); + } + sd->achievement_data.save = true; + + // Send a removed fake achievement + memset(&dummy, 0, sizeof(struct achievement)); + dummy.achievement_id = achievement_id; + clif_achievement_update(sd, &dummy, sd->achievement_data.count - sd->achievement_data.incompleteCount); + + return true; +} + +/** + * Checks to see if an achievement has a dependent, and if so, checks if that dependent is complete + * @param sd: Player data + * @param achievement_id: Achievement to check if it has a dependent + * @return False on failure or not complete, true on complete or no dependents + */ +bool achievement_check_dependent(struct map_session_data *sd, int achievement_id) +{ + struct achievement_db *adb = &achievement_dummy; + + nullpo_retr(false, sd); + + adb = achievement_search(achievement_id); + + if (adb == &achievement_dummy) + return false; + + // Check if the achievement has a dependent + // If so, then do a check on all dependents to see if they're complete + if (adb->dependent_count) { + int i; + + for (i = 0; i < adb->dependent_count; i++) { + struct achievement_db *adb_dep = achievement_search(adb->dependents[i].achievement_id); + int j; + + if (adb_dep == &achievement_dummy) + return false; + + ARR_FIND(0, sd->achievement_data.count, j, sd->achievement_data.achievements[j].achievement_id == adb->dependents[i].achievement_id && sd->achievement_data.achievements[j].completed > 0); + if (j == sd->achievement_data.count) + return false; // One of the dependent is not complete! + } + } + + return true; +} + +/** + * Check achievements that only have dependents and no other requirements + * @return True if successful, false if not + */ +static int achievement_check_groups(DBKey key, DBData *data, va_list ap) +{ + struct achievement_db *ad; + struct map_session_data *sd; + int i; + + ad = (struct achievement_db *)db_data2ptr(data); + sd = va_arg(ap, struct map_session_data *); + + if (ad == &achievement_dummy || sd == NULL) + return 0; + + if (ad->group != AG_BATTLE && ad->group != AG_TAMING && ad->group != AG_ADVENTURE) + return 0; + + if (ad->dependent_count == 0 || ad->condition) + return 0; + + ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == ad->achievement_id); + if (i == sd->achievement_data.count) { // Achievement isn't in player's log + if (achievement_check_dependent(sd, ad->achievement_id) == true) { + achievement_add(sd, ad->achievement_id); + achievement_update_achievement(sd, ad->achievement_id, true); + } + } + + return 1; +} + +/** + * Update an achievement + * @param sd: Player to update + * @param achievement_id: Achievement ID of the achievement to update + * @param complete: Complete state of an achievement + * @return True if successful, false if not + */ +bool achievement_update_achievement(struct map_session_data *sd, int achievement_id, bool complete) +{ + struct achievement_db *adb = &achievement_dummy; + int i; + + nullpo_retr(false, sd); + + adb = achievement_search(achievement_id); + + if (adb == &achievement_dummy) + return false; + + ARR_FIND(0, sd->achievement_data.incompleteCount, i, sd->achievement_data.achievements[i].achievement_id == achievement_id); + if (i == sd->achievement_data.incompleteCount) + return false; + + if (sd->achievement_data.achievements[i].completed > 0) + return false; + + // Finally we send the updated achievement to the client + if (complete) { + if (adb->target_count) { // Make sure all the objective targets are at their respective total requirement + int k; + + for (k = 0; k < adb->target_count; k++) + sd->achievement_data.achievements[i].count[k] = adb->targets[k].count; + + for (k = 1; k < adb->dependent_count; k++) { + sd->achievement_data.achievements[i].count[k] = max(1, sd->achievement_data.achievements[i].count[k]); + } + } + + sd->achievement_data.achievements[i].completed = time(NULL); + + if (i < (--sd->achievement_data.incompleteCount)) { // The achievement needs to be moved to the completed achievements block at the end of the array + struct achievement tmp_ach; + + memcpy(&tmp_ach, &sd->achievement_data.achievements[i], sizeof(struct achievement)); + memcpy(&sd->achievement_data.achievements[i], &sd->achievement_data.achievements[sd->achievement_data.incompleteCount], sizeof(struct achievement)); + memcpy(&sd->achievement_data.achievements[sd->achievement_data.incompleteCount], &tmp_ach, sizeof(struct achievement)); + } + + achievement_level(sd, true); // Re-calculate achievement level + // Check dependents + achievement_db->foreach(achievement_db, achievement_check_groups, sd); + ARR_FIND(sd->achievement_data.incompleteCount, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id); // Look for the index again, the position most likely changed + } + + clif_achievement_update(sd, &sd->achievement_data.achievements[i], sd->achievement_data.count - sd->achievement_data.incompleteCount); + sd->achievement_data.save = true; // Flag to save with the autosave interval + + if (sd->achievement_data.sendlist) { + clif_achievement_list_all(sd); + sd->achievement_data.sendlist = false; + } + + return true; +} + +/** + * Get the reward of an achievement + * @param sd: Player getting the reward + * @param achievement_id: Achievement to get reward data + */ +void achievement_get_reward(struct map_session_data *sd, int achievement_id, time_t rewarded) +{ + struct achievement_db *adb = achievement_search(achievement_id); + int i; + + nullpo_retv(sd); + + if( rewarded == 0 ){ + clif_achievement_reward_ack(sd->fd, 0, achievement_id); + return; + } + + if (adb == &achievement_dummy) { + ShowError("achievement_reward: Inter server sent a reward claim for achievement %d not found in DB.\n", achievement_id); + return; + } + + ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id); + + if (i == sd->achievement_data.count) { + return; + } + + // Only update in the cache, db was updated already + sd->achievement_data.achievements[i].rewarded = rewarded; + + run_script(adb->rewards.script, 0, sd->bl.id, fake_nd->bl.id); + if (adb->rewards.title_id) { + RECREATE(sd->titles, int, sd->titleCount + 1); + sd->titles[sd->titleCount] = adb->rewards.title_id; + sd->titleCount++; + sd->achievement_data.sendlist = true; + } + + clif_achievement_reward_ack(sd->fd, 1, achievement_id); + clif_achievement_update(sd, &sd->achievement_data.achievements[i], sd->achievement_data.count - sd->achievement_data.incompleteCount); +} + +/** + * Check if player has recieved an achievement's reward + * @param sd: Player to get reward + * @param achievement_id: Achievement to get reward data + */ +void achievement_check_reward(struct map_session_data *sd, int achievement_id) +{ + int i; + struct achievement_db *adb = achievement_search(achievement_id); + + nullpo_retv(sd); + + if (adb == &achievement_dummy) { + ShowError("achievement_reward: Trying to reward achievement %d not found in DB.\n", achievement_id); + clif_achievement_reward_ack(sd->fd, 0, achievement_id); + return; + } + + ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id); + if (i == sd->achievement_data.count) { + clif_achievement_reward_ack(sd->fd, 0, achievement_id); + return; + } + + if (sd->achievement_data.achievements[i].rewarded > 0 || sd->achievement_data.achievements[i].completed == 0) { + clif_achievement_reward_ack(sd->fd, 0, achievement_id); + return; + } + + if( !intif_achievement_reward(sd,adb) ){ + clif_achievement_reward_ack(sd->fd, 0, achievement_id); + } +} + +/** + * Return all titles to a player based on completed achievements + * @param char_id: Character ID requesting + */ +void achievement_get_titles(uint32 char_id) +{ + struct map_session_data *sd = map_charid2sd(char_id); + + if (sd) { + sd->titles = NULL; + sd->titleCount = 0; + + if (sd->achievement_data.count) { + int i; + + for (i = 0; i < sd->achievement_data.count; i++) { + struct achievement_db *adb = achievement_search(sd->achievement_data.achievements[i].achievement_id); + + if (adb && adb->rewards.title_id && sd->achievement_data.achievements[i].completed > 0) { // If the achievement has a title and is complete, give it to the player + RECREATE(sd->titles, int, sd->titleCount + 1); + sd->titles[sd->titleCount] = adb->rewards.title_id; + sd->titleCount++; + } + } + } + } +} + +/** + * Frees the player's data for achievements and titles + * @param sd: Player's session + */ +void achievement_free(struct map_session_data *sd) +{ + nullpo_retv(sd); + + if (sd->titleCount) { + aFree(sd->titles); + sd->titles = NULL; + sd->titleCount = 0; + } + + if (sd->achievement_data.count) { + aFree(sd->achievement_data.achievements); + sd->achievement_data.achievements = NULL; + sd->achievement_data.count = sd->achievement_data.incompleteCount = 0; + } +} + +/** + * Get an achievement's progress information + * @param sd: Player to check achievement progress + * @param achievement_id: Achievement progress to check + * @param type: Type to return + * @return The type's data, -1 if player doesn't have achievement, -2 on failure/incorrect type + */ +int achievement_check_progress(struct map_session_data *sd, int achievement_id, int type) +{ + int i; + + nullpo_retr(-2, sd); + + // Achievement ID is not needed so skip the lookup + if (type == ACHIEVEINFO_LEVEL) + return sd->achievement_data.level; + else if (type == ACHIEVEINFO_SCORE) + return sd->achievement_data.total_score; + + ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == achievement_id); + if (i == sd->achievement_data.count) + return -1; + + if (type >= ACHIEVEINFO_COUNT1 && type <= ACHIEVEINFO_COUNT10) + return sd->achievement_data.achievements[i].count[type - 1]; + else if (type == ACHIEVEINFO_COMPLETE) + return sd->achievement_data.achievements[i].completed > 0; + else if (type == ACHIEVEINFO_COMPLETEDATE) + return (int)sd->achievement_data.achievements[i].completed; + else if (type == ACHIEVEINFO_GOTREWARD) + return sd->achievement_data.achievements[i].rewarded > 0; + return -2; +} + +/** + * Calculate a player's achievement level + * @param sd: Player to check achievement level + * @param flag: If the call should attempt to give the AG_GOAL_ACHIEVE achievement + */ +int *achievement_level(struct map_session_data *sd, bool flag) +{ + static int info[2]; + int i, old_level; + const int score_table[MAX_ACHIEVEMENT_RANK] = { 18, 31, 49, 73, 135, 104, 140, 178, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000 }; //! TODO: Figure out the EXP required to level up from 8-20 + + nullpo_retr(0, sd); + + sd->achievement_data.total_score = 0; + old_level = sd->achievement_data.level; + + for (i = 0; i < sd->achievement_data.count; i++) { + if (sd->achievement_data.achievements[i].completed > 0) + sd->achievement_data.total_score += sd->achievement_data.achievements[i].score; + } + + info[0] = 0; + info[1] = 0; + + for (i = 0; i < MAX_ACHIEVEMENT_RANK; i++) { + info[0] = info[1]; + + if (i < ARRAYLENGTH(score_table)) + info[1] = score_table[i]; + else { + info[0] = info[1]; + info[1] = info[1] + 500; + } + + if (sd->achievement_data.total_score < info[1]) + break; + } + + if (i == MAX_ACHIEVEMENT_RANK) + i = 0; + + info[1] = info[1] - info[0]; // Right number + info[0] = sd->achievement_data.total_score - info[0]; // Left number + sd->achievement_data.level = i; + + if (flag == true && old_level != sd->achievement_data.level) { + int achievement_id = 240000 + sd->achievement_data.level; + + if( achievement_add(sd, achievement_id) ){ + achievement_update_achievement(sd, achievement_id, true); + } + } + + return info; +} + +/** + * Update achievement objectives. + * @see DBApply + */ +static int achievement_update_objectives(DBKey key, DBData *data, va_list ap) +{ + struct achievement_db *ad; + struct map_session_data *sd; + enum e_achievement_group group; + struct achievement *entry = NULL; + bool isNew = false, changed = false, complete = false; + int i, k = 0, objective_count[MAX_ACHIEVEMENT_OBJECTIVES], update_count[MAX_ACHIEVEMENT_OBJECTIVES]; + + ad = (struct achievement_db *)db_data2ptr(data); + sd = va_arg(ap, struct map_session_data *); + group = (enum e_achievement_group)va_arg(ap, int); + memcpy(update_count, (int *)va_arg(ap, int *), sizeof(update_count)); + + if (ad == NULL || sd == NULL) + return 0; + + if (group <= AG_NONE || group >= AG_MAX) + return 0; + + if (group != ad->group) + return 0; + + memset(objective_count, 0, sizeof(objective_count)); // Current objectives count + + ARR_FIND(0, sd->achievement_data.count, i, sd->achievement_data.achievements[i].achievement_id == ad->achievement_id); + if (i == sd->achievement_data.count) { // Achievement isn't in player's log + if (achievement_check_dependent(sd, ad->achievement_id) == false) // Check to see if dependents are complete before adding to player's log + return 0; + isNew = true; + } else { + entry = &sd->achievement_data.achievements[i]; + + if (entry->completed > 0) // Player has completed the achievement + return 0; + + memcpy(objective_count, entry->count, sizeof(objective_count)); + } + + switch (group) { + case AG_ADD_FRIEND: + case AG_BABY: + case AG_CHAT_COUNT: + case AG_CHAT_CREATE: + case AG_CHAT_DYING: + case AG_GET_ITEM: + case AG_GET_ZENY: + case AG_GOAL_LEVEL: + case AG_GOAL_STATUS: + case AG_JOB_CHANGE: + case AG_MARRY: + case AG_PARTY: + case AG_REFINE_FAIL: + case AG_REFINE_SUCCESS: + case AG_SPEND_ZENY: + if (group == AG_SPEND_ZENY) { // Achievement type is cummulative + objective_count[0] += update_count[0]; + changed = true; + } + + if (!ad->condition || achievement_check_condition(ad->condition, sd, update_count)) { + changed = true; + complete = true; + } + + if (changed == false) + break; + + if (isNew) { + if ((entry = achievement_add(sd, ad->achievement_id)) == NULL) + return 0; // Failed to add achievement, fall out + } + break; + case AG_CHAT: + if (!ad->target_count) + break; + + if (ad->condition && !achievement_check_condition(ad->condition, sd, update_count)) // Parameters weren't met + break; + + if (ad->mapindex > -1 && sd->bl.m != ad->mapindex) + break; + + for (i = 0; i < ad->target_count; i++) { + if (objective_count[i] < ad->targets[i].count) + objective_count[i] += update_count[0]; + } + + changed = true; + + ARR_FIND(0, ad->target_count, k, objective_count[k] < ad->targets[k].count); + if (k == ad->target_count) + complete = true; + + if (isNew) { + if ((entry = achievement_add(sd, ad->achievement_id)) == NULL) + return 0; // Failed to add achievement, fall out + } + break; + case AG_BATTLE: + case AG_TAMING: + ARR_FIND(0, ad->target_count, k, ad->targets[k].mob == update_count[0]); + if (k == ad->target_count) + break; // Mob wasn't found + + for (k = 0; k < ad->target_count; k++) { + if (ad->targets[k].mob == update_count[0] && objective_count[k] < ad->targets[k].count) { + objective_count[k]++; + changed = true; + } + } + + ARR_FIND(0, ad->target_count, k, objective_count[k] < ad->targets[k].count); + if (k == ad->target_count) + complete = true; + + if (isNew) { + if ((entry = achievement_add(sd, ad->achievement_id)) == NULL) + return 0; // Failed to add achievement, fall out + } + break; + } + + if (changed) { + memcpy(entry->count, objective_count, sizeof(objective_count)); + achievement_update_achievement(sd, ad->achievement_id, complete); + } + + return 1; +} + +/** + * Update achievement objective count. + * @param sd: Player data + * @param group: Achievement enum type + * @param sp_value: SP parameter value + * @param arg_count: va_arg count + */ +void achievement_update_objective(struct map_session_data *sd, enum e_achievement_group group, uint8 arg_count, ...) +{ + if (sd) { + va_list ap; + int i, count[MAX_ACHIEVEMENT_OBJECTIVES]; + + if (!battle_config.feature_achievement) + return; + + memset(count, 0, sizeof(count)); // Clear out array before setting values + + va_start(ap, arg_count); + for (i = 0; i < arg_count; i++) + count[i] = va_arg(ap, int); + va_end(ap); + + switch(group) { + case AG_CHAT: //! TODO: Not sure how this works officially + case AG_GOAL_ACHIEVE: + // These have no objective use right now. + break; + default: + achievement_db->foreach(achievement_db, achievement_update_objectives, sd, (int)group, count); + break; + } + } +} + +/*========================================== + * Achievement condition parsing section + *------------------------------------------*/ +static void disp_error_message2(const char *mes,const char *pos,int report) +{ + av_error_msg = aStrdup(mes); + av_error_pos = pos; + av_error_report = report; + longjmp(av_error_jump, 1); +} +#define disp_error_message(mes,pos) disp_error_message2(mes,pos,1) + +/** + * Checks the condition of an achievement. + * @param condition: Achievement condition + * @param sd: Player data + * @param count: Script arguments + * @return The result of the condition. + */ +long long achievement_check_condition(struct av_condition *condition, struct map_session_data *sd, int *count) +{ + long long left = 0; + long long right = 0; + + // Reduce the recursion, almost all calls will be C_PARAM, C_NAME or C_ARG + if (condition->left) { + if (condition->left->op == C_NAME || condition->left->op == C_INT) + left = condition->left->value; + else if (condition->left->op == C_PARAM) + left = pc_readparam(sd, (int)condition->left->value); + else if (condition->left->op == C_ARG && condition->left->value < MAX_ACHIEVEMENT_OBJECTIVES) + left = count[condition->left->value]; + else + left = achievement_check_condition(condition->left, sd, count); + } + + if (condition->right) { + if (condition->right->op == C_NAME || condition->right->op == C_INT) + right = condition->right->value; + else if (condition->right->op == C_PARAM) + right = pc_readparam(sd, (int)condition->right->value); + else if (condition->right->op == C_ARG && condition->right->value < MAX_ACHIEVEMENT_OBJECTIVES) + right = count[condition->right->value]; + else + right = achievement_check_condition(condition->right, sd, count); + } + + switch(condition->op) { + case C_NOP: + return false; + case C_NAME: + case C_INT: + return condition->value; + case C_PARAM: + return pc_readparam(sd, (int)condition->value); + case C_LOR: + return left || right; + case C_LAND: + return left && right; + case C_LE: + return left <= right; + case C_LT: + return left < right; + case C_GE: + return left >= right; + case C_GT: + return left > right; + case C_EQ: + return left == right; + case C_NE: + return left != right; + case C_XOR: + return left ^ right; + case C_OR: + return left || right; + case C_AND: + return left & right; + case C_ADD: + return left + right; + case C_SUB: + return left - right; + case C_MUL: + return left * right; + case C_DIV: + return left / right; + case C_MOD: + return left % right; + case C_NEG: + return -left; + case C_LNOT: + return !left; + case C_NOT: + return ~left; + case C_R_SHIFT: + return left >> right; + case C_L_SHIFT: + return left << right; + case C_ARG: + if (condition->value < MAX_ACHIEVEMENT_OBJECTIVES) + return count[condition->value]; + + return false; + default: + ShowError("achievement_check_condition: unexpected operator: %d\n", condition->op); + return false; + } + + return false; +} + +static const char *skip_word(const char *p) +{ + while (ISALNUM(*p) || *p == '_') + ++p; + + if (*p == '$') // String + p++; + + return p; +} + +const char *av_parse_simpleexpr(const char *p, struct av_condition *parent) +{ + long long i; + + p = skip_space(p); + + if(*p == ';' || *p == ',') + disp_error_message("av_parse_simpleexpr: unexpected character.", p); + if(*p == '(') { + p = av_parse_subexpr(p + 1, -1, parent); + p = skip_space(p); + + if (*p != ')') + disp_error_message("av_parse_simpleexpr: unmatched ')'", p); + ++p; + } else if(is_number(p)) { + char *np; + + while(*p == '0' && ISDIGIT(p[1])) + p++; + i = strtoll(p, &np, 0); + + if (i < INT_MIN) { + i = INT_MIN; + disp_error_message("av_parse_simpleexpr: underflow detected, capping value to INT_MIN.", p); + } else if (i > INT_MAX) { + i = INT_MAX; + disp_error_message("av_parse_simpleexpr: underflow detected, capping value to INT_MAX.", p); + } + + parent->op = C_INT; + parent->value = i; + p = np; + } else { + int v, len; + char * word; + + if (skip_word(p) == p) + disp_error_message("av_parse_simpleexpr: unexpected character.", p); + + len = skip_word(p) - p; + + if (len == 0) + disp_error_message("av_parse_simpleexpr: invalid word. A word consists of undercores and/or alphanumeric characters.", p); + + word = (char*)aMalloc(len + 1); + memcpy(word, p, len); + word[len] = 0; + + if (script_get_parameter(word, &v)) + parent->op = C_PARAM; + else if (script_get_constant(word, &v)) { + if (word[0] == 'b' && ISUPPER(word[1])) // Consider b* variables as parameters (because they... are?) + parent->op = C_PARAM; + else + parent->op = C_NAME; + } else { + if (word[0] == 'A' && word[1] == 'R' && word[2] == 'G' && ISDIGIT(word[3])) { // Special constants used to set temporary variables + parent->op = C_ARG; + v = atoi(word + 3); + } else { + aFree(word); + disp_error_message("av_parse_simpleexpr: invalid constant.", p); + } + } + + aFree(word); + parent->value = v; + p = skip_word(p); + } + + return p; +} + +const char* av_parse_subexpr(const char* p, int limit, struct av_condition *parent) +{ + int op, opl, len; + + p = skip_space(p); + + CREATE(parent->left, struct av_condition, 1); + + if ((op = C_NEG, *p == '-') || (op = C_LNOT, *p == '!') || (op = C_NOT, *p == '~')) { // Unary - ! ~ operators + p = av_parse_subexpr(p + 1, 11, parent->left); + parent->op = op; + } else + p = av_parse_simpleexpr(p, parent->left); + + p = skip_space(p); + + while(( + ((op=C_ADD,opl=9,len=1,*p=='+') && p[1]!='+') || + ((op=C_SUB,opl=9,len=1,*p=='-') && p[1]!='-') || + (op=C_MUL,opl=10,len=1,*p=='*') || + (op=C_DIV,opl=10,len=1,*p=='/') || + (op=C_MOD,opl=10,len=1,*p=='%') || + (op=C_LAND,opl=2,len=2,*p=='&' && p[1]=='&') || + (op=C_AND,opl=5,len=1,*p=='&') || + (op=C_LOR,opl=1,len=2,*p=='|' && p[1]=='|') || + (op=C_OR,opl=3,len=1,*p=='|') || + (op=C_XOR,opl=4,len=1,*p=='^') || + (op=C_EQ,opl=6,len=2,*p=='=' && p[1]=='=') || + (op=C_NE,opl=6,len=2,*p=='!' && p[1]=='=') || + (op=C_R_SHIFT,opl=8,len=2,*p=='>' && p[1]=='>') || + (op=C_GE,opl=7,len=2,*p=='>' && p[1]=='=') || + (op=C_GT,opl=7,len=1,*p=='>') || + (op=C_L_SHIFT,opl=8,len=2,*p=='<' && p[1]=='<') || + (op=C_LE,opl=7,len=2,*p=='<' && p[1]=='=') || + (op=C_LT,opl=7,len=1,*p=='<')) && opl>limit) { + p += len; + + if (parent->right) { // Chain conditions + struct av_condition *condition = NULL; + CREATE(condition, struct av_condition, 1); + condition->op = parent->op; + condition->left = parent->left; + condition->right = parent->right; + parent->left = condition; + parent->right = NULL; + } + + CREATE(parent->right, struct av_condition, 1); + p = av_parse_subexpr(p, opl, parent->right); + parent->op = op; + p = skip_space(p); + } + + if (parent->op == C_NOP && parent->right == NULL) { // Move the node up + struct av_condition *temp = parent->left; + + parent->right = parent->left->right; + parent->op = parent->left->op; + parent->value = parent->left->value; + parent->left = parent->left->left; + + aFree(temp); + } + + return p; +} + +/** + * Parses a condition from a script. + * @param p: The script buffer. + * @param file: The file being parsed. + * @param line: The current achievement line number. + * @return The parsed achievement condition. + */ +struct av_condition *parse_condition(const char *p, const char *file, int line) +{ + struct av_condition *condition = NULL; + + if (setjmp(av_error_jump) != 0) { + if (av_error_report) + script_error(p,file,line,av_error_msg,av_error_pos); + aFree(av_error_msg); + if (condition) + achievement_script_free(condition); + return NULL; + } + + switch(*p) { + case ')': case ';': case ':': case '[': case ']': case '}': + disp_error_message("parse_condition: unexpected character.", p); + } + + condition = (struct av_condition *) aCalloc(1, sizeof(struct av_condition)); + av_parse_subexpr(p, -1, condition); + + return condition; +} + +/** + * Reads and parses an entry from the achievement_db. + * @param wrapper: The YAML wrapper containing the entry. + * @param n: The sequential index of the current entry. + * @param source: The source YAML file. + * @return The parsed achievement entry or NULL in case of error. + */ +struct achievement_db *achievement_read_db_sub(yamlwrapper *wrapper, int n, const char *source) +{ + struct achievement_db *entry = NULL; + yamlwrapper *t = NULL; + yamliterator *it; + enum e_achievement_group group = AG_NONE; + int score = 0, achievement_id = 0; + char *group_char = NULL, *name = NULL, *condition = NULL, *mapname = NULL; + + if (!yaml_node_is_defined(wrapper, "ID")) { + ShowWarning("achievement_read_db_sub: Missing ID in \"%s\", entry #%d, skipping.\n", source, n); + return NULL; + } else + achievement_id = yaml_get_int(wrapper, "ID"); + if (achievement_id < 1 || achievement_id > INT_MAX) { + ShowWarning("achievement_read_db_sub: Invalid achievement ID %d in \"%s\", entry #%d (min: 1, max: %d), skipping.\n", achievement_id, source, n, INT_MAX); + return NULL; + } + + if (!yaml_node_is_defined(wrapper, "Group")) { + ShowWarning("achievement_read_db_sub: Missing group for achievement %d in \"%s\", skipping.\n", achievement_id, source); + return NULL; + } else + group_char = yaml_get_c_string(wrapper, "Group"); + if (!script_get_constant(group_char, (int *)&group)) { + ShowWarning("achievement_read_db_sub: Invalid group %s for achievement %d in \"%s\", skipping.\n", group_char, achievement_id, source); + return NULL; + } + aFree(group_char); + + if (!yaml_node_is_defined(wrapper, "Name")) { + ShowWarning("achievement_read_db_sub: Missing achievement name for achievement %d in \"%s\", skipping.\n", name, achievement_id, source); + return NULL; + } else + name = yaml_get_c_string(wrapper, "Name"); + + CREATE(entry, struct achievement_db, 1); + entry->achievement_id = achievement_id; + entry->group = group; + safestrncpy(entry->name, name, sizeof(entry->name)); + aFree(name); + entry->mapindex = -1; + + if (yaml_node_is_defined(wrapper, "Target") && (t = yaml_get_subnode(wrapper, "Target")) && (it = yaml_get_iterator(t)) && yaml_iterator_is_valid(it)) { + yamlwrapper *tt = NULL; + + for (tt = yaml_iterator_first(it); yaml_iterator_has_next(it) && entry->target_count < MAX_ACHIEVEMENT_OBJECTIVES; tt = yaml_iterator_next(it)) { + int mobid = 0, count = 0; + + if (yaml_node_is_defined(tt, "MobID") && (mobid = yaml_get_int(tt, "MobID")) && !mobdb_exists(mobid)) { // The mob ID field is not required + ShowError("achievement_read_db_sub: Invalid mob ID %d for achievement %d in \"%s\", skipping.\n", mobid, achievement_id, source); + continue; + } + if (yaml_node_is_defined(tt, "Count") && (!(count = yaml_get_int(tt, "Count")) || count <= 0)) { + ShowError("achievement_read_db_sub: Invalid count %d for achievement %d in \"%s\", skipping.\n", count, achievement_id, source); + continue; + } + if (mobid && group == AG_BATTLE && !idb_exists(achievementmobs_db, mobid)) { + struct achievement_mob *entrymob = NULL; + + CREATE(entrymob, struct achievement_mob, 1); + idb_put(achievementmobs_db, mobid, entrymob); + } + + RECREATE(entry->targets, struct achievement_target, entry->target_count + 1); + entry->targets[entry->target_count].mob = mobid; + entry->targets[entry->target_count].count = count; + entry->target_count++; + yaml_destroy_wrapper(tt); + } + yaml_iterator_destroy(it); + } + + if (yaml_node_is_defined(wrapper, "Condition") && (condition = yaml_get_c_string(wrapper, "Condition"))){ + entry->condition = parse_condition(condition, source, n); + aFree(condition); + } + + if (yaml_node_is_defined(wrapper, "Map") && (mapname = yaml_get_c_string(wrapper, "Map"))) { + if (group != AG_CHAT) + ShowWarning("achievement_read_db_sub: The map argument can only be used with the group AG_CHATTING (achievement %d in \"%s\"), skipping.\n", achievement_id, source); + else { + entry->mapindex = map_mapname2mapid(mapname); + + if (entry->mapindex == -1) + ShowWarning("achievement_read_db_sub: Invalid map name %s for achievement %d in \"%s\".\n", mapname, achievement_id, source); + } + aFree(mapname); + } + + if (yaml_node_is_defined(wrapper, "Dependent") && (t = yaml_get_subnode(wrapper, "Dependent")) && (it = yaml_get_iterator(t))) { + if (yaml_iterator_is_valid(it)) { + yamlwrapper *tt = NULL; + + for (tt = yaml_iterator_first(it); yaml_iterator_has_next(it) && entry->dependent_count < MAX_ACHIEVEMENT_DEPENDENTS; tt = yaml_iterator_next(it)) { + RECREATE(entry->dependents, struct achievement_dependent, entry->dependent_count + 1); + entry->dependents[entry->dependent_count].achievement_id = yaml_as_int(tt); + entry->dependent_count++; + yaml_destroy_wrapper(tt); + } + yaml_iterator_destroy(it); + } else + ShowWarning("achievement_read_db_sub: Invalid dependent format for achievement %d in \"%s\".\n", achievement_id, source); + } + + if (yaml_node_is_defined(wrapper, "Reward") && (t = yaml_get_subnode(wrapper, "Reward"))) { + char *script_char = NULL; + int nameid = 0, amount = 0, titleid = 0; + + if (yaml_node_is_defined(t, "ItemID") && (nameid = yaml_get_int(t, "ItemID"))) { + if (itemdb_exists(nameid)) { + entry->rewards.nameid = nameid; + entry->rewards.amount = 1; // Default the amount to 1 + } else if (nameid && !itemdb_exists(nameid)) { + ShowWarning("achievement_read_db_sub: Invalid reward item ID %hu for achievement %d in \"%s\". Setting to 0.\n", nameid, achievement_id, source); + entry->rewards.nameid = nameid = 0; + } + + if (yaml_node_is_defined(t, "Amount") && (amount = yaml_get_int(t, "Amount")) && amount > 0 && nameid) + entry->rewards.amount = amount; + } + if (yaml_node_is_defined(t, "Script") && (script_char = yaml_get_c_string(t, "Script"))){ + entry->rewards.script = parse_script(script_char, source, achievement_id, SCRIPT_IGNORE_EXTERNAL_BRACKETS); + aFree(script_char); + } + if (yaml_node_is_defined(t, "TitleID") && (titleid = yaml_get_int(t, "TitleID")) && titleid > 0) + entry->rewards.title_id = titleid; + } + + if ((score = yaml_get_int(wrapper, "Score")) && score > 0) + entry->score = score; + + return entry; +} + +/** + * Loads achievements from the achievement db. + */ +void achievement_read_db(void) +{ + yamlwrapper *adb = NULL, *adb_sub = NULL; + yamliterator *it; + int i = 0; + const char *dbsubpath[] = { + "", + "/"DBIMPORT"/", + //add other path here + }; + + for (i = 0; i < ARRAYLENGTH(dbsubpath); i++) { + char filepath[256]; + int count = 0; + + if (!i) + sprintf(filepath, "%s/%s%s%s", db_path, DBPATH, dbsubpath[i], "achievement_db.yml"); + else + sprintf(filepath, "%s%s%s", db_path, dbsubpath[i], "achievement_db.yml"); + + if ((adb = yaml_load_file(filepath)) == NULL) { + ShowError("Failed to read '%s'.\n", filepath); + continue; + } + + if (!yaml_node_is_defined(adb, "Achievements")) + continue; // Skip if base structure isn't defined + adb_sub = yaml_get_subnode(adb, "Achievements"); + it = yaml_get_iterator(adb_sub); + if (yaml_iterator_is_valid(it)) { + yamlwrapper *id = NULL; + + for (id = yaml_iterator_first(it); yaml_iterator_has_next(it); id = yaml_iterator_next(it)) { + struct achievement_db *duplicate = &achievement_dummy, *entry = achievement_read_db_sub(id, count, filepath); + + if (!entry) { + ShowWarning("achievement_read_db: Failed to parse achievement entry %d.\n", count); + continue; + } + if ((duplicate = achievement_search(entry->achievement_id)) != &achievement_dummy) { + if (!i) { // Normal file read-in + ShowWarning("achievement_read_db: Duplicate achievement %d.\n", entry->achievement_id); + achievement_db_free_sub(entry, false); + continue; + } + else // Import file read-in, free previous value and store new value + achievement_db_free_sub(duplicate, false); + } + yaml_destroy_wrapper(id); + idb_put(achievement_db, entry->achievement_id, entry); + count++; + } + } + yaml_destroy_wrapper(adb_sub); + yaml_iterator_destroy(it); + + ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, filepath); + } + + return; +} + +/** + * Recursive method to free an achievement condition + * @param condition: Condition to clear + */ +void achievement_script_free(struct av_condition *condition) +{ + if (condition->left) { + achievement_script_free(condition->left); + condition->left = NULL; + } + + if (condition->right) { + achievement_script_free(condition->right); + condition->right = NULL; + } + + aFree(condition); +} + +/** + * Clear achievement single entry + * @param achievement: Achievement to clear + * @param free: Will free achievement from memory + */ +void achievement_db_free_sub(struct achievement_db *achievement, bool free) +{ + if (achievement->targets) { + aFree(achievement->targets); + achievement->targets = NULL; + achievement->target_count = 0; + } + if (achievement->condition) { + achievement_script_free(achievement->condition); + achievement->condition = NULL; + } + if (achievement->dependents) { + aFree(achievement->dependents); + achievement->dependents = NULL; + achievement->dependent_count = 0; + } + if (achievement->rewards.script) { + script_free_code(achievement->rewards.script); + achievement->rewards.script = NULL; + } + if (free) + aFree(achievement); +} + +/** + * Clears the achievement database for shutdown or reload. + */ +static int achievement_db_free(DBKey key, DBData *data, va_list ap) +{ + struct achievement_db *achievement = (struct achievement_db *)db_data2ptr(data); + + if (!achievement) + return 0; + + achievement_db_free_sub(achievement, true); + return 1; +} + +static int achievementmobs_db_free(DBKey key, DBData *data, va_list ap) +{ + struct achievementmobs_db *achievement = (struct achievementmobs_db *)db_data2ptr(data); + + if (!achievement) + return 0; + + aFree(achievement); + return 1; +} + +void achievement_db_reload(void) +{ + if (!battle_config.feature_achievement) + return; + achievementmobs_db->clear(achievementmobs_db, achievementmobs_db_free); + achievement_db->clear(achievement_db, achievement_db_free); + achievement_read_db(); +} + +void do_init_achievement(void) +{ + if (!battle_config.feature_achievement) + return; + memset(&achievement_dummy, 0, sizeof(achievement_dummy)); + achievement_db = idb_alloc(DB_OPT_BASE); + achievementmobs_db = idb_alloc(DB_OPT_BASE); + achievement_read_db(); +} + +void do_final_achievement(void) +{ + if (!battle_config.feature_achievement) + return; + achievementmobs_db->destroy(achievementmobs_db, achievementmobs_db_free); + achievement_db->destroy(achievement_db, achievement_db_free); +} diff --git a/src/map/achievement.h b/src/map/achievement.h new file mode 100644 index 0000000000..e1e6caeaf2 --- /dev/null +++ b/src/map/achievement.h @@ -0,0 +1,133 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#ifndef MAP_ACHIEVEMENTS_H +#define MAP_ACHIEVEMENTS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../common/mmo.h" +#include "../common/db.h" + +enum e_achievement_group { + AG_NONE = 0, + AG_ADD_FRIEND, + AG_ADVENTURE, + AG_BABY, + AG_BATTLE, + AG_CHAT, + AG_CHAT_COUNT, + AG_CHAT_CREATE, + AG_CHAT_DYING, + AG_EAT, + AG_GET_ITEM, + AG_GET_ZENY, + AG_GOAL_ACHIEVE, + AG_GOAL_LEVEL, + AG_GOAL_STATUS, + AG_HEAR, + AG_JOB_CHANGE, + AG_MARRY, + AG_PARTY, + AG_REFINE_FAIL, + AG_REFINE_SUCCESS, + AG_SEE, + AG_SPEND_ZENY, + AG_TAMING, + AG_MAX +}; + +enum e_achievement_info { + ACHIEVEINFO_COUNT1 = 1, + ACHIEVEINFO_COUNT2, + ACHIEVEINFO_COUNT3, + ACHIEVEINFO_COUNT4, + ACHIEVEINFO_COUNT5, + ACHIEVEINFO_COUNT6, + ACHIEVEINFO_COUNT7, + ACHIEVEINFO_COUNT8, + ACHIEVEINFO_COUNT9, + ACHIEVEINFO_COUNT10, + ACHIEVEINFO_COMPLETE, + ACHIEVEINFO_COMPLETEDATE, + ACHIEVEINFO_GOTREWARD, + ACHIEVEINFO_LEVEL, + ACHIEVEINFO_SCORE, + ACHIEVEINFO_MAX, +}; + +struct achievement_mob { + int mod_id; +}; + +struct achievement_target { + int mob; + int count; +}; + +struct achievement_dependent { + int achievement_id; +}; + +struct av_condition { + int op; + struct av_condition *left; + struct av_condition *right; + long long value; +}; + +struct achievement_db { + int achievement_id; + char name[ACHIEVEMENT_NAME_LENGTH]; + enum e_achievement_group group; + uint8 target_count; + struct achievement_target *targets; + uint8 dependent_count; + struct achievement_dependent *dependents; + struct av_condition *condition; + int16 mapindex; + struct ach_reward { + unsigned short nameid, amount; + struct script_code *script; + int title_id; + } rewards; + int score; + int has_dependent; // Used for quick updating of achievements that depend on others - this is their ID +}; + +struct map_session_data; +struct block_list; + +struct achievement_db achievement_dummy; ///< Dummy entry for invalid achievement lookups + +struct achievement_db *achievement_search(int achievement_id); +bool achievement_mobexists(int mob_id); +void achievement_get_reward(struct map_session_data *sd, int achievement_id, time_t rewarded); +struct achievement *achievement_add(struct map_session_data *sd, int achievement_id); +bool achievement_remove(struct map_session_data *sd, int achievement_id); +bool achievement_update_achievement(struct map_session_data *sd, int achievement_id, bool complete); +void achievement_check_reward(struct map_session_data *sd, int achievement_id); +void achievement_free(struct map_session_data *sd); +int achievement_check_progress(struct map_session_data *sd, int achievement_id, int type); +int *achievement_level(struct map_session_data *sd, bool flag); +void achievement_get_titles(uint32 char_id); +void achievement_update_objective(struct map_session_data *sd, enum e_achievement_group group, uint8 arg_count, ...); +void achievement_read_db(void); +void achievement_db_reload(void); + +void do_init_achievement(void); +void do_final_achievement(void); + +// Parser +const char *av_parse_subexpr(const char *p,int limit, struct av_condition *parent); +const char *av_parse_simpleexpr(const char *p, struct av_condition *parent); +long long achievement_check_condition(struct av_condition *condition, struct map_session_data *sd, int *count); +void achievement_script_free(struct av_condition *condition); + +#ifdef __cplusplus +} +#endif + +#endif /* MAP_ACHIEVEMENTS_H */ diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 22908cc4b7..d8d52b9ccc 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -34,6 +34,7 @@ #include "mapreg.h" #include "quest.h" #include "pc.h" +#include "achievement.h" #include #include @@ -79,6 +80,8 @@ static char atcmd_output[CHAT_SIZE_MAX]; static char atcmd_player_name[NAME_LENGTH]; const char *parent_cmd; +struct atcmd_binding_data** atcmd_binding; + static AtCommandInfo* get_atcommandinfo_byname(const char *name); // @help static const char* atcommand_checkalias(const char *aliasname); // @help static void atcommand_get_suggestions(struct map_session_data* sd, const char *name, bool atcommand); // @help @@ -185,12 +188,12 @@ ACMD_FUNC(send) long num; if(len) {// show packet length - sprintf(atcmd_output, msg_txt(sd,904), type, packet_db[sd->packet_ver][type].len); // Packet 0x%x length: %d + sprintf(atcmd_output, msg_txt(sd,904), type, packet_db[type].len); // Packet 0x%x length: %d clif_displaymessage(fd, atcmd_output); return 0; } - len=packet_db[sd->packet_ver][type].len; + len=packet_db[type].len; off=2; if(len == 0) {// unknown packet - ERROR @@ -341,7 +344,7 @@ ACMD_FUNC(send) SKIP_VALUE(message); } - if(packet_db[sd->packet_ver][type].len == -1) + if(packet_db[type].len == -1) {// send dynamic packet WFIFOW(fd,2)=TOW(off); WFIFOSET(fd,off); @@ -427,8 +430,8 @@ static void warp_get_suggestions(struct map_session_data* sd, const char *name) strcat(buffer, " "); // swap elements - swap(distance[i][0], distance[min][0]); - swap(distance[i][1], distance[min][1]); + SWAP(distance[i][0], distance[min][0]); + SWAP(distance[i][1], distance[min][1]); } } @@ -1422,6 +1425,8 @@ ACMD_FUNC(baselevelup) status_calc_pc(sd, SCO_FORCE); status_percent_heal(&sd->bl, 100, 100); clif_misceffect(&sd->bl, 0); + achievement_update_objective(sd, AG_GOAL_LEVEL, 1, sd->status.base_level); + achievement_update_objective(sd, AG_GOAL_STATUS, 2, sd->status.base_level, sd->status.class_); clif_displaymessage(fd, msg_txt(sd,21)); // Base level raised. } else { if (sd->status.base_level == 1) { @@ -1483,6 +1488,7 @@ ACMD_FUNC(joblevelup) sd->status.job_level += (unsigned int)level; sd->status.skill_point += level; clif_misceffect(&sd->bl, 1); + achievement_update_objective(sd, AG_GOAL_LEVEL, 1, sd->status.job_level); clif_displaymessage(fd, msg_txt(sd,24)); // Job level raised. } else { if (sd->status.job_level == 1) { @@ -1757,7 +1763,7 @@ ACMD_FUNC(bodystyle) || (sd->class_&MAPID_THIRDMASK) == MAPID_MECHANIC || (sd->class_&MAPID_THIRDMASK) == MAPID_ROYAL_GUARD || (sd->class_&MAPID_THIRDMASK) == MAPID_ARCH_BISHOP || (sd->class_&MAPID_THIRDMASK) == MAPID_RANGER || (sd->class_&MAPID_THIRDMASK) == MAPID_WARLOCK || (sd->class_&MAPID_THIRDMASK) == MAPID_SHADOW_CHASER - || (sd->class_&MAPID_THIRDMASK) == MAPID_MINSTRELWANDERER)) { + || (sd->class_&MAPID_THIRDMASK) == MAPID_MINSTRELWANDERER || (sd->class_&MAPID_THIRDMASK) == MAPID_SORCERER)) { clif_displaymessage(fd, msg_txt(sd,740)); // This job has no alternate body styles. return -1; } @@ -1917,6 +1923,7 @@ ACMD_FUNC(go) { MAP_MALANGDO, 140, 114 }, // 33=Malangdo Island { MAP_MALAYA, 242, 211 }, // 34=Malaya Port { MAP_ECLAGE, 110, 39 }, // 35=Eclage + { MAP_LASAGNA, 193, 182 }, // 36=Lasagna }; nullpo_retr(-1, sd); @@ -2036,6 +2043,8 @@ ACMD_FUNC(go) town = 34; } else if (strncmp(map_name, "eclage", 3) == 0) { town = 35; + } else if (strncmp(map_name, "lasagna", 2) == 0) { + town = 36; } if (town >= 0 && town < ARRAYLENGTH(data)) @@ -2274,6 +2283,7 @@ ACMD_FUNC(refine) clif_additem(sd, i, 1, 0); pc_equipitem(sd, i, current_position); clif_misceffect(&sd->bl, 3); + achievement_update_objective(sd, AG_REFINE_SUCCESS, 2, sd->inventory_data[i]->wlv, sd->inventory.u.items_inventory[i].refine); count++; } } @@ -3924,12 +3934,12 @@ ACMD_FUNC(reload) { } 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. - } else if (strstr(command, "packetdb") || strncmp(message, "packetdb", 4) == 0) { - packetdb_readdb(true); - clif_displaymessage(fd, msg_txt(sd,1477)); // Packet 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. + } 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. } return 0; @@ -9842,7 +9852,6 @@ ACMD_FUNC(cloneequip) { */ ACMD_FUNC(clonestat) { struct map_session_data *pl_sd; - uint32 char_id = 0; nullpo_retr(-1, sd); @@ -10083,8 +10092,8 @@ void atcommand_basecommands(void) { ACMD_DEF2("reloadmotd", reload), ACMD_DEF2("reloadquestdb", reload), ACMD_DEF2("reloadmsgconf", reload), - ACMD_DEF2("reloadpacketdb", reload), ACMD_DEF2("reloadinstancedb", reload), + ACMD_DEF2("reloadachievementdb",reload), ACMD_DEF(partysharelvl), ACMD_DEF(mapinfo), ACMD_DEF(dye), diff --git a/src/map/atcommand.h b/src/map/atcommand.h index 6fd1bc0000..54d0ca3cfa 100644 --- a/src/map/atcommand.h +++ b/src/map/atcommand.h @@ -45,7 +45,7 @@ struct atcmd_binding_data { int level; int level2; }; -struct atcmd_binding_data** atcmd_binding; +extern struct atcmd_binding_data** atcmd_binding; struct atcmd_binding_data* get_atcommandbind_byname(const char* name); #ifdef __cplusplus diff --git a/src/map/battle.c b/src/map/battle.c index 8c87ba25e2..458564f419 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -6580,7 +6580,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * break; case GN_HELLS_PLANT_ATK: //[{( Hell Plant Skill Level x Casters Base Level ) x 10 } + {( Casters INT x 7 ) / 2 } x { 18 + ( Casters Job Level / 4 )] x ( 5 / ( 10 - Summon Flora Skill Level )) - md.damage = ( skill_lv * status_get_lv(src) * 10 ) + ( status_get_int(src) * 7 / 2 ) * ( 18 + (sd?sd->status.job_level:0) / 4 ) * ( 5 / (10 - ((sd) ? pc_checkskill(sd,AM_CANNIBALIZE) : 0)) ); + md.damage = skill_lv * status_get_lv(src) * 10 + status_get_int(src) * 7 / 2 * (18 + (sd ? sd->status.job_level : 0) / 4) * 5 / (10 - (sd ? pc_checkskill(sd, AM_CANNIBALIZE) : 0)); break; case RL_B_TRAP: // kRO 2014-02-12: Damage: Caster's DEX, Target's current HP, Skill Level @@ -8191,8 +8191,6 @@ static const struct _battle_data { { "night_at_start", &battle_config.night_at_start, 0, 0, 1, }, { "show_mob_info", &battle_config.show_mob_info, 0, 0, 1|2|4, }, { "ban_hack_trade", &battle_config.ban_hack_trade, 0, 0, INT_MAX, }, - { "packet_ver_flag", &battle_config.packet_ver_flag, 0x7FFFFFFF,0, INT_MAX, }, - { "packet_ver_flag2", &battle_config.packet_ver_flag2, 0x7FFFFFFF,0, INT_MAX, }, { "min_hair_style", &battle_config.min_hair_style, 0, 0, INT_MAX, }, { "max_hair_style", &battle_config.max_hair_style, 23, 0, INT_MAX, }, { "min_hair_color", &battle_config.min_hair_color, 0, 0, INT_MAX, }, @@ -8427,6 +8425,8 @@ static const struct _battle_data { { "banana_bomb_duration", &battle_config.banana_bomb_duration, 0, 0, UINT16_MAX, }, { "guild_leaderchange_delay", &battle_config.guild_leaderchange_delay, 1440, 0, INT32_MAX, }, { "guild_leaderchange_woe", &battle_config.guild_leaderchange_woe, 0, 0, 1, }, + { "guild_alliance_onlygm", &battle_config.guild_alliance_onlygm, 0, 0, 1, }, + { "feature.achievement", &battle_config.feature_achievement, 1, 0, 1, }, #include "../custom/battle_config_init.inc" }; @@ -8550,6 +8550,13 @@ void battle_adjust_conf() } #endif +#if PACKETVER < 20150513 + if (battle_config.feature_achievement) { + ShowWarning("conf/battle/feature.conf achievement is enabled but it requires PACKETVER 2015-05-13 or newer, disabling...\n"); + battle_config.feature_achievement = 0; + } +#endif + #ifndef CELL_NOSTACK if (battle_config.custom_cell_stack_limit != 1) ShowWarning("Battle setting 'custom_cell_stack_limit' takes no effect as this server was compiled without Cell Stack Limit support.\n"); diff --git a/src/map/battle.h b/src/map/battle.h index c0a5e5c043..2651cbf3a8 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -373,8 +373,6 @@ extern struct Battle_Config int day_duration; // added by [Yor] int night_duration; // added by [Yor] int ban_hack_trade; // added by [Yor] - int packet_ver_flag; // added by [Yor] - int packet_ver_flag2; // expend of packet_ver_flag int min_hair_style; // added by [MouseJstr] int max_hair_style; // added by [MouseJstr] @@ -630,6 +628,8 @@ extern struct Battle_Config int banana_bomb_duration; int guild_leaderchange_delay; int guild_leaderchange_woe; + int guild_alliance_onlygm; + int feature_achievement; #include "../custom/battle_config_struct.inc" } battle_config; diff --git a/src/map/channel.c b/src/map/channel.c index dc8bbcef90..8084dcbb10 100644 --- a/src/map/channel.c +++ b/src/map/channel.c @@ -115,6 +115,7 @@ struct Channel* channel_create_simple(char *name, char *pass, enum Channel_Type tmp_chan.opt = channel_config.private_channel.opt; tmp_chan.msg_delay = channel_config.private_channel.delay; tmp_chan.color = channel_config.private_channel.color; + tmp_chan.char_id = owner; break; default: return NULL; @@ -943,11 +944,12 @@ int channel_pcban(struct map_session_data *sd, char *chname, char *pname, int fl if (channel->char_id != sd->status.char_id) { sprintf(output, msg_txt(sd,1412), chname);// You're not the owner of channel '%s'. clif_displaymessage(sd->fd, output); + return -1; } else if (!channel_config.private_channel.ban) { sprintf(output, msg_txt(sd,765), chname); // You're not allowed to ban a player. clif_displaymessage(sd->fd, output); + return -1; } - return -1; } if(flag != 2 && flag != 3){ @@ -974,7 +976,7 @@ int channel_pcban(struct map_session_data *sd, char *chname, char *pname, int fl if( !db_size(channel->banned) ) { sprintf(output, msg_txt(sd,1439), chname);// Channel '%s' contains no banned players. clif_displaymessage(sd->fd, output); - return -1; + return 0; } } diff --git a/src/map/chat.c b/src/map/chat.c index 3cbc904b9f..81ba0dab63 100644 --- a/src/map/chat.c +++ b/src/map/chat.c @@ -14,6 +14,7 @@ #include "npc.h" // npc_event_do() #include "pc.h" #include "chat.h" +#include "achievement.h" int chat_triggerevent(struct chat_data *cd); // forward declaration @@ -102,6 +103,11 @@ int chat_createpcchat(struct map_session_data* sd, const char* title, const char pc_stop_attack(sd); clif_createchat(sd,0); clif_dispchat(cd,0); + + if (status_isdead(&sd->bl)) + achievement_update_objective(sd, AG_CHAT_DYING, 1, 1); + else + achievement_update_objective(sd, AG_CHAT_CREATE, 1, 1); } else clif_createchat(sd,1); @@ -164,6 +170,9 @@ int chat_joinchat(struct map_session_data* sd, int chatid, const char* pass) chat_triggerevent(cd); //Event + if (cd->owner->type == BL_PC) + achievement_update_objective(map_id2sd(cd->owner->id), AG_CHAT_COUNT, 1, cd->users); + return 0; } diff --git a/src/map/chrif.c b/src/map/chrif.c index aeaa14e6a7..2a11fa3892 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -36,7 +36,7 @@ static bool char_init_done = false; //server already initialized? Used for Inter static const int packet_len_table[0x3d] = { // U - used, F - free 60, 3,-1,-1,10,-1, 6,-1, // 2af8-2aff: U->2af8, U->2af9, U->2afa, U->2afb, U->2afc, U->2afd, U->2afe, U->2aff - 6,-1,19, 7,-1,39,30, 10, // 2b00-2b07: U->2b00, U->2b01, U->2b02, U->2b03, U->2b04, U->2b05, U->2b06, U->2b07 + 6,-1,18, 7,-1,39,30, 10, // 2b00-2b07: U->2b00, U->2b01, U->2b02, U->2b03, U->2b04, U->2b05, U->2b06, U->2b07 6,30, 10, -1,86, 7,44,34, // 2b08-2b0f: U->2b08, U->2b09, U->2b0a, U->2b0b, U->2b0c, U->2b0d, U->2b0e, U->2b0f 11,10,10, 0,11, -1,266,10, // 2b10-2b17: U->2b10, U->2b11, U->2b12, F->2b13, U->2b14, U->2b15, U->2b16, U->2b17 2,10, 2,-1,-1,-1, 2, 7, // 2b18-2b1f: U->2b18, U->2b19, U->2b1a, U->2b1b, U->2b1c, U->2b1d, U->2b1e, U->2b1f @@ -362,6 +362,8 @@ int chrif_save(struct map_session_data *sd, int flag) { elemental_save(sd->ed); if( sd->save_quest ) intif_quest_save(sd); + if (sd->achievement_data.save) + intif_achievement_save(sd); return 0; } @@ -809,14 +811,13 @@ int chrif_charselectreq(struct map_session_data* sd, uint32 s_ip) { chrif_check(-1); - WFIFOHEAD(char_fd,19); + WFIFOHEAD(char_fd,18); WFIFOW(char_fd, 0) = 0x2b02; WFIFOL(char_fd, 2) = sd->bl.id; WFIFOL(char_fd, 6) = sd->login_id1; WFIFOL(char_fd,10) = sd->login_id2; WFIFOL(char_fd,14) = htonl(s_ip); - WFIFOB(char_fd,18) = sd->packet_ver; - WFIFOSET(char_fd,19); + WFIFOSET(char_fd,18); return 0; } diff --git a/src/map/chrif.h b/src/map/chrif.h index 70c5149f61..2c2aaec833 100644 --- a/src/map/chrif.h +++ b/src/map/chrif.h @@ -4,14 +4,14 @@ #ifndef _CHRIF_H_ #define _CHRIF_H_ -#ifdef __cplusplus -extern "C" { -#endif - #include "../common/cbasetypes.h" #include "../common/socket.h" // enum chrif_req_op #include +#ifdef __cplusplus +extern "C" { +#endif + enum sd_state { ST_LOGIN, ST_LOGOUT, ST_MAPCHANGE }; enum e_chrif_save_opt { diff --git a/src/map/clif.c b/src/map/clif.c index 04cc4fa9a0..2287354551 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -45,6 +45,7 @@ #include "quest.h" #include "cashshop.h" #include "channel.h" +#include "achievement.h" #include #include @@ -55,21 +56,11 @@ /* for clif_clearunit_delayed */ static struct eri *delay_clearunit_ers; -//#define DUMP_UNKNOWN_PACKET -//#define DUMP_INVALID_PACKET +struct s_packet_db packet_db[MAX_PACKET_DB + 1]; +int packet_db_ack[MAX_ACK_FUNC + 1]; +unsigned long color_table[COLOR_MAX]; -struct Clif_Config { - int packet_db_ver; //Preferred packet version. - int connect_cmd[MAX_PACKET_VER + 1]; //Store the connect command for all versions. [Skotlex] -} clif_config; - -struct s_packet_db packet_db[MAX_PACKET_VER + 1][MAX_PACKET_DB + 1]; -int packet_db_ack[MAX_PACKET_VER + 1][MAX_ACK_FUNC + 1]; -#ifdef PACKET_OBFUSCATION -static struct s_packet_keys *packet_keys[MAX_PACKET_VER + 1]; -static unsigned int clif_cryptKey[3]; // Used keys -#endif -static unsigned short clif_parse_cmd(int fd, struct map_session_data *sd); +#include "clif_obfuscation.h" static bool clif_session_isValid(struct map_session_data *sd); #if PACKETVER >= 20150513 @@ -295,9 +286,7 @@ static inline unsigned char clif_bl_type(struct block_list *bl) { #endif static bool clif_session_isValid(struct map_session_data *sd) { - if (sd != NULL && sd->packet_ver <= MAX_PACKET_VER && session_isActive(sd->fd)) - return true; - return false; + return ( sd != NULL && session_isActive(sd->fd) ); } /*========================================== @@ -373,10 +362,8 @@ static int clif_send_sub(struct block_list *bl, va_list ap) return 0; } - if (packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - } + memcpy(WFIFOP(fd,0), buf, len); + WFIFOSET(fd,len); return 0; } @@ -404,14 +391,10 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target case ALL_CLIENT: //All player clients. iter = mapit_getallusers(); - while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL ) - { - if( packet_db[tsd->packet_ver][RBUFW(buf,0)].len ) - { // packet must exist for the client version - WFIFOHEAD(tsd->fd, len); - memcpy(WFIFOP(tsd->fd,0), buf, len); - WFIFOSET(tsd->fd,len); - } + while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL ){ + WFIFOHEAD(tsd->fd, len); + memcpy(WFIFOP(tsd->fd, 0), buf, len); + WFIFOSET(tsd->fd, len); } mapit_free(iter); break; @@ -420,8 +403,7 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target iter = mapit_getallusers(); while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL ) { - if( bl->m == tsd->bl.m && packet_db[tsd->packet_ver][RBUFW(buf,0)].len ) - { // packet must exist for the client version + if( bl->m == tsd->bl.m ){ WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); WFIFOSET(tsd->fd,len); @@ -458,13 +440,10 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target for(i = 0; i < cd->users; i++) { if (type == CHAT_WOS && cd->usersd[i] == sd) continue; - if (packet_db[cd->usersd[i]->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version - if ((fd=cd->usersd[i]->fd) >0 && session[fd]) // Added check to see if session exists [PoW] - { - WFIFOHEAD(fd,len); - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - } + if ((fd=cd->usersd[i]->fd) >0 && session[fd]){ // Added check to see if session exists [PoW] + WFIFOHEAD(fd,len); + memcpy(WFIFOP(fd,0), buf, len); + WFIFOSET(fd,len); } } } @@ -500,12 +479,9 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target if( (type == PARTY_AREA || type == PARTY_AREA_WOS) && (sd->bl.x < x0 || sd->bl.y < y0 || sd->bl.x > x1 || sd->bl.y > y1) ) continue; - if( packet_db[sd->packet_ver][RBUFW(buf,0)].len ) - { // packet must exist for the client version - WFIFOHEAD(fd,len); - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - } + WFIFOHEAD(fd, len); + memcpy(WFIFOP(fd, 0), buf, len); + WFIFOSET(fd, len); } if (!enable_spy) //Skip unnecessary parsing. [Skotlex] break; @@ -513,8 +489,7 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target iter = mapit_getallusers(); while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL ) { - if( tsd->partyspy == p->party.party_id && packet_db[tsd->packet_ver][RBUFW(buf,0)].len ) - { // packet must exist for the client version + if( tsd->partyspy == p->party.party_id ){ WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); WFIFOSET(tsd->fd,len); @@ -533,8 +508,7 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target { if( type == DUEL_WOS && bl->id == tsd->bl.id ) continue; - if( sd->duel_group == tsd->duel_group && packet_db[tsd->packet_ver][RBUFW(buf,0)].len ) - { // packet must exist for the client version + if( sd->duel_group == tsd->duel_group ){ WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); WFIFOSET(tsd->fd,len); @@ -544,7 +518,7 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target break; case SELF: - if (sd && (fd=sd->fd) && packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version + if (sd && (fd=sd->fd)) { WFIFOHEAD(fd,len); memcpy(WFIFOP(fd,0), buf, len); WFIFOSET(fd,len); @@ -585,12 +559,9 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target if( (type == GUILD_AREA || type == GUILD_AREA_WOS) && (sd->bl.x < x0 || sd->bl.y < y0 || sd->bl.x > x1 || sd->bl.y > y1) ) continue; - if( packet_db[sd->packet_ver][RBUFW(buf,0)].len ) - { // packet must exist for the client version - WFIFOHEAD(fd,len); - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - } + WFIFOHEAD(fd,len); + memcpy(WFIFOP(fd,0), buf, len); + WFIFOSET(fd,len); } } if (!enable_spy) //Skip unnecessary parsing. [Skotlex] @@ -599,8 +570,7 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target iter = mapit_getallusers(); while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL ) { - if( tsd->guildspy == g->guild_id && packet_db[tsd->packet_ver][RBUFW(buf,0)].len ) - { // packet must exist for the client version + if( tsd->guildspy == g->guild_id ){ WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd,0), buf, len); WFIFOSET(tsd->fd,len); @@ -632,12 +602,9 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target continue; if( (type == BG_AREA || type == BG_AREA_WOS) && (sd->bl.x < x0 || sd->bl.y < y0 || sd->bl.x > x1 || sd->bl.y > y1) ) continue; - if( packet_db[sd->packet_ver][RBUFW(buf,0)].len ) - { // packet must exist for the client version - WFIFOHEAD(fd,len); - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - } + WFIFOHEAD(fd,len); + memcpy(WFIFOP(fd,0), buf, len); + WFIFOSET(fd,len); } } break; @@ -650,11 +617,9 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target continue; } - if( packet_db[sd->packet_ver][RBUFW(buf,0)].len ){ // packet must exist for the client version - WFIFOHEAD(fd,len); - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - } + WFIFOHEAD(fd,len); + memcpy(WFIFOP(fd,0), buf, len); + WFIFOSET(fd,len); } if (!enable_spy) //Skip unnecessary parsing. [Skotlex] @@ -662,8 +627,7 @@ int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target iter = mapit_getallusers(); while ((tsd = (TBL_PC*)mapit_next(iter)) != NULL){ - if (tsd->clanspy == clan->id && packet_db[tsd->packet_ver][RBUFW(buf, 0)].len) - { // packet must exist for the client version + if (tsd->clanspy == clan->id){ WFIFOHEAD(tsd->fd, len); memcpy(WFIFOP(tsd->fd, 0), buf, len); WFIFOSET(tsd->fd, len); @@ -1505,6 +1469,7 @@ int clif_spawn(struct block_list *bl) else if( nd->size == SZ_MEDIUM ) clif_specialeffect(&nd->bl,421,AREA); clif_efst_status_change_sub(bl, bl, AREA); + clif_progressbar_npc_area(nd); } break; case BL_PET: @@ -1997,18 +1962,9 @@ void clif_selllist(struct map_session_data *sd) { if( sd->inventory.u.items_inventory[i].nameid > 0 && sd->inventory_data[i] ) { - if( !itemdb_cansell(&sd->inventory.u.items_inventory[i], pc_get_group_level(sd)) ) + if( !pc_can_sell_item(sd, &sd->inventory.u.items_inventory[i])) continue; - if( battle_config.hide_fav_sell && sd->inventory.u.items_inventory[i].favorite ) - continue; //Cannot sell favs [Jey] - - if( sd->inventory.u.items_inventory[i].expire_time || (sd->inventory.u.items_inventory[i].bound && !pc_can_give_bounded_items(sd)) ) - continue; // Cannot Sell Rental Items or Account Bounded Items - - if( sd->inventory.u.items_inventory[i].bound && !pc_can_give_bounded_items(sd)) - continue; // Don't allow sale of bound items - val=sd->inventory_data[i]->value_sell; if( val < 0 ) continue; @@ -2046,7 +2002,7 @@ void clif_npc_market_open(struct map_session_data *sd, struct npc_data *nd) { if (sd->state.trading) return; - info = &packet_db[sd->packet_ver][cmd]; + info = &packet_db[cmd]; if (!info || info->len == 0) return; @@ -2093,7 +2049,7 @@ void clif_npc_market_purchase_ack(struct map_session_data *sd, uint8 res, uint8 nullpo_retv(sd); nullpo_retv((nd = map_id2nd(sd->npc_shopid))); - info = &packet_db[sd->packet_ver][cmd]; + info = &packet_db[cmd]; if (!info || info->len == 0) return; @@ -2137,7 +2093,7 @@ void clif_parse_NPCMarketPurchase(int fd, struct map_session_data *sd) { if (!sd->npc_shopid) return; - info = &packet_db[sd->packet_ver][RFIFOW(fd,0)]; + info = &packet_db[RFIFOW(fd,0)]; if (!info || info->len == 0) return; len = RFIFOW(fd,info->pos[0]); @@ -2246,9 +2202,9 @@ void clif_scriptclear(struct map_session_data *sd, int npcid) nullpo_retv(sd); - cmd = packet_db_ack[sd->packet_ver][ZC_CLEAR_DIALOG]; + cmd = packet_db_ack[ZC_CLEAR_DIALOG]; if(!cmd) cmd = 0x8d6; //default - info = &packet_db[sd->packet_ver][cmd]; + info = &packet_db[cmd]; len = info->len; fd = sd->fd; @@ -2493,7 +2449,7 @@ static void clif_addcards(unsigned char* buf, struct item* item) /// 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 >= 20150226 +#if PACKETVER >= 20150225 int i; for (i = 0; i < MAX_ITEM_RDM_OPT; i++) { @@ -2528,7 +2484,7 @@ void clif_additem(struct map_session_data *sd, int n, int amount, unsigned char header = 0x29a; #elif PACKETVER < 20120925 header = 0x2d4; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 header = 0x990; #elif PACKETVER < 20160921 header = 0xa0c; @@ -2568,7 +2524,7 @@ void clif_additem(struct map_session_data *sd, int n, int amount, unsigned char #endif #if PACKETVER >= 20071002 WFIFOW(fd,offs+27) = 0; // HireExpireDate -#if PACKETVER >= 20150226 +#if PACKETVER >= 20150225 clif_add_random_options(WFIFOP(fd,offs+31), &sd->inventory.u.items_inventory[n]); #if PACKETVER >= 20160921 WFIFOB(fd,offs+54) = 0; // Favorite @@ -2608,7 +2564,7 @@ void clif_additem(struct map_session_data *sd, int n, int amount, unsigned char /* Yellow color only for non-stackable item */ WFIFOW(fd,offs+27)=(sd->inventory.u.items_inventory[n].bound && !itemdb_isstackable(sd->inventory.u.items_inventory[n].nameid)) ? BOUND_DISPYELLOW : sd->inventory_data[n]->flag.bindOnEquip ? BOUND_ONEQUIP : 0; #endif -#if PACKETVER >= 20150226 +#if PACKETVER >= 20150225 clif_add_random_options(WFIFOP(fd,31), &sd->inventory.u.items_inventory[n]); #if PACKETVER >= 20160921 WFIFOB(fd,offs+54) = sd->inventory.u.items_inventory[n].favorite; @@ -2685,7 +2641,7 @@ void clif_item_sub_v5(unsigned char *buf, int n, int idx, struct item *it, struc WBUFL(buf,n+22) = it->expire_time; WBUFW(buf,n+26) = it->bound ? BOUND_DISPYELLOW : id->flag.bindOnEquip ? BOUND_ONEQUIP : 0; //bindOnEquipType WBUFW(buf,n+28) = (id->equip&EQP_VISIBLE) ? id->look : 0; -#if PACKETVER >= 20150226 +#if PACKETVER >= 20150225 //V6_ITEM_Option WBUFB(buf,n+30) = 0; // nRandomOptionCnt clif_add_random_options(WBUFP(buf, n+31), it);// optionData @@ -2766,7 +2722,7 @@ void clif_inventorylist(struct map_session_data *sd) { const int se = 26; #elif PACKETVER < 20120925 const int se = 28; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 const int se = 31; #else const int se = 57; @@ -2814,7 +2770,7 @@ void clif_inventorylist(struct map_session_data *sd) { WBUFW(bufe,0)=0xa4; #elif PACKETVER < 20120925 WBUFW(bufe,0)=0x2d0; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 WBUFW(bufe,0)=0x992; #else WBUFW(bufe,0)=0xa0d; @@ -2846,7 +2802,7 @@ void clif_equiplist(struct map_session_data *sd) const int cmd = 26; #elif PACKETVER < 20120925 const int cmd = 28; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 const int cmd = 31; #else const int cmd = 57; @@ -2870,7 +2826,7 @@ void clif_equiplist(struct map_session_data *sd) WBUFW(buf,0)=0xa4; #elif PACKETVER < 20120925 WBUFW(buf,0)=0x2d0; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 WBUFW(buf,0)=0x992; #else WBUFW(buf,0)=0xa0d; @@ -2916,7 +2872,7 @@ void clif_storagelist(struct map_session_data* sd, struct item* items, int items const int se = 28; const int sidxe = 4; const int cmde = 0x2d1; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 const int se = 31; const int sidxe = 4+24; const int cmde = 0x996; @@ -3004,7 +2960,7 @@ void clif_cartlist(struct map_session_data *sd) const int cmd = 26; #elif PACKETVER < 20120925 const int cmd = 28; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 const int cmd = 31; #else const int cmd = 57; @@ -3047,7 +3003,7 @@ void clif_cartlist(struct map_session_data *sd) WBUFW(bufe,0)=0x122; #elif PACKETVER < 20120925 WBUFW(bufe,0)=0x2d2; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 WBUFW(bufe,0)=0x994; #else WBUFW(bufe,0)=0xa0f; @@ -3814,8 +3770,8 @@ void clif_equipitemack(struct map_session_data *sd,int n,int pos,uint8 flag) nullpo_retv(sd); - cmd = packet_db_ack[sd->packet_ver][ZC_WEAR_EQUIP_ACK]; - if (!cmd || !(info = &packet_db[sd->packet_ver][cmd]) || !info->len) + cmd = packet_db_ack[ZC_WEAR_EQUIP_ACK]; + if (!cmd || !(info = &packet_db[cmd]) || !info->len) return; fd = sd->fd; @@ -3829,12 +3785,12 @@ void clif_equipitemack(struct map_session_data *sd,int n,int pos,uint8 flag) switch (cmd) { case 0xaa: WFIFOW(fd, info->pos[1]) = pos; - if (sd->packet_ver < date2version(20100629)) - WFIFOW(fd, info->pos[2]) = (flag == ITEM_EQUIP_ACK_OK ? 1 : 0); - else { - WFIFOL(fd, info->pos[2]) = look; - WFIFOW(fd, info->pos[3]) = (flag == ITEM_EQUIP_ACK_OK ? 1 : 0); - } +#if PACKETVER < 20100629 + WFIFOW(fd, info->pos[2]) = (flag == ITEM_EQUIP_ACK_OK ? 1 : 0); +#else + WFIFOL(fd, info->pos[2]) = look; + WFIFOW(fd, info->pos[3]) = (flag == ITEM_EQUIP_ACK_OK ? 1 : 0); +#endif break; case 0x8d0: if (flag == ITEM_EQUIP_ACK_FAILLEVEL) @@ -4343,7 +4299,7 @@ void clif_tradeadditem(struct map_session_data* sd, struct map_session_data* tsd unsigned char *buf; #if PACKETVER < 20100223 const int cmd = 0xe9; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 const int cmd = 0x80f; #else const int cmd = 0xa09; @@ -4373,7 +4329,7 @@ void clif_tradeadditem(struct map_session_data* sd, struct map_session_data* tsd WBUFW(buf,13)= 0; //card (4w) WBUFW(buf,15)= 0; //card (4w) WBUFW(buf,17)= 0; //card (4w) -#if PACKETVER >= 20150226 +#if PACKETVER >= 20150225 clif_add_random_options(WBUFP(buf, 19), &sd->inventory.u.items_inventory[index]); #endif } @@ -4399,7 +4355,7 @@ void clif_tradeadditem(struct map_session_data* sd, struct map_session_data* tsd WBUFB(buf,9) = sd->inventory.u.items_inventory[index].attribute; // attribute WBUFB(buf,10)= sd->inventory.u.items_inventory[index].refine; //refine clif_addcards(WBUFP(buf, 11), &sd->inventory.u.items_inventory[index]); -#if PACKETVER >= 20150226 +#if PACKETVER >= 20150225 clif_add_random_options(WBUFP(buf, 19), &sd->inventory.u.items_inventory[index]); #endif } @@ -4516,7 +4472,7 @@ void clif_storageitemadded(struct map_session_data* sd, struct item* i, int inde { #if PACKETVER < 5 const int cmd = 0xf4; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 const int cmd = 0x1c4; #else const int cmd = 0xa0a; @@ -4542,7 +4498,7 @@ void clif_storageitemadded(struct map_session_data* sd, struct item* i, int inde WFIFOB(fd,11+offset) = i->attribute; // attribute WFIFOB(fd,12+offset) = i->refine; //refine clif_addcards(WFIFOP(fd,13+offset), i); -#if PACKETVER >= 20150226 +#if PACKETVER >= 20150225 clif_add_random_options(WFIFOP(fd,21+offset), i); #endif WFIFOSET(fd,packet_len(cmd)); @@ -4679,6 +4635,7 @@ void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl) else if( nd->size == SZ_MEDIUM ) clif_specialeffect_single(bl,421,sd->fd); clif_efst_status_change_sub(&sd->bl, bl, SELF); + clif_progressbar_npc(nd, sd); } break; case BL_MOB: @@ -6798,7 +6755,7 @@ void clif_cart_additem(struct map_session_data *sd,int n,int amount,int fail) { #if PACKETVER < 5 const int cmd = 0x124; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 const int cmd = 0x1c5; #else const int cmd = 0xa0b; @@ -6830,7 +6787,7 @@ void clif_cart_additem(struct map_session_data *sd,int n,int amount,int fail) WBUFB(buf,11+offset)=sd->cart.u.items_cart[n].attribute; WBUFB(buf,12+offset)=sd->cart.u.items_cart[n].refine; clif_addcards(WBUFP(buf,13+offset), &sd->cart.u.items_cart[n]); -#if PACKETVER >= 20150226 +#if PACKETVER >= 20150225 clif_add_random_options(WBUFP(buf,21+offset), &sd->cart.u.items_cart[n]); #endif WFIFOSET(fd,packet_len(cmd)); @@ -6882,7 +6839,7 @@ void clif_parse_BankOpen(int fd, struct map_session_data* sd) { return; } else { - struct s_packet_db* info = &packet_db[sd->packet_ver][RFIFOW(fd,0)]; + struct s_packet_db* info = &packet_db[RFIFOW(fd,0)]; int aid = RFIFOL(fd,info->pos[0]); //unused should we check vs fd ? if(sd->status.account_id == aid){ sd->state.banking = 1; @@ -6913,7 +6870,7 @@ void clif_bank_close(struct map_session_data *sd){ * 09B8 L ??? (dunno just wild guess checkme) */ void clif_parse_BankClose(int fd, struct map_session_data* sd) { - struct s_packet_db* info = &packet_db[sd->packet_ver][RFIFOW(fd,0)]; + struct s_packet_db* info = &packet_db[RFIFOW(fd,0)]; int aid = RFIFOL(fd,info->pos[0]); //unused should we check vs fd ? nullpo_retv(sd); @@ -6939,9 +6896,9 @@ void clif_Bank_Check(struct map_session_data* sd) { nullpo_retv(sd); - cmd = packet_db_ack[sd->packet_ver][ZC_BANKING_CHECK]; + cmd = packet_db_ack[ZC_BANKING_CHECK]; if(!cmd) cmd = 0x09A6; //default - info = &packet_db[sd->packet_ver][cmd]; + info = &packet_db[cmd]; len = info->len; if(!len) return; //version as packet disable // sd->state.banking = 1; //mark opening and closing @@ -6964,7 +6921,7 @@ void clif_parse_BankCheck(int fd, struct map_session_data* sd) { return; } else { - struct s_packet_db* info = &packet_db[sd->packet_ver][RFIFOW(fd,0)]; + struct s_packet_db* info = &packet_db[RFIFOW(fd,0)]; int aid = RFIFOL(fd,info->pos[0]); //unused should we check vs fd ? if(sd->status.account_id == aid) //since we have it let check it for extra security clif_Bank_Check(sd); @@ -6983,9 +6940,9 @@ void clif_bank_deposit(struct map_session_data *sd, enum e_BANKING_DEPOSIT_ACK r nullpo_retv(sd); - cmd = packet_db_ack[sd->packet_ver][ZC_ACK_BANKING_DEPOSIT]; + cmd = packet_db_ack[ZC_ACK_BANKING_DEPOSIT]; if(!cmd) cmd = 0x09A8; - info = &packet_db[sd->packet_ver][cmd]; + info = &packet_db[cmd]; len = info->len; if(!len) return; //version as packet disable @@ -7008,7 +6965,7 @@ void clif_parse_BankDeposit(int fd, struct map_session_data* sd) { return; } else { - struct s_packet_db* info = &packet_db[sd->packet_ver][RFIFOW(fd,0)]; + struct s_packet_db* info = &packet_db[RFIFOW(fd,0)]; int aid = RFIFOL(fd,info->pos[0]); //unused should we check vs fd ? int money = RFIFOL(fd,info->pos[1]); @@ -7031,9 +6988,9 @@ void clif_bank_withdraw(struct map_session_data *sd,enum e_BANKING_WITHDRAW_ACK nullpo_retv(sd); - cmd = packet_db_ack[sd->packet_ver][ZC_ACK_BANKING_WITHDRAW]; + cmd = packet_db_ack[ZC_ACK_BANKING_WITHDRAW]; if(!cmd) cmd = 0x09AA; - info = &packet_db[sd->packet_ver][cmd]; + info = &packet_db[cmd]; len = info->len; if(!len) return; //version as packet disable @@ -7056,7 +7013,7 @@ void clif_parse_BankWithdraw(int fd, struct map_session_data* sd) { return; } else { - struct s_packet_db* info = &packet_db[sd->packet_ver][RFIFOW(fd,0)]; + struct s_packet_db* info = &packet_db[RFIFOW(fd,0)]; int aid = RFIFOL(fd,info->pos[0]); //unused should we check vs fd ? int money = RFIFOL(fd,info->pos[1]); if(sd->status.account_id == aid){ @@ -7160,7 +7117,7 @@ void clif_vendinglist(struct map_session_data* sd, int id, struct s_vending* ven const int offset = 12; #endif -#if PACKETVER < 20150226 +#if PACKETVER < 20150225 const int item_length = 22; #elif PACKETVER < 20160921 const int item_length = 47; @@ -7196,7 +7153,7 @@ void clif_vendinglist(struct map_session_data* sd, int id, struct s_vending* ven WFIFOB(fd,offset+12+i*item_length) = vsd->cart.u.items_cart[index].attribute; WFIFOB(fd,offset+13+i*item_length) = vsd->cart.u.items_cart[index].refine; clif_addcards(WFIFOP(fd,offset+14+i*item_length), &vsd->cart.u.items_cart[index]); -#if PACKETVER >= 20150226 +#if PACKETVER >= 20150225 clif_add_random_options(WFIFOP(fd,offset+22+i*item_length), &vsd->cart.u.items_cart[index]); #if PACKETVER >= 20160921 WFIFOL(fd,offset+47+i*item_length) = pc_equippoint_sub(sd,data); @@ -7258,7 +7215,7 @@ void clif_openvending(struct map_session_data* sd, int id, struct s_vending* ven int i,fd; int count; -#if PACKETVER < 20150226 +#if PACKETVER < 20150225 const int item_length = 22; #else const int item_length = 47; @@ -7285,7 +7242,7 @@ void clif_openvending(struct map_session_data* sd, int id, struct s_vending* ven WFIFOB(fd,20+i*item_length) = sd->cart.u.items_cart[index].attribute; WFIFOB(fd,21+i*item_length) = sd->cart.u.items_cart[index].refine; clif_addcards(WFIFOP(fd,22+i*item_length), &sd->cart.u.items_cart[index]); -#if PACKETVER >= 20150226 +#if PACKETVER >= 20150225 clif_add_random_options(WFIFOP(fd,30+i*item_length), &sd->cart.u.items_cart[index]); #endif } @@ -9501,7 +9458,7 @@ void clif_name( struct block_list* src, struct block_list *bl, send_target targe } #if PACKETVER >= 20150513 - WBUFL(buf,102) = 0; // Title ID + WBUFL(buf,102) = sd->status.title_id; // Title ID #endif } break; @@ -9526,7 +9483,11 @@ void clif_name( struct block_list* src, struct block_list *bl, send_target targe safestrncpy(WBUFCP(buf,6), md->name, NAME_LENGTH); if( md->guardian_data && md->guardian_data->guild_id ) { +#if PACKETVER >= 20150513 + WBUFW(buf, 0) = cmd = 0xa30; +#else WBUFW(buf, 0) = cmd = 0x195; +#endif WBUFB(buf,30) = 0; safestrncpy(WBUFCP(buf,54), md->guardian_data->guild_name, NAME_LENGTH); safestrncpy(WBUFCP(buf,78), md->guardian_data->castle->castle_name, NAME_LENGTH); @@ -9534,7 +9495,11 @@ void clif_name( struct block_list* src, struct block_list *bl, send_target targe else if( battle_config.show_mob_info ) { char mobhp[50], *str_p = mobhp; +#if PACKETVER >= 20150513 + WBUFW(buf, 0) = cmd = 0xa30; +#else WBUFW(buf, 0) = cmd = 0x195; +#endif if( battle_config.show_mob_info&4 ) str_p += sprintf(str_p, "Lv. %d | ", md->level); if( battle_config.show_mob_info&1 ) @@ -9551,6 +9516,9 @@ void clif_name( struct block_list* src, struct block_list *bl, send_target targe WBUFB(buf,78) = 0; } } +#if PACKETVER >= 20150513 + WBUFL(buf, 102) = 0; // Title ID +#endif } break; case BL_CHAT: //FIXME: Clients DO request this... what should be done about it? The chat's title may not fit... [Skotlex] @@ -9794,7 +9762,7 @@ void clif_equipcheckbox(struct map_session_data* sd) /// 0859 .W .24B .W .W .W .W .W .W .W .B {equip item}.28B* (ZC_EQUIPWIN_MICROSCOPE2, PACKETVER >= 20101124) /// 0859 .W .24B .W .W .W .W .W .W .W .W .B {equip item}.28B* (ZC_EQUIPWIN_MICROSCOPE2, PACKETVER >= 20110111) /// 0997 .W .24B .W .W .W .W .W .W .W .W .B {equip item}.31B* (ZC_EQUIPWIN_MICROSCOPE_V5, PACKETVER >= 20120925) -/// 0a2d .W .24B .W .W .W .W .W .W .W .W .B {equip item}.57B* (ZC_EQUIPWIN_MICROSCOPE_V6, PACKETVER >= 20150226) +/// 0a2d .W .24B .W .W .W .W .W .W .W .W .B {equip item}.57B* (ZC_EQUIPWIN_MICROSCOPE_V6, PACKETVER >= 20150225) void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* tsd) { uint8* buf; @@ -9803,7 +9771,7 @@ void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* ts const int s = 26; #elif PACKETVER < 20120925 const int s = 28; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 const int s = 31; #else const int s = 57; @@ -9819,7 +9787,7 @@ void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* ts WBUFW(buf, 0) = 0x2d7; #elif PACKETVER < 20120925 WBUFW(buf, 0) = 0x859; -#elif PACKETVER < 20150226 +#elif PACKETVER < 20150225 WBUFW(buf, 0) = 0x997; #else WBUFW(buf, 0) = 0xa2d; @@ -9914,7 +9882,7 @@ static bool clif_process_message(struct map_session_data* sd, bool whisperFormat fd = sd->fd; - info = &packet_db[sd->packet_ver][RFIFOW(fd,0)]; + info = &packet_db[RFIFOW(fd,0)]; packetLength = RFIFOW(fd,info->pos[0]); input = RFIFOCP(fd,info->pos[1]); @@ -10037,7 +10005,7 @@ static bool clif_process_message(struct map_session_data* sd, bool whisperFormat } // --------------------- -// clif_guess_PacketVer +// clif_parse_wanttoconnect // --------------------- // Parses a WantToConnection packet to try to identify which is the packet version used. [Skotlex] // error codes: @@ -10049,74 +10017,33 @@ static bool clif_process_message(struct map_session_data* sd, bool whisperFormat // 5 - Invalid client_tick (reserved) // 6 - Invalid sex // Only the first 'invalid' error that appears is used. -static int clif_guess_PacketVer(int fd, int get_previous, int *error) +static int clif_parse_WantToConnection_sub(int fd) { - static int err = 1; - static int packet_ver = -1; int packet_len, value; //Value is used to temporarily store account/char_id/sex unsigned short cmd; - if (get_previous) - {//For quick reruns, since the normal code flow is to fetch this once to identify the packet version, then again in the wanttoconnect function. [Skotlex] - if( error ) - *error = err; - return packet_ver; - } - //By default, start searching on the default one. - err = 1; - packet_ver = clif_config.packet_db_ver; - cmd = clif_parse_cmd(fd, NULL); + cmd = RFIFOW(fd, 0); packet_len = RFIFOREST(fd); -#define SET_ERROR(n) \ - if( err == 1 )\ - err = n;\ -//define SET_ERROR - // FIXME: If the packet is not received at once, this will FAIL. // Figure out, when it happens, that only part of the packet is // received, or fix the function to be able to deal with that // case. -#define CHECK_PACKET_VER() \ - if( cmd != clif_config.connect_cmd[packet_ver] || packet_len != packet_db[packet_ver][cmd].len )\ - ;/* not wanttoconnection or wrong length */\ - else if( (value=(int)RFIFOL(fd, packet_db[packet_ver][cmd].pos[0])) < START_ACCOUNT_NUM || value > END_ACCOUNT_NUM )\ - { SET_ERROR(2); }/* invalid account_id */\ - else if( (value=(int)RFIFOL(fd, packet_db[packet_ver][cmd].pos[1])) <= 0 )\ - { SET_ERROR(3); }/* invalid char_id */\ - /* RFIFOL(fd, packet_db[packet_ver][cmd].pos[2]) - don't care about login_id1 */\ - /* RFIFOL(fd, packet_db[packet_ver][cmd].pos[3]) - don't care about client_tick */\ - else if( (value=(int)RFIFOB(fd, packet_db[packet_ver][cmd].pos[4])) != 0 && value != 1 )\ - { SET_ERROR(6); }/* invalid sex */\ - else\ - {\ - err = 0;\ - if( error )\ - *error = 0;\ - return packet_ver;\ - }\ -//define CHECK_PACKET_VER - - CHECK_PACKET_VER();//Default packet version found. - - for (packet_ver = MAX_PACKET_VER; packet_ver > 0; packet_ver--) { //Start guessing the version, giving priority to the newer ones. [Skotlex] - CHECK_PACKET_VER(); - } - if( error ) - *error = err; - packet_ver = -1; - return -1; -#undef SET_ERROR -#undef CHECK_PACKET_VER + if( packet_len != packet_db[cmd].len ) + return 1; /* wrong length */ + else if( (value=(int)RFIFOL(fd, packet_db[cmd].pos[0])) < START_ACCOUNT_NUM || value > END_ACCOUNT_NUM ) + return 2; /* invalid account_id */ + else if( (value=(int)RFIFOL(fd, packet_db[cmd].pos[1])) <= 0 ) + return 3; /* invalid char_id */ + /* RFIFOL(fd, packet_db[cmd].pos[2]) - don't care about login_id1 */ + /* RFIFOL(fd, packet_db[cmd].pos[3]) - don't care about client_tick */ + else if( (value=(int)RFIFOB(fd, packet_db[cmd].pos[4])) != 0 && value != 1 ) + return 6; /* invalid sex */ + else + return 0; } -// ------------ -// clif_parse_* -// ------------ -// Parses incoming (player) connection - - /// Request to connect to map-server. /// 0072 .L .L .L .L .B (CZ_ENTER) /// 0436 .L .L .L .L .B (CZ_ENTER2) @@ -10125,35 +10052,46 @@ void clif_parse_WantToConnection(int fd, struct map_session_data* sd) { struct block_list* bl; struct auth_node* node; - int cmd, account_id, char_id, login_id1, sex; + int cmd, account_id, char_id, login_id1, sex, err; unsigned int client_tick; //The client tick is a tick, therefore it needs be unsigned. [Skotlex] - int packet_ver; // 5: old, 6: 7july04, 7: 13july04, 8: 26july04, 9: 9aug04/16aug04/17aug04, 10: 6sept04, 11: 21sept04, 12: 18oct04, 13: 25oct04 (by [Yor]) if (sd) { ShowError("clif_parse_WantToConnection : invalid request (character already logged in)\n"); return; } - // Only valid packet version get here - packet_ver = clif_guess_PacketVer(fd, 1, NULL); + cmd = RFIFOW(fd, 0); + account_id = RFIFOL(fd, packet_db[cmd].pos[0]); + char_id = RFIFOL(fd, packet_db[cmd].pos[1]); + login_id1 = RFIFOL(fd, packet_db[cmd].pos[2]); + client_tick = RFIFOL(fd, packet_db[cmd].pos[3]); + sex = RFIFOB(fd, packet_db[cmd].pos[4]); - cmd = RFIFOW(fd,0); - account_id = RFIFOL(fd, packet_db[packet_ver][cmd].pos[0]); - char_id = RFIFOL(fd, packet_db[packet_ver][cmd].pos[1]); - login_id1 = RFIFOL(fd, packet_db[packet_ver][cmd].pos[2]); - client_tick = RFIFOL(fd, packet_db[packet_ver][cmd].pos[3]); - sex = RFIFOB(fd, packet_db[packet_ver][cmd].pos[4]); + err = clif_parse_WantToConnection_sub(fd); - if( packet_ver < 5 || // reject really old client versions - (packet_ver <= 9 && (battle_config.packet_ver_flag & 1) == 0) || // older than 6sept04 - (packet_ver > 9 && packet_ver <40 && (battle_config.packet_ver_flag & 1<<(packet_ver-9)) == 0) || // version not allowed - (packet_ver >= 40 && packet_ver <=72 && (battle_config.packet_ver_flag2 & 1<<(packet_ver-40)) == 0) ) - {// packet version rejected - ShowInfo("Rejected connection attempt, forbidden packet version (AID/CID: '"CL_WHITE"%d/%d"CL_RESET"', Packet Ver: '"CL_WHITE"%d"CL_RESET"', IP: '"CL_WHITE"%s"CL_RESET"').\n", account_id, char_id, packet_ver, ip2str(session[fd]->client_addr, NULL)); + if( err ){ // connection rejected + ShowInfo("clif_parse: Disconnecting session #%d with unknown connect packet 0x%04x(length:%d)%s\n", fd, cmd, RFIFOREST(fd), ( + err == 1 ? "." : + err == 2 ? ", possibly for having an invalid account_id." : + err == 3 ? ", possibly for having an invalid char_id." : + /* Uncomment when checks are added in clif_parse_WantToConnection_sub. [FlavioJS] + err == 4 ? ", possibly for having an invalid login_id1." : + err == 5 ? ", possibly for having an invalid client_tick." : + */ + err == 6 ? ", possibly for having an invalid sex." : + ". ERROR invalid error code")); + WFIFOHEAD(fd,packet_len(0x6a)); WFIFOW(fd,0) = 0x6a; - WFIFOB(fd,2) = 5; // Your Game's EXE file is not the latest version + WFIFOB(fd,2) = err; WFIFOSET(fd,packet_len(0x6a)); + +#ifdef DUMP_INVALID_PACKET + ShowDump(RFIFOP(fd, 0), RFIFOREST(fd)); +#endif + + RFIFOSKIP(fd, RFIFOREST(fd)); + set_eof(fd); return; } @@ -10185,7 +10123,6 @@ void clif_parse_WantToConnection(int fd, struct map_session_data* sd) CREATE(sd, TBL_PC, 1); sd->fd = fd; - sd->packet_ver = packet_ver; #ifdef PACKET_OBFUSCATION sd->cryptKey = (((((clif_cryptKey[0] * clif_cryptKey[1]) + clif_cryptKey[2]) & 0xFFFFFFFF) * clif_cryptKey[1]) + clif_cryptKey[2]) & 0xFFFFFFFF; #endif @@ -10595,7 +10532,7 @@ void clif_notify_time(struct map_session_data* sd, unsigned long time) /// There are various variants of this packet, some of them have padding between fields. void clif_parse_TickSend(int fd, struct map_session_data *sd) { - sd->client_tick = RFIFOL(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0]); + sd->client_tick = RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[0]); clif_notify_time(sd, gettick()); } @@ -10638,7 +10575,7 @@ void clif_hotkeys_send(struct map_session_data *sd) { /// Request to update a position on the hotkey row bar void clif_parse_HotkeyRowShift(int fd, struct map_session_data *sd) { int cmd = RFIFOW(fd, 0); - sd->status.hotkey_rowshift = RFIFOB(fd, packet_db[sd->packet_ver][cmd].pos[0]); + sd->status.hotkey_rowshift = RFIFOB(fd, packet_db[cmd].pos[0]); } /// Request to update a position on the hotkey bar (CZ_SHORTCUT_KEY_CHANGE). @@ -10646,7 +10583,7 @@ void clif_parse_HotkeyRowShift(int fd, struct map_session_data *sd) { void clif_parse_Hotkey(int fd, struct map_session_data *sd) { #ifdef HOTKEY_SAVING unsigned short idx; - struct s_packet_db* info = &packet_db[sd->packet_ver][RFIFOW(fd,0)]; + struct s_packet_db* info = &packet_db[RFIFOW(fd,0)]; idx = RFIFOW(fd, info->pos[0]); if (idx >= MAX_HOTKEYS) return; @@ -10698,6 +10635,26 @@ void clif_parse_progressbar(int fd, struct map_session_data * sd) npc_scriptcont(sd, npc_id, false); } +/// Displays cast-like progress bar on a NPC +/// 09d1 .L .L