summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md5
-rw-r--r--conf/battlegrounds.conf5
-rw-r--r--conf/channels.conf4
-rw-r--r--conf/plugins.conf4
-rwxr-xr-xconfigure3
-rw-r--r--configure.in1
-rw-r--r--db/cashshop_db.conf4
-rw-r--r--db/const.txt12
-rw-r--r--db/pet_db.txt8
-rw-r--r--db/pre-re/item_chain.conf4
-rw-r--r--db/pre-re/item_combo_db.txt18
-rw-r--r--db/pre-re/item_db.conf550
-rw-r--r--db/pre-re/item_group.conf4
-rw-r--r--db/pre-re/item_packages.conf4
-rw-r--r--db/pre-re/job_db.conf4
-rw-r--r--db/pre-re/map_zone_db.conf4
-rw-r--r--db/pre-re/skill_tree.conf4
-rw-r--r--db/re/item_chain.conf4
-rw-r--r--db/re/item_group.conf4
-rw-r--r--db/re/item_packages.conf4
-rw-r--r--db/re/job_db.conf4
-rw-r--r--db/re/map_zone_db.conf4
-rw-r--r--db/re/skill_cast_db.txt2
-rw-r--r--db/re/skill_tree.conf4
-rw-r--r--db/roulette_db.conf4
-rw-r--r--db/translations.conf4
-rw-r--r--db2sql.bat4
-rw-r--r--doc/script_commands.txt21
-rw-r--r--npc/MOTD.txt4
-rw-r--r--npc/custom/woe_controller.txt4
-rw-r--r--npc/instances/OrcsMemory.txt47
-rw-r--r--npc/kafras/functions_kafras.txt2
-rw-r--r--npc/pre-re/quests/collection/quest_disguiseloliruri.txt2
-rw-r--r--npc/pre-re/scripts_main.conf2
-rw-r--r--npc/re/merchants/coin_exchange.txt6
-rw-r--r--npc/re/scripts_main.conf4
-rw-r--r--npc/re/scripts_woe.conf (renamed from npc/re/scripts_guild.conf)4
-rw-r--r--npc/re/warps/cities/eclage.txt2
-rw-r--r--npc/re/woe-fe/invest_main.txt (renamed from npc/re/guild/invest_main.txt)0
-rw-r--r--npc/re/woe-fe/invest_npc.txt (renamed from npc/re/guild/invest_npc.txt)0
-rw-r--r--npc/scripts_guild.conf55
-rw-r--r--npc/scripts_woe.conf55
-rw-r--r--npc/woe-fe/agit_controller.txt (renamed from npc/guild/agit_controller.txt)0
-rw-r--r--npc/woe-fe/agit_main.txt (renamed from npc/guild/agit_main.txt)0
-rw-r--r--npc/woe-fe/aldeg_cas01.txt (renamed from npc/guild/aldeg_cas01.txt)0
-rw-r--r--npc/woe-fe/aldeg_cas02.txt (renamed from npc/guild/aldeg_cas02.txt)0
-rw-r--r--npc/woe-fe/aldeg_cas03.txt (renamed from npc/guild/aldeg_cas03.txt)0
-rw-r--r--npc/woe-fe/aldeg_cas04.txt (renamed from npc/guild/aldeg_cas04.txt)0
-rw-r--r--npc/woe-fe/aldeg_cas05.txt (renamed from npc/guild/aldeg_cas05.txt)0
-rw-r--r--npc/woe-fe/gefg_cas01.txt (renamed from npc/guild/gefg_cas01.txt)0
-rw-r--r--npc/woe-fe/gefg_cas02.txt (renamed from npc/guild/gefg_cas02.txt)0
-rw-r--r--npc/woe-fe/gefg_cas03.txt (renamed from npc/guild/gefg_cas03.txt)0
-rw-r--r--npc/woe-fe/gefg_cas04.txt (renamed from npc/guild/gefg_cas04.txt)0
-rw-r--r--npc/woe-fe/gefg_cas05.txt (renamed from npc/guild/gefg_cas05.txt)0
-rw-r--r--npc/woe-fe/payg_cas01.txt (renamed from npc/guild/payg_cas01.txt)0
-rw-r--r--npc/woe-fe/payg_cas02.txt (renamed from npc/guild/payg_cas02.txt)0
-rw-r--r--npc/woe-fe/payg_cas03.txt (renamed from npc/guild/payg_cas03.txt)0
-rw-r--r--npc/woe-fe/payg_cas04.txt (renamed from npc/guild/payg_cas04.txt)0
-rw-r--r--npc/woe-fe/payg_cas05.txt (renamed from npc/guild/payg_cas05.txt)0
-rw-r--r--npc/woe-fe/prtg_cas01.txt (renamed from npc/guild/prtg_cas01.txt)0
-rw-r--r--npc/woe-fe/prtg_cas02.txt (renamed from npc/guild/prtg_cas02.txt)0
-rw-r--r--npc/woe-fe/prtg_cas03.txt (renamed from npc/guild/prtg_cas03.txt)0
-rw-r--r--npc/woe-fe/prtg_cas04.txt (renamed from npc/guild/prtg_cas04.txt)0
-rw-r--r--npc/woe-fe/prtg_cas05.txt (renamed from npc/guild/prtg_cas05.txt)0
-rw-r--r--npc/woe-fe/trs_rp.txt (renamed from npc/guild/trs_rp.txt)0
-rw-r--r--npc/woe-se/agit_main_se.txt (renamed from npc/guild2/agit_main_se.txt)0
-rw-r--r--npc/woe-se/agit_start_se.txt (renamed from npc/guild2/agit_start_se.txt)0
-rw-r--r--npc/woe-se/arug_cas01.txt (renamed from npc/guild2/arug_cas01.txt)0
-rw-r--r--npc/woe-se/arug_cas02.txt (renamed from npc/guild2/arug_cas02.txt)0
-rw-r--r--npc/woe-se/arug_cas03.txt (renamed from npc/guild2/arug_cas03.txt)0
-rw-r--r--npc/woe-se/arug_cas04.txt (renamed from npc/guild2/arug_cas04.txt)0
-rw-r--r--npc/woe-se/arug_cas05.txt (renamed from npc/guild2/arug_cas05.txt)0
-rw-r--r--npc/woe-se/guild_flags.txt (renamed from npc/guild2/guild_flags.txt)0
-rw-r--r--npc/woe-se/schg_cas01.txt (renamed from npc/guild2/schg_cas01.txt)0
-rw-r--r--npc/woe-se/schg_cas02.txt (renamed from npc/guild2/schg_cas02.txt)0
-rw-r--r--npc/woe-se/schg_cas03.txt (renamed from npc/guild2/schg_cas03.txt)0
-rw-r--r--npc/woe-se/schg_cas04.txt (renamed from npc/guild2/schg_cas04.txt)0
-rw-r--r--npc/woe-se/schg_cas05.txt (renamed from npc/guild2/schg_cas05.txt)0
-rw-r--r--script-checker.bat2
-rw-r--r--sql-files/item_db.sql320
-rw-r--r--sql-files/upgrades/2013-04-16--01-24.sql2
-rw-r--r--src/char/char.c116
-rw-r--r--src/char/int_guild.c24
-rw-r--r--src/char/int_party.c13
-rw-r--r--src/char/inter.c4
-rw-r--r--src/common/HPM.c65
-rw-r--r--src/common/console.c2
-rw-r--r--src/common/core.c2
-rw-r--r--src/common/db.h22
-rw-r--r--src/common/ers.h10
-rw-r--r--src/common/grfio.c2
-rw-r--r--src/common/mapindex.c2
-rw-r--r--src/common/mmo.h97
-rw-r--r--src/common/nullpo.c17
-rw-r--r--src/common/showmsg.h85
-rw-r--r--src/common/sysinfo.c2
-rw-r--r--src/common/sysinfo.h2
-rw-r--r--src/config/classes/general.h2
-rw-r--r--src/config/const.h4
-rw-r--r--src/config/renewal.h5
-rw-r--r--src/config/secure.h4
-rw-r--r--src/login/login.c39
-rw-r--r--src/login/login.h17
-rw-r--r--src/login/loginlog_sql.c1
-rw-r--r--src/map/atcommand.c166
-rw-r--r--src/map/battle.c172
-rw-r--r--src/map/battle.h21
-rw-r--r--src/map/battleground.c17
-rw-r--r--src/map/buyingstore.c2
-rw-r--r--src/map/channel.c5
-rw-r--r--src/map/chat.c10
-rw-r--r--src/map/chrif.c62
-rw-r--r--src/map/clif.c314
-rw-r--r--src/map/clif.h35
-rw-r--r--src/map/elemental.c2
-rw-r--r--src/map/guild.c30
-rw-r--r--src/map/homunculus.c2
-rw-r--r--src/map/irc-bot.c2
-rw-r--r--src/map/irc-bot.h2
-rw-r--r--src/map/mail.c5
-rw-r--r--src/map/map.c4
-rw-r--r--src/map/map.h20
-rw-r--r--src/map/mob.c30
-rw-r--r--src/map/mob.h33
-rw-r--r--src/map/npc.c12
-rw-r--r--src/map/packets.h2
-rw-r--r--src/map/packets_struct.h2
-rw-r--r--src/map/party.c2
-rw-r--r--src/map/pc.c715
-rw-r--r--src/map/pc.h38
-rw-r--r--src/map/pet.c12
-rw-r--r--src/map/script.c70
-rw-r--r--src/map/skill.c275
-rw-r--r--src/map/skill.h1
-rw-r--r--src/map/status.c117
-rw-r--r--src/map/status.h43
-rw-r--r--src/map/storage.c34
-rw-r--r--src/map/storage.h9
-rw-r--r--src/map/trade.c12
-rw-r--r--src/map/unit.c57
-rw-r--r--src/map/unit.h13
-rw-r--r--src/map/vending.c2
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc12
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc3
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc86
-rw-r--r--src/plugins/dbghelpplug.c4
-rw-r--r--src/plugins/sample.c2
-rwxr-xr-xsysinfogen.sh2
-rw-r--r--tools/Script-Checker.applescript2
-rwxr-xr-xtools/itemdbconverter.pl2
-rwxr-xr-xtools/questdbconverter.pl2
151 files changed, 2366 insertions, 1844 deletions
diff --git a/README.md b/README.md
index 7ffe47596..e3e19be33 100644
--- a/README.md
+++ b/README.md
@@ -131,7 +131,10 @@ The following list of links point to various help files within the GIT, articles
pages on the Wiki or topics within the Hercules forum.
* Hercules Forums
- http://hercules.ws/board/
+ http://herc.ws/board/
+
+* Hercules Wiki
+ http://herc.ws/wiki/Main_Page
* GIT Repository URL:
https://github.com/HerculesWS/Hercules
diff --git a/conf/battlegrounds.conf b/conf/battlegrounds.conf
index 0aa81d35d..ea54d3f2e 100644
--- a/conf/battlegrounds.conf
+++ b/conf/battlegrounds.conf
@@ -6,10 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//====================================================
-//= Link~u! <description> <link to wiki/topic>
-//= http://hercules.ws/board/topic/928-memory-slasher-may-30-patch/
+//= http://herc.ws/board/topic/928-memory-slasher-may-30-patch/
//====================================================
//= Fields (TODO/INCOMPLETE)
//= arenas: ({
diff --git a/conf/channels.conf b/conf/channels.conf
index a3eee122d..19021a64d 100644
--- a/conf/channels.conf
+++ b/conf/channels.conf
@@ -6,10 +6,10 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//====================================================
//================= More Information =================
-// http://hercules.ws/board/topic/316-introducing-hercules-channel-system/
+// http://herc.ws/board/topic/316-introducing-hercules-channel-system/
//====================================================
chsys: (
{
diff --git a/conf/plugins.conf b/conf/plugins.conf
index 8f171f034..367fc81f2 100644
--- a/conf/plugins.conf
+++ b/conf/plugins.conf
@@ -6,10 +6,10 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//====================================================
//== Topic Discussion ================================
-//== http://hercules.ws/board/topic/549-introducing-hercules-plugin-manager/
+//== http://herc.ws/board/topic/549-introducing-hercules-plugin-manager/
//====================================================
//== Description =====================================
//The plugin system allows you to create customized scripts
diff --git a/configure b/configure
index 75fd62a97..b022ca2d5 100755
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
#! /bin/sh
-# From configure.in 18c1133.
+# From configure.in 3bd5d73.
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69.
#
@@ -4616,6 +4616,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
CFLAGS="$CFLAGS -pipe -ffast-math -Wall -Wextra -Wno-sign-compare"
CPPFLAGS="$CPPFLAGS -I../common"
+LDFLAGS="$LDFLAGS -rdynamic"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
diff --git a/configure.in b/configure.in
index 9497ce6bc..d17f5b4a7 100644
--- a/configure.in
+++ b/configure.in
@@ -487,6 +487,7 @@ AC_LANG([C])
CFLAGS="$CFLAGS -pipe -ffast-math -Wall -Wextra -Wno-sign-compare"
CPPFLAGS="$CPPFLAGS -I../common"
+LDFLAGS="$LDFLAGS -rdynamic"
AC_C_BIGENDIAN(
diff --git a/db/cashshop_db.conf b/db/cashshop_db.conf
index 7f1d4f5d6..ecd17daf8 100644
--- a/db/cashshop_db.conf
+++ b/db/cashshop_db.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-//= http://hercules.ws/board/topic/367-introducing-cash-shop-support/
+//= http://herc.ws/board/topic/367-introducing-cash-shop-support/
//====================================================
// This file handles the entire Cashshop. You can simply
// add in any amount of items you like within each category.
diff --git a/db/const.txt b/db/const.txt
index 0fec098ef..950bf8ceb 100644
--- a/db/const.txt
+++ b/db/const.txt
@@ -657,6 +657,7 @@ Ele_Holy 6
Ele_Dark 7
Ele_Ghost 8
Ele_Undead 9
+Ele_All 255
RC_Formless 0
RC_Undead 1
@@ -668,9 +669,14 @@ RC_Demon 6
RC_DemiHuman 7
RC_Angel 8
RC_Dragon 9
-RC_Boss 10
-RC_NonBoss 11
-RC_NonDemiHuman 12
+RC_Player 10
+RC_Boss 11
+RC_NonBoss 12
+RC_NonDemiHuman 14
+RC_NonPlayer 15
+RC_DemiPlayer 16
+RC_NonDemiPlayer 17
+RC_All 255
RC2_None 0
RC2_Goblin 1
diff --git a/db/pet_db.txt b/db/pet_db.txt
index f3f574718..37401dca4 100644
--- a/db/pet_db.txt
+++ b/db/pet_db.txt
@@ -76,13 +76,13 @@
1109,DEVIRUCHI,Deviruchi,641,9023,10004,711,80,60,10,100,250,20,500,150,0,0,800,200,100,{ petskillbonus bAgiDexStr,6,20,40; },{ bonus bMatkRate,1; bonus bAtkRate,1; bonus bMaxHPrate,-3; bonus bMaxSPrate,-3; }
1101,BAPHOMET_,Baphomet Jr.,642,9024,10001,518,80,60,10,100,250,20,200,150,0,0,1000,100,200,{ petskillattack "NPC_DARKNESSATTACK",1776,4,0,5; },{ bonus bDef,1; bonus bMdef,1; bonus2 bResEff,Eff_Stun,-100; }
1188,BON_GUN,Bon Gun,659,9025,10020,537,80,60,30,100,250,20,500,150,1,0,600,200,400,{ petskillattack "NPC_DARKNESSATTACK",555,1,1,1; },{ bonus bVit,1; bonus2 bResEff,Eff_Stun,100; }
-1200,ZHERLTHSH,Zealotus,660,9026,0,929,80,60,10,100,250,20,300,150,0,0,1000,100,500,{ petskillattack "AS_SONICBLOW",1,0,0,3; },{ bonus2 bAddRace,RC_DemiHuman,2; bonus2 bMagicAddRace,RC_DemiHuman,2; }
-1275,ALICE,Alice,661,9027,0,504,80,60,20,100,250,20,800,150,0,0,100,1000,200,{ petskillsupport "AL_HEAL",5,60,25,100; },{ bonus bMdef,1; if (RENEWAL) { bonus2 bAddRaceTolerance,RC_DemiHuman,1; } else { bonus2 bSubRace,RC_DemiHuman,1; } }
+1200,ZHERLTHSH,Zealotus,660,9026,0,929,80,60,10,100,250,20,300,150,0,0,1000,100,500,{ petskillattack "AS_SONICBLOW",1,0,0,3; },{ bonus2 bAddRace,RC_DemiPlayer,2; bonus2 bMagicAddRace,RC_DemiPlayer,2; }
+1275,ALICE,Alice,661,9027,0,504,80,60,20,100,250,20,800,150,0,0,100,1000,200,{ petskillsupport "AL_HEAL",5,60,25,100; },{ bonus bMdef,1; if (RENEWAL) { bonus2 bAddRaceTolerance,RC_DemiPlayer,1; } else { bonus2 bSubRace,RC_DemiPlayer,1; } }
1815,EVENT_RICECAKE,Rice Cake,0,9028,0,511,80,60,50,100,250,20,2000,150,1,0,500,500,200,{ petskillsupport "CR_DEFENDER",3,240,50,100; },{ bonus2 bSubEle,Ele_Neutral,1; bonus bMaxHPrate,-1; }
1245,GOBLINE_XMAS,Christmas Goblin,12225,9029,0,911,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "MG_SIGHT",5,0,5,5; },{ bonus bMaxHP,30; bonus2 bSubEle,Ele_Water,1; }
// Newest pets.
-1519,CHUNG_E,Green Maiden,12395,9030,0,6115,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "CR_SHIELDCHARGE",5,0,5,5; },{ bonus bDef,1; if (RENEWAL) { bonus2 bAddRaceTolerance,RC_DemiHuman,1; } else { bonus2 bSubRace,RC_DemiHuman,1; } }
+1519,CHUNG_E,Green Maiden,12395,9030,0,6115,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "CR_SHIELDCHARGE",5,0,5,5; },{ bonus bDef,1; if (RENEWAL) { bonus2 bAddRaceTolerance,RC_DemiPlayer,1; } else { bonus2 bSubRace,RC_DemiPlayer,1; } }
1879,ECLIPSE_P,Spring Rabbit,0,9031,0,7766,80,60,50,100,250,20,2000,150,0,0,300,300,800,{ petskillattack "TF_THROWSTONE",1,0,5,5; },{}
1122,GOBLIN_1,Goblin,14569,9032,0,7821,80,60,50,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_WINDATTACK",5,0,5,5; },{}
1123,GOBLIN_2,Goblin,14570,9033,0,7821,80,60,50,100,250,20,800,150,0,0,300,300,800,{ petskillattack "NPC_FIREATTACK",5,0,5,5; },{}
@@ -98,7 +98,7 @@
1143,MARIONETTE,Marionette,12361,9043,10025,6098,80,60,10,100,250,20,500,150,0,0,300,300,800,{},{ bonus bSPrecovRate,3; }
1148,MEDUSA,Medusa,12368,9050,10032,6108,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus bVit,1; bonus2 bResEff,Eff_Stone,500; }
1179,WHISPER,Whisper,12363,9045,10027,6100,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus bFlee,7; bonus bDef,-3; }
-1299,GOBLIN_LEADER,Goblin Leader,12364,9046,10028,6104,80,60,10,100,250,20,50,150,0,0,300,300,800,{},{ bonus2 bAddRace,RC_DemiHuman,3; }
+1299,GOBLIN_LEADER,Goblin Leader,12364,9046,10028,6104,80,60,10,100,250,20,50,150,0,0,300,300,800,{},{ bonus2 bAddRace,RC_DemiPlayer,3; }
1370,SUCCUBUS,Succubus,12373,9055,10037,6113,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bHPDrainRate,50,5; }
1374,INCUBUS,Incubus,12370,9052,10034,6110,80,60,10,100,250,20,50,150,0,0,300,300,800,{},{ bonus bMaxSPrate,3; }
1379,NIGHTMARE_TERROR,Nightmare Terror,12372,9054,10036,6112,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bResEff,Eff_Sleep,10000; }
diff --git a/db/pre-re/item_chain.conf b/db/pre-re/item_chain.conf
index bedb33d73..744b1cbcf 100644
--- a/db/pre-re/item_chain.conf
+++ b/db/pre-re/item_chain.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/1244-official-item-grouppackagechain
+// http://herc.ws/board/topic/1244-official-item-grouppackagechain
//====================================================
// Structure of file:
/*
diff --git a/db/pre-re/item_combo_db.txt b/db/pre-re/item_combo_db.txt
index 2c7b3cc81..5177d339c 100644
--- a/db/pre-re/item_combo_db.txt
+++ b/db/pre-re/item_combo_db.txt
@@ -64,18 +64,18 @@
2357:2421:2524:5171,{ bonus bAllStats,1; }
2358:5153,{ bonus bLuk,6; bonus bFlee,5; bonus bInt,2; }
2359:2654,{ bonus bUseSPrate,-20; bonus bMaxHP,300; }
-//2369:2428:2533:5306,{ bonus2 bSubRace,RC_DemiHuman,10; bonus bMaxHPrate,20; bonus2 bResEff,Eff_Freeze,10000; skill "WZ_FIREPILLAR",10; }
+//2369:2428:2533:5306,{ bonus2 bSubRace,RC_DemiPlayer,10; bonus bMaxHPrate,20; bonus2 bResEff,Eff_Freeze,10000; skill "WZ_FIREPILLAR",10; }
2371:2522,{ bonus bAgi,5; bonus bFlee,10; }
2371:2523,{ bonus bAgi,5; bonus bFlee,10; }
2374:2729,{ bonus2 bAddRace,RC_NonBoss,3; bonus2 bAddRace,RC_Boss,3; bonus bMatkRate,3; }
2375:2729,{ bonus2 bAddRace,RC_NonBoss,3; bonus2 bAddRace,RC_Boss,3; bonus bMatkRate,3; }
-2376:2435:2538,{ bonus2 bSubRace,RC_NonDemiHuman,-300; bonus bVit,3; bonus bMaxHPrate,12; bonus bHealPower2,10; bonus bAddItemHealRate,10; autobonus2 "{ bonus2 bHPRegenRate,600,1000; }",5,10000,BF_WEAPON,"{ specialeffect2 EF_HEAL; }"; }
-2377:2435:2538,{ bonus2 bSubRace,RC_NonDemiHuman,-300; bonus bStr,3; bonus bMaxHPrate,12; bonus2 bSkillAtk,"MC_MAMMONITE",20; bonus2 bSkillHeal,"AM_POTIONPITCHER",10; bonus2 bSkillHeal2,"AM_POTIONPITCHER",10; bonus2 bSkillHeal2,"AL_HEAL",10; bonus bUnbreakableArmor,0; }
-2378:2435:2538,{ bonus2 bSubRace,RC_NonDemiHuman,-300; bonus bAgi,3; bonus bMaxHPrate,12; bonus bCritical,5; bonus bAspdRate,5; autobonus "{ bonus2 bHPRegenRate,300,1000; }",10,10000,BF_WEAPON,"{ specialeffect2 EF_HEAL; }"; }
-2379:2436:2539,{ bonus2 bSubRace,RC_NonDemiHuman,-300; bonus bInt,3; bonus bMaxHPrate,12; bonus2 bResEff,Eff_Stun,2000; autobonus2 "{ bonus bDefEle,Ele_Ghost; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_ENERGYCOAT; }"; }
-2380:2436:2539,{ bonus2 bSubRace,RC_NonDemiHuman,-300; bonus bInt,3; bonus bMaxHPrate,12; bonus2 bCastrate,"AL_HOLYLIGHT",-50; bonus bHealPower,6; autobonus2 "{ bonus bDefEle,Ele_Ghost; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_ENERGYCOAT; }"; }
-2381:2436:2539,{ bonus2 bSubRace,RC_NonDemiHuman,-300; bonus bDex,3; bonus bMaxHPrate,12; bonus bLongAtkDef,10; bonus bDelayrate,-25; }
-2382:2437:2540,{ bonus2 bSubRace,RC_NonDemiHuman,-300; bonus bDex,3; bonus bMaxHPrate,12; bonus bLongAtkDef,10; bonus bDelayrate,-25; }
+2376:2435:2538,{ bonus2 bSubRace,RC_NonDemiPlayer,-300; bonus bVit,3; bonus bMaxHPrate,12; bonus bHealPower2,10; bonus bAddItemHealRate,10; autobonus2 "{ bonus2 bHPRegenRate,600,1000; }",5,10000,BF_WEAPON,"{ specialeffect2 EF_HEAL; }"; }
+2377:2435:2538,{ bonus2 bSubRace,RC_NonDemiPlayer,-300; bonus bStr,3; bonus bMaxHPrate,12; bonus2 bSkillAtk,"MC_MAMMONITE",20; bonus2 bSkillHeal,"AM_POTIONPITCHER",10; bonus2 bSkillHeal2,"AM_POTIONPITCHER",10; bonus2 bSkillHeal2,"AL_HEAL",10; bonus bUnbreakableArmor,0; }
+2378:2435:2538,{ bonus2 bSubRace,RC_NonDemiPlayer,-300; bonus bAgi,3; bonus bMaxHPrate,12; bonus bCritical,5; bonus bAspdRate,5; autobonus "{ bonus2 bHPRegenRate,300,1000; }",10,10000,BF_WEAPON,"{ specialeffect2 EF_HEAL; }"; }
+2379:2436:2539,{ bonus2 bSubRace,RC_NonDemiPlayer,-300; bonus bInt,3; bonus bMaxHPrate,12; bonus2 bResEff,Eff_Stun,2000; autobonus2 "{ bonus bDefEle,Ele_Ghost; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_ENERGYCOAT; }"; }
+2380:2436:2539,{ bonus2 bSubRace,RC_NonDemiPlayer,-300; bonus bInt,3; bonus bMaxHPrate,12; bonus2 bCastrate,"AL_HOLYLIGHT",-50; bonus bHealPower,6; autobonus2 "{ bonus bDefEle,Ele_Ghost; }",30,10000,BF_WEAPON,"{ specialeffect2 EF_ENERGYCOAT; }"; }
+2381:2436:2539,{ bonus2 bSubRace,RC_NonDemiPlayer,-300; bonus bDex,3; bonus bMaxHPrate,12; bonus bLongAtkDef,10; bonus bDelayrate,-25; }
+2382:2437:2540,{ bonus2 bSubRace,RC_NonDemiPlayer,-300; bonus bDex,3; bonus bMaxHPrate,12; bonus bLongAtkDef,10; bonus bDelayrate,-25; }
2387:2440:2744,{ bonus bMaxHPrate,7; bonus bMaxSPrate,7; bonus bCastrate,-3; bonus bDelayrate,-15; }
2390:2749,{ bonus bFlee2,5; }
2394:2444:2549,{ bonus2 bAddRace,RC_NonBoss,5; bonus2 bAddRace,RC_Boss,5; bonus bMatkRate,5; bonus2 bResEff,Eff_Freeze,10000; bonus2 bSkillHeal2,"AM_POTIONPITCHER",3; bonus2 bSkillHeal2,"AL_HEAL",3; bonus2 bSkillHeal2,"PR_SANCTUARY",3; }
@@ -150,7 +150,7 @@
4268:4277,{ bonus bBaseAtk,20; bonus bLuk,3; }
4311:4319:4331:4371,{ bonus bInt,1; bonus bStr,1; bonus bDef,2; bonus bSPrecovRate,10; bonus2 bSkillAtk,"PA_SHIELDCHAIN",10; bonus2 bSkillAtk,"PA_SACRIFICE",10; bonus bCastrate,-10; if(BaseJob==Job_Crusader) bonus bDefEle,Ele_Holy; }
4323:4324,{ bonus3 bAutoSpell,"MG_FROSTDIVER",3,250; }
-4435:4436,{ bonus2 bSPGainRace,RC_DemiHuman,2; }
+4435:4436,{ bonus2 bSPGainRace,RC_DemiPlayer,2; }
5040:5442,{ bonus bAspdRate,3; bonus bCastrate,3; }
5068:5653,{ bonus bStr,1; bonus bAtkRate,5; }
5074:5653,{ bonus bStr,1; bonus bAspdRate,2; }
diff --git a/db/pre-re/item_db.conf b/db/pre-re/item_db.conf
index 65044a647..4d45931c3 100644
--- a/db/pre-re/item_db.conf
+++ b/db/pre-re/item_db.conf
@@ -4866,7 +4866,7 @@ item_db: (
Script: <"
skill TF_DOUBLE,5;
bonus bDoubleRate,25;
- bonus2 bAddRace,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,5;
">
},
{
@@ -5557,9 +5557,9 @@ item_db: (
EquipLv: 48
View: 3
Script: <"
- bonus bIgnoreDefRace,RC_DemiHuman;
- bonus2 bAddRace,RC_DemiHuman,20;
- bonus2 bSubRace,RC_DemiHuman,-10;
+ bonus bIgnoreDefRace,RC_DemiPlayer;
+ bonus2 bAddRace,RC_DemiPlayer,20;
+ bonus2 bSubRace,RC_DemiPlayer,-10;
bonus bAtkEle,Ele_Dark;
">
},
@@ -5658,9 +5658,9 @@ item_db: (
Refine: false
View: 3
Script: <"
- bonus bIgnoreDefRace,RC_DemiHuman;
- bonus2 bAddRace,RC_DemiHuman,20;
- bonus2 bSubRace,RC_DemiHuman,-10;
+ bonus bIgnoreDefRace,RC_DemiPlayer;
+ bonus2 bAddRace,RC_DemiPlayer,20;
+ bonus2 bSubRace,RC_DemiPlayer,-10;
bonus bAtkEle,Ele_Dark;
">
},
@@ -5770,9 +5770,9 @@ item_db: (
EquipLv: 48
View: 3
Script: <"
- bonus bIgnoreDefRace,RC_DemiHuman;
- bonus2 bAddRace,RC_DemiHuman,20;
- bonus2 bSubRace,RC_DemiHuman,-10;
+ bonus bIgnoreDefRace,RC_DemiPlayer;
+ bonus2 bAddRace,RC_DemiPlayer,20;
+ bonus2 bSubRace,RC_DemiPlayer,-10;
bonus bAtkEle,Ele_Dark;
">
},
@@ -5866,8 +5866,8 @@ item_db: (
}
Script: <"
bonus bStr,2;
- bonus2 bAddRace,RC_DemiHuman,55;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,55;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -5894,7 +5894,7 @@ item_db: (
}
Script: <"
bonus bCritical,20;
- bonus2 bAddRace,RC_DemiHuman,55;
+ bonus2 bAddRace,RC_DemiPlayer,55;
bonus bCritAtkRate,20;
bonus bUnbreakableWeapon,0;
">
@@ -5970,12 +5970,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,70;
- bonus2 bIgnoreDefRate,RC_DemiHuman,25;
+ bonus2 bAddRace,RC_DemiPlayer,70;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,25;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-3)*(getrefine()-3);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-3)*(getrefine()-3);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
bonus3 bAutoSpell,LK_CONCENTRATION,max(getskilllv(LK_CONCENTRATION),1),30;
@@ -6513,8 +6513,8 @@ item_db: (
EquipLv: 36
View: 1
Script: <"
- bonus bIgnoreDefRace,RC_DemiHuman;
- bonus2 bSubRace,RC_DemiHuman,10;
+ bonus bIgnoreDefRace,RC_DemiPlayer;
+ bonus2 bSubRace,RC_DemiPlayer,10;
bonus2 bSubRace,RC_Demon,-10;
">
},
@@ -6614,7 +6614,7 @@ item_db: (
Script: <"
bonus bIgnoreDefRace,RC_Demon;
bonus2 bSubRace,RC_Demon,5;
- bonus2 bSubRace,RC_DemiHuman,-10;
+ bonus2 bSubRace,RC_DemiPlayer,-10;
">
},
{
@@ -7096,7 +7096,7 @@ item_db: (
EquipLv: 75
View: 16
Script: <"
- bonus2 bAddRace,RC_DemiHuman,50;
+ bonus2 bAddRace,RC_DemiPlayer,50;
bonus bDef,3;
bonus bFlee,5;
bonus bFlee2,2;
@@ -7171,7 +7171,7 @@ item_db: (
EquipLv: 75
View: 16
Script: <"
- bonus bIgnoreDefRace,RC_DemiHuman;
+ bonus bIgnoreDefRace,RC_DemiPlayer;
bonus bFlee,-160;
bonus bFlee2,-160;
bonus bHPrecovRate,-100;
@@ -7194,7 +7194,7 @@ item_db: (
EquipLv: 75
View: 16
Script: <"
- bonus2 bAddRace,RC_DemiHuman,50;
+ bonus2 bAddRace,RC_DemiPlayer,50;
bonus bDef,3;
bonus bFlee,5;
bonus bFlee2,2;
@@ -7225,7 +7225,7 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,70;
+ bonus2 bAddRace,RC_DemiPlayer,70;
bonus bDef,3;
bonus bFlee,5;
bonus bFlee2,2;
@@ -7360,7 +7360,7 @@ item_db: (
Refine: false
View: 16
Script: <"
- bonus bIgnoreDefRace,RC_DemiHuman;
+ bonus bIgnoreDefRace,RC_DemiPlayer;
bonus bFlee,-160;
bonus bFlee2,-160;
">
@@ -7490,8 +7490,8 @@ item_db: (
bonus bStr,1;
bonus bDex,1;
bonus bLuk,1;
- bonus2 bAddRace,RC_DemiHuman,70;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,70;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -7520,7 +7520,7 @@ item_db: (
bonus bStr,1;
bonus bDex,1;
bonus bLuk,1;
- bonus2 bAddRace,RC_DemiHuman,70;
+ bonus2 bAddRace,RC_DemiPlayer,70;
bonus bCritAtkRate,20;
bonus bAspdRate,5;
bonus bUnbreakableWeapon,0;
@@ -7549,12 +7549,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,70;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,70;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) autobonus "{ bonus bAspdRate,100; }",70,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }";
">
@@ -7582,12 +7582,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,70;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,70;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bCriticalAddRace,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bCriticalAddRace,RC_DemiPlayer,5;
}
if(getrefine()>8) autobonus "{ bonus bAspdRate,100; }",70,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }";
">
@@ -7779,7 +7779,7 @@ item_db: (
EquipLv: 44
View: 6
Script: <"
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
bonus3 bAddMonsterDropItem,517,RC_Brute,3000;
">
},
@@ -7876,12 +7876,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,75;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,75;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
bonus bAspdRate,5;
}
if(getrefine()>8) {
@@ -8332,9 +8332,9 @@ item_db: (
EquipLv: 44
View: 7
Script: <"
- bonus2 bWeaponComaRace,RC_DemiHuman,30;
- bonus2 bSPGainRaceAttack,RC_DemiHuman,2;
- bonus2 bSPGainRace,RC_DemiHuman,20;
+ bonus2 bWeaponComaRace,RC_DemiPlayer,30;
+ bonus2 bSPGainRaceAttack,RC_DemiPlayer,2;
+ bonus2 bSPGainRace,RC_DemiPlayer,20;
">
},
{
@@ -8565,8 +8565,8 @@ item_db: (
}
Script: <"
bonus bStr,3;
- bonus2 bAddRace,RC_DemiHuman,55;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,55;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -8593,7 +8593,7 @@ item_db: (
}
Script: <"
bonus bStr,3;
- bonus2 bAddRace,RC_DemiHuman,55;
+ bonus2 bAddRace,RC_DemiPlayer,55;
autobonus "{ bonus bBreakArmorRate,10000; }",20,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }";
bonus bUnbreakableWeapon,0;
">
@@ -8646,12 +8646,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,70;
- bonus2 bIgnoreDefRate,RC_DemiHuman,25;
+ bonus2 bAddRace,RC_DemiPlayer,70;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,25;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-3)*(getrefine()-3);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-3)*(getrefine()-3);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
bonus3 bAutoSpell,NPC_CRITICALWOUND,1,50;
}
if(getrefine()>8) {
@@ -9249,7 +9249,7 @@ item_db: (
View: 4
Script: <"
bonus2 bAddEff,Eff_Stun,500;
- bonus2 bAddRace,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,20;
skill KN_PIERCE,3;
">
},
@@ -9343,8 +9343,8 @@ item_db: (
}
Script: <"
bonus bStr,2;
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(BaseJob==Job_Crusader) bonus bAspdRate,20;
">
@@ -9372,12 +9372,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
bonus bAspdRate,10;
}
if(getrefine()>8) {
@@ -9821,7 +9821,7 @@ item_db: (
View: 5
Script: <"
bonus2 bAddRace,RC_Brute,10;
- bonus2 bAddRace,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,5;
">
},
{
@@ -9860,7 +9860,7 @@ item_db: (
View: 5
Script: <"
bonus bAtkEle,Ele_Dark;
- bonus2 bAddRace,RC_DemiHuman,10;
+ bonus2 bAddRace,RC_DemiPlayer,10;
bonus2 bAddRace,RC_Angel,10;
">
},
@@ -10043,7 +10043,7 @@ item_db: (
Script: <"
bonus bIgnoreDefRace,RC_NonBoss;
bonus bIgnoreDefRace,RC_Boss;
- bonus2 bAddRace,RC_DemiHuman,10;
+ bonus2 bAddRace,RC_DemiPlayer,10;
bonus3 bAutoSpell,KN_PIERCE,5,30;
">
},
@@ -10136,8 +10136,8 @@ item_db: (
}
Script: <"
bonus bStr,2;
- bonus2 bAddRace,RC_DemiHuman,25;
- bonus bIgnoreDefRace,RC_DemiHuman;
+ bonus2 bAddRace,RC_DemiPlayer,25;
+ bonus bIgnoreDefRace,RC_DemiPlayer;
bonus bUnbreakableWeapon,0;
">
},
@@ -10226,12 +10226,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,70;
- bonus2 bIgnoreDefRate,RC_DemiHuman,25;
+ bonus2 bAddRace,RC_DemiPlayer,70;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,25;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
if(BaseJob==Job_Knight) bonus4 bAutoSpellOnSkill,KN_PIERCE,NPC_CRITICALWOUND,2,200;
@@ -10286,7 +10286,7 @@ item_db: (
Script: <"
bonus bIgnoreDefRace,RC_NonBoss;
bonus bIgnoreDefRace,RC_Boss;
- bonus2 bAddRace,RC_DemiHuman,10;
+ bonus2 bAddRace,RC_DemiPlayer,10;
bonus3 bAutoSpell,KN_PIERCE,5,30;
">
},
@@ -10732,7 +10732,7 @@ item_db: (
View: 8
Script: <"
bonus2 bAddRace,RC_Undead,10;
- bonus2 bAddRace,RC_DemiHuman,10;
+ bonus2 bAddRace,RC_DemiPlayer,10;
bonus2 bAddEle,Ele_Earth,10;
">
},
@@ -10944,7 +10944,7 @@ item_db: (
Refine: false
View: 8
Script: <"
- bonus2 bAddRace,RC_DemiHuman,30;
+ bonus2 bAddRace,RC_DemiPlayer,30;
bonus2 bAddRace,RC_Demon,40;
bonus2 bAddRace,RC_Undead,40;
">
@@ -11059,8 +11059,8 @@ item_db: (
Script: <"
bonus bStr,1;
bonus bDex,1;
- bonus2 bAddRace,RC_DemiHuman,75;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,75;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -11088,7 +11088,7 @@ item_db: (
Script: <"
bonus bStr,1;
bonus bDex,1;
- bonus2 bAddRace,RC_DemiHuman,75;
+ bonus2 bAddRace,RC_DemiPlayer,75;
bonus bUnbreakableWeapon,0;
autobonus "{ bonus2 bAddEff,Eff_Stun,5000; }",10,6000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }";
">
@@ -11168,12 +11168,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,75;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,75;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
bonus bAspdRate,5;
}
if(getrefine()>8) {
@@ -11541,7 +11541,7 @@ item_db: (
bonus bStr,3;
bonus bInt,3;
bonus bLuk,-20;
- bonus2 bWeaponComaRace,RC_DemiHuman,10;
+ bonus2 bWeaponComaRace,RC_DemiPlayer,10;
bonus bAspdRate,getrefine();
if(BaseJob==Job_Sage) bonus3 bAutoSpell,NPC_HELLJUDGEMENT,5,20;
">
@@ -11723,8 +11723,8 @@ item_db: (
bonus bStr,2;
bonus bInt,1;
bonus bMatkRate,15;
- bonus2 bAddRace,RC_DemiHuman,75;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,75;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -11753,7 +11753,7 @@ item_db: (
bonus bStr,2;
bonus bInt,1;
bonus bMatkRate,15;
- bonus2 bIgnoreMdefRate,RC_DemiHuman,25;
+ bonus2 bIgnoreMdefRate,RC_DemiPlayer,25;
bonus bUnbreakableWeapon,0;
">
},
@@ -11781,12 +11781,12 @@ item_db: (
}
Script: <"
bonus bMatkRate,15;
- bonus2 bAddRace,RC_DemiHuman,80;
- bonus2 bIgnoreDefRate,RC_DemiHuman,25;
+ bonus2 bAddRace,RC_DemiPlayer,80;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,25;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) autobonus "{ bonus bBaseAtk,200; }",30,3000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }";
">
@@ -11815,10 +11815,10 @@ item_db: (
}
Script: <"
bonus bMatkRate,15;
- bonus2 bAddRace,RC_DemiHuman,80;
- bonus2 bIgnoreDefRate,RC_DemiHuman,25;
+ bonus2 bAddRace,RC_DemiPlayer,80;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,25;
bonus bUnbreakableWeapon,0;
- if(getrefine()>5) bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ if(getrefine()>5) bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
if(getrefine()>8) {
bonus bMatkRate,5;
bonus bCastrate,-5;
@@ -11885,7 +11885,7 @@ item_db: (
bonus bStr,3;
bonus bInt,3;
bonus bLuk,-20;
- bonus2 bWeaponComaRace,RC_DemiHuman,10;
+ bonus2 bWeaponComaRace,RC_DemiPlayer,10;
bonus bAspdRate,getrefine();
if(BaseJob==Job_Sage) bonus3 bAutoSpell,NPC_HELLJUDGEMENT,5,20;
">
@@ -12649,7 +12649,7 @@ item_db: (
bonus bInt,4;
bonus bDex,3;
bonus bMatkRate,15;
- bonus2 bIgnoreMdefRate,RC_DemiHuman,25;
+ bonus2 bIgnoreMdefRate,RC_DemiPlayer,25;
bonus3 bAddEff,Eff_Stun,500,ATF_SKILL;
bonus bUnbreakableWeapon,0;
">
@@ -12679,7 +12679,7 @@ item_db: (
bonus bInt,3;
bonus bDex,3;
bonus bMatkRate,15;
- bonus2 bMagicAddRace,RC_DemiHuman,15;
+ bonus2 bMagicAddRace,RC_DemiPlayer,15;
bonus3 bAddEff,Eff_Stun,500,ATF_SKILL;
bonus bUnbreakableWeapon,0;
">
@@ -12868,8 +12868,8 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bMagicAddRace,RC_DemiHuman,15;
- bonus2 bIgnoreMdefRate,RC_DemiHuman,25 + ((getrefine()>5) ? 5 : 0);
+ bonus2 bMagicAddRace,RC_DemiPlayer,15;
+ bonus2 bIgnoreMdefRate,RC_DemiPlayer,25 + ((getrefine()>5) ? 5 : 0);
bonus bUnbreakableWeapon,0;
if(getrefine()>8) {
bonus bCastrate,-5;
@@ -12906,7 +12906,7 @@ item_db: (
bonus bDelayrate,-10;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bIgnoreMdefRate,RC_DemiHuman,5;
+ bonus2 bIgnoreMdefRate,RC_DemiPlayer,5;
bonus bHealPower,5+(getrefine()-5)*2;
}
if(getrefine()>8) bonus5 bAutoSpellOnSkill,AL_HEAL,AL_HEAL,10,100,1;
@@ -13775,8 +13775,8 @@ item_db: (
}
Script: <"
bonus bDex,2;
- bonus2 bAddRace,RC_DemiHuman,55;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,55;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -13804,7 +13804,7 @@ item_db: (
Script: <"
bonus bDex,2;
bonus bInt,10;
- bonus2 bAddRace,RC_DemiHuman,55;
+ bonus2 bAddRace,RC_DemiPlayer,55;
bonus bUnbreakableWeapon,0;
">
},
@@ -13895,13 +13895,13 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,55;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,55;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bCritAtkRate,getrefine() * 2;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) bonus2 bSkillAtk,AC_DOUBLE,20;
">
@@ -14702,8 +14702,8 @@ item_db: (
Script: <"
bonus bStr,2;
bonus bAgi,1;
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus4 bAutoSpell,CH_SOULCOLLECT,1,5,0;
bonus bUnbreakableWeapon,0;
">
@@ -14732,7 +14732,7 @@ item_db: (
Script: <"
bonus bStr,2;
bonus bInt,1;
- bonus2 bAddRace,RC_DemiHuman,95;
+ bonus2 bAddRace,RC_DemiPlayer,95;
bonus2 bCastrate,MO_EXTREMITYFIST,-25;
autobonus "{ bonus2 bCastrate,MO_EXTREMITYFIST,-100; }",50,6000,BF_WEAPON,"{ specialeffect2 EF_SUFFRAGIUM; }";
bonus bUnbreakableWeapon,0;
@@ -14783,12 +14783,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
bonus3 bAutoSpell,MO_INVESTIGATE,5,(getrefine()*10-50);
@@ -14820,12 +14820,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
bonus2 bCastrate,MO_EXTREMITYFIST,-100;
@@ -15329,8 +15329,8 @@ item_db: (
}
Script: <"
bonus bDex,2;
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -15358,7 +15358,7 @@ item_db: (
}
Script: <"
bonus bDex,2;
- bonus2 bAddRace,RC_DemiHuman,95;
+ bonus2 bAddRace,RC_DemiPlayer,95;
bonus2 bSkillAtk,CG_ARROWVULCAN,20;
bonus bUnbreakableWeapon,0;
">
@@ -15439,12 +15439,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) bonus4 bAutoSpellOnSkill,CG_ARROWVULCAN,CG_TAROTCARD,5,100;
">
@@ -16012,8 +16012,8 @@ item_db: (
}
Script: <"
bonus bDex,2;
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -16040,7 +16040,7 @@ item_db: (
}
Script: <"
bonus bDex,2;
- bonus2 bAddRace,RC_DemiHuman,95;
+ bonus2 bAddRace,RC_DemiPlayer,95;
bonus2 bSkillAtk,CG_ARROWVULCAN,20;
bonus bUnbreakableWeapon,0;
">
@@ -16118,12 +16118,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) bonus4 bAutoSpellOnSkill,CG_ARROWVULCAN,CG_TAROTCARD,5,100;
">
@@ -16258,12 +16258,12 @@ item_db: (
}
Script: <"
bonus bMatkRate,getrefine();
- bonus2 bMagicAddRace,RC_DemiHuman,15;
- bonus2 bIgnoreMdefRate,RC_DemiHuman,25;
+ bonus2 bMagicAddRace,RC_DemiPlayer,15;
+ bonus2 bIgnoreMdefRate,RC_DemiPlayer,25;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bMagicAddRace,RC_DemiHuman,(getrefine()-5)*2;
- bonus2 bIgnoreMdefRate,RC_DemiHuman,5+(getrefine()-5)*2;
+ bonus2 bMagicAddRace,RC_DemiPlayer,(getrefine()-5)*2;
+ bonus2 bIgnoreMdefRate,RC_DemiPlayer,5+(getrefine()-5)*2;
}
if(getrefine()>8) {
bonus5 bAutoSpellOnSkill,WZ_STORMGUST,MG_SAFETYWALL,10,200,1;
@@ -17048,7 +17048,7 @@ item_db: (
bonus bAllStats,50;
bonus bMdef,99;
bonus bShortWeaponDamageReturn,100;
- bonus2 bSubRace,RC_DemiHuman,95;
+ bonus2 bSubRace,RC_DemiPlayer,95;
skill CR_FULLPROTECTION,5;
skill WZ_ESTIMATION,1;
skill ST_FULLSTRIP,5;
@@ -18175,7 +18175,7 @@ item_db: (
Loc: 256
Refine: false
View: 76
- Script: <" bonus2 bSubRace,RC_DemiHuman,10; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,10; ">
},
{
Id: 2290
@@ -18200,7 +18200,7 @@ item_db: (
Loc: 512
Refine: false
View: 78
- Script: <" bonus2 bAddRace,RC_DemiHuman,3; ">
+ Script: <" bonus2 bAddRace,RC_DemiPlayer,3; ">
},
{
Id: 2292
@@ -19263,7 +19263,7 @@ item_db: (
}
Script: <"
bonus bUnbreakableArmor,0;
- bonus2 bSubRace,RC_DemiHuman,10;
+ bonus2 bSubRace,RC_DemiPlayer,10;
">
},
{
@@ -19400,7 +19400,7 @@ item_db: (
Script: <"
bonus bMaxHP,150;
bonus bMdef,2;
- bonus2 bSubRace,RC_DemiHuman,2;
+ bonus2 bSubRace,RC_DemiPlayer,2;
">
},
{
@@ -19425,7 +19425,7 @@ item_db: (
Script: <"
bonus bMaxHP,150;
bonus bMdef,2;
- bonus2 bSubRace,RC_DemiHuman,2;
+ bonus2 bSubRace,RC_DemiPlayer,2;
">
},
{
@@ -19450,7 +19450,7 @@ item_db: (
Script: <"
bonus bMaxHP,150;
bonus bMdef,2;
- bonus2 bSubRace,RC_DemiHuman,2;
+ bonus2 bSubRace,RC_DemiPlayer,2;
">
},
{
@@ -19475,7 +19475,7 @@ item_db: (
Script: <"
bonus bMaxHP,150;
bonus bMdef,2;
- bonus2 bSubRace,RC_DemiHuman,2;
+ bonus2 bSubRace,RC_DemiPlayer,2;
">
},
{
@@ -19500,7 +19500,7 @@ item_db: (
Script: <"
bonus bMaxHP,150;
bonus bMdef,2;
- bonus2 bSubRace,RC_DemiHuman,2;
+ bonus2 bSubRace,RC_DemiPlayer,2;
">
},
{
@@ -19525,7 +19525,7 @@ item_db: (
Script: <"
bonus bMaxHP,150;
bonus bMdef,2;
- bonus2 bSubRace,RC_DemiHuman,2;
+ bonus2 bSubRace,RC_DemiPlayer,2;
">
},
{
@@ -19550,7 +19550,7 @@ item_db: (
Script: <"
bonus bMaxHP,150;
bonus bMdef,2;
- bonus2 bSubRace,RC_DemiHuman,2;
+ bonus2 bSubRace,RC_DemiPlayer,2;
">
},
{
@@ -19807,7 +19807,7 @@ item_db: (
}
Script: <"
bonus bMaxHPrate,20;
- bonus2 bSubRace,RC_DemiHuman,7;
+ bonus2 bSubRace,RC_DemiPlayer,7;
">
},
{
@@ -20310,7 +20310,7 @@ item_db: (
Job: 0xFFFFFFFE
Loc: 64
Refine: false
- Script: <" bonus2 bSubRace,RC_DemiHuman,5; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,5; ">
},
*/
{
@@ -20442,7 +20442,7 @@ item_db: (
Script: <"
bonus bMaxHP,100;
bonus bMdef,1;
- bonus2 bSubRace,RC_DemiHuman,1;
+ bonus2 bSubRace,RC_DemiPlayer,1;
">
},
{
@@ -20467,7 +20467,7 @@ item_db: (
Script: <"
bonus bMaxHP,100;
bonus bMdef,1;
- bonus2 bSubRace,RC_DemiHuman,1;
+ bonus2 bSubRace,RC_DemiPlayer,1;
">
},
{
@@ -20492,7 +20492,7 @@ item_db: (
Script: <"
bonus bMaxHP,100;
bonus bMdef,1;
- bonus2 bSubRace,RC_DemiHuman,1;
+ bonus2 bSubRace,RC_DemiPlayer,1;
">
},
{
@@ -20624,7 +20624,7 @@ item_db: (
}
Script: <"
bonus bMaxHPrate,10;
- bonus2 bSubRace,RC_DemiHuman,4;
+ bonus2 bSubRace,RC_DemiPlayer,4;
bonus3 bAutoSpellWhenHit,AL_INCAGI,1,10;
">
},
@@ -21203,7 +21203,7 @@ item_db: (
Job: 0xFFFFFFFE
Loc: 4
Refine: false
- Script: <" bonus2 bSubRace,RC_DemiHuman,15; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,15; ">
},
*/
{
@@ -21303,7 +21303,7 @@ item_db: (
Script: <"
bonus bMaxHP,50;
bonus bMdef,1;
- bonus2 bSubRace,RC_DemiHuman,1;
+ bonus2 bSubRace,RC_DemiPlayer,1;
">
},
{
@@ -21328,7 +21328,7 @@ item_db: (
Script: <"
bonus bMaxHP,50;
bonus bMdef,1;
- bonus2 bSubRace,RC_DemiHuman,1;
+ bonus2 bSubRace,RC_DemiPlayer,1;
">
},
{
@@ -21353,7 +21353,7 @@ item_db: (
Script: <"
bonus bMaxHP,50;
bonus bMdef,1;
- bonus2 bSubRace,RC_DemiHuman,1;
+ bonus2 bSubRace,RC_DemiPlayer,1;
">
},
{
@@ -21509,7 +21509,7 @@ item_db: (
EquipLv: 95
Refine: false
Script: <"
- bonus2 bSubRace,RC_DemiHuman,10;
+ bonus2 bSubRace,RC_DemiPlayer,10;
bonus bMaxHPrate,10;
bonus2 bSubEle,Ele_Water,5;
bonus2 bSubEle,Ele_Fire,5;
@@ -21537,7 +21537,7 @@ item_db: (
}
Script: <"
bonus bMaxHPrate,5;
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
">
},
{
@@ -24464,7 +24464,7 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" bonus2 bExpAddRace,RC_DemiHuman,15; ">
+ Script: <" bonus2 bExpAddRace,RC_DemiPlayer,15; ">
},
{
Id: 2761
@@ -25751,7 +25751,7 @@ item_db: (
Buy: 20
Weight: 10
Loc: 2
- Script: <" bonus2 bAddRace,RC_DemiHuman,20; ">
+ Script: <" bonus2 bAddRace,RC_DemiPlayer,20; ">
},
{
Id: 4036
@@ -26015,7 +26015,7 @@ item_db: (
Buy: 20
Weight: 10
Loc: 32
- Script: <" bonus2 bSubRace,RC_DemiHuman,30; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,30; ">
},
{
Id: 4059
@@ -26790,7 +26790,7 @@ item_db: (
Weight: 10
Loc: 2
Script: <"
- bonus2 bAddRace,RC_DemiHuman,7;
+ bonus2 bAddRace,RC_DemiPlayer,7;
bonus2 bAddRace,RC_Brute,7;
bonus2 bAddRace,RC_Plant,7;
bonus2 bAddRace,RC_Insect,7;
@@ -27131,8 +27131,8 @@ item_db: (
Script: <"
bonus2 bAddItemHealRate,Candy,50;
bonus2 bAddItemHealRate,Candy_Striper,50;
- bonus3 bAddMonsterDropItem,529,RC_DemiHuman,300;
- bonus3 bAddMonsterDropItem,530,RC_DemiHuman,100;
+ bonus3 bAddMonsterDropItem,529,RC_DemiPlayer,300;
+ bonus3 bAddMonsterDropItem,530,RC_DemiPlayer,100;
">
},
{
@@ -28229,8 +28229,8 @@ item_db: (
Weight: 10
Loc: 64
Script: <"
- bonus2 bSubRace,RC_DemiHuman,-20;
- bonus2 bExpAddRace,RC_DemiHuman,10;
+ bonus2 bSubRace,RC_DemiPlayer,-20;
+ bonus2 bExpAddRace,RC_DemiPlayer,10;
">
},
{
@@ -28243,7 +28243,7 @@ item_db: (
Loc: 2
Script: <"
bonus bCritAtkRate,10;
- bonus2 bCriticalAddRace,RC_DemiHuman,7;
+ bonus2 bCriticalAddRace,RC_DemiPlayer,7;
">
},
{
@@ -28359,7 +28359,7 @@ item_db: (
Buy: 20
Weight: 10
Loc: 136
- Script: <" bonus3 bAddMonsterDropItem,12034,RC_DemiHuman,100; ">
+ Script: <" bonus3 bAddMonsterDropItem,12034,RC_DemiPlayer,100; ">
},
{
Id: 4257
@@ -29240,7 +29240,7 @@ item_db: (
Buy: 20
Weight: 10
Loc: 2
- Script: <" bonus2 bSPGainRace,RC_DemiHuman,5; ">
+ Script: <" bonus2 bSPGainRace,RC_DemiPlayer,5; ">
OnUnequipScript: <" heal 0,-5; ">
},
{
@@ -29621,7 +29621,7 @@ item_db: (
Buy: 20
Weight: 10
Loc: 2
- Script: <" bonus2 bCriticalAddRace,RC_DemiHuman,10; ">
+ Script: <" bonus2 bCriticalAddRace,RC_DemiPlayer,10; ">
},
{
Id: 4361
@@ -30602,8 +30602,8 @@ item_db: (
Weight: 10
Loc: 64
Script: <"
- bonus2 bAddRace,RC_DemiHuman,1;
- bonus2 bMagicAddRace,RC_DemiHuman,1;
+ bonus2 bAddRace,RC_DemiPlayer,1;
+ bonus2 bMagicAddRace,RC_DemiPlayer,1;
bonus bHPGainValue,50;
">
},
@@ -30616,9 +30616,9 @@ item_db: (
Weight: 10
Loc: 136
Script: <"
- bonus2 bCriticalAddRace,RC_DemiHuman,5;
- bonus2 bAddRace,RC_DemiHuman,1;
- bonus2 bMagicAddRace,RC_DemiHuman,1;
+ bonus2 bCriticalAddRace,RC_DemiPlayer,5;
+ bonus2 bAddRace,RC_DemiPlayer,1;
+ bonus2 bMagicAddRace,RC_DemiPlayer,1;
bonus2 bAddEff2,Eff_Bleeding,10;
">
},
@@ -30702,7 +30702,7 @@ item_db: (
bonus bMatkRate,10;
bonus bMaxSPrate,-50;
bonus2 bMagicAddRace,RC_Angel,50;
- bonus2 bMagicAddRace,RC_DemiHuman,50;
+ bonus2 bMagicAddRace,RC_DemiPlayer,50;
">
},
{
@@ -33316,8 +33316,8 @@ item_db: (
EquipLv: 70
View: 200
Script: <"
- bonus2 bAddRace,RC_DemiHuman,5;
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
">
},
{
@@ -33501,7 +33501,7 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" bonus2 bSubRace,RC_DemiHuman,10; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,10; ">
},
{
Id: 5133
@@ -33574,7 +33574,7 @@ item_db: (
View: 208
Script: <"
bonus bStr,1;
- bonus2 bAddRace,RC_DemiHuman,10;
+ bonus2 bAddRace,RC_DemiPlayer,10;
bonus2 bAddEff2,Eff_Sleep,10;
">
},
@@ -33658,7 +33658,7 @@ item_db: (
View: 213
Script: <"
bonus bVit,1;
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
">
},
{
@@ -34075,7 +34075,7 @@ item_db: (
View: 224
Script: <"
bonus bMdef,1;
- bonus2 bSubRace,RC_DemiHuman,10;
+ bonus2 bSubRace,RC_DemiPlayer,10;
">
},
{
@@ -34103,7 +34103,7 @@ item_db: (
Loc: 256
Refine: false
View: 226
- Script: <" bonus2 bSubRace,RC_DemiHuman,10; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,10; ">
},
{
Id: 5173
@@ -35813,7 +35813,7 @@ item_db: (
}
Script: <"
bonus bMdef,5;
- bonus2 bSubRace,RC_DemiHuman,10;
+ bonus2 bSubRace,RC_DemiPlayer,10;
">
},
{
@@ -36120,7 +36120,7 @@ item_db: (
bonus bMaxSP,50;
skill TF_DOUBLE,2;
bonus bDoubleRate,10;
- bonus2 bSubRace,RC_DemiHuman,3;
+ bonus2 bSubRace,RC_DemiPlayer,3;
">
},
{
@@ -36548,7 +36548,7 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" bonus2 bSubRace,RC_DemiHuman,5; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,5; ">
},
{
Id: 5307
@@ -36659,7 +36659,7 @@ item_db: (
}
Script: <"
bonus bStr,1;
- bonus2 bAddRace,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,5;
">
},
{
@@ -36701,7 +36701,7 @@ item_db: (
noselltonpc: true
nogstorage: true
}
- Script: <" bonus2 bAddRace,RC_DemiHuman,5; ">
+ Script: <" bonus2 bAddRace,RC_DemiPlayer,5; ">
},
{
Id: 5315
@@ -36913,7 +36913,7 @@ item_db: (
Loc: 512
Refine: false
View: 78
- Script: <" bonus2 bAddRace,RC_DemiHuman,7; ">
+ Script: <" bonus2 bAddRace,RC_DemiPlayer,7; ">
},
{
Id: 5327
@@ -37148,7 +37148,7 @@ item_db: (
Refine: false
View: 354
Script: <"
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
bonus bStr,2;
bonus3 bAutoSpellWhenHit,AL_ANGELUS,10,20;
">
@@ -37166,7 +37166,7 @@ item_db: (
Refine: false
View: 355
Script: <"
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
bonus bInt,2;
bonus bMagicHPGainValue,50;
">
@@ -37184,7 +37184,7 @@ item_db: (
Refine: false
View: 356
Script: <"
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
bonus bDex,2;
autobonus "{ bonus bBaseAtk,50; }",20,10000,0,"{ specialeffect2 EF_POTION_BERSERK; }";
">
@@ -37202,7 +37202,7 @@ item_db: (
Refine: false
View: 357
Script: <"
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
bonus bAgi,2;
bonus2 bAddItemHealRate,504,10;
bonus2 bAddItemHealRate,547,10;
@@ -37221,7 +37221,7 @@ item_db: (
Refine: false
View: 358
Script: <"
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
bonus bVit,2;
autobonus "{ bonus bAspdRate,5; }",20,30000,0,"{ specialeffect2 EF_HASTEUP; }";
">
@@ -37239,7 +37239,7 @@ item_db: (
Refine: false
View: 359
Script: <"
- bonus2 bSubRace,RC_DemiHuman,5;
+ bonus2 bSubRace,RC_DemiPlayer,5;
bonus bLuk,2;
bonus2 bAddRace,RC_Undead,5;
bonus2 bMagicAddRace,RC_Undead,5;
@@ -37564,7 +37564,7 @@ item_db: (
EquipLv: 70
View: 371
Script: <"
- bonus2 bSubRace,RC_DemiHuman,-10;
+ bonus2 bSubRace,RC_DemiPlayer,-10;
bonus2 bSubRace,RC_Boss,10;
">
},
@@ -37773,7 +37773,7 @@ item_db: (
nogstorage: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,12;
+ bonus2 bAddRace,RC_DemiPlayer,12;
bonus bBaseAtk,(JobLevel*2)/7;
">
},
@@ -37834,7 +37834,7 @@ item_db: (
noselltonpc: true
nogstorage: true
}
- Script: <" bonus2 bSubRace,RC_DemiHuman,2; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,2; ">
},
{
Id: 5378
@@ -37955,7 +37955,7 @@ item_db: (
Script: <"
bonus bLuk,1;
bonus2 bAddRace,RC_Brute,10;
- bonus2 bAddRace,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,5;
">
},
{
@@ -38470,7 +38470,7 @@ item_db: (
Script: <"
bonus bMaxHP,100;
bonus2 bResEff, Eff_Stun, 400;
- bonus2 bSubRace,RC_DemiHuman,4;
+ bonus2 bSubRace,RC_DemiPlayer,4;
">
},
{
@@ -38706,7 +38706,7 @@ item_db: (
}
Script: <"
bonus bDex,3;
- bonus2 bSubRace,RC_DemiHuman,10;
+ bonus2 bSubRace,RC_DemiPlayer,10;
">
},
{
@@ -38776,7 +38776,7 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" bonus2 bSubRace,RC_DemiHuman,12; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,12; ">
},
{
Id: 5429
@@ -39136,7 +39136,7 @@ item_db: (
Script: <"
bonus bAspdRate,10;
bonus bAllStats,3;
- bonus2 bAddRace,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,5;
">
},
{
@@ -39164,7 +39164,7 @@ item_db: (
Script: <"
bonus bAspdRate,7;
bonus bAllStats,2;
- bonus2 bAddRace,RC_DemiHuman,3;
+ bonus2 bAddRace,RC_DemiPlayer,3;
">
},
{
@@ -39191,7 +39191,7 @@ item_db: (
Script: <"
bonus bAspdRate,5;
bonus bAllStats,2;
- bonus2 bAddRace,RC_DemiHuman,1;
+ bonus2 bAddRace,RC_DemiPlayer,1;
">
},
{
@@ -39374,8 +39374,8 @@ item_db: (
}
Script: <"
bonus bVit,1;
- bonus2 bAddRace,RC_DemiHuman,1;
- bonus2 bSubRace,RC_DemiHuman,1;
+ bonus2 bAddRace,RC_DemiPlayer,1;
+ bonus2 bSubRace,RC_DemiPlayer,1;
">
},
{
@@ -39570,7 +39570,7 @@ item_db: (
Weight: 100
Loc: 256
View: 469
- Script: <" bonus3 bAddMonsterDropItem,550,RC_DemiHuman,3; ">
+ Script: <" bonus3 bAddMonsterDropItem,550,RC_DemiPlayer,3; ">
},
*/
/*
@@ -39775,7 +39775,7 @@ item_db: (
}
Script: <"
bonus bHit,-10;
- bonus2 bAddRace,RC_DemiHuman,6;
+ bonus2 bAddRace,RC_DemiPlayer,6;
">
},
{
@@ -39916,7 +39916,7 @@ item_db: (
}
Script: <"
bonus bMdef,3;
- bonus2 bAddRace,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,5;
">
},
{
@@ -40446,7 +40446,7 @@ item_db: (
EquipLv: 50
View: 513
Script: <"
- bonus2 bSubRace,RC_DemiHuman,12;
+ bonus2 bSubRace,RC_DemiPlayer,12;
bonus bBaseAtk,(JobLevel*2)/7;
">
},
@@ -40750,8 +40750,8 @@ item_db: (
bonus bVit,1;
bonus bDex,1;
bonus bMdef,3;
- bonus2 bSubRace,RC_DemiHuman,5;
- bonus2 bAddRace,RC_DemiHuman,3;
+ bonus2 bSubRace,RC_DemiPlayer,5;
+ bonus2 bAddRace,RC_DemiPlayer,3;
">
},
{
@@ -41122,7 +41122,7 @@ item_db: (
View: 15
Script: <"
bonus bMdef,4;
- bonus2 bSubRace,RC_DemiHuman,9;
+ bonus2 bSubRace,RC_DemiPlayer,9;
">
},
{
@@ -41345,7 +41345,7 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" bonus2 bAddRace,RC_DemiHuman,10; ">
+ Script: <" bonus2 bAddRace,RC_DemiPlayer,10; ">
},
{
Id: 5566
@@ -41368,7 +41368,7 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" bonus2 bAddRace,RC_DemiHuman,2; ">
+ Script: <" bonus2 bAddRace,RC_DemiPlayer,2; ">
},
{
Id: 5567
@@ -45303,7 +45303,7 @@ item_db: (
Loc: 512
Refine: false
View: 125
- Script: <" bonus2 bSubRace,RC_DemiHuman,3; ">
+ Script: <" bonus2 bSubRace,RC_DemiPlayer,3; ">
},
{
Id: 5801
@@ -45317,7 +45317,7 @@ item_db: (
View: 167
Script: <"
bonus bAllStats,2;
- bonus2 bSubRace,RC_DemiHuman,10;
+ bonus2 bSubRace,RC_DemiPlayer,10;
if(getskilllv(AL_HEAL)==10) {
bonus3 bAutoSpellWhenHit,AL_HEAL,10,20;
}
@@ -45677,7 +45677,7 @@ item_db: (
bonus bLuk,4;
bonus bMaxHP,100;
bonus bMaxSP,100;
- bonus2 bSubRace,RC_DemiHuman,7;
+ bonus2 bSubRace,RC_DemiPlayer,7;
bonus2 bSubRace,RC_Undead,7;
">
},
@@ -71645,7 +71645,7 @@ item_db: (
View: 1
Script: <"
bonus bAtkEle,Ele_Water;
- bonus2 bCriticalAddRace,RC_DemiHuman,10;
+ bonus2 bCriticalAddRace,RC_DemiPlayer,10;
">
},
{
@@ -71665,7 +71665,7 @@ item_db: (
View: 1
Script: <"
bonus bAtkEle,Ele_Water;
- bonus2 bCriticalAddRace,RC_DemiHuman,10;
+ bonus2 bCriticalAddRace,RC_DemiPlayer,10;
">
},
{
@@ -71839,8 +71839,8 @@ item_db: (
noauction: true
}
Script: <"
- bonus bIgnoreDefRace,RC_DemiHuman;
- bonus2 bSubRace,RC_DemiHuman,10;
+ bonus bIgnoreDefRace,RC_DemiPlayer;
+ bonus2 bSubRace,RC_DemiPlayer,10;
bonus2 bSubRace,RC_Demon,-10;
bonus bMaxSPrate,10;
bonus bSPDrainValue,3;
@@ -72148,8 +72148,8 @@ item_db: (
Script: <"
bonus bStr,1;
bonus bAgi,1;
- bonus2 bAddRace,RC_DemiHuman,75;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,75;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(Class==Job_Ninja||Class==Job_Rogue||Class==Job_Stalker) bonus bMatkRate,15;
">
@@ -72178,7 +72178,7 @@ item_db: (
Script: <"
bonus bStr,1;
bonus bAgi,1;
- bonus2 bAddRace,RC_DemiHuman,75;
+ bonus2 bAddRace,RC_DemiPlayer,75;
bonus bUnbreakableWeapon,0;
autobonus "{ bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss; }",10,6000,BF_WEAPON,"{ specialeffect2 EF_HASTEUP; }";
if(Class==Job_Ninja||Class==Job_Rogue||Class==Job_Stalker) bonus bMatkRate,15;
@@ -72304,13 +72304,13 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,75;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,75;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus3 bAutoSpell,PR_LEXDIVINA,1,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) bonus4 bAutoSpellOnSkill,RG_RAID,NPC_WIDEBLEEDING,1,250;
">
@@ -72621,8 +72621,8 @@ item_db: (
Script: <"
bonus bDex,2;
bonus bHit,-10;
- bonus2 bAddRace,RC_DemiHuman,55;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,55;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
autobonus "{ bonus bAspdRate,100; }",10,3000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }";
bonus bUnbreakableWeapon,0;
">
@@ -72671,12 +72671,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,55;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,55;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,pow(getrefine()-4,2);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,pow(getrefine()-4,2);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
bonus4 bAutoSpellOnSkill,GS_RAPIDSHOWER,GS_GLITTERING,1,1000;
@@ -73164,9 +73164,9 @@ item_db: (
bonus bDex,2;
bonus bHit,10;
bonus bCritical,10;
- bonus2 bAddRace,RC_DemiHuman,75;
+ bonus2 bAddRace,RC_DemiPlayer,75;
bonus2 bCastrate,GS_TRACKING,-25;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -73193,8 +73193,8 @@ item_db: (
}
Script: <"
bonus bDex,2;
- bonus2 bAddRace,RC_DemiHuman,35;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,35;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
autobonus "{ bonus bBaseAtk,80; bonus2 bHPLossRate,120,1000; }",10,6000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }";
bonus bUnbreakableWeapon,0;
">
@@ -73223,8 +73223,8 @@ item_db: (
Script: <"
bonus bDex,2;
bonus bSplashRange,1;
- bonus2 bAddRace,RC_DemiHuman,55;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,55;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
autobonus "{ bonus bBaseAtk,80; bonus2 bHPLossRate,100,1000; }",30,6000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }";
bonus bUnbreakableWeapon,0;
">
@@ -73252,8 +73252,8 @@ item_db: (
}
Script: <"
bonus bDex,2;
- bonus2 bAddRace,RC_DemiHuman,35;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,35;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
autobonus "{ bonus bBaseAtk,300; bonus2 bHPLossRate,120,1000; }",30,9000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }";
bonus bUnbreakableWeapon,0;
">
@@ -73310,13 +73310,13 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,75;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,75;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus2 bSkillAtk,GS_TRIPLEACTION,30;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
bonus2 bCastrate,GS_TRACKING,25;
@@ -73348,13 +73348,13 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,35;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,35;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus2 bSkillAtk,GS_TRIPLEACTION,30;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
bonus2 bAddRace,RC_Boss,getrefine();
@@ -73386,14 +73386,14 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,55;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,55;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bSplashRange,1;
bonus2 bSkillAtk,GS_TRIPLEACTION,30;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
bonus2 bSkillAtk,GS_SPREADATTACK,getrefine() * 2;
@@ -73425,13 +73425,13 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,35;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,35;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus2 bSkillAtk,GS_TRIPLEACTION,30;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
bonus2 bSkillAtk,GS_GROUNDDRIFT,getrefine() * 2;
@@ -74282,8 +74282,8 @@ item_db: (
Script: <"
bonus bStr,2;
bonus bDex,1;
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -74311,7 +74311,7 @@ item_db: (
Script: <"
bonus bStr,2;
bonus bDex,1;
- bonus2 bAddRace,RC_DemiHuman,95;
+ bonus2 bAddRace,RC_DemiPlayer,95;
autobonus "{ bonus2 bSkillAtk,NJ_HUUMA,100; bonus2 bSkillAtk,NJ_ISSEN,100; }",50,10000,BF_WEAPON,"{specialeffect2 EF_POTION_BERSERK; }";
bonus bUnbreakableWeapon,0;
">
@@ -74339,14 +74339,14 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,95;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,95;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bMatkRate,15;
autobonus "{ bonus2 bSkillAtk,NJ_HUUMA,100; bonus2 bSkillAtk,NJ_ISSEN,100; }",50,10000;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-3)*(getrefine()-3);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-3)*(getrefine()-3);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>8) {
bonus5 bAutoSpellOnSkill,NJ_ISSEN,AL_HEAL,10,1000,1;
@@ -74579,7 +74579,7 @@ item_db: (
Script: <"
skill TF_DOUBLE,5;
bonus bDoubleRate,25;
- bonus2 bAddRace,RC_DemiHuman,40;
+ bonus2 bAddRace,RC_DemiPlayer,40;
">
},
{
@@ -74646,8 +74646,8 @@ item_db: (
Script: <"
bonus bStr,1;
bonus bDex,1;
- bonus2 bAddRace,RC_DemiHuman,75;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,75;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
">
},
@@ -74675,7 +74675,7 @@ item_db: (
Script: <"
bonus bStr,1;
bonus bDex,1;
- bonus2 bAddRace,RC_DemiHuman,75;
+ bonus2 bAddRace,RC_DemiPlayer,75;
bonus bMatkRate,10;
bonus bUnbreakableWeapon,0;
">
@@ -74800,12 +74800,12 @@ item_db: (
noauction: true
}
Script: <"
- bonus2 bAddRace,RC_DemiHuman,75;
- bonus2 bIgnoreDefRate,RC_DemiHuman,20;
+ bonus2 bAddRace,RC_DemiPlayer,75;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,20;
bonus bUnbreakableWeapon,0;
if(getrefine()>5) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4);
- bonus2 bIgnoreDefRate,RC_DemiHuman,5;
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4);
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,5;
}
if(getrefine()>6) bonus bAspdRate,5;
if(getrefine()>8) {
@@ -88088,7 +88088,7 @@ item_db: (
Script: <"
bonus bStr,1;
bonus bMdef,3;
- bonus2 bIgnoreDefRate,RC_DemiHuman,10;
+ bonus2 bIgnoreDefRate,RC_DemiPlayer,10;
bonus2 bIgnoreDefRate,RC_Brute,10;
bonus3 bAutoSpellWhenHit,NPC_WIDEBLEEDING,1,10;
">
@@ -89105,12 +89105,12 @@ item_db: (
Script: <"
bonus bAtkRate,5;
if(getrefine() > 5 && getrefine() <= 12) {
- bonus2 bAddRace,RC_DemiHuman,(getrefine() - 5);
- bonus2 bSubRace,RC_DemiHuman,(getrefine() - 5);
+ bonus2 bAddRace,RC_DemiPlayer,(getrefine() - 5);
+ bonus2 bSubRace,RC_DemiPlayer,(getrefine() - 5);
}
if(getrefine() > 12) {
- bonus2 bAddRace,RC_DemiHuman,7;
- bonus2 bSubRace,RC_DemiHuman,7;
+ bonus2 bAddRace,RC_DemiPlayer,7;
+ bonus2 bSubRace,RC_DemiPlayer,7;
}
">
diff --git a/db/pre-re/item_group.conf b/db/pre-re/item_group.conf
index 25f9302e0..f03762790 100644
--- a/db/pre-re/item_group.conf
+++ b/db/pre-re/item_group.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/1244-official-item-grouppackagechain
+// http://herc.ws/board/topic/1244-official-item-grouppackagechain
//====================================================
// Structure of file:
/*
diff --git a/db/pre-re/item_packages.conf b/db/pre-re/item_packages.conf
index dc9346e32..a25453f3f 100644
--- a/db/pre-re/item_packages.conf
+++ b/db/pre-re/item_packages.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/1244-official-item-grouppackagechain
+// http://herc.ws/board/topic/1244-official-item-grouppackagechain
//====================================================
// Structure of file:
/*
diff --git a/db/pre-re/job_db.conf b/db/pre-re/job_db.conf
index 1deaa826b..ff83db27a 100644
--- a/db/pre-re/job_db.conf
+++ b/db/pre-re/job_db.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/9082-job-db1txt-redesign/
+// http://hercs.ws/board/topic/9082-job-db1txt-redesign/
//============== pRE Structure Example ===============
/*
Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so if you want to add a new job you should add it there)
diff --git a/db/pre-re/map_zone_db.conf b/db/pre-re/map_zone_db.conf
index 558a168ce..2d0ffee49 100644
--- a/db/pre-re/map_zone_db.conf
+++ b/db/pre-re/map_zone_db.conf
@@ -6,11 +6,11 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//====================================================
//= Hercules Map Zone Database [Ind/Hercules]
//================ More Information ==================
-//= http://hercules.ws/board/topic/302-introducing-hercules-map-zone-database/
+//= http://herc.ws/board/topic/302-introducing-hercules-map-zone-database/
//= (TODO: replace with wiki link and detail the wiki page in a decent format ^)
//====================================================
//================ Description =======================
diff --git a/db/pre-re/skill_tree.conf b/db/pre-re/skill_tree.conf
index c9d229d8d..1b9ad25a5 100644
--- a/db/pre-re/skill_tree.conf
+++ b/db/pre-re/skill_tree.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/1188-skill-tree-db-redesign/
+// http://herc.ws/board/topic/1188-skill-tree-db-redesign/
//================ Structure Example =================
/*
Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so if you want to add a new job you should add it there)
diff --git a/db/re/item_chain.conf b/db/re/item_chain.conf
index bedb33d73..744b1cbcf 100644
--- a/db/re/item_chain.conf
+++ b/db/re/item_chain.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/1244-official-item-grouppackagechain
+// http://herc.ws/board/topic/1244-official-item-grouppackagechain
//====================================================
// Structure of file:
/*
diff --git a/db/re/item_group.conf b/db/re/item_group.conf
index 5446d67be..699be4048 100644
--- a/db/re/item_group.conf
+++ b/db/re/item_group.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/1244-official-item-grouppackagechain
+// http://herc.ws/board/topic/1244-official-item-grouppackagechain
//====================================================
// Structure of file:
/*
diff --git a/db/re/item_packages.conf b/db/re/item_packages.conf
index e900ca23e..8fc9a2e17 100644
--- a/db/re/item_packages.conf
+++ b/db/re/item_packages.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/1244-official-item-grouppackagechain
+// http://herc.ws/board/topic/1244-official-item-grouppackagechain
//====================================================
// Structure of file:
/*
diff --git a/db/re/job_db.conf b/db/re/job_db.conf
index 47f543793..38d79597b 100644
--- a/db/re/job_db.conf
+++ b/db/re/job_db.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/9082-job-db1txt-redesign/
+// http://herc.ws/board/topic/9082-job-db1txt-redesign/
//============== RE Structure Example ================
/*
Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so if you want to add a new job you should add it there)
diff --git a/db/re/map_zone_db.conf b/db/re/map_zone_db.conf
index dadb93d89..be7d3317a 100644
--- a/db/re/map_zone_db.conf
+++ b/db/re/map_zone_db.conf
@@ -6,11 +6,11 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//====================================================
//= Hercules Map Zone Database [Ind/Hercules]
//================ More Information ==================
-//= http://hercules.ws/board/topic/302-introducing-hercules-map-zone-database/
+//= http://herc.ws/board/topic/302-introducing-hercules-map-zone-database/
//= (TODO: replace with wiki link and detail the wiki page in a decent format ^)
//====================================================
//================ Description =======================
diff --git a/db/re/skill_cast_db.txt b/db/re/skill_cast_db.txt
index a9b2c6140..7d73fccef 100644
--- a/db/re/skill_cast_db.txt
+++ b/db/re/skill_cast_db.txt
@@ -1565,7 +1565,7 @@
//-- SO_WARMER
2452,2200:2400:2600:2800:3000,1000,0,40000:45000:50000:55000:60000,30000,35000:40000:45000:50000:55000,1800:1600:1400:1200:1000
//-- SO_VACUUM_EXTREME
-2453,1000:1500:2000:2500:3000,1000,0,4000:6000:8000:10000:12000,1000,5000,-1
+2453,1000:1500:2000:2500:3000,1000,0,4000:6000:8000:10000:12000,0,5000,-1
//-- SO_VARETYR_SPEAR
2454,2200:2400:2600:2800:3000,1000,0,0,2200:2400:2600:2800:3000,2000,1800:1600:1400:1200:1000
//-- SO_ARULLO
diff --git a/db/re/skill_tree.conf b/db/re/skill_tree.conf
index f3655db3f..0da4479d4 100644
--- a/db/re/skill_tree.conf
+++ b/db/re/skill_tree.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-// http://hercules.ws/board/topic/1188-skill-tree-db-redesign/
+// http://herc.ws/board/topic/1188-skill-tree-db-redesign/
//================ Structure Example =================
/*
Job_Name: { // Job names as in src/map/pc.c (they are hardcoded at the moment so if you want to add a new job you should add it there)
diff --git a/db/roulette_db.conf b/db/roulette_db.conf
index 831ee9023..c82bb0830 100644
--- a/db/roulette_db.conf
+++ b/db/roulette_db.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-//= http://hercules.ws/board/ ???
+//= http://herc.ws/board/topic/7618-2014-10-22-roulette-and-per-char-gender/
//====================================================
// This file handles the Roulette, the format is <item>:<amount>
// The first entry is the one that loses the game.
diff --git a/db/translations.conf b/db/translations.conf
index 3b16a8c23..fc8144636 100644
--- a/db/translations.conf
+++ b/db/translations.conf
@@ -6,9 +6,9 @@
//= | | | | __/ | | (__| |_| | | __/\__ \
//= \_| |_/\___|_| \___|\__,_|_|\___||___/
//=
-//= http://hercules.ws/board/
+//= http://herc.ws/board/
//================= More Information =================
-//= http://hercules.ws/board/topic/8687-hercules-ultimate-localization-design/
+//= http://herc.ws/board/topic/8687-hercules-ultimate-localization-design/
//====================================================
// Translations generated with —-generate-translations
// should be pointed to here
diff --git a/db2sql.bat b/db2sql.bat
index b23f76bce..c3f22b5e5 100644
--- a/db2sql.bat
+++ b/db2sql.bat
@@ -2,7 +2,7 @@
REM Copyright (c) Hercules Dev Team, licensed under GNU GPL.
REM See the LICENSE file
-REM Base Author: Mumbles @ http://hercules.ws
+REM Base Author: Mumbles @ http://herc.ws
COLOR 0F
@@ -16,7 +16,7 @@ ECHO ^| ^| ^| ^| __/ ^| ^| (__^| ^|_^| ^| ^| __/\__ \
ECHO \_^| ^|_/\___^|_^| \___^|\__,_^|_^|\___^|^|___/
ECHO.
ECHO Database to SQL Converter
-ECHO http://hercules.ws/board/
+ECHO http://herc.ws/board/
ECHO.
ECHO.
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index 779589281..342934533 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -7809,7 +7809,7 @@ mes axtoi("11"); // Displays 17 (1 = 1, 10 = 16)
---------------------------------------
-*compare(<string>,<substring>)
+*compare("<string>","<substring>")
This command returns 1 or 0 when the substring is in the main string (1)
or not (0). This command is not case sensitive.
@@ -7822,7 +7822,26 @@ Examples:
//dothat; will not be executed ('Blood butterfly' does not contain 'Bloody').
if (compare("Blood Butterfly","Bloody"))
dothat;
+
+---------------------------------------
+
+*strcmp("<string>","<string>")
+
+This command compares two strings and is similar to strcmp in C.
+Return Values:
+ >0 : String 1 > String 2
+ 0 : Strings are equal
+ <0 : String 1 < String 2
+
+Examples:
+ .@a = strcmp("abcdef","ABCDEF");
+ if (.@a > 0){
+ mes ".@a is greater than 0."; //Output is this.
+ }else{
+ mes ".@a is less or equal to 0";
+ }
+
---------------------------------------
*getstrlen("<string>")
diff --git a/npc/MOTD.txt b/npc/MOTD.txt
index ceb3f4cda..99bd8c773 100644
--- a/npc/MOTD.txt
+++ b/npc/MOTD.txt
@@ -1,4 +1,4 @@
-//======= Hercules Script ===========================
+//================== Hercules Script =================
//= _ _ _ =
//= | | | | | | =
//= | |_| | ___ _ __ ___ _ _| | ___ ___ =
@@ -6,7 +6,7 @@
//= | | | | __/ | | (__| |_| | | __/\__ \ =
//= \_| |_/\___|_| \___|\__,_|_|\___||___/ =
//= =
-//= http://hercules.ws/board/ =
+//= http://herc.ws/board/ =
//====================================================
// run when any character logs in, attached to them.
- script HerculesMOTD -1,{
diff --git a/npc/custom/woe_controller.txt b/npc/custom/woe_controller.txt
index 824fa4a4f..ec5bb3d81 100644
--- a/npc/custom/woe_controller.txt
+++ b/npc/custom/woe_controller.txt
@@ -11,8 +11,8 @@
//= and "rewards" function originally by Goddameit.
//===== Additional Comments: =================================
//= Be sure to disable the default agit controllers!
-//== npc\guild\agit_controller.txt
-//== npc\guild2\agit_start_se.txt
+//== npc\woe-fe\agit_controller.txt
+//== npc\woe-se\agit_start_se.txt
//============================================================
// Information NPC
diff --git a/npc/instances/OrcsMemory.txt b/npc/instances/OrcsMemory.txt
index e43e3df10..68cf8b2e9 100644
--- a/npc/instances/OrcsMemory.txt
+++ b/npc/instances/OrcsMemory.txt
@@ -52,7 +52,19 @@ gef_fild10,242,202,0 script Dimensional Gorge Piece 2_MONEMUS,{
}
.@orctime = questprogress(12059,PLAYTIME);
- if (!.@orctime) {
+ if (.@orctime == 2) {
+ mes "^0000ffAll records and after-effects related to the Orc's Memory Dungeon are deleted. You can now regenerate or re-enter the dungeon.^000000";
+ erasequest 12059;
+ close;
+ }
+
+ if (.@orctime == 1) {
+ mes "You can enter the Dungeon if it has been generated.";
+ next;
+ if(select("Enter the Dungeon "+.@md_name$+":Cancel") == 2)
+ close;
+ // Fall through to access the dungeon
+ } else { // !.@orctime
if (getcharid(0) == getpartyleader(.@party_id,2)) {
mes "Party status confirmed. Would you like to book entrance to the "+.@md_name$+"?";
next;
@@ -79,28 +91,17 @@ gef_fild10,242,202,0 script Dimensional Gorge Piece 2_MONEMUS,{
mes "After making a reservation, you have to select 'Enter the Dungeon' from the menu if you wish to enter the "+.@md_name$+".";
close;
case 2:
- callsub L_Enter,0;
+ break; // Fall through to access the dungeon (after the else)
case 3:
close;
}
- }
- if(select(.@md_name$ + " Enter the Memorial Dungeon:Cancel") == 2)
+ } else if (select(.@md_name$ + " Enter the Memorial Dungeon:Cancel") == 2)
end;
- callsub L_Enter,1;
- } else if (.@orctime == 1) {
- mes "You can enter the Dungeon if it has been generated.";
- next;
- if(select("Enter the Dungeon "+.@md_name$+":Cancel") == 2)
- close;
- callsub L_Enter,0;
- } else if (.@orctime == 2) {
- mes "^0000ffAll records and after-effects related to the Orc's Memory Dungeon are deleted. You can now regenerate or re-enter the dungeon.^000000";
- erasequest 12059;
- close;
+ // Else access the dungeon
}
- mes "In order to generate a dungeon you must be the Party Leader and have at least 2 members in the party.";
- close;
-L_Enter:
+
+ // Dungeon access
+
if (has_instance("1@orcs") == "") {
mes "Memorial Dungeon "+.@md_name$+" does not exist.";
mes "The party leader has not reserved entrance to the dungeon yet.";
@@ -108,12 +109,12 @@ L_Enter:
mes "Once the reservation is complete, the dungeon will be generated.";
mes "If your dungeon has been destroyed you must wait 7 days before re-entering.";
close;
- } else {
- mapannounce "gef_fild10", .@p_leader$ + " of the party, " + .@p_name$ + " is entering the "+.@md_name$+".",bc_map,"0x00ff99";
- if (!questprogress(12059)) setquest 12059;
- warp "1@orcs",179,15;
- end;
}
+
+ mapannounce "gef_fild10", strcharinfo(0) + " of the party, " + .@p_name$ + " is entering the "+.@md_name$+".",bc_map,"0x00ff99";
+ if (!questprogress(12059)) setquest 12059;
+ warp "1@orcs",179,15;
+ end;
}
gef_fild10,238,202,6 script Mad Scientist#orc 4_LGTSCIENCE,{
diff --git a/npc/kafras/functions_kafras.txt b/npc/kafras/functions_kafras.txt
index 483e9b72a..eabd3f1d8 100644
--- a/npc/kafras/functions_kafras.txt
+++ b/npc/kafras/functions_kafras.txt
@@ -315,7 +315,7 @@ function script F_KafTele {
mes "your destination.";
next;
.@menu$ = "";
- for (.@i = 0; .@i <= 6; ++.@i)
+ for (.@i = 0; .@i <= getarraysize(@wrpD$); ++.@i)
.@menu$ += @wrpC$[.@i] + ":";
.@j = select(.@menu$) - 1;
if (@wrpC$[.@j] == "Cancel")
diff --git a/npc/pre-re/quests/collection/quest_disguiseloliruri.txt b/npc/pre-re/quests/collection/quest_disguiseloliruri.txt
index 8ff2ebce3..f267eb7d4 100644
--- a/npc/pre-re/quests/collection/quest_disguiseloliruri.txt
+++ b/npc/pre-re/quests/collection/quest_disguiseloliruri.txt
@@ -11,7 +11,7 @@
//= 1.0 First version.
//============================================================
-nif_fild02,332,327,4 script Deadman 4_M_NFDEADMAN,{
+nif_fild01,332,327,4 script Deadman 4_M_NFDEADMAN,{
if (questprogress(60173)) {
if (questprogress(60173,HUNTING) != 2) {
diff --git a/npc/pre-re/scripts_main.conf b/npc/pre-re/scripts_main.conf
index 8e75dd332..737099ec8 100644
--- a/npc/pre-re/scripts_main.conf
+++ b/npc/pre-re/scripts_main.conf
@@ -27,7 +27,7 @@ npc: npc/other/CashShop_Functions.txt
// ------------------- Common Script Files ----------------------
import: npc/scripts.conf
-import: npc/scripts_guild.conf
+import: npc/scripts_woe.conf
import: npc/scripts_jobs.conf
import: npc/scripts_mapflags.conf
import: npc/scripts_monsters.conf
diff --git a/npc/re/merchants/coin_exchange.txt b/npc/re/merchants/coin_exchange.txt
index f2ee8a506..cabd9753b 100644
--- a/npc/re/merchants/coin_exchange.txt
+++ b/npc/re/merchants/coin_exchange.txt
@@ -828,7 +828,7 @@ malangdo,150,135,5 script Roving Merchant 4_M_MERCAT1,{
// Eclage
//============================================================
-ecl_in01,66,95,3 script Armor Merchant Naphara#e::glove 4_F_FAIRYKID,{
+ecl_in01,66,95,3 script Armor Merchant Naphara#e 4_F_FAIRYKID,{
if (!checkweight(Axe,3)) {
mes "- Stop Here!! -";
mes "- You have too many items. -";
@@ -947,7 +947,7 @@ ecl_in01,64,97,5 script Slot Expert Nattuer#ecl 4_F_FAIRYKID,{
close;
}
-ecl_in01,33,98,5 script Armor Merchant Naphara#e::armor 4_M_FAIRYKID2,{
+ecl_in01,33,98,5 script Herb Merchant Plafina#e 4_M_FAIRYKID2,{
if (checkweight(Axe,1)==0) {
mes "- Stop Here!! -";
mes "- You have too many items. -";
@@ -1004,7 +1004,7 @@ ecl_in01,33,98,5 script Armor Merchant Naphara#e::armor 4_M_FAIRYKID2,{
mes "[Herb Merchant]";
mes "Thank you for your business.";
delitem Splendide_Coin,.cost[.@item]*.@buy; //Splendide_Coin
- getitem Snow_Flip,.@buy;
+ getitem .items[.@item],.@buy;
close;
OnInit:
diff --git a/npc/re/scripts_main.conf b/npc/re/scripts_main.conf
index 28f514d19..3e0bceecc 100644
--- a/npc/re/scripts_main.conf
+++ b/npc/re/scripts_main.conf
@@ -27,7 +27,7 @@ npc: npc/other/CashShop_Functions.txt
// ------------------- Common Script Files ----------------------
import: npc/scripts.conf
-import: npc/scripts_guild.conf
+import: npc/scripts_woe.conf
import: npc/scripts_jobs.conf
import: npc/scripts_mapflags.conf
import: npc/scripts_monsters.conf
@@ -35,7 +35,7 @@ import: npc/scripts_warps.conf
// ------------------- Renewal Script Files ---------------------
import: npc/re/scripts.conf
-import: npc/re/scripts_guild.conf
+import: npc/re/scripts_woe.conf
import: npc/re/scripts_jobs.conf
import: npc/re/scripts_monsters.conf
import: npc/re/scripts_warps.conf
diff --git a/npc/re/scripts_guild.conf b/npc/re/scripts_woe.conf
index e5c01e436..c3a2ecccf 100644
--- a/npc/re/scripts_guild.conf
+++ b/npc/re/scripts_woe.conf
@@ -4,5 +4,5 @@
// ----------------------- War of Emperium ----------------------
// - Hall of Abyss
-npc: npc/re/guild/invest_main.txt
-npc: npc/re/guild/invest_npc.txt
+npc: npc/re/woe-fe/invest_main.txt
+npc: npc/re/woe-fe/invest_npc.txt
diff --git a/npc/re/warps/cities/eclage.txt b/npc/re/warps/cities/eclage.txt
index a9ab2e385..715e51935 100644
--- a/npc/re/warps/cities/eclage.txt
+++ b/npc/re/warps/cities/eclage.txt
@@ -17,7 +17,7 @@
ecl_fild01,207,72,0 warp fild01-1_biffild 1,1,bif_fild02,294,350
bif_fild02,292,351,0 warp biffild_fild01-1 1,1,ecl_fild01,205,76
//ecl_fild01,97,320,0 warp eclage_field0003 1,1,eclage,100,28
-eclage,98,26,0 warp eclageS_EclEnter 1,1,eclage,100,28
+eclage,98,26,0 warp eclageS_EclEnter 1,1,ecl_fild01,99,317
eclage,299,309,0 warp eclageN_in01s 1,1,ecl_in01,47,11
ecl_in01,47,8,0 warp in01s_eclageN 1,1,eclage,297,307
ecl_in01,8,67,0 warp in01w_hub1-1 1,1,ecl_hub01,38,94
diff --git a/npc/re/guild/invest_main.txt b/npc/re/woe-fe/invest_main.txt
index 9ed49ce7a..9ed49ce7a 100644
--- a/npc/re/guild/invest_main.txt
+++ b/npc/re/woe-fe/invest_main.txt
diff --git a/npc/re/guild/invest_npc.txt b/npc/re/woe-fe/invest_npc.txt
index a1d564e00..a1d564e00 100644
--- a/npc/re/guild/invest_npc.txt
+++ b/npc/re/woe-fe/invest_npc.txt
diff --git a/npc/scripts_guild.conf b/npc/scripts_guild.conf
deleted file mode 100644
index 90c066fcb..000000000
--- a/npc/scripts_guild.conf
+++ /dev/null
@@ -1,55 +0,0 @@
-// --------------------------------------------------------------
-// - Guild Wars -
-// --------------------------------------------------------------
-
-// ----------------------- War of Emperium ----------------------
-// - Guild WoE time settings
-npc: npc/guild/agit_controller.txt
-// - Guild NPC Template file
-npc: npc/guild/agit_main.txt
-// - Al De Baran
-npc: npc/guild/aldeg_cas01.txt
-npc: npc/guild/aldeg_cas02.txt
-npc: npc/guild/aldeg_cas03.txt
-npc: npc/guild/aldeg_cas04.txt
-npc: npc/guild/aldeg_cas05.txt
-// - Geffen
-npc: npc/guild/gefg_cas01.txt
-npc: npc/guild/gefg_cas02.txt
-npc: npc/guild/gefg_cas03.txt
-npc: npc/guild/gefg_cas04.txt
-npc: npc/guild/gefg_cas05.txt
-// - Payon
-npc: npc/guild/payg_cas01.txt
-npc: npc/guild/payg_cas02.txt
-npc: npc/guild/payg_cas03.txt
-npc: npc/guild/payg_cas04.txt
-npc: npc/guild/payg_cas05.txt
-// - Prontera
-npc: npc/guild/prtg_cas01.txt
-npc: npc/guild/prtg_cas02.txt
-npc: npc/guild/prtg_cas03.txt
-npc: npc/guild/prtg_cas04.txt
-npc: npc/guild/prtg_cas05.txt
-// - Treasure Room Protection
-//npc: npc/guild/trs_rp.txt
-
-// --------------- War of Emperium Second Edition ---------------
-// - WoE SE time settings
-npc: npc/guild2/agit_start_se.txt
-// - Guild NPC Template file
-npc: npc/guild2/agit_main_se.txt
-// - Town Flags
-npc: npc/guild2/guild_flags.txt
-// - Arunafeltz
-npc: npc/guild2/arug_cas01.txt
-npc: npc/guild2/arug_cas02.txt
-npc: npc/guild2/arug_cas03.txt
-npc: npc/guild2/arug_cas04.txt
-npc: npc/guild2/arug_cas05.txt
-// - Schwaltzvalt
-npc: npc/guild2/schg_cas01.txt
-npc: npc/guild2/schg_cas02.txt
-npc: npc/guild2/schg_cas03.txt
-npc: npc/guild2/schg_cas04.txt
-npc: npc/guild2/schg_cas05.txt
diff --git a/npc/scripts_woe.conf b/npc/scripts_woe.conf
new file mode 100644
index 000000000..42f567c65
--- /dev/null
+++ b/npc/scripts_woe.conf
@@ -0,0 +1,55 @@
+// --------------------------------------------------------------
+// - Guild Wars -
+// --------------------------------------------------------------
+
+// ----------------------- War of Emperium ----------------------
+// - Guild WoE time settings
+npc: npc/woe-fe/agit_controller.txt
+// - Guild NPC Template file
+npc: npc/woe-fe/agit_main.txt
+// - Al De Baran
+npc: npc/woe-fe/aldeg_cas01.txt
+npc: npc/woe-fe/aldeg_cas02.txt
+npc: npc/woe-fe/aldeg_cas03.txt
+npc: npc/woe-fe/aldeg_cas04.txt
+npc: npc/woe-fe/aldeg_cas05.txt
+// - Geffen
+npc: npc/woe-fe/gefg_cas01.txt
+npc: npc/woe-fe/gefg_cas02.txt
+npc: npc/woe-fe/gefg_cas03.txt
+npc: npc/woe-fe/gefg_cas04.txt
+npc: npc/woe-fe/gefg_cas05.txt
+// - Payon
+npc: npc/woe-fe/payg_cas01.txt
+npc: npc/woe-fe/payg_cas02.txt
+npc: npc/woe-fe/payg_cas03.txt
+npc: npc/woe-fe/payg_cas04.txt
+npc: npc/woe-fe/payg_cas05.txt
+// - Prontera
+npc: npc/woe-fe/prtg_cas01.txt
+npc: npc/woe-fe/prtg_cas02.txt
+npc: npc/woe-fe/prtg_cas03.txt
+npc: npc/woe-fe/prtg_cas04.txt
+npc: npc/woe-fe/prtg_cas05.txt
+// - Treasure Room Protection
+//npc: npc/woe-fe/trs_rp.txt
+
+// --------------- War of Emperium Second Edition ---------------
+// - WoE SE time settings
+npc: npc/woe-se/agit_start_se.txt
+// - Guild NPC Template file
+npc: npc/woe-se/agit_main_se.txt
+// - Town Flags
+npc: npc/woe-se/guild_flags.txt
+// - Arunafeltz
+npc: npc/woe-se/arug_cas01.txt
+npc: npc/woe-se/arug_cas02.txt
+npc: npc/woe-se/arug_cas03.txt
+npc: npc/woe-se/arug_cas04.txt
+npc: npc/woe-se/arug_cas05.txt
+// - Schwaltzvalt
+npc: npc/woe-se/schg_cas01.txt
+npc: npc/woe-se/schg_cas02.txt
+npc: npc/woe-se/schg_cas03.txt
+npc: npc/woe-se/schg_cas04.txt
+npc: npc/woe-se/schg_cas05.txt
diff --git a/npc/guild/agit_controller.txt b/npc/woe-fe/agit_controller.txt
index 8d038c322..8d038c322 100644
--- a/npc/guild/agit_controller.txt
+++ b/npc/woe-fe/agit_controller.txt
diff --git a/npc/guild/agit_main.txt b/npc/woe-fe/agit_main.txt
index 527bebce4..527bebce4 100644
--- a/npc/guild/agit_main.txt
+++ b/npc/woe-fe/agit_main.txt
diff --git a/npc/guild/aldeg_cas01.txt b/npc/woe-fe/aldeg_cas01.txt
index e72b121c5..e72b121c5 100644
--- a/npc/guild/aldeg_cas01.txt
+++ b/npc/woe-fe/aldeg_cas01.txt
diff --git a/npc/guild/aldeg_cas02.txt b/npc/woe-fe/aldeg_cas02.txt
index 938e511da..938e511da 100644
--- a/npc/guild/aldeg_cas02.txt
+++ b/npc/woe-fe/aldeg_cas02.txt
diff --git a/npc/guild/aldeg_cas03.txt b/npc/woe-fe/aldeg_cas03.txt
index c595a8681..c595a8681 100644
--- a/npc/guild/aldeg_cas03.txt
+++ b/npc/woe-fe/aldeg_cas03.txt
diff --git a/npc/guild/aldeg_cas04.txt b/npc/woe-fe/aldeg_cas04.txt
index 6a6b9d7ec..6a6b9d7ec 100644
--- a/npc/guild/aldeg_cas04.txt
+++ b/npc/woe-fe/aldeg_cas04.txt
diff --git a/npc/guild/aldeg_cas05.txt b/npc/woe-fe/aldeg_cas05.txt
index 93a78d7fb..93a78d7fb 100644
--- a/npc/guild/aldeg_cas05.txt
+++ b/npc/woe-fe/aldeg_cas05.txt
diff --git a/npc/guild/gefg_cas01.txt b/npc/woe-fe/gefg_cas01.txt
index 6127e62f9..6127e62f9 100644
--- a/npc/guild/gefg_cas01.txt
+++ b/npc/woe-fe/gefg_cas01.txt
diff --git a/npc/guild/gefg_cas02.txt b/npc/woe-fe/gefg_cas02.txt
index 45530849a..45530849a 100644
--- a/npc/guild/gefg_cas02.txt
+++ b/npc/woe-fe/gefg_cas02.txt
diff --git a/npc/guild/gefg_cas03.txt b/npc/woe-fe/gefg_cas03.txt
index a206c8bac..a206c8bac 100644
--- a/npc/guild/gefg_cas03.txt
+++ b/npc/woe-fe/gefg_cas03.txt
diff --git a/npc/guild/gefg_cas04.txt b/npc/woe-fe/gefg_cas04.txt
index 06d37361a..06d37361a 100644
--- a/npc/guild/gefg_cas04.txt
+++ b/npc/woe-fe/gefg_cas04.txt
diff --git a/npc/guild/gefg_cas05.txt b/npc/woe-fe/gefg_cas05.txt
index 81ebd3905..81ebd3905 100644
--- a/npc/guild/gefg_cas05.txt
+++ b/npc/woe-fe/gefg_cas05.txt
diff --git a/npc/guild/payg_cas01.txt b/npc/woe-fe/payg_cas01.txt
index 1deee9a4f..1deee9a4f 100644
--- a/npc/guild/payg_cas01.txt
+++ b/npc/woe-fe/payg_cas01.txt
diff --git a/npc/guild/payg_cas02.txt b/npc/woe-fe/payg_cas02.txt
index 92db92c09..92db92c09 100644
--- a/npc/guild/payg_cas02.txt
+++ b/npc/woe-fe/payg_cas02.txt
diff --git a/npc/guild/payg_cas03.txt b/npc/woe-fe/payg_cas03.txt
index e0e649308..e0e649308 100644
--- a/npc/guild/payg_cas03.txt
+++ b/npc/woe-fe/payg_cas03.txt
diff --git a/npc/guild/payg_cas04.txt b/npc/woe-fe/payg_cas04.txt
index 498bc1aed..498bc1aed 100644
--- a/npc/guild/payg_cas04.txt
+++ b/npc/woe-fe/payg_cas04.txt
diff --git a/npc/guild/payg_cas05.txt b/npc/woe-fe/payg_cas05.txt
index 7b667c4ca..7b667c4ca 100644
--- a/npc/guild/payg_cas05.txt
+++ b/npc/woe-fe/payg_cas05.txt
diff --git a/npc/guild/prtg_cas01.txt b/npc/woe-fe/prtg_cas01.txt
index 961453ccd..961453ccd 100644
--- a/npc/guild/prtg_cas01.txt
+++ b/npc/woe-fe/prtg_cas01.txt
diff --git a/npc/guild/prtg_cas02.txt b/npc/woe-fe/prtg_cas02.txt
index 315478ba1..315478ba1 100644
--- a/npc/guild/prtg_cas02.txt
+++ b/npc/woe-fe/prtg_cas02.txt
diff --git a/npc/guild/prtg_cas03.txt b/npc/woe-fe/prtg_cas03.txt
index 4b52dbb7f..4b52dbb7f 100644
--- a/npc/guild/prtg_cas03.txt
+++ b/npc/woe-fe/prtg_cas03.txt
diff --git a/npc/guild/prtg_cas04.txt b/npc/woe-fe/prtg_cas04.txt
index 8936b8451..8936b8451 100644
--- a/npc/guild/prtg_cas04.txt
+++ b/npc/woe-fe/prtg_cas04.txt
diff --git a/npc/guild/prtg_cas05.txt b/npc/woe-fe/prtg_cas05.txt
index 3b9652783..3b9652783 100644
--- a/npc/guild/prtg_cas05.txt
+++ b/npc/woe-fe/prtg_cas05.txt
diff --git a/npc/guild/trs_rp.txt b/npc/woe-fe/trs_rp.txt
index d96bd694e..d96bd694e 100644
--- a/npc/guild/trs_rp.txt
+++ b/npc/woe-fe/trs_rp.txt
diff --git a/npc/guild2/agit_main_se.txt b/npc/woe-se/agit_main_se.txt
index bad6b27f7..bad6b27f7 100644
--- a/npc/guild2/agit_main_se.txt
+++ b/npc/woe-se/agit_main_se.txt
diff --git a/npc/guild2/agit_start_se.txt b/npc/woe-se/agit_start_se.txt
index 74f03cb28..74f03cb28 100644
--- a/npc/guild2/agit_start_se.txt
+++ b/npc/woe-se/agit_start_se.txt
diff --git a/npc/guild2/arug_cas01.txt b/npc/woe-se/arug_cas01.txt
index be190c77f..be190c77f 100644
--- a/npc/guild2/arug_cas01.txt
+++ b/npc/woe-se/arug_cas01.txt
diff --git a/npc/guild2/arug_cas02.txt b/npc/woe-se/arug_cas02.txt
index bf7f639eb..bf7f639eb 100644
--- a/npc/guild2/arug_cas02.txt
+++ b/npc/woe-se/arug_cas02.txt
diff --git a/npc/guild2/arug_cas03.txt b/npc/woe-se/arug_cas03.txt
index 0a1665566..0a1665566 100644
--- a/npc/guild2/arug_cas03.txt
+++ b/npc/woe-se/arug_cas03.txt
diff --git a/npc/guild2/arug_cas04.txt b/npc/woe-se/arug_cas04.txt
index e6d734684..e6d734684 100644
--- a/npc/guild2/arug_cas04.txt
+++ b/npc/woe-se/arug_cas04.txt
diff --git a/npc/guild2/arug_cas05.txt b/npc/woe-se/arug_cas05.txt
index e4848b346..e4848b346 100644
--- a/npc/guild2/arug_cas05.txt
+++ b/npc/woe-se/arug_cas05.txt
diff --git a/npc/guild2/guild_flags.txt b/npc/woe-se/guild_flags.txt
index bfbca227d..bfbca227d 100644
--- a/npc/guild2/guild_flags.txt
+++ b/npc/woe-se/guild_flags.txt
diff --git a/npc/guild2/schg_cas01.txt b/npc/woe-se/schg_cas01.txt
index ba9da886b..ba9da886b 100644
--- a/npc/guild2/schg_cas01.txt
+++ b/npc/woe-se/schg_cas01.txt
diff --git a/npc/guild2/schg_cas02.txt b/npc/woe-se/schg_cas02.txt
index 798fb9c8b..798fb9c8b 100644
--- a/npc/guild2/schg_cas02.txt
+++ b/npc/woe-se/schg_cas02.txt
diff --git a/npc/guild2/schg_cas03.txt b/npc/woe-se/schg_cas03.txt
index 77d50195e..77d50195e 100644
--- a/npc/guild2/schg_cas03.txt
+++ b/npc/woe-se/schg_cas03.txt
diff --git a/npc/guild2/schg_cas04.txt b/npc/woe-se/schg_cas04.txt
index dd81e16c6..dd81e16c6 100644
--- a/npc/guild2/schg_cas04.txt
+++ b/npc/woe-se/schg_cas04.txt
diff --git a/npc/guild2/schg_cas05.txt b/npc/woe-se/schg_cas05.txt
index ca69a2dd6..ca69a2dd6 100644
--- a/npc/guild2/schg_cas05.txt
+++ b/npc/woe-se/schg_cas05.txt
diff --git a/script-checker.bat b/script-checker.bat
index d81277971..3d5a3aee9 100644
--- a/script-checker.bat
+++ b/script-checker.bat
@@ -2,7 +2,7 @@
REM Copyright (c) Hercules Dev Team, licensed under GNU GPL.
REM See the LICENSE file
-REM Base Author: Mumbles @ http://hercules.ws
+REM Base Author: Mumbles @ http://herc.ws
COLOR 0F
diff --git a/sql-files/item_db.sql b/sql-files/item_db.sql
index 242816c00..0e1d1513f 100644
--- a/sql-files/item_db.sql
+++ b/sql-files/item_db.sql
@@ -512,7 +512,7 @@ REPLACE INTO `item_db` VALUES ('1126','Saber','Saber','4','49000','24500','1000'
REPLACE INTO `item_db` VALUES ('1127','Saber_','Saber','4','49000','24500','1000','115','0','0','1','3','414946','63','2','2','3','27',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1128','Hae_Dong_Gum_','Haedonggum','4','50000','25000','900','120','0','0','1','2','414946','63','2','2','3','27',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,3;','','');
REPLACE INTO `item_db` VALUES ('1129','Flamberge','Flamberge','4','60000','30000','1500','150','0','0','1','0','16512','63','2','2','3','27',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('1130','Nagan','Nagan','4','20','10','500','120','0','0','1','0','414946','63','2','2','4','40',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill TF_DOUBLE,5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('1130','Nagan','Nagan','4','20','10','500','120','0','0','1','0','414946','63','2','2','4','40',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill TF_DOUBLE,5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('1131','Ice_Falchon','Ice Falchion','4','20','10','600','100','0','0','1','0','414946','63','2','2','4','40',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; bonus2 bAddEff2,Eff_Freeze,10; skill MG_COLDBOLT,3; bonus3 bAutoSpell,MG_COLDBOLT,3,100;','','');
REPLACE INTO `item_db` VALUES ('1132','Edge','Edge','4','20','10','700','115','0','0','1','0','414946','63','2','2','4','40',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Curse,30; bonus2 bWeaponComaRace,RC_NonBoss,10;','','');
REPLACE INTO `item_db` VALUES ('1133','Fire_Brand','Fireblend','4','20','10','500','100','0','0','1','0','414946','63','2','2','4','40',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Fire; skill MG_FIREBOLT,3; bonus3 bAutoSpell,MG_FIREBOLT,3,100;','','');
@@ -550,25 +550,25 @@ REPLACE INTO `item_db` VALUES ('1165','Masamune','Masamune','4','20','10','1000'
REPLACE INTO `item_db` VALUES ('1166','Dragon_Slayer','Dragon Slayer','4','20','10','1300','150','0','0','1','0','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Dragon,15;','','');
REPLACE INTO `item_db` VALUES ('1167','Schweizersabel','Schweizersabel','4','20','10','1600','160','0','0','1','0','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus bDef,1; bonus3 bAutoSpell,MG_LIGHTNINGBOLT,3,100;','','');
REPLACE INTO `item_db` VALUES ('1168','Zweihander','Zweihander','4','20','10','2200','200','0','0','1','0','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1169','Executioner_','Executioner','4','20','10','2200','155','0','0','1','0','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bSubRace,RC_DemiHuman,-10; bonus bAtkEle,Ele_Dark;','','');
+REPLACE INTO `item_db` VALUES ('1169','Executioner_','Executioner','4','20','10','2200','155','0','0','1','0','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiPlayer; bonus2 bAddRace,RC_DemiPlayer,20; bonus2 bSubRace,RC_DemiPlayer,-10; bonus bAtkEle,Ele_Dark;','','');
REPLACE INTO `item_db` VALUES ('1170','Katzbalger','Katzbalger','4','20','10','2000','175','0','0','1','0','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,5; bonus bDef,10;','','');
REPLACE INTO `item_db` VALUES ('1171','Zweihander_','Zweihander','4','20','10','2200','200','0','0','1','2','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1172','Claymore_','Claymore','4','74000','37000','2500','180','0','0','1','2','16512','63','2','34','3','33',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1173','Muramasa_C','Muramasa','4','1','0','0','204','0','0','1','0','16514','63','2','34','4','1',NULL,'0','3','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,30; bonus bAspdRate,8;','','');
-REPLACE INTO `item_db` VALUES ('1174','Executioner_C','Executioner','4','2','1','0','190','0','0','1','0','16514','63','2','34','4','0',NULL,'0','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bSubRace,RC_DemiHuman,-10; bonus bAtkEle,Ele_Dark;','','');
+REPLACE INTO `item_db` VALUES ('1174','Executioner_C','Executioner','4','2','1','0','190','0','0','1','0','16514','63','2','34','4','0',NULL,'0','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiPlayer; bonus2 bAddRace,RC_DemiPlayer,20; bonus2 bSubRace,RC_DemiPlayer,-10; bonus bAtkEle,Ele_Dark;','','');
REPLACE INTO `item_db` VALUES ('1175','Altas_Weapon','Atlas Weapon','4','20','10','3500','200','0','0','1','1','16514','2','2','34','4','55',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,10; if(readparam(bStr)>=80) bonus bBreakArmorRate,500;','','');
REPLACE INTO `item_db` VALUES ('1176','Muscle_Cutter','Muscle Cutter','4','20','10','2200','160','0','0','1','2','16514','2','2','34','4','55',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Bleeding,800; bonus3 bAutoSpell,AL_DECAGI,1,30;','','');
REPLACE INTO `item_db` VALUES ('1177','Muramash','Muramash','4','20','10','0','120','0','0','1','0','16514','63','2','34','1','0',NULL,'0','3','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Boss,50; bonus2 bAddRace,RC_NonBoss,50;','','');
REPLACE INTO `item_db` VALUES ('1178','Schweizersabel_','Schweizersabel','4','20','10','1600','160','0','0','1','2','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus bDef,1; bonus3 bAutoSpell,MG_LIGHTNINGBOLT,3,100;','','');
-REPLACE INTO `item_db` VALUES ('1179','Executioner__','Executioner','4','20','10','2200','155','0','0','1','1','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bAddRace,RC_DemiHuman,20; bonus2 bSubRace,RC_DemiHuman,-10; bonus bAtkEle,Ele_Dark;','','');
+REPLACE INTO `item_db` VALUES ('1179','Executioner__','Executioner','4','20','10','2200','155','0','0','1','1','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiPlayer; bonus2 bAddRace,RC_DemiPlayer,20; bonus2 bSubRace,RC_DemiPlayer,-10; bonus bAtkEle,Ele_Dark;','','');
REPLACE INTO `item_db` VALUES ('1180','Dragon_Slayer_','Dragon Slayer','4','20','10','1300','150','0','0','1','2','16514','63','2','34','4','48',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Dragon,15;','','');
REPLACE INTO `item_db` VALUES ('1181','Tae_Goo_Lyeon','Tae Goo Lyeon','4','20','10','2000','250','0','0','1','2','16514','2','2','34','4','90',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bFlee2,10; if(JobLevel>=70) autobonus \"{ bonus bBaseAtk,50; }\",10,10000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\"; if(getrefine()>8) { bonus bCastrate,-20; bonus bDelayrate,-20; }','','');
REPLACE INTO `item_db` VALUES ('1182','Bloody_Eater','Bloody Eater','4','20','10','1200','200','0','0','1','2','16514','63','2','34','4','50',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Ghost; autobonus \"{ bonus bCritical,100; bonus bBaseAtk,50; }\",1,5000,0,\"{ specialeffect2 EF_FIRESPLASHHIT; }\"; bonus bHPGainValue,100;','','');
-REPLACE INTO `item_db` VALUES ('1183','BF_Two_Handed_Sword1','Brave Assaulter\'s Katzbalger','4','20','10','0','200','0','0','1','0','16514','63','2','34','3','80',NULL,'1','3','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1184','BF_Two_Handed_Sword2','Valorous Assaulter\'s Katzbalger','4','20','10','0','200','0','0','1','0','16514','63','2','34','3','80',NULL,'1','3','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,20; bonus2 bAddRace,RC_DemiHuman,55; bonus bCritAtkRate,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1183','BF_Two_Handed_Sword1','Brave Assaulter\'s Katzbalger','4','20','10','0','200','0','0','1','0','16514','63','2','34','3','80',NULL,'1','3','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus2 bAddRace,RC_DemiPlayer,55; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1184','BF_Two_Handed_Sword2','Valorous Assaulter\'s Katzbalger','4','20','10','0','200','0','0','1','0','16514','63','2','34','3','80',NULL,'1','3','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,20; bonus2 bAddRace,RC_DemiPlayer,55; bonus bCritAtkRate,20; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1185','Violet_Fear','Violet Fear','4','20','10','2200','275','0','0','1','2','16514','2','2','34','4','80',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpell,WZ_METEOR,3,30; bonus3 bAutoSpell,WZ_FROSTNOVA,5,50; autobonus \"{ bonus bIgnoreDefRace,RC_NonBoss; }\",50,5000;','','');
REPLACE INTO `item_db` VALUES ('1186','Death_Guidance','Death Guidance','4','20','10','2000','200','0','0','1','2','16514','2','2','34','4','70',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,5; bonus bAgi,2; bonus bFlee2,20; bonus3 bAutoSpell,NPC_HELLPOWER,1,10; bonus4 bAutoSpell,NPC_HELLPOWER,1,10,0; if( getrefine()>8 ) bonus3 bAutoSpell,NPC_VAMPIRE_GIFT,2,20; else bonus3 bAutoSpell,NPC_VAMPIRE_GIFT,1,20;','','');
-REPLACE INTO `item_db` VALUES ('1187','Krieger_Twohand_Sword1','Glorious Claymore','4','20','10','0','220','0','0','1','0','16514','63','2','34','4','80',NULL,'1','3','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,70; bonus2 bIgnoreDefRate,RC_DemiHuman,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-3)*(getrefine()-3); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { bonus3 bAutoSpell,LK_CONCENTRATION,max(getskilllv(LK_CONCENTRATION),1),30; bonus3 bAutoSpell,LK_AURABLADE,max(getskilllv(LK_AURABLADE),1),30; }','','');
+REPLACE INTO `item_db` VALUES ('1187','Krieger_Twohand_Sword1','Glorious Claymore','4','20','10','0','220','0','0','1','0','16514','63','2','34','4','80',NULL,'1','3','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,70; bonus2 bIgnoreDefRate,RC_DemiPlayer,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-3)*(getrefine()-3); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { bonus3 bAutoSpell,LK_CONCENTRATION,max(getskilllv(LK_CONCENTRATION),1),30; bonus3 bAutoSpell,LK_AURABLADE,max(getskilllv(LK_AURABLADE),1),30; }','','');
REPLACE INTO `item_db` VALUES ('1188','Veteran_Sword','Veteran Sword','4','10000','5000','2000','180','0','0','1','1','16514','63','2','34','4','80',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(getskilllv(SM_BASH)==10) { bonus2 bSkillAtk,SM_BASH,50; } if(getskilllv(KN_BOWLINGBASH)==10) { bonus2 bSkillAtk,KN_BOWLINGBASH,50; } bonus bStr,1; bonus bDex,1;','','');
REPLACE INTO `item_db` VALUES ('1189','Krasnaya','Krasnaya','4','20','10','3800','200','0','0','2','3','16514','2','2','34','2','50',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(readparam(bStr)>=95) { bonus bBaseAtk,20; }','','');
REPLACE INTO `item_db` VALUES ('1190','Claymore_C','Claymore','4','0','0','0','220','0','0','1','0','16512','63','2','34','3','1',NULL,'0','3','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddSize,Size_Small,40; bonus2 bAddSize,Size_Medium,40; bonus2 bAddSize,Size_Large,40;','','');
@@ -599,12 +599,12 @@ REPLACE INTO `item_db` VALUES ('1224','Sword_Breaker','Swordbreaker','4','20','1
REPLACE INTO `item_db` VALUES ('1225','Mail_Breaker','Mailbreaker','4','20','10','1000','70','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bBreakArmorRate,500;','','');
REPLACE INTO `item_db` VALUES ('1226','Damascus_','Damascus','4','49000','24500','800','118','0','0','1','2','42950382','63','2','2','3','24',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1227','Weeder_Knife','Weeder Knife','4','20','10','400','80','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_Plant; bonus2 bAddRace,RC_Plant,15; bonus2 bSubRace,RC_Plant,15;','','');
-REPLACE INTO `item_db` VALUES ('1228','Combat_Knife','Combat Knife','4','20','10','400','80','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Demon,-10;','','');
+REPLACE INTO `item_db` VALUES ('1228','Combat_Knife','Combat Knife','4','20','10','400','80','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiPlayer; bonus2 bSubRace,RC_DemiPlayer,10; bonus2 bSubRace,RC_Demon,-10;','','');
REPLACE INTO `item_db` VALUES ('1229','Mama\'s_Knife','Kitchen Knife','4','20','10','500','75','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,30; bonus3 bAddMonsterDropItem,517,RC_Brute,5000;','','');
REPLACE INTO `item_db` VALUES ('1230','House_Auger','Ice Pick','4','20','10','600','80','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss;','','');
REPLACE INTO `item_db` VALUES ('1231','Bazerald','Bazerald','4','20','10','500','70','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Fire; bonus bInt,5; bonus bMatkRate,10;','','');
REPLACE INTO `item_db` VALUES ('1232','Assasin_Dagger','Assassin Dagger','4','20','10','600','140','0','0','1','0','4096','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,20; bonus bMaxSPrate,15; bonus bAspdRate,2; bonus bAtkEle,Ele_Dark;','','');
-REPLACE INTO `item_db` VALUES ('1233','Exercise','Exorciser','4','20','10','700','90','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_Demon; bonus2 bSubRace,RC_Demon,5; bonus2 bSubRace,RC_DemiHuman,-10;','','');
+REPLACE INTO `item_db` VALUES ('1233','Exercise','Exorciser','4','20','10','700','90','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_Demon; bonus2 bSubRace,RC_Demon,5; bonus2 bSubRace,RC_DemiPlayer,-10;','','');
REPLACE INTO `item_db` VALUES ('1234','Moonlight_Sword','Moonlight Dagger','4','20','10','700','50','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxSPrate,10; bonus bSPDrainValue,3;','','');
REPLACE INTO `item_db` VALUES ('1235','Azoth','Azoth','4','20','10','700','110','0','0','1','0','262144','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bClassChange,300;','','');
REPLACE INTO `item_db` VALUES ('1236','Sucsamad','Sucsamad','4','20','10','800','140','0','0','1','0','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEle,Ele_Earth,10; bonus2 bAddEle,Ele_Wind,10; bonus bUnbreakableWeapon,0;','','');
@@ -632,28 +632,28 @@ REPLACE INTO `item_db` VALUES ('1257','Katar_Of_Thornbush','Katar of Quaking','4
REPLACE INTO `item_db` VALUES ('1258','Katar_Of_Raging_Blaze','Katar of Raging Blaze','4','45000','22500','1200','105','0','0','1','0','4096','63','2','34','3','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Fire; bonus2 bAddEff,Eff_Silence,500;','','');
REPLACE INTO `item_db` VALUES ('1259','Katar_Of_Piercing_Wind','Katar of Piercing Wind','4','45000','22500','1200','105','0','0','1','0','4096','63','2','34','3','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus2 bAddEff,Eff_Sleep,500;','','');
REPLACE INTO `item_db` VALUES ('1260','Ghoul_Leg','Sharpened Legbone of Ghoul','4','52500','26250','1700','150','0','0','1','0','4096','63','2','34','3','65',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Undead;','','');
-REPLACE INTO `item_db` VALUES ('1261','Infiltrator','Infiltrator','4','57000','28500','1500','140','0','0','1','0','4096','63','2','34','4','75',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2;','','');
+REPLACE INTO `item_db` VALUES ('1261','Infiltrator','Infiltrator','4','57000','28500','1500','140','0','0','1','0','4096','63','2','34','4','75',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2;','','');
REPLACE INTO `item_db` VALUES ('1262','Nail_Of_Loki','Loki\'s Nail','4','20','10','1200','115','0','0','1','0','4096','63','2','34','3','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Bleeding,300;','','');
REPLACE INTO `item_db` VALUES ('1263','Unholy_Touch','Unholy Touch','4','20','10','1250','151','0','0','1','0','4096','63','2','34','4','70',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,200; bonus bCritical,-1; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1264','Various_Jur','Specialty Jur','4','20','10','800','90','0','0','1','4','4096','63','2','34','1','1',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff2,Eff_Bleeding,10;','','');
-REPLACE INTO `item_db` VALUES ('1265','Bloody_Roar','Bloody Roar','4','20','10','1000','120','0','0','1','0','4096','63','2','34','4','75',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiHuman; bonus bFlee,-160; bonus bFlee2,-160; bonus bHPrecovRate,-100; bonus bSPrecovRate,-100;','','');
-REPLACE INTO `item_db` VALUES ('1266','Infiltrator_','Infiltrator','4','57000','28500','1500','140','0','0','1','1','4096','63','2','34','4','75',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2;','','');
-REPLACE INTO `item_db` VALUES ('1267','Infiltrator_C','Infiltrator','4','1','0','0','189','0','0','1','0','4096','63','2','34','4','1',NULL,'0','16','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,70; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; bonus bAspdRate,5;','','');
+REPLACE INTO `item_db` VALUES ('1265','Bloody_Roar','Bloody Roar','4','20','10','1000','120','0','0','1','0','4096','63','2','34','4','75',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiPlayer; bonus bFlee,-160; bonus bFlee2,-160; bonus bHPrecovRate,-100; bonus bSPrecovRate,-100;','','');
+REPLACE INTO `item_db` VALUES ('1266','Infiltrator_','Infiltrator','4','57000','28500','1500','140','0','0','1','1','4096','63','2','34','4','75',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,50; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2;','','');
+REPLACE INTO `item_db` VALUES ('1267','Infiltrator_C','Infiltrator','4','1','0','0','189','0','0','1','0','4096','63','2','34','4','1',NULL,'0','16','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,70; bonus bDef,3; bonus bFlee,5; bonus bFlee2,2; bonus bAspdRate,5;','','');
REPLACE INTO `item_db` VALUES ('1268','Wild_Beast_Claw','Wild Beast Claw','4','20','10','1450','160','0','0','1','1','4096','2','2','34','4','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(getrefine()>=9) { bonus3 bAutoSpell,NPC_CRITICALWOUND,2,100; } else bonus3 bAutoSpell,NPC_CRITICALWOUND,1,100;','','');
REPLACE INTO `item_db` VALUES ('1269','Inverse_Scale','Inverse Scale','4','20','10','1500','140','0','0','1','0','4096','2','2','34','4','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; bonus3 bAutoSpell,NPC_DRAGONFEAR,1,30;','','');
REPLACE INTO `item_db` VALUES ('1270','Drill_Katar','Drill Katar','4','20','10','1400','110','0','0','1','1','4096','2','2','34','4','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHit,30; bonus3 bAutoSpell,ST_FULLSTRIP,1,150;','','');
REPLACE INTO `item_db` VALUES ('1271','Blood_Tears','Blood Tears','4','20','10','1700','120','0','0','1','2','4096','2','2','34','4','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(getrefine()>=9) { bonus3 bAutoSpell,NPC_WIDEBLEEDING,2,30; } else bonus3 bAutoSpell,NPC_WIDEBLEEDING,1,30;','','');
REPLACE INTO `item_db` VALUES ('1272','Scratcher','Scratcher','4','20','10','0','120','0','0','1','0','4096','63','2','34','1','0',NULL,'0','16','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Boss,50; bonus2 bAddRace,RC_NonBoss,50;','','');
-REPLACE INTO `item_db` VALUES ('1273','Bloody_Roar_C','Refined Bloody Roar','4','1','0','0','148','0','0','1','0','4096','63','2','34','4','0',NULL,'0','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiHuman; bonus bFlee,-160; bonus bFlee2,-160;','','');
+REPLACE INTO `item_db` VALUES ('1273','Bloody_Roar_C','Refined Bloody Roar','4','1','0','0','148','0','0','1','0','4096','63','2','34','4','0',NULL,'0','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiPlayer; bonus bFlee,-160; bonus bFlee2,-160;','','');
REPLACE INTO `item_db` VALUES ('1274','Unholy_Touch_C','Refined Unholy Touch','4','1','0','0','179','0','0','1','0','4096','63','2','34','4','0',NULL,'0','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Curse,5000; bonus bCritical,-1; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1275','Katar_Of_Cold_Icicle_','Katar of Frozen Icicle','4','45000','22500','1200','105','0','0','1','3','4096','63','2','34','3','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500;','','');
REPLACE INTO `item_db` VALUES ('1276','Katar_Of_Thornbush_','Katar of Quaking','4','45000','22500','1200','105','0','0','1','3','4096','63','2','34','3','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Earth; bonus2 bAddEff,Eff_Blind,500;','','');
REPLACE INTO `item_db` VALUES ('1277','Katar_Of_Raging_Blaze_','Katar of Raging Blaze','4','45000','22500','1200','105','0','0','1','3','4096','63','2','34','3','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Fire; bonus2 bAddEff,Eff_Silence,500;','','');
REPLACE INTO `item_db` VALUES ('1278','Katar_Of_Piercing_Wind_','Katar of Piercing Wind','4','45000','22500','1200','105','0','0','1','3','4096','63','2','34','3','55',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus2 bAddEff,Eff_Sleep,500;','','');
-REPLACE INTO `item_db` VALUES ('1279','BF_Katar1','Brave Carnage Katar','4','20','10','0','130','0','0','1','0','4096','63','2','34','3','80',NULL,'1','16','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus bLuk,1; bonus2 bAddRace,RC_DemiHuman,70; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1280','BF_Katar2','Valorous Carnage Katar','4','20','10','0','130','0','0','1','0','4096','63','2','34','3','80',NULL,'1','16','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus bLuk,1; bonus2 bAddRace,RC_DemiHuman,70; bonus bCritAtkRate,20; bonus bAspdRate,5; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1281','Krieger_Katar1','Glorious Bloody Roar','4','20','10','0','140','0','0','1','0','4096','63','2','34','4','80',NULL,'1','16','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,70; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) autobonus \"{ bonus bAspdRate,100; }\",70,3000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\";','','');
-REPLACE INTO `item_db` VALUES ('1282','Krieger_Katar2','Glorious Jamadhar','4','20','10','0','140','0','0','1','0','4096','63','2','34','4','80',NULL,'1','16','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,70; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bCriticalAddRace,RC_DemiHuman,5; } if(getrefine()>8) autobonus \"{ bonus bAspdRate,100; }\",70,3000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\";','','');
+REPLACE INTO `item_db` VALUES ('1279','BF_Katar1','Brave Carnage Katar','4','20','10','0','130','0','0','1','0','4096','63','2','34','3','80',NULL,'1','16','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus bLuk,1; bonus2 bAddRace,RC_DemiPlayer,70; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1280','BF_Katar2','Valorous Carnage Katar','4','20','10','0','130','0','0','1','0','4096','63','2','34','3','80',NULL,'1','16','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus bLuk,1; bonus2 bAddRace,RC_DemiPlayer,70; bonus bCritAtkRate,20; bonus bAspdRate,5; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1281','Krieger_Katar1','Glorious Bloody Roar','4','20','10','0','140','0','0','1','0','4096','63','2','34','4','80',NULL,'1','16','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,70; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) autobonus \"{ bonus bAspdRate,100; }\",70,3000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\";','','');
+REPLACE INTO `item_db` VALUES ('1282','Krieger_Katar2','Glorious Jamadhar','4','20','10','0','140','0','0','1','0','4096','63','2','34','4','80',NULL,'1','16','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,70; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bCriticalAddRace,RC_DemiPlayer,5; } if(getrefine()>8) autobonus \"{ bonus bAspdRate,100; }\",70,3000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\";','','');
REPLACE INTO `item_db` VALUES ('1283','Katar_Of_Speed','Katar Of Speed','4','20','10','0','175','0','0','1','0','4096','63','2','34','4','0',NULL,'0','16','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,AS_SONICBLOW,25; bonus bAspdRate,3;','','');
REPLACE INTO `item_db` VALUES ('1284','Krishna','Krishna','4','20','10','1200','120','0','0','1','2','4096','2','2','34','3','50',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,AS_GRIMTOOTH,10; if(getskilllv(AS_SONICBLOW)) { bonus3 bAutoSpell,AS_SONICBLOW,getskilllv(AS_SONICBLOW),5; } else { bonus3 bAutoSpell,AS_SONICBLOW,1,5; }','','');
REPLACE INTO `item_db` VALUES ('1285','Cakram','Chakram','4','20','10','1000','130','0','0','1','2','4096','2','2','34','3','50',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(getskilllv(AS_KATAR)==10) { bonus bHit,10; } bonus2 bSkillAtk,ASC_METEORASSAULT,20;','','');
@@ -662,12 +662,12 @@ REPLACE INTO `item_db` VALUES ('1301','Axe','Axe','4','500','250','800','38','0'
REPLACE INTO `item_db` VALUES ('1302','Axe_','Axe','4','500','250','800','38','0','0','1','4','414947','63','2','2','1','3',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1303','Axe__','Axe','4','500','250','800','38','0','0','1','0','414947','63','2','2','1','3',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1304','Orcish_Axe','Orcish Axe','4','20','10','1500','75','0','0','1','0','414947','63','2','2','3','3',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('1305','Cleaver','Cleaver','4','20','10','1200','140','0','0','1','0','279714','63','2','2','4','44',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,5; bonus3 bAddMonsterDropItem,517,RC_Brute,3000;','','');
+REPLACE INTO `item_db` VALUES ('1305','Cleaver','Cleaver','4','20','10','1200','140','0','0','1','0','279714','63','2','2','4','44',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,5; bonus3 bAddMonsterDropItem,517,RC_Brute,3000;','','');
REPLACE INTO `item_db` VALUES ('1306','War_Axe','War Axe','4','20','10','4200','140','0','0','1','1','263168','63','2','2','3','76',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bLuk,2;','','');
REPLACE INTO `item_db` VALUES ('1307','Windhawk','Windhawk','4','18000','9000','1500','115','0','0','1','0','414946','63','2','2','2','14',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus bAspdRate,5;','','');
REPLACE INTO `item_db` VALUES ('1308','Golden_Axe','Golden Axe','4','20','10','3000','170','0','0','1','0','1','63','2','2','4','45',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1309','Orcish_Axe_','Orcish Axe','4','20','10','1500','75','0','0','1','4','414947','63','2','2','3','3',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('1310','Krieger_Onehand_Axe1','Glorious Cleaver','4','20','10','0','130','0','0','1','0','279714','63','2','2','4','80',NULL,'1','6','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; bonus bAspdRate,5; } if(getrefine()>8) { bonus bAspdRate,5; bonus3 bAutoSpell,NPC_CRITICALWOUND,1,50; bonus4 bAutoSpellOnSkill,MC_MAMMONITE,NPC_CRITICALWOUND,2,200; }','','');
+REPLACE INTO `item_db` VALUES ('1310','Krieger_Onehand_Axe1','Glorious Cleaver','4','20','10','0','130','0','0','1','0','279714','63','2','2','4','80',NULL,'1','6','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; bonus bAspdRate,5; } if(getrefine()>8) { bonus bAspdRate,5; bonus3 bAutoSpell,NPC_CRITICALWOUND,1,50; bonus4 bAutoSpellOnSkill,MC_MAMMONITE,NPC_CRITICALWOUND,2,200; }','','');
REPLACE INTO `item_db` VALUES ('1311','Vecer_Axe','Vecer Axe','4','20','10','1500','140','0','0','1','2','279714','2','2','2','3','50',NULL,'1','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(readparam(bLuk)>=90) { bonus bBaseAtk,20; } if(readparam(bDex)>=90) { bonus bCritical,5; } if(readparam(bDex)>=90||readparam(bLuk)>=90) { bonus2 bSkillAtk,MC_MAMMONITE,15; }','','');
REPLACE INTO `item_db` VALUES ('1312','Orcish_Axe_C','Orcish Axe','4','0','0','0','110','0','0','1','0','414947','63','2','2','3','1',NULL,'0','6','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddSize,Size_Small,70; bonus2 bAddSize,Size_Medium,70; bonus2 bAddSize,Size_Large,70;','','');
REPLACE INTO `item_db` VALUES ('1313','Tourist_Axe','Tourist Axe','4','0','0','500','77','0','0','1','0','414947','63','2','2','1','1',NULL,'0','6','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2;','','');
@@ -691,7 +691,7 @@ REPLACE INTO `item_db` VALUES ('1365','Sabbath','Sabbath','4','20','10','2300','
REPLACE INTO `item_db` VALUES ('1366','Right_Epsilon','Light Epsilon','4','20','10','2300','180','0','0','1','0','279714','63','2','34','4','44',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; skill AL_HEAL,3; bonus2 bAddRace,RC_Demon,3;','','');
REPLACE INTO `item_db` VALUES ('1367','Slaughter','Slaughter','4','20','10','2500','120','0','0','1','0','279714','63','2','34','4','44',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Earth; bonus bIgnoreDefRace,RC_Brute; bonus2 bWeaponComaRace,RC_Brute,40;','','');
REPLACE INTO `item_db` VALUES ('1368','Tomahawk','Tomahawk','4','20','10','2500','165','0','0','1','0','279714','63','2','34','4','44',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; skill ITM_TOMAHAWK,1;','','');
-REPLACE INTO `item_db` VALUES ('1369','Guillotine','Guillotine','4','20','10','3000','215','0','0','1','0','279714','63','2','34','4','44',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bWeaponComaRace,RC_DemiHuman,30; bonus2 bSPGainRaceAttack,RC_DemiHuman,2; bonus2 bSPGainRace,RC_DemiHuman,20;','','');
+REPLACE INTO `item_db` VALUES ('1369','Guillotine','Guillotine','4','20','10','3000','215','0','0','1','0','279714','63','2','34','4','44',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bWeaponComaRace,RC_DemiPlayer,30; bonus2 bSPGainRaceAttack,RC_DemiPlayer,2; bonus2 bSPGainRace,RC_DemiPlayer,20;','','');
REPLACE INTO `item_db` VALUES ('1370','Doom_Slayer','Doom Slayer','4','20','10','6000','10','0','0','1','0','279714','63','2','34','4','80',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95) { bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; }','','');
REPLACE INTO `item_db` VALUES ('1371','Doom_Slayer_','Doom Slayer','4','20','10','6000','10','0','0','1','1','279714','63','2','34','4','80',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95) { bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; }','','');
REPLACE INTO `item_db` VALUES ('1372','Right_Epsilon_C','Light Epsilon','4','1','0','0','229','0','0','1','0','279714','63','2','34','4','1',NULL,'0','7','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; skill AL_HEAL,3; bonus2 bAddRace,RC_Demon,3; bonus bStr,10; bonus bSpeedRate,25;','','');
@@ -701,10 +701,10 @@ REPLACE INTO `item_db` VALUES ('1375','Berdysz','Berdysz','4','20','10','2500','
REPLACE INTO `item_db` VALUES ('1376','Heart_Breaker','Heart Breaker','4','20','10','2000','175','0','0','1','1','279714','2','2','34','4','70',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,20+getrefine(); bonus bAspdRate,5; if((Class==Job_Whitesmith)||(Class==Job_Creator)) bonus3 bAutoSpell,BS_HAMMERFALL,3,30;','','');
REPLACE INTO `item_db` VALUES ('1377','Hurricane_Fury','Hurricane\'s Fury','4','20','10','3500','332','0','0','1','1','279714','2','2','34','4','80',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubSize,Size_Medium,10+getrefine(); bonus bAspdRate,getrefine(); bonus3 bAutoSpell,NPC_PULSESTRIKE,5,20;','','');
REPLACE INTO `item_db` VALUES ('1378','Great_Axe_C','Refined Great Axe','4','1','0','0','215','0','0','1','0','279714','63','2','34','4','0',NULL,'0','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,5; bonus bHit,20; bonus2 bAddSkillBlow,MC_MAMMONITE,5; bonus2 bAddEff,Eff_Stun,2000;','','');
-REPLACE INTO `item_db` VALUES ('1379','BF_Two_Handed_Axe1','Valorous Insane Battle Axe','4','20','10','0','200','0','0','1','0','279714','63','2','34','3','80',NULL,'1','7','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,3; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1380','BF_Two_Handed_Axe2','Brave Insane Battle Axe','4','20','10','0','200','0','0','1','0','279714','63','2','34','3','80',NULL,'1','7','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,3; bonus2 bAddRace,RC_DemiHuman,55; autobonus \"{ bonus bBreakArmorRate,10000; }\",20,3000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\"; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1379','BF_Two_Handed_Axe1','Valorous Insane Battle Axe','4','20','10','0','200','0','0','1','0','279714','63','2','34','3','80',NULL,'1','7','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,3; bonus2 bAddRace,RC_DemiPlayer,55; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1380','BF_Two_Handed_Axe2','Brave Insane Battle Axe','4','20','10','0','200','0','0','1','0','279714','63','2','34','3','80',NULL,'1','7','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,3; bonus2 bAddRace,RC_DemiPlayer,55; autobonus \"{ bonus bBreakArmorRate,10000; }\",20,3000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\"; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1381','N_Battle_Axe','Novice Battle Axe','4','0','0','0','100','0','0','1','3','279714','63','2','34','1','3',NULL,'0','7','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('1382','Krieger_Twohand_Axe1','Glorious Two-Handed Axe','4','20','10','0','220','0','0','1','0','279714','63','2','34','4','80',NULL,'1','7','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,70; bonus2 bIgnoreDefRate,RC_DemiHuman,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-3)*(getrefine()-3); bonus2 bIgnoreDefRate,RC_DemiHuman,5; bonus3 bAutoSpell,NPC_CRITICALWOUND,1,50; } if(getrefine()>8) { bonus3 bAutoSpell,NPC_CRITICALWOUND,1,100; bonus4 bAutoSpellOnSkill,MC_MAMMONITE,NPC_CRITICALWOUND,2,200; bonus4 bAutoSpellOnSkill,WS_CARTTERMINATION,NPC_CRITICALWOUND,2,200; }','','');
+REPLACE INTO `item_db` VALUES ('1382','Krieger_Twohand_Axe1','Glorious Two-Handed Axe','4','20','10','0','220','0','0','1','0','279714','63','2','34','4','80',NULL,'1','7','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,70; bonus2 bIgnoreDefRate,RC_DemiPlayer,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-3)*(getrefine()-3); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; bonus3 bAutoSpell,NPC_CRITICALWOUND,1,50; } if(getrefine()>8) { bonus3 bAutoSpell,NPC_CRITICALWOUND,1,100; bonus4 bAutoSpellOnSkill,MC_MAMMONITE,NPC_CRITICALWOUND,2,200; bonus4 bAutoSpellOnSkill,WS_CARTTERMINATION,NPC_CRITICALWOUND,2,200; }','','');
REPLACE INTO `item_db` VALUES ('1383','Holy_Celestial_Axe','Celestial Axe','4','20','10','1500','200','0','0','1','0','279714','63','2','34','4','60',NULL,'1','7','0','0','0','457',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; bonus bVit,10; bonus2 bAddRace,RC_Undead,10; bonus3 bAutoSpell,AL_BLESSING,5,50;','','');
REPLACE INTO `item_db` VALUES ('1384','Veteran_Axe','Veteran Axe','4','10000','5000','3000','250','0','0','1','2','279714','63','2','34','3','80',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(getskilllv(BS_DAGGER)==3) { bonus bBaseAtk,10; } if(getskilllv(BS_SWORD)==3) { bonus bBaseAtk,10; } if(getskilllv(BS_TWOHANDSWORD)==3) { bonus bBaseAtk,10; } if(getskilllv(BS_KNUCKLE)==3) { bonus bBaseAtk,10; } if(getskilllv(BS_SPEAR)==3) { bonus bBaseAtk,10; } if(getskilllv(BS_AXE)==3) { bonus bBaseAtk,10; } if(getskilllv(BS_MACE)==3) { bonus bBaseAtk,10; } bonus bVit,2;','','');
REPLACE INTO `item_db` VALUES ('1385','Bradium_Stonehammer','Bradium Stone Hammer','4','20','10','2700','210','0','0','1','0','279714','2','2','34','4','75',NULL,'1','7','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAddEffOnSkill,BS_HAMMERFALL,Eff_Stun,500+(200*getrefine());','','');
@@ -733,12 +733,12 @@ REPLACE INTO `item_db` VALUES ('1417','Pole_Axe','Pole Axe','4','20','10','3800'
REPLACE INTO `item_db` VALUES ('1418','Gungnir_','Gungnir','4','20','10','500','120','0','0','3','2','16514','63','2','2','4','4',NULL,'1','4','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus bPerfectHitRate,25; bonus bHit,30;','','');
REPLACE INTO `item_db` VALUES ('1419','Pole_Axe_C','Pole Axe','4','1','0','4800','159','0','0','3','0','16514','63','2','2','3','1',NULL,'0','4','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bInt,2; bonus bDex,1;','','');
REPLACE INTO `item_db` VALUES ('1420','Long_Horn','Long Horn','4','20','10','1000','150','0','0','3','1','16514','2','2','2','4','65',NULL,'1','4','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; bonus2 bAddEff,Eff_Bleeding,500; skill TF_DETOXIFY,1; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1421','Battle_Hook','Battle Hook','4','20','10','900','140','0','0','3','1','16514','2','2','2','4','65',NULL,'1','4','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Stun,500; bonus2 bAddRace,RC_DemiHuman,20; skill KN_PIERCE,3;','','');
+REPLACE INTO `item_db` VALUES ('1421','Battle_Hook','Battle Hook','4','20','10','900','140','0','0','3','1','16514','2','2','2','4','65',NULL,'1','4','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Stun,500; bonus2 bAddRace,RC_DemiPlayer,20; skill KN_PIERCE,3;','','');
REPLACE INTO `item_db` VALUES ('1422','Hunting_Spear','Hunting Spear','4','20','10','4200','180','0','0','3','1','16514','2','2','2','4','60',NULL,'1','4','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_Brute; bonus3 bAddMonsterDropItem,517,RC_Brute,1000; bonus3 bAutoSpell,LK_JOINTBEAT,3,100;','','');
REPLACE INTO `item_db` VALUES ('1423','Pole_XO','Pole XO','4','20','10','0','120','0','0','3','0','16514','63','2','2','1','0',NULL,'0','4','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Boss,50; bonus2 bAddRace,RC_NonBoss,50;','','');
REPLACE INTO `item_db` VALUES ('1424','Skewer_C','Refined Brocca','4','1','0','0','149','0','0','3','0','16514','63','2','2','4','0',NULL,'0','4','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_NonBoss; bonus2 bAddSize,Size_Medium,20;','','');
-REPLACE INTO `item_db` VALUES ('1425','BF_Spear1','Assaulter Spear','4','20','10','0','60','0','0','3','0','16514','63','2','2','3','80',NULL,'1','4','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(BaseJob==Job_Crusader) bonus bAspdRate,20;','','');
-REPLACE INTO `item_db` VALUES ('1426','Krieger_Onehand_Spear1','Glorious Spear','4','20','10','0','130','0','0','3','0','16514','63','2','2','4','80',NULL,'1','4','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; bonus bAspdRate,10; } if(getrefine()>8) { if(BaseJob==Job_Knight) bonus4 bAutoSpellOnSkill,KN_PIERCE,NPC_CRITICALWOUND,2,200; else if(BaseJob==Job_Crusader) bonus3 bAutoSpell,PA_PRESSURE,5,100; }','','');
+REPLACE INTO `item_db` VALUES ('1425','BF_Spear1','Assaulter Spear','4','20','10','0','60','0','0','3','0','16514','63','2','2','3','80',NULL,'1','4','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(BaseJob==Job_Crusader) bonus bAspdRate,20;','','');
+REPLACE INTO `item_db` VALUES ('1426','Krieger_Onehand_Spear1','Glorious Spear','4','20','10','0','130','0','0','3','0','16514','63','2','2','4','80',NULL,'1','4','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; bonus bAspdRate,10; } if(getrefine()>8) { if(BaseJob==Job_Knight) bonus4 bAutoSpellOnSkill,KN_PIERCE,NPC_CRITICALWOUND,2,200; else if(BaseJob==Job_Crusader) bonus3 bAutoSpell,PA_PRESSURE,5,100; }','','');
REPLACE INTO `item_db` VALUES ('1427','Spear_Of_Excellent','Spear Of Excellent','4','20','10','0','160','0','0','3','0','16514','63','2','2','3','0',NULL,'0','4','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,SM_MAGNUM,25; bonus bStr,2;','','');
REPLACE INTO `item_db` VALUES ('1428','Long_Horn_M','Long Horn','4','20','10','1000','150','0','0','3','1','16514','2','2','2','4','65',NULL,'1','4','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; bonus2 bAddEff,Eff_Bleeding,500; skill TF_DETOXIFY,1; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1429','Hunting_Spear_M','Hunting Spear','4','20','10','4200','180','0','0','3','1','16514','2','2','2','4','60',NULL,'1','4','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_Brute; bonus3 bAddMonsterDropItem,517,RC_Brute,1000; bonus3 bAutoSpell,LK_JOINTBEAT,3,500;','','');
@@ -761,9 +761,9 @@ REPLACE INTO `item_db` VALUES ('1463','Halberd','Halberd','4','54000','27000','2
REPLACE INTO `item_db` VALUES ('1464','Halberd_','Halberd','4','54000','27000','2500','165','0','0','3','2','16514','63','2','34','3','33',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1465','Halberd__','Halberd','4','54000','27000','2500','165','0','0','3','0','16514','63','2','34','3','33',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1466','Crescent_Scythe','Crescent Scythe','4','20','10','2500','180','0','0','3','0','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,30; bonus bHit,10;','','');
-REPLACE INTO `item_db` VALUES ('1467','Bill_Guisarme','Bill Guisarme','4','20','10','1000','183','0','0','3','0','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Brute,10; bonus2 bAddRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('1467','Bill_Guisarme','Bill Guisarme','4','20','10','1000','183','0','0','3','0','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Brute,10; bonus2 bAddRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('1468','Zephyrus','Zephyrus','4','20','10','2000','170','0','0','3','0','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus2 bAddEff,Eff_Silence,200; bonus3 bAutoSpell,MG_THUNDERSTORM,3,100;','','');
-REPLACE INTO `item_db` VALUES ('1469','Longinus\'s_Spear','Longinus\'s Spear','4','20','10','2500','180','0','0','3','0','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Dark; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddRace,RC_Angel,10;','','');
+REPLACE INTO `item_db` VALUES ('1469','Longinus\'s_Spear','Longinus\'s Spear','4','20','10','2500','180','0','0','3','0','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Dark; bonus2 bAddRace,RC_DemiPlayer,10; bonus2 bAddRace,RC_Angel,10;','','');
REPLACE INTO `item_db` VALUES ('1470','Brionac','Brionac','4','20','10','3000','190','0','0','3','0','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; skill AL_HEAL,5; bonus3 bAutoSpell,MG_SOULSTRIKE,3,100; bonus2 bAddRace,RC_Boss,5;','','');
REPLACE INTO `item_db` VALUES ('1471','Hell_Fire','Hellfire','4','20','10','3500','200','0','0','3','0','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Fire; bonus3 bAutoSpell,MG_FIREBALL,3,100; bonus bStr,3;','','');
REPLACE INTO `item_db` VALUES ('1472','Staff_Of_Soul','Soul Staff','4','20','10','1400','25','0','0','1','0','8454660','63','2','34','3','73',NULL,'1','10','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,5; bonus bAgi,2; bonus bMatkRate,15;','','');
@@ -772,17 +772,17 @@ REPLACE INTO `item_db` VALUES ('1474','Gae_Bolg','Gae Bolg','4','20','10','2000'
REPLACE INTO `item_db` VALUES ('1475','Horseback_Lance','Equestrian\'s Spear','4','20','10','3700','200','0','0','4','0','16514','63','2','34','4','75',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1476','Crescent_Scythe_','Crescent Scythe','4','20','10','2500','180','0','0','3','1','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,30; bonus bHit,10;','','');
REPLACE INTO `item_db` VALUES ('1477','Spectral_Spear','Spectral Spear','4','20','10','2000','170','0','0','3','0','16514','63','2','34','4','75',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEle,Ele_Dark,20; bonus2 bAddRace,RC_Demon,20; bonus2 bAddRace,RC_Undead,20; bonus2 bSubEle,Ele_Dark,10; bonus2 bSubRace,RC_Demon,10; bonus2 bSubRace,RC_Undead,10; bonus3 bAddEff,Eff_Confusion,10000,ATF_SELF|ATF_SHORT; bonus bHPGainValue,50;','','');
-REPLACE INTO `item_db` VALUES ('1478','Ahlspiess','Ahlspiess','4','20','10','1000','120','0','0','3','0','16512','63','2','34','4','65',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_NonBoss; bonus bIgnoreDefRace,RC_Boss; bonus2 bAddRace,RC_DemiHuman,10; bonus3 bAutoSpell,KN_PIERCE,5,30;','','');
+REPLACE INTO `item_db` VALUES ('1478','Ahlspiess','Ahlspiess','4','20','10','1000','120','0','0','3','0','16512','63','2','34','4','65',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_NonBoss; bonus bIgnoreDefRace,RC_Boss; bonus2 bAddRace,RC_DemiPlayer,10; bonus3 bAutoSpell,KN_PIERCE,5,30;','','');
REPLACE INTO `item_db` VALUES ('1479','Spectral_Spear_','Spectral Spear','4','20','10','2000','170','0','0','3','1','16514','63','2','34','4','75',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEle,Ele_Dark,20; bonus2 bAddRace,RC_Demon,20; bonus2 bAddRace,RC_Undead,20; bonus2 bSubEle,Ele_Dark,10; bonus2 bSubRace,RC_Demon,10; bonus2 bSubRace,RC_Undead,10; bonus3 bAddEff,Eff_Confusion,10000,ATF_SELF|ATF_SHORT; bonus bHPGainValue,50;','','');
REPLACE INTO `item_db` VALUES ('1480','Gae_Bolg_','Gae Bolg','4','20','10','2000','160','0','0','3','2','16514','63','2','34','4','60',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_Dragon; bonus2 bAddRace,RC_Boss,10;','','');
REPLACE INTO `item_db` VALUES ('1481','Zephyrus_','Zephyrus','4','20','10','2000','170','0','0','3','3','16514','63','2','34','4','48',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus2 bAddEff,Eff_Silence,200; bonus3 bAutoSpell,MG_THUNDERSTORM,3,100;','','');
-REPLACE INTO `item_db` VALUES ('1482','BF_Lance1','Assaulter Lance','4','0','0','0','160','0','0','3','0','16514','63','2','34','3','80',NULL,'1','5','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus2 bAddRace,RC_DemiHuman,25; bonus bIgnoreDefRace,RC_DemiHuman; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1482','BF_Lance1','Assaulter Lance','4','0','0','0','160','0','0','3','0','16514','63','2','34','3','80',NULL,'1','5','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus2 bAddRace,RC_DemiPlayer,25; bonus bIgnoreDefRace,RC_DemiPlayer; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1483','Ivory_Lance','Ivory Lance','4','20','10','1000','160','0','0','3','1','16514','2','2','34','3','50',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,2; bonus bAspdRate,3; bonus2 bAddEff,Eff_Bleeding,100; bonus3 bAutoSpell,LK_JOINTBEAT,1,100; skill KN_SPEARSTAB,5;','','');
REPLACE INTO `item_db` VALUES ('1484','Cardo','Cardo','4','20','10','5600','150','0','0','3','1','128','2','2','34','4','70',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,-10; bonus bDef,getrefine()/2;','','');
REPLACE INTO `item_db` VALUES ('1485','Battle_Fork','Battle Fork','4','20','10','700','112','0','0','3','4','16514','2','2','34','2','50',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('1486','Krieger_Twohand_Spear1','Glorious Lance','4','20','10','0','220','0','0','3','0','16514','63','2','34','4','80',NULL,'1','5','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,70; bonus2 bIgnoreDefRate,RC_DemiHuman,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { if(BaseJob==Job_Knight) bonus4 bAutoSpellOnSkill,KN_PIERCE,NPC_CRITICALWOUND,2,200; else if(BaseJob==Job_Crusader) bonus3 bAutoSpell,PA_PRESSURE,5,200; }','','');
+REPLACE INTO `item_db` VALUES ('1486','Krieger_Twohand_Spear1','Glorious Lance','4','20','10','0','220','0','0','3','0','16514','63','2','34','4','80',NULL,'1','5','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,70; bonus2 bIgnoreDefRate,RC_DemiPlayer,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { if(BaseJob==Job_Knight) bonus4 bAutoSpellOnSkill,KN_PIERCE,NPC_CRITICALWOUND,2,200; else if(BaseJob==Job_Crusader) bonus3 bAutoSpell,PA_PRESSURE,5,200; }','','');
REPLACE INTO `item_db` VALUES ('1487','Lance_C','Lance','4','0','0','0','220','0','0','3','0','16514','63','2','34','3','1',NULL,'0','5','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddSize,Size_Small,50; bonus2 bAddSize,Size_Medium,50; bonus2 bAddSize,Size_Large,50;','','');
-REPLACE INTO `item_db` VALUES ('1488','Ahlspiess_C','Ahlspiess','4','20','10','0','135','0','0','3','0','16512','63','2','34','4','1',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_NonBoss; bonus bIgnoreDefRace,RC_Boss; bonus2 bAddRace,RC_DemiHuman,10; bonus3 bAutoSpell,KN_PIERCE,5,30;','','');
+REPLACE INTO `item_db` VALUES ('1488','Ahlspiess_C','Ahlspiess','4','20','10','0','135','0','0','3','0','16512','63','2','34','4','1',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_NonBoss; bonus bIgnoreDefRace,RC_Boss; bonus2 bAddRace,RC_DemiPlayer,10; bonus3 bAutoSpell,KN_PIERCE,5,30;','','');
REPLACE INTO `item_db` VALUES ('1501','Club','Club','4','120','60','700','23','0','0','1','3','312755','63','2','2','1','2',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1502','Club_','Club','4','120','60','700','23','0','0','1','4','312755','63','2','2','1','2',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1503','Club__','Club','4','120','60','700','23','0','0','1','0','312755','63','2','2','1','2',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -809,7 +809,7 @@ REPLACE INTO `item_db` VALUES ('1523','Spike','Spike','4','20','10','700','85','
REPLACE INTO `item_db` VALUES ('1524','Golden_Mace','Golden Mace','4','20','10','800','110','0','0','1','1','33040','63','2','2','4','40',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Undead,10; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1525','Long_Mace','Long Mace','4','20','10','800','135','0','0','3','0','33040','63','2','2','4','40',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bLongAtkDef,10;','','');
REPLACE INTO `item_db` VALUES ('1526','Slash','Slash','4','20','10','1000','145','0','0','1','0','33040','63','2','2','4','40',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Undead,15; bonus2 bWeaponComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5;','','');
-REPLACE INTO `item_db` VALUES ('1527','Quadrille','Quadrille','4','20','10','900','165','0','0','1','0','33040','63','2','2','4','40',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Undead,10; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddEle,Ele_Earth,10;','','');
+REPLACE INTO `item_db` VALUES ('1527','Quadrille','Quadrille','4','20','10','900','165','0','0','1','0','33040','63','2','2','4','40',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Undead,10; bonus2 bAddRace,RC_DemiPlayer,10; bonus2 bAddEle,Ele_Earth,10;','','');
REPLACE INTO `item_db` VALUES ('1528','Grand_Cross','Grand Cross','4','20','10','1500','140','0','0','1','0','33040','63','2','2','4','40',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; skill PR_TURNUNDEAD,3; bonus3 bAutoSpell,PR_TURNUNDEAD,3,100; bonus2 bSPDrainValueRace,RC_Undead,1; bonus2 bSPGainRace,RC_Undead,3;','','');
REPLACE INTO `item_db` VALUES ('1529','Iron_Driver','Iron Driver','4','20','10','3000','155','0','0','2','0','33024','63','2','2','3','78',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1530','Mjolnir','Mjolnir','4','20','10','6000','250','0','0','1','0','279714','63','2','2','4','95',NULL,'0','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus bDex,40; bonus bStr,15; bonus bAspdRate,10; bonus bUnbreakableWeapon,0;','','');
@@ -819,16 +819,16 @@ REPLACE INTO `item_db` VALUES ('1533','Warrior_Balmung','Warrior\'s Balmung','4'
REPLACE INTO `item_db` VALUES ('1534','Spanner_C','Wrench','4','2','1','0','150','0','0','1','0','33040','63','2','2','3','0',NULL,'0','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Blind,100; bonus2 bAddEff,Eff_Stun,100; bonus2 bAddEff,Eff_Poison,100; bonus2 bAddEff,Eff_Freeze,100;','','');
REPLACE INTO `item_db` VALUES ('1535','Hollgrehenn_Hammer','Hollgrehenn\'s Hammer','4','4444','2222','44','4','0','0','1','1','312754','63','2','2','4','44',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bBreakArmorRate,100; bonus bBreakWeaponRate,100; if(readparam(bStr)>=44) { bonus bBaseAtk,44; }','','');
REPLACE INTO `item_db` VALUES ('1536','Good_Morning_Star','Good Morning Star','4','20','10','0','120','0','0','1','0','312754','63','2','2','1','0',NULL,'0','8','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Boss,50; bonus2 bAddRace,RC_NonBoss,50;','','');
-REPLACE INTO `item_db` VALUES ('1537','Quadrille_C','Refined Quadrille','4','1','0','0','193','0','0','1','0','33040','63','2','2','4','0',NULL,'0','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_Demon,40; bonus2 bAddRace,RC_Undead,40;','','');
+REPLACE INTO `item_db` VALUES ('1537','Quadrille_C','Refined Quadrille','4','1','0','0','193','0','0','1','0','33040','63','2','2','4','0',NULL,'0','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,30; bonus2 bAddRace,RC_Demon,40; bonus2 bAddRace,RC_Undead,40;','','');
REPLACE INTO `item_db` VALUES ('1538','Spike_','Spike','4','20','10','700','85','0','0','1','2','33040','63','2','2','4','40',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67;','','');
REPLACE INTO `item_db` VALUES ('1539','Golden_Mace_','Golden Mace','4','20','10','800','110','0','0','1','2','33040','63','2','2','4','40',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Undead,10; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1540','Grand_Cross_','Grand Cross','4','20','10','1500','140','0','0','1','1','33040','63','2','2','4','40',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; skill PR_TURNUNDEAD,3; bonus3 bAutoSpell,PR_TURNUNDEAD,3,100; bonus2 bSPDrainValueRace,RC_Undead,1; bonus2 bSPGainRace,RC_Undead,3;','','');
REPLACE INTO `item_db` VALUES ('1541','Nemesis','Nemesis','4','20','10','900','120','0','0','1','0','33040','63','2','2','4','60',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; bonus2 bAddRace,RC_Undead,10; bonus2 bAddRace,RC_Demon,10; bonus3 bAutoSpell,AL_CRUCIS,1+getrefine(),100; autobonus \"{ bonus bBaseAtk,50; }\",10,20000,BF_WEAPON,\"{ specialeffect2 EF_BLOODDRAIN; }\";','','');
-REPLACE INTO `item_db` VALUES ('1542','BF_Morning_Star1','Valorous Battlefield Morning Star','4','20','10','0','105','0','0','1','0','312755','63','2','2','3','80',NULL,'1','8','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1543','BF_Morning_Star2','Brave Battlefield Morning Star','4','20','10','0','105','0','0','1','0','312755','63','2','2','3','80',NULL,'1','8','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus2 bAddRace,RC_DemiHuman,75; bonus bUnbreakableWeapon,0; autobonus \"{ bonus2 bAddEff,Eff_Stun,5000; }\",10,6000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\";','','');
+REPLACE INTO `item_db` VALUES ('1542','BF_Morning_Star1','Valorous Battlefield Morning Star','4','20','10','0','105','0','0','1','0','312755','63','2','2','3','80',NULL,'1','8','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1543','BF_Morning_Star2','Brave Battlefield Morning Star','4','20','10','0','105','0','0','1','0','312755','63','2','2','3','80',NULL,'1','8','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus2 bAddRace,RC_DemiPlayer,75; bonus bUnbreakableWeapon,0; autobonus \"{ bonus2 bAddEff,Eff_Stun,5000; }\",10,6000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\";','','');
REPLACE INTO `item_db` VALUES ('1544','Lunakaligo','Lunakaligo','4','20','10','700','110','0','0','1','3','33040','2','2','2','3','50',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(readparam(bStr)>=77) { bonus bAspdRate,4; bonus2 bAddEff,Eff_Stun,1500; bonus3 bAddMonsterDropItem,12065,RC_Plant,500; bonus3 bAddMonsterDropItem,12043,RC_Brute,500; bonus3 bAddMonsterDropItem,12069,RC_Fish,500; }','','');
REPLACE INTO `item_db` VALUES ('1545','N_Mace','Novice Mace','4','0','0','0','57','0','0','1','3','312755','63','2','2','1','2',NULL,'0','8','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('1546','Krieger_Onehand_Mace1','Glorious Morning Star','4','20','10','0','130','0','0','1','0','312755','63','2','2','4','80',NULL,'1','8','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; bonus bAspdRate,5; } if(getrefine()>8) { bonus2 bAddEff,Eff_Stun,2000; bonus bAspdRate,5; }','','');
+REPLACE INTO `item_db` VALUES ('1546','Krieger_Onehand_Mace1','Glorious Morning Star','4','20','10','0','130','0','0','1','0','312755','63','2','2','4','80',NULL,'1','8','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; bonus bAspdRate,5; } if(getrefine()>8) { bonus2 bAddEff,Eff_Stun,2000; bonus bAspdRate,5; }','','');
REPLACE INTO `item_db` VALUES ('1547','Mace_Of_Madness','Mace Of Madness','4','20','10','0','150','0','0','1','0','312754','63','2','2','3','0',NULL,'0','8','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,MC_CARTREVOLUTION,25; bonus bStr,2;','','');
REPLACE INTO `item_db` VALUES ('1548','Veteran_Hammer','Veteran Hammer','4','10000','5000','1800','160','0','0','1','2','33040','63','2','2','3','80',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHealPower,getskilllv(AL_DP); bonus bCritical,getskilllv(PR_MACEMASTERY)*2; bonus bInt,1; bonus bLuk,1;','','');
REPLACE INTO `item_db` VALUES ('1550','Book','Book','4','30000','15000','600','85','0','0','1','3','4260096','63','2','2','2','14',NULL,'1','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -846,7 +846,7 @@ REPLACE INTO `item_db` VALUES ('1561','Hardback','Hardcover Book','4','20','10',
REPLACE INTO `item_db` VALUES ('1562','Bible_Of_Battlefield','Battlefield Textbook','4','20','10','700','110','0','0','1','1','4260096','63','2','2','4','80',NULL,'0','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,3; bonus3 bAutoSpell,AL_BLESSING,3+(getskilllv(AL_BLESSING)>3)*(getskilllv(AL_BLESSING)-3),20;','','');
REPLACE INTO `item_db` VALUES ('1563','Diary_Of_Great_Sage_C','Sage\'s Diary','4','1','0','0','135','0','0','1','2','4260096','63','2','2','3','1',NULL,'0','15','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,20; bonus bAspdRate,5;','','');
REPLACE INTO `item_db` VALUES ('1564','Encyclopedia','Encyclopedia','4','20','10','2000','110','0','0','1','2','4260096','63','2','2','3','70',NULL,'1','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10);','','');
-REPLACE INTO `item_db` VALUES ('1565','Death_Note','Ledger of Death','4','20','10','1000','137','0','0','1','2','4260096','63','2','2','4','85',NULL,'1','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,NPC_HELLJUDGEMENT,5,20;','','');
+REPLACE INTO `item_db` VALUES ('1565','Death_Note','Ledger of Death','4','20','10','1000','137','0','0','1','2','4260096','63','2','2','4','85',NULL,'1','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiPlayer,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,NPC_HELLJUDGEMENT,5,20;','','');
REPLACE INTO `item_db` VALUES ('1566','Diary_Of_Great_Basil','Diary Of Great Basil','4','20','10','0','120','0','0','1','0','4260096','63','2','2','1','0',NULL,'0','15','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Boss,50; bonus2 bAddRace,RC_NonBoss,50;','','');
REPLACE INTO `item_db` VALUES ('1567','Hardback_C','Refined Hardcover Book','4','1','0','0','168','0','0','1','0','4260096','63','2','2','4','0',NULL,'0','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,5; bonus bDex,2; bonus bMatkRate,20;','','');
REPLACE INTO `item_db` VALUES ('1568','Book_Of_Billows_','Book of Billows','4','35000','17500','750','90','0','0','1','3','4260096','63','2','2','3','27',NULL,'1','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Water;','','');
@@ -855,12 +855,12 @@ REPLACE INTO `item_db` VALUES ('1570','Book_Of_Blazing_Sun_','Book of Blazing Su
REPLACE INTO `item_db` VALUES ('1571','Book_Of_Gust_Of_Wind_','Book of Gust of Wind','4','35000','17500','750','90','0','0','1','3','4260096','63','2','2','3','27',NULL,'1','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind;','','');
REPLACE INTO `item_db` VALUES ('1572','Principles_Of_Magic','Principles of Magic','4','20','10','300','60','0','0','1','2','4260096','63','2','2','3','60',NULL,'1','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,20; bonus bInt,3; bonus bSPrecovRate,5;','','');
REPLACE INTO `item_db` VALUES ('1573','Ancient_Magic','Ancient Magic','4','20','10','700','30','0','0','1','2','4260096','63','2','2','3','70',NULL,'1','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15;','','');
-REPLACE INTO `item_db` VALUES ('1574','BF_Book1','Brave Battle Strategy Book','4','20','10','0','90','0','0','1','0','4260096','63','2','2','3','80',NULL,'1','15','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bInt,1; bonus bMatkRate,15; bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1575','BF_Book2','Valorous Battle Strategy Book','4','20','10','0','90','0','0','1','0','4260096','63','2','2','3','80',NULL,'1','15','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bInt,1; bonus bMatkRate,15; bonus2 bIgnoreMdefRate,RC_DemiHuman,25; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1576','Krieger_Book1','Glorious Tablet','4','20','10','0','90','0','0','1','0','4260096','63','2','2','4','80',NULL,'1','15','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus2 bAddRace,RC_DemiHuman,80; bonus2 bIgnoreDefRate,RC_DemiHuman,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) autobonus \"{ bonus bBaseAtk,200; }\",30,3000,BF_WEAPON,\"{ specialeffect2 EF_BASH3D; }\";','','');
-REPLACE INTO `item_db` VALUES ('1577','Krieger_Book2','Glorious Apocalypse','4','20','10','0','90','0','0','1','0','4260096','63','2','2','4','80',NULL,'1','15','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus2 bAddRace,RC_DemiHuman,80; bonus2 bIgnoreDefRate,RC_DemiHuman,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) bonus2 bIgnoreDefRate,RC_DemiHuman,5; if(getrefine()>8) { bonus bMatkRate,5; bonus bCastrate,-5; bonus bDelayrate,-5; }','','');
+REPLACE INTO `item_db` VALUES ('1574','BF_Book1','Brave Battle Strategy Book','4','20','10','0','90','0','0','1','0','4260096','63','2','2','3','80',NULL,'1','15','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bInt,1; bonus bMatkRate,15; bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1575','BF_Book2','Valorous Battle Strategy Book','4','20','10','0','90','0','0','1','0','4260096','63','2','2','3','80',NULL,'1','15','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bInt,1; bonus bMatkRate,15; bonus2 bIgnoreMdefRate,RC_DemiPlayer,25; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1576','Krieger_Book1','Glorious Tablet','4','20','10','0','90','0','0','1','0','4260096','63','2','2','4','80',NULL,'1','15','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus2 bAddRace,RC_DemiPlayer,80; bonus2 bIgnoreDefRate,RC_DemiPlayer,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) autobonus \"{ bonus bBaseAtk,200; }\",30,3000,BF_WEAPON,\"{ specialeffect2 EF_BASH3D; }\";','','');
+REPLACE INTO `item_db` VALUES ('1577','Krieger_Book2','Glorious Apocalypse','4','20','10','0','90','0','0','1','0','4260096','63','2','2','4','80',NULL,'1','15','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus2 bAddRace,RC_DemiPlayer,80; bonus2 bIgnoreDefRate,RC_DemiPlayer,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) bonus2 bIgnoreDefRate,RC_DemiPlayer,5; if(getrefine()>8) { bonus bMatkRate,5; bonus bCastrate,-5; bonus bDelayrate,-5; }','','');
REPLACE INTO `item_db` VALUES ('1578','Book_Of_Prayer','Book Of Prayer','4','20','10','0','140','0','0','1','0','4260096','63','2','2','3','0',NULL,'0','15','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bVit,2; bonus bMdef,2; bonus bMaxSPrate,10;','','');
-REPLACE INTO `item_db` VALUES ('1579','Death_Note_M','Book of the Dead','4','20','10','1000','137','0','0','1','2','4260096','63','2','2','4','85',NULL,'1','15','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,NPC_HELLJUDGEMENT,5,20;','','');
+REPLACE INTO `item_db` VALUES ('1579','Death_Note_M','Book of the Dead','4','20','10','1000','137','0','0','1','2','4260096','63','2','2','4','85',NULL,'1','15','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiPlayer,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,NPC_HELLJUDGEMENT,5,20;','','');
REPLACE INTO `item_db` VALUES ('1580','Encyclopedia_C','Giant Encyclopedia','4','0','0','0','145','0','0','1','0','4260096','63','2','2','3','0',NULL,'0','15','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10); bonus2 bAddSize,Size_Small,40; bonus2 bAddSize,Size_Medium,40; bonus2 bAddSize,Size_Large,40;','','');
REPLACE INTO `item_db` VALUES ('1581','F_Diary_Of_Great_Sage_C','Diary Of Great Sage','4','1','0','0','135','0','0','1','2','4260096','63','2','2','3','1',NULL,'0','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('1582','E_Diary_Of_Great_Sage_C','Diary Of Great Sage','4','1','0','0','135','0','0','1','2','4260096','63','2','2','3','1',NULL,'0','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -896,16 +896,16 @@ REPLACE INTO `item_db` VALUES ('1628','Survival_Rod_C','Refined Survivor\'s Rod'
REPLACE INTO `item_db` VALUES ('1629','Walking_Stick','Gentleman\'s Staff','4','20','10','500','40','0','0','1','1','8487700','63','2','2','4','50',NULL,'1','10','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus bDex,1;','','');
REPLACE INTO `item_db` VALUES ('1630','Release_Of_Wish','Release of Wish','4','20','10','500','30','0','0','1','0','8454660','63','2','2','3','50',NULL,'1','10','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus bInt,3; bonus bHealPower,5; autobonus \"{ bonus2 bSPRegenRate,100,2000; bonus2 bHPRegenRate,50,2000; }\",10,10000,BF_MAGIC,\"{ specialeffect2 EF_HEAL; }\";','','');
REPLACE INTO `item_db` VALUES ('1631','Holy_Stick','Holy Stick','4','20','10','500','50','0','0','1','1','33024','63','2','2','4','70',NULL,'1','10','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; bonus bMatkRate,15; bonus2 bCastrate,AL_HOLYLIGHT,-25; bonus2 bCastrate,PR_TURNUNDEAD,-25; bonus2 bCastrate,PR_MAGNUS,-25;','','');
-REPLACE INTO `item_db` VALUES ('1632','BF_Staff1','Warlock\'s Magic Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','3','80',NULL,'1','10','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bInt,4; bonus bDex,3; bonus bMatkRate,15; bonus2 bIgnoreMdefRate,RC_DemiHuman,25; bonus3 bAddEff,Eff_Stun,500,ATF_SKILL; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1633','BF_Staff2','Warlock\'s Battle Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','3','80',NULL,'1','10','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bInt,3; bonus bDex,3; bonus bMatkRate,15; bonus2 bMagicAddRace,RC_DemiHuman,15; bonus3 bAddEff,Eff_Stun,500,ATF_SKILL; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1632','BF_Staff1','Warlock\'s Magic Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','3','80',NULL,'1','10','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bInt,4; bonus bDex,3; bonus bMatkRate,15; bonus2 bIgnoreMdefRate,RC_DemiPlayer,25; bonus3 bAddEff,Eff_Stun,500,ATF_SKILL; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1633','BF_Staff2','Warlock\'s Battle Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','3','80',NULL,'1','10','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bInt,3; bonus bDex,3; bonus bMatkRate,15; bonus2 bMagicAddRace,RC_DemiPlayer,15; bonus3 bAddEff,Eff_Stun,500,ATF_SKILL; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1634','BF_Staff3','Strong Recovery Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','3','80',NULL,'1','10','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15; bonus bHealPower,14; bonus2 bSPRegenRate,5,10000; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1635','BF_Staff4','Speedy Recovery Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','3','80',NULL,'1','10','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bInt,3; bonus bDex,2; bonus bMatkRate,15; bonus bDelayrate,-15; bonus2 bSPRegenRate,5,10000; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1636','Thorn_Staff','Thorn Staff of Darkness','4','20','10','700','60','0','0','1','0','99092','2','2','2','4','75',NULL,'1','10','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,3; bonus bDex,3; bonus bMatkRate,20; bonus bIgnoreMdefRate,getrefine(); bonus bDelayrate,-(getrefine()*3/2);','','');
REPLACE INTO `item_db` VALUES ('1637','Eraser','Eraser','4','20','10','500','80','0','0','1','0','99092','2','2','2','4','70',NULL,'1','10','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,20; bonus bInt,3; bonus bDex,2; bonus bSPrecovRate,8; if( getrefine()>9 ) bonus5 bAutoSpell,NPC_WIDESOULDRAIN,3,5,BF_MAGIC,0; else bonus5 bAutoSpell,NPC_WIDESOULDRAIN,1,5,BF_MAGIC,0;','','');
REPLACE INTO `item_db` VALUES ('1638','Healing_Staff_C','Staff Of Healing','4','20','10','0','10','0','0','1','0','33040','63','2','2','3','1',NULL,'0','10','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; bonus bMatkRate,15; bonus bHealPower,(getrefine()*3/2);','','');
REPLACE INTO `item_db` VALUES ('1639','N_Rod','Novice Rod','4','0','0','0','15','0','0','1','3','8487701','63','2','2','1','1',NULL,'0','10','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,16;','','');
-REPLACE INTO `item_db` VALUES ('1640','Krieger_Onehand_Staff1','Glorious Arc Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','4','80',NULL,'1','10','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bMagicAddRace,RC_DemiHuman,15; bonus2 bIgnoreMdefRate,RC_DemiHuman,25 + ((getrefine()>5) ? 5 : 0); bonus bUnbreakableWeapon,0; if(getrefine()>8) { bonus bCastrate,-5; bonus bDelayrate,-5; bonus bMatkRate,5; }','','');
-REPLACE INTO `item_db` VALUES ('1641','Krieger_Onehand_Staff2','Glorious Cure Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','4','80',NULL,'1','10','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bHealPower,14; bonus bDelayrate,-10; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bIgnoreMdefRate,RC_DemiHuman,5; bonus bHealPower,5+(getrefine()-5)*2; } if(getrefine()>8) bonus5 bAutoSpellOnSkill,AL_HEAL,AL_HEAL,10,100,1; if(getrefine()>9) { bonus bHealPower,10; }','','');
+REPLACE INTO `item_db` VALUES ('1640','Krieger_Onehand_Staff1','Glorious Arc Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','4','80',NULL,'1','10','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bMagicAddRace,RC_DemiPlayer,15; bonus2 bIgnoreMdefRate,RC_DemiPlayer,25 + ((getrefine()>5) ? 5 : 0); bonus bUnbreakableWeapon,0; if(getrefine()>8) { bonus bCastrate,-5; bonus bDelayrate,-5; bonus bMatkRate,5; }','','');
+REPLACE INTO `item_db` VALUES ('1641','Krieger_Onehand_Staff2','Glorious Cure Wand','4','20','10','0','70','0','0','1','0','8487700','63','2','2','4','80',NULL,'1','10','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bHealPower,14; bonus bDelayrate,-10; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bIgnoreMdefRate,RC_DemiPlayer,5; bonus bHealPower,5+(getrefine()-5)*2; } if(getrefine()>8) bonus5 bAutoSpellOnSkill,AL_HEAL,AL_HEAL,10,100,1; if(getrefine()>9) { bonus bHealPower,10; }','','');
REPLACE INTO `item_db` VALUES ('1642','Staff_Of_Darkness','Staff Of Darkness','4','20','10','0','100','0','0','1','0','8487700','63','2','2','2','0',NULL,'0','10','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bCastrate,-5; bonus bMatkRate,15; bonus bInt,2;','','');
REPLACE INTO `item_db` VALUES ('1643','Dead_Tree_Cane','Dead Tree Cane','4','20','10','100','100','0','0','1','0','8487700','63','2','2','4','70',NULL,'1','10','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatk,15; bonus bInt,4; if(getrefine()>5) { bonus bInt,getrefine()-5; bonus bMaxHP,-200; bonus bMaxSP,-100; }','','');
REPLACE INTO `item_db` VALUES ('1644','Piercing_Staff_M','Staff of Piercing','4','20','10','500','80','0','0','1','0','99092','2','2','2','3','70',NULL,'1','10','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bInt,4; bonus bMatkRate,15; bonus bIgnoreMdefRate,10+getrefine();','','');
@@ -949,12 +949,12 @@ REPLACE INTO `item_db` VALUES ('1734','Orc_Archer_Bow','Orc Archer Bow','4','20'
REPLACE INTO `item_db` VALUES ('1735','Kkakkung','Kkakkung','4','20','10','0','120','0','0','5','0','657480','63','2','34','1','1',NULL,'0','11','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Boss,50; bonus2 bAddRace,RC_NonBoss,50;','','');
REPLACE INTO `item_db` VALUES ('1736','Double_Bound','Double Bound','4','20','10','900','70','0','0','5','3','2048','2','2','34','3','70',NULL,'1','11','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpell,AC_DOUBLE,getskilllv(AC_DOUBLE),10;','','');
REPLACE INTO `item_db` VALUES ('1737','Ixion_Wing','Ixion Wings','4','20','10','300','135','0','0','5','1','2048','2','2','34','4','70',NULL,'1','11','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','autobonus \"{ bonus bAspdRate,7; }\",10+(getrefine()*2),7000,BF_WEAPON,\"{ specialeffect2 EF_HASTEUP; }\"; bonus2 bAddSkillBlow,AC_CHARGEARROW,3;','','');
-REPLACE INTO `item_db` VALUES ('1738','BF_Bow1','Valorous Battle CrossBow','4','0','0','0','100','0','0','5','0','657480','63','2','34','3','80',NULL,'1','11','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1739','BF_Bow2','Brave Battle CrossBow','4','0','0','0','100','0','0','5','0','657480','63','2','34','3','80',NULL,'1','11','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bInt,10; bonus2 bAddRace,RC_DemiHuman,55; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1738','BF_Bow1','Valorous Battle CrossBow','4','0','0','0','100','0','0','5','0','657480','63','2','34','3','80',NULL,'1','11','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiPlayer,55; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1739','BF_Bow2','Brave Battle CrossBow','4','0','0','0','100','0','0','5','0','657480','63','2','34','3','80',NULL,'1','11','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bInt,10; bonus2 bAddRace,RC_DemiPlayer,55; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1740','Nepenthes_Bow','Nepenthes Bow','4','20','10','1000','105','0','0','5','2','2048','2','2','34','4','60',NULL,'1','11','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus4 bAutoSpellOnSkill,AC_DOUBLE,AC_CHARGEARROW,1,20;','','');
REPLACE INTO `item_db` VALUES ('1741','Cursed_Lyre','Cursed Lyre','4','20','10','1250','125','0','0','5','1','526344','2','2','34','4','80',NULL,'1','11','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,-2; bonus2 bAddEff,Eff_Curse,400;','','');
REPLACE INTO `item_db` VALUES ('1742','N_Composite_Bow','Novice Composite Bow','4','1','0','0','49','0','0','5','3','657480','63','2','34','1','4',NULL,'0','11','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('1743','Krieger_Bow1','Glorious Hunter Bow','4','0','0','0','100','0','0','5','0','1706056','63','2','34','4','80',NULL,'1','11','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bCritAtkRate,getrefine() * 2; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) bonus2 bSkillAtk,AC_DOUBLE,20;','','');
+REPLACE INTO `item_db` VALUES ('1743','Krieger_Bow1','Glorious Hunter Bow','4','0','0','0','100','0','0','5','0','1706056','63','2','34','4','80',NULL,'1','11','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,55; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bCritAtkRate,getrefine() * 2; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) bonus2 bSkillAtk,AC_DOUBLE,20;','','');
REPLACE INTO `item_db` VALUES ('1744','Bow_Of_Evil','Bow Of Evil','4','0','0','0','170','0','0','5','0','657480','63','2','34','4','1',NULL,'0','11','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,AC_DOUBLE,25; bonus bDex,2;','','');
REPLACE INTO `item_db` VALUES ('1745','Falken_Blitz','Falken Blitz','4','0','0','1000','100','0','0','5','2','526344','2','2','34','3','50',NULL,'1','11','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,SN_SHARPSHOOTING,10; bonus2 bSkillAtk,AC_DOUBLE,10; bonus2 bSkillAtk,AC_CHARGEARROW,10;','','');
REPLACE INTO `item_db` VALUES ('1750','Arrow','Arrow','10','1','0','1','25','0','0','0','0','661576','63','2','32768','0','1',NULL,'0','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -1002,11 +1002,11 @@ REPLACE INTO `item_db` VALUES ('1819','Icicle_Fist','Icicle Fist','4','20','10',
REPLACE INTO `item_db` VALUES ('1820','Electric_Fist','Electric Fist','4','20','10','650','80','0','0','1','3','33024','63','2','2','3','75',NULL,'1','12','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpell,SA_LIGHTNINGLOADER,5,10;','','');
REPLACE INTO `item_db` VALUES ('1821','Seismic_Fist','Seismic Fist','4','20','10','650','80','0','0','1','3','33024','63','2','2','3','75',NULL,'1','12','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpell,SA_SEISMICWEAPON,5,10;','','');
REPLACE INTO `item_db` VALUES ('1822','Combo_Battle_Glove','Combo Battle Glove','4','20','10','500','30','0','0','1','4','33024','63','2','2','3','60',NULL,'1','12','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,MO_TRIPLEATTACK,15; bonus2 bSkillAtk,MO_CHAINCOMBO,15; bonus2 bSkillAtk,MO_COMBOFINISH,20;','','');
-REPLACE INTO `item_db` VALUES ('1823','BF_Knuckle1','Valorous Battle Fist','4','20','10','0','30','0','0','1','0','33024','63','2','2','3','80',NULL,'1','12','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bAgi,1; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus4 bAutoSpell,CH_SOULCOLLECT,1,5,0; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1824','BF_Knuckle2','Brave Battle Fist','4','20','10','0','30','0','0','1','0','33024','63','2','2','3','80',NULL,'1','12','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bInt,1; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bCastrate,MO_EXTREMITYFIST,-25; autobonus \"{ bonus2 bCastrate,MO_EXTREMITYFIST,-100; }\",50,6000,BF_WEAPON,\"{ specialeffect2 EF_SUFFRAGIUM; }\"; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1823','BF_Knuckle1','Valorous Battle Fist','4','20','10','0','30','0','0','1','0','33024','63','2','2','3','80',NULL,'1','12','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bAgi,1; bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus4 bAutoSpell,CH_SOULCOLLECT,1,5,0; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1824','BF_Knuckle2','Brave Battle Fist','4','20','10','0','30','0','0','1','0','33024','63','2','2','3','80',NULL,'1','12','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bInt,1; bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bCastrate,MO_EXTREMITYFIST,-25; autobonus \"{ bonus2 bCastrate,MO_EXTREMITYFIST,-100; }\",50,6000,BF_WEAPON,\"{ specialeffect2 EF_SUFFRAGIUM; }\"; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1825','Horn_Of_Hilthrion','Horn of Hillslion','4','20','10','600','95','0','0','1','3','32768','2','2','2','3','60',NULL,'1','12','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpell,NPC_CRITICALWOUND,1,100; bonus4 bAutoSpellOnSkill,CH_PALMSTRIKE,MO_INVESTIGATE,1,100; bonus3 bAutoSpell,MO_CALLSPIRITS,5,100;','','');
-REPLACE INTO `item_db` VALUES ('1826','Krieger_Knuckle1','Glorious Claw','4','20','10','0','30','0','0','1','0','33024','63','2','2','4','80',NULL,'1','12','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { bonus3 bAutoSpell,MO_INVESTIGATE,5,(getrefine()*10-50); bonus3 bAutoSpell,AL_DECAGI,1,(getrefine()*10-50); }','','');
-REPLACE INTO `item_db` VALUES ('1827','Krieger_Knuckle2','Glorious Fist','4','20','10','0','30','0','0','1','0','33024','63','2','2','4','80',NULL,'1','12','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { bonus2 bCastrate,MO_EXTREMITYFIST,-100; bonus4 bAutoSpellOnSkill,MO_EXPLOSIONSPIRITS,CH_SOULCOLLECT,1,1000; }','','');
+REPLACE INTO `item_db` VALUES ('1826','Krieger_Knuckle1','Glorious Claw','4','20','10','0','30','0','0','1','0','33024','63','2','2','4','80',NULL,'1','12','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { bonus3 bAutoSpell,MO_INVESTIGATE,5,(getrefine()*10-50); bonus3 bAutoSpell,AL_DECAGI,1,(getrefine()*10-50); }','','');
+REPLACE INTO `item_db` VALUES ('1827','Krieger_Knuckle2','Glorious Fist','4','20','10','0','30','0','0','1','0','33024','63','2','2','4','80',NULL,'1','12','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { bonus2 bCastrate,MO_EXTREMITYFIST,-100; bonus4 bAutoSpellOnSkill,MO_EXPLOSIONSPIRITS,CH_SOULCOLLECT,1,1000; }','','');
REPLACE INTO `item_db` VALUES ('1828','Monk_Knuckle','Monk Knuckle','4','20','10','0','150','0','0','1','0','33024','63','2','2','4','0',NULL,'0','12','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; bonus2 bSkillAtk,MO_FINGEROFFENSIVE,25;','','');
REPLACE INTO `item_db` VALUES ('1829','Fist_C','Fist','4','0','0','0','150','0','0','1','0','33024','63','2','2','3','1',NULL,'0','12','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddSize,Size_Small,40; bonus2 bAddSize,Size_Medium,40; bonus2 bAddSize,Size_Large,40;','','');
REPLACE INTO `item_db` VALUES ('1901','Violin','Violin','4','4000','2000','700','50','0','0','1','3','524288','63','1','2','1','2',NULL,'1','13','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -1031,11 +1031,11 @@ REPLACE INTO `item_db` VALUES ('1919','Base_Guitar','Bass Guitar','4','20','10',
REPLACE INTO `item_db` VALUES ('1920','Berserk_Guitar','Berserk Guitar','4','20','10','1800','10','0','0','1','0','524288','2','1','2','4','70',NULL,'1','13','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,100; bonus bHPrecovRate,-100; bonus2 bHPLossRate,50,5000; bonus bDex,-readparam(bDex);','','');
REPLACE INTO `item_db` VALUES ('1921','Guh_Moon_Gom','Gun Moon Gom','4','20','10','0','120','0','0','1','0','524288','63','1','2','1','0',NULL,'0','13','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Boss,50; bonus2 bAddRace,RC_NonBoss,50;','','');
REPLACE INTO `item_db` VALUES ('1922','Oriental_Lute_','Oriental Lute','4','20','10','1200','150','0','0','1','2','524288','63','1','2','4','65',NULL,'1','13','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,CG_ARROWVULCAN,10; bonus2 bSkillAtk,BA_MUSICALSTRIKE,10;','','');
-REPLACE INTO `item_db` VALUES ('1923','BF_Instrument1','Valorous Battlefield Guitar','4','20','10','0','50','0','0','1','0','524288','63','1','2','3','80',NULL,'1','13','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1924','BF_Instrument2','Brave Battlefield Guitar','4','20','10','0','50','0','0','1','0','524288','63','1','2','3','80',NULL,'1','13','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bSkillAtk,CG_ARROWVULCAN,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1923','BF_Instrument1','Valorous Battlefield Guitar','4','20','10','0','50','0','0','1','0','524288','63','1','2','3','80',NULL,'1','13','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1924','BF_Instrument2','Brave Battlefield Guitar','4','20','10','0','50','0','0','1','0','524288','63','1','2','3','80',NULL,'1','13','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bSkillAtk,CG_ARROWVULCAN,20; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1925','Cello','Cello','4','20','10','700','110','0','0','1','3','524288','2','1','2','3','70',NULL,'1','13','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,2; bonus bDex,3; bonus2 bAddSkillBlow,BA_MUSICALSTRIKE,2; bonus2 bAddSkillBlow,CG_ARROWVULCAN,3;','','');
REPLACE INTO `item_db` VALUES ('1926','Harp_Of_Nepenthes','Harp of Nepenthes','4','20','10','1000','120','0','0','1','2','524288','2','1','2','4','60',NULL,'1','13','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; if( getrefine()>9 ) { bonus3 bAddEffOnSkill,BA_MUSICALSTRIKE,Eff_Stun,2000; } else { bonus3 bAddEffOnSkill,BA_MUSICALSTRIKE,Eff_Stun,1000; }','','');
-REPLACE INTO `item_db` VALUES ('1927','Krieger_Instrument1','Glorious Guitar','4','20','10','0','50','0','0','1','0','524288','63','1','2','4','80',NULL,'1','13','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) bonus4 bAutoSpellOnSkill,CG_ARROWVULCAN,CG_TAROTCARD,5,100;','','');
+REPLACE INTO `item_db` VALUES ('1927','Krieger_Instrument1','Glorious Guitar','4','20','10','0','50','0','0','1','0','524288','63','1','2','4','80',NULL,'1','13','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) bonus4 bAutoSpellOnSkill,CG_ARROWVULCAN,CG_TAROTCARD,5,100;','','');
REPLACE INTO `item_db` VALUES ('1928','Berserk_Guitar_I','Spirited Guitar','4','0','0','0','40','0','0','1','0','524288','2','1','2','4','0',NULL,'0','13','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,100; bonus bHPrecovRate,-100; bonus2 bHPLossRate,50,5000; bonus bDex,-readparam(bDex);','','');
REPLACE INTO `item_db` VALUES ('1929','Guitar_C','Guitar','4','0','0','0','177','0','0','1','0','524288','63','1','2','3','1',NULL,'0','13','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddSize,Size_Small,40; bonus2 bAddSize,Size_Medium,40; bonus2 bAddSize,Size_Large,40;','','');
REPLACE INTO `item_db` VALUES ('1950','Rope','Rope','4','2500','1250','400','45','0','0','2','3','524288','63','0','2','1','3',NULL,'1','14','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -1065,16 +1065,16 @@ REPLACE INTO `item_db` VALUES ('1973','Sea_Witch_Foot','Sea Witch\'s Foot','4','
REPLACE INTO `item_db` VALUES ('1974','Carrot_Whip','Carrot Whip','4','20','10','1300','185','0','0','2','0','524288','2','0','2','4','70',NULL,'1','14','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(getrefine()>0) bonus3 bAutoSpell,AL_INCAGI,getrefine(),10;','','');
REPLACE INTO `item_db` VALUES ('1975','Queen_Is_Whip','Queen Is Whip','4','20','10','0','120','0','0','2','0','524288','63','0','2','1','0',NULL,'0','14','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Boss,50; bonus2 bAddRace,RC_NonBoss,50;','','');
REPLACE INTO `item_db` VALUES ('1976','Queen\'s_Whip_','Queen\'s Whip','4','20','10','1100','150','0','0','2','2','524288','63','0','2','4','65',NULL,'1','14','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,CG_ARROWVULCAN,10; bonus2 bSkillAtk,DC_THROWARROW,10;','','');
-REPLACE INTO `item_db` VALUES ('1977','BF_Whip1','Valorous Battle Lariat','4','20','10','0','50','0','0','2','0','524288','63','0','2','3','80',NULL,'1','14','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('1978','BF_Whip2','Brave Battle Lariat','4','20','10','0','50','0','0','2','0','524288','63','0','2','3','80',NULL,'1','14','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bSkillAtk,CG_ARROWVULCAN,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1977','BF_Whip1','Valorous Battle Lariat','4','20','10','0','50','0','0','2','0','524288','63','0','2','3','80',NULL,'1','14','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('1978','BF_Whip2','Brave Battle Lariat','4','20','10','0','50','0','0','2','0','524288','63','0','2','3','80',NULL,'1','14','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bSkillAtk,CG_ARROWVULCAN,20; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('1979','Stem_Of_Nepenthes','Stem of Nepenthes','4','20','10','1000','120','0','0','2','2','524288','2','0','2','4','60',NULL,'1','14','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; if( getrefine()>=9 ) { bonus3 bAddEffOnSkill,DC_THROWARROW,Eff_Freeze,2000; } else { bonus3 bAddEffOnSkill,DC_THROWARROW,Eff_Freeze,1000; }','','');
REPLACE INTO `item_db` VALUES ('1980','Whip_Of_Balance','Whip of Balance','4','20','10','700','110','0','0','2','3','524288','2','0','2','3','70',NULL,'1','14','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,2; bonus bDex,3; bonus2 bAddSkillBlow,DC_THROWARROW,2; bonus2 bAddSkillBlow,CG_ARROWVULCAN,3;','','');
-REPLACE INTO `item_db` VALUES ('1981','Krieger_Whip1','Glorious Lariat','4','20','10','0','50','0','0','2','0','524288','63','0','2','4','80',NULL,'1','14','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) bonus4 bAutoSpellOnSkill,CG_ARROWVULCAN,CG_TAROTCARD,5,100;','','');
+REPLACE INTO `item_db` VALUES ('1981','Krieger_Whip1','Glorious Lariat','4','20','10','0','50','0','0','2','0','524288','63','0','2','4','80',NULL,'1','14','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) bonus4 bAutoSpellOnSkill,CG_ARROWVULCAN,CG_TAROTCARD,5,100;','','');
REPLACE INTO `item_db` VALUES ('1982','Phenomena_Whip','Phenomena Whip','4','20','10','0','160','0','0','2','0','524288','63','0','2','4','0',NULL,'0','14','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bSkillAtk,DC_THROWARROW,25;','','');
REPLACE INTO `item_db` VALUES ('1983','Rante_C','Rante Whip','4','0','0','0','170','0','0','2','0','524288','63','0','2','3','1',NULL,'0','14','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddSize,Size_Small,40; bonus2 bAddSize,Size_Medium,40; bonus2 bAddSize,Size_Large,40;','','');
REPLACE INTO `item_db` VALUES ('2000','Destruction_Rod','Staff of Destruction','4','20','10','2500','130','0','0','1','1','512','2','2','34','4','80',NULL,'1','23','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,25+getrefine()/2; bonus bInt,3; bonus bAgi,10; bonus bUseSPrate,(getrefine()*2); bonus3 bAutoSpellWhenHit,WZ_JUPITEL,5,(getrefine()*20); bonus2 bCastrate,HW_MAGICPOWER,-50;','','');
REPLACE INTO `item_db` VALUES ('2001','Divine_Cross','Divine Cross','4','20','10','1500','120','0','0','1','0','33024','63','2','34','4','70',NULL,'1','23','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; bonus bMatkRate,15; bonus bDex,4; bonus2 bSubRace,RC_Demon,15; bonus2 bSubRace,RC_Undead,15;','','');
-REPLACE INTO `item_db` VALUES ('2002','Krieger_Twohand_Staff1','Glorious Destruction Staff','4','20','10','0','70','0','0','1','0','99092','63','2','34','4','80',NULL,'1','23','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,getrefine(); bonus2 bMagicAddRace,RC_DemiHuman,15; bonus2 bIgnoreMdefRate,RC_DemiHuman,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bMagicAddRace,RC_DemiHuman,(getrefine()-5)*2; bonus2 bIgnoreMdefRate,RC_DemiHuman,5+(getrefine()-5)*2; } if(getrefine()>8) { bonus5 bAutoSpellOnSkill,WZ_STORMGUST,MG_SAFETYWALL,10,200,1; bonus5 bAutoSpellOnSkill,WZ_METEOR,MG_SAFETYWALL,10,200,1; bonus5 bAutoSpellOnSkill,WZ_VERMILION,MG_SAFETYWALL,10,200,1; }','','');
+REPLACE INTO `item_db` VALUES ('2002','Krieger_Twohand_Staff1','Glorious Destruction Staff','4','20','10','0','70','0','0','1','0','99092','63','2','34','4','80',NULL,'1','23','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,getrefine(); bonus2 bMagicAddRace,RC_DemiPlayer,15; bonus2 bIgnoreMdefRate,RC_DemiPlayer,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bMagicAddRace,RC_DemiPlayer,(getrefine()-5)*2; bonus2 bIgnoreMdefRate,RC_DemiPlayer,5+(getrefine()-5)*2; } if(getrefine()>8) { bonus5 bAutoSpellOnSkill,WZ_STORMGUST,MG_SAFETYWALL,10,200,1; bonus5 bAutoSpellOnSkill,WZ_METEOR,MG_SAFETYWALL,10,200,1; bonus5 bAutoSpellOnSkill,WZ_VERMILION,MG_SAFETYWALL,10,200,1; }','','');
REPLACE INTO `item_db` VALUES ('2003','Destruction_Rod_M','Staff of Destruction','4','20','10','2500','130','0','0','1','1','512','2','2','34','4','80',NULL,'1','23','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,25+getrefine()/2; bonus bInt,3; bonus bAgi,10; bonus bUseSPrate,(getrefine()*2); bonus3 bAutoSpellWhenHit,WZ_JUPITEL,5,(getrefine()*20); bonus2 bCastrate,HW_MAGICPOWER,-50;','','');
REPLACE INTO `item_db` VALUES ('2004','Kronos','Kronos','4','20','10','1000','30','0','0','1','0','66052','2','2','34','4','50',NULL,'1','23','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,20; bonus bInt,3+(getrefine()/2); bonus bMaxHP,300+(50*getrefine()/2); autobonus \"{ bonus bMatkRate,12; bonus buseSPRate,20; }\",1,5000,BF_MAGIC,\"{ specialeffect2 EF_ENHANCE; }\";','','');
REPLACE INTO `item_db` VALUES ('2005','Dea_Staff','Dea Staff','4','20','10','1000','30','0','0','1','1','33040','2','2','34','3','50',NULL,'1','23','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy; bonus bMatkRate,15+getrefine()/2; bonus bInt,6; bonus bVit,2; autobonus3 \"{ }\",20,1000,AL_HEAL,\"{ specialeffect2 EF_MAGICALATTHIT; heal 0,200; }\";','','');
@@ -1117,7 +1117,7 @@ REPLACE INTO `item_db` VALUES ('2135','Shadow_Guard','Shadow Guard','5','20','10
REPLACE INTO `item_db` VALUES ('2136','Cracked_Buckler','Cracked Buckler','5','0','0','0','0','0','5','0','0','4294967295','63','2','32','0','0',NULL,'0','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,2; bonus2 bAddEle,Ele_Neutral,-10; bonus3 bAutoSpellWhenHit,PR_KYRIE,1,50; bonus bMdef,1;','','');
REPLACE INTO `item_db` VALUES ('2137','Valkyrja\'s_Shield_C','Neo Valkyrja\'s Shield','5','0','0','0','0','0','5','0','0','2147483646','2','2','32','0','95',NULL,'0','4','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Water,20; bonus2 bSubEle,Ele_Fire,20; bonus2 bSubEle,Ele_Dark,20; bonus2 bSubEle,Ele_Undead,20; bonus bMdef,5;','','');
REPLACE INTO `item_db` VALUES ('2138','Bradium_Shield','Bradium Shield','5','20','10','1800','0','0','5','0','1','13631360','2','2','32','0','65',NULL,'1','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,CR_SHIELDBOOMERANG,60; bonus bAgi,-1; bonus bMaxHP,500;','','');
-REPLACE INTO `item_db` VALUES ('2199','Ahura_Mazda','Ahura Mazdah','5','1','0','10','0','0','100','0','0','4294967295','63','2','32','0','1',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,50; bonus bMdef,99; bonus bShortWeaponDamageReturn,100; bonus2 bSubRace,RC_DemiHuman,95; skill CR_FULLPROTECTION,5; skill WZ_ESTIMATION,1; skill ST_FULLSTRIP,5; skill HW_MAGICPOWER,10; bonus bMaxHPrate,200; bonus bNoGemStone,0; bonus bSpeedRate,25;','sc_start4 SC_ENDURE,60000,10,0,0,1;','sc_end SC_ENDURE;');
+REPLACE INTO `item_db` VALUES ('2199','Ahura_Mazda','Ahura Mazdah','5','1','0','10','0','0','100','0','0','4294967295','63','2','32','0','1',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,50; bonus bMdef,99; bonus bShortWeaponDamageReturn,100; bonus2 bSubRace,RC_DemiPlayer,95; skill CR_FULLPROTECTION,5; skill WZ_ESTIMATION,1; skill ST_FULLSTRIP,5; skill HW_MAGICPOWER,10; bonus bMaxHPrate,200; bonus bNoGemStone,0; bonus bSpeedRate,25;','sc_start4 SC_ENDURE,60000,10,0,0,1;','sc_end SC_ENDURE;');
REPLACE INTO `item_db` VALUES ('2201','Sunglasses','Sunglasses','5','5000','2500','100','0','0','0','0','0','4294967295','63','2','512','0','0',NULL,'0','12','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Blind,500;','','');
REPLACE INTO `item_db` VALUES ('2202','Sunglasses_','Sunglasses','5','5000','2500','100','0','0','0','0','1','4294967295','63','2','512','0','0',NULL,'0','12','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Blind,500;','','');
REPLACE INTO `item_db` VALUES ('2203','Glasses','Glasses','5','4000','2000','100','0','0','0','0','0','4294967295','63','2','512','0','0',NULL,'0','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -1205,9 +1205,9 @@ REPLACE INTO `item_db` VALUES ('2285','Apple_Of_Archer','Apple of Archer','5','2
REPLACE INTO `item_db` VALUES ('2286','Elven_Ears','Elven Ears','5','20','10','100','0','0','0','0','0','2147483646','63','2','512','0','70',NULL,'0','73','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('2287','Pirate_Bandana','Pirate Bandana','5','20','10','100','0','0','3','0','0','2147483646','63','2','256','0','0',NULL,'1','74','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1;','','');
REPLACE INTO `item_db` VALUES ('2288','Mr_Scream','Mr. Scream','5','20','10','100','0','0','1','0','0','2147483646','63','2','513','0','0',NULL,'0','75','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('2289','Poo_Poo_Hat','Poo Poo Hat','5','20','10','700','0','0','0','0','0','4294967295','63','2','256','0','0',NULL,'0','76','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,10;','','');
+REPLACE INTO `item_db` VALUES ('2289','Poo_Poo_Hat','Poo Poo Hat','5','20','10','700','0','0','0','0','0','4294967295','63','2','256','0','0',NULL,'0','76','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,10;','','');
REPLACE INTO `item_db` VALUES ('2290','Funeral_Costume','Funeral Hat','5','3000','1500','100','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'0','77','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('2291','Masquerade','Masquerade','5','20','10','100','0','0','0','0','0','2147483646','63','2','512','0','0',NULL,'0','78','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,3;','','');
+REPLACE INTO `item_db` VALUES ('2291','Masquerade','Masquerade','5','20','10','100','0','0','0','0','0','2147483646','63','2','512','0','0',NULL,'0','78','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,3;','','');
REPLACE INTO `item_db` VALUES ('2292','Welding_Mask','Welding Mask','5','20','10','300','0','0','2','0','0','263200','63','2','513','0','50',NULL,'0','79','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Fire,10;','','');
REPLACE INTO `item_db` VALUES ('2293','Pretend_Murdered','Pretend Murdered','5','20','10','100','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'0','80','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('2294','Star_Dust','Stellar','5','20','10','100','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'1','81','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -1281,20 +1281,20 @@ REPLACE INTO `item_db` VALUES ('2365','Orleans_Gown','Orleans\'s Gown','5','20',
REPLACE INTO `item_db` VALUES ('2366','Divine_Cloth','Divine Cloth','5','20','10','1500','0','0','6','0','1','2147483646','2','2','16','0','55',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Curse,500; bonus2 bResEff,Eff_Silence,500; bonus2 bResEff,Eff_Stun,500; bonus2 bResEff,Eff_Stone,500; bonus2 bResEff,Eff_Sleep,500;','','');
REPLACE INTO `item_db` VALUES ('2367','Sniping_Suit','Sniping Suit','5','20','10','750','0','0','5','0','1','2048','2','2','16','0','50',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5; bonus bCritical,6+(readparam(bLuk)/10); bonus bDelayrate,-23;','','');
REPLACE INTO `item_db` VALUES ('2368','Golden_Armor','Golden Armor','5','20','10','2000','0','0','4','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,4;','','');
-REPLACE INTO `item_db` VALUES ('2369','Freyja_Overcoat','Freyja Overcoat','5','0','0','500','0','0','12','0','0','2147483646','63','2','16','0','0',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableArmor,0; bonus2 bSubRace,RC_DemiHuman,10;','','');
+REPLACE INTO `item_db` VALUES ('2369','Freyja_Overcoat','Freyja Overcoat','5','0','0','500','0','0','12','0','0','2147483646','63','2','16','0','0',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableArmor,0; bonus2 bSubRace,RC_DemiPlayer,10;','','');
REPLACE INTO `item_db` VALUES ('2370','Used_Mage_Coat','Used Mage Coat','5','0','0','0','0','0','15','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,300; bonus bMaxSP,30; bonus bBaseAtk,10; bonus bAgi,1;','','');
REPLACE INTO `item_db` VALUES ('2371','G_Strings_','Pantie','5','1000','500','100','0','0','4','0','1','4294967295','63','2','16','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('2372','Mage_Coat_','Mage Coat','5','20','10','600','0','0','5','0','1','8454660','63','2','16','0','50',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5; bonus bInt,1;','','');
REPLACE INTO `item_db` VALUES ('2373','Holy_Robe_','Holy Robe','5','20','10','1700','0','0','7','0','1','33040','63','2','16','0','60',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5; bonus2 bSubRace,RC_Demon,15; bonus2 bSubEle,Ele_Dark,10;','','');
REPLACE INTO `item_db` VALUES ('2374','Diabolus_Robe','Diabolus Robe','5','20','10','300','0','0','6','0','1','625436','2','2','16','0','55',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxSP,150; bonus bMdef,5; bonus bHealPower,6; bonus bDelayrate,-10;','','');
REPLACE INTO `item_db` VALUES ('2375','Diabolus_Armor','Diabolus Armor','5','20','10','600','0','0','7','0','1','414946','2','2','16','0','55',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bDex,1; bonus bMaxHP,150; bonus2 bResEff,Eff_Stun,500; bonus2 bResEff,Eff_Stone,500;','','');
-REPLACE INTO `item_db` VALUES ('2376','Assaulter_Plate','Assaulter Plate','5','10','5','0','0','0','7','0','1','6571170','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiHuman,2;','','');
-REPLACE INTO `item_db` VALUES ('2377','Elite_Engineer_Armor','Elite Engineer Armor','5','10','5','0','0','0','7','0','1','263200','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiHuman,2;','','');
-REPLACE INTO `item_db` VALUES ('2378','Assassin_Robe','Assassin Robe','5','10','5','0','0','0','7','0','1','33689664','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiHuman,2;','','');
-REPLACE INTO `item_db` VALUES ('2379','Warlock_Battle_Robe','Warlock\'s Battle Robe','5','10','5','0','0','0','3','0','1','8454660','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiHuman,2;','','');
-REPLACE INTO `item_db` VALUES ('2380','Medic_Robe','Medic\'s Robe','5','10','5','0','0','0','3','0','1','33040','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiHuman,2;','','');
-REPLACE INTO `item_db` VALUES ('2381','Elite_Archer_Suit','Elite Archer Suit','5','10','5','0','0','0','3','0','1','526344','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiHuman,2;','','');
-REPLACE INTO `item_db` VALUES ('2382','Elite_Shooter_Suit','Elite Shooter Suit','5','10','5','0','0','0','3','0','1','16777216','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiHuman,2;','','');
+REPLACE INTO `item_db` VALUES ('2376','Assaulter_Plate','Assaulter Plate','5','10','5','0','0','0','7','0','1','6571170','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiPlayer,2;','','');
+REPLACE INTO `item_db` VALUES ('2377','Elite_Engineer_Armor','Elite Engineer Armor','5','10','5','0','0','0','7','0','1','263200','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiPlayer,2;','','');
+REPLACE INTO `item_db` VALUES ('2378','Assassin_Robe','Assassin Robe','5','10','5','0','0','0','7','0','1','33689664','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiPlayer,2;','','');
+REPLACE INTO `item_db` VALUES ('2379','Warlock_Battle_Robe','Warlock\'s Battle Robe','5','10','5','0','0','0','3','0','1','8454660','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiPlayer,2;','','');
+REPLACE INTO `item_db` VALUES ('2380','Medic_Robe','Medic\'s Robe','5','10','5','0','0','0','3','0','1','33040','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiPlayer,2;','','');
+REPLACE INTO `item_db` VALUES ('2381','Elite_Archer_Suit','Elite Archer Suit','5','10','5','0','0','0','3','0','1','526344','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiPlayer,2;','','');
+REPLACE INTO `item_db` VALUES ('2382','Elite_Shooter_Suit','Elite Shooter Suit','5','10','5','0','0','0','3','0','1','16777216','63','2','16','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,150; bonus bMdef,2; bonus2 bSubRace,RC_DemiPlayer,2;','','');
REPLACE INTO `item_db` VALUES ('2383','Brynhild','Brynhild','5','20','10','400','0','0','10','0','0','4294967295','63','2','16','0','94',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,10; bonus bMaxHP,20*BaseLevel; bonus bMaxSP,5*BaseLevel; bonus2 bAddRace,RC_NonBoss,10; bonus2 bAddRace,RC_Boss,10; bonus bMatkRate,10; bonus bUnbreakableArmor,0; bonus bNoKnockback,0;','','');
REPLACE INTO `item_db` VALUES ('2384','Spritual_Tunic','Spiritual Tunic','5','20','10','0','0','0','10','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,800; bonus2 bResEff,Eff_Freeze,10000; bonus2 bSubEle,Ele_Earth,20; bonus2 bSubEle,Ele_Fire,20; bonus2 bSubEle,Ele_Wind,20; bonus2 bSubEle,Ele_Poison,20; bonus2 bSubEle,Ele_Holy,20; bonus2 bSubEle,Ele_Dark,20; bonus2 bSubEle,Ele_Ghost,20; bonus2 bSubEle,Ele_Undead,20;','','');
REPLACE INTO `item_db` VALUES ('2385','Recuperative_Armor','Recuperative Armor','5','20','10','0','0','0','12','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bNoRegen,1; bonus bNoRegen,2; bonus bHPGainValue,60; bonus bSPGainValue,6; bonus bMagicHPGainValue,60; bonus bMagicSPGainValue,6;','','heal 0,-100;');
@@ -1306,7 +1306,7 @@ REPLACE INTO `item_db` VALUES ('2390','Improved_Tights','Improved Tights','5','2
REPLACE INTO `item_db` VALUES ('2391','Life_Link','Life Link','5','20','10','3500','0','0','9','0','1','16514','2','2','16','0','82',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,2; bonus bMdef,5; bonus bHPrecovRate,50;','','');
REPLACE INTO `item_db` VALUES ('2392','Old_Pant','Old Green Pantie','5','0','0','0','0','0','10','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bVit,2; bonus bMaxHP,200; bonus3 bAutoSpellWhenHit,MO_CALLSPIRITS,5,20; bonus bMdef,1;','','');
REPLACE INTO `item_db` VALUES ('2393','N_Adventurer\'s_Suit','Novice Adventurer\'s Suit','5','0','0','0','0','0','8','0','1','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('2394','Krieger_Suit1','Glorious Suit','5','20','10','0','0','0','0','0','0','2147483646','63','2','16','0','81',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,20; bonus2 bSubRace,RC_DemiHuman,7;','','');
+REPLACE INTO `item_db` VALUES ('2394','Krieger_Suit1','Glorious Suit','5','20','10','0','0','0','0','0','0','2147483646','63','2','16','0','81',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,20; bonus2 bSubRace,RC_DemiPlayer,7;','','');
REPLACE INTO `item_db` VALUES ('2395','Krieger_Suit2','Glorious Popularized Suit','5','20','10','0','0','0','0','0','0','2147483646','63','2','16','0','61',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,600; bonus bSPrecovRate,10;','','');
REPLACE INTO `item_db` VALUES ('2396','Krieger_Suit3','Glorious Mass-Production Suit','5','20','10','0','0','0','0','0','0','2147483646','63','2','16','0','0',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,500;','','');
REPLACE INTO `item_db` VALUES ('2397','Incredible_Coat','Incredible Event Resignation Coat','5','10','5','900','0','0','2','0','0','2147483646','63','2','16','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -1345,16 +1345,16 @@ REPLACE INTO `item_db` VALUES ('2431','Valley_Shoes','Valley Shoes','5','20','10
REPLACE INTO `item_db` VALUES ('2432','Spiky_Heel_','High Heels','5','8500','4250','600','0','0','2','0','1','2147483646','63','2','64','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5;','','');
REPLACE INTO `item_db` VALUES ('2433','Diabolus_Boots','Diabolus Boots','5','20','10','250','0','0','4','0','1','13631360','2','2','64','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,(BaseLevel*10);','','');
REPLACE INTO `item_db` VALUES ('2434','Black_Leather_Boots_','Black Leather Boots','5','20','10','500','0','0','4','0','1','2147483646','2','2','64','0','55',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,1; if(getrefine()>=9) bonus bAgi,2;','','');
-REPLACE INTO `item_db` VALUES ('2435','Battle_Greave','Battle Greaves','5','10','5','0','0','0','4','0','1','40260834','63','2','64','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,100; bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,1;','','');
-REPLACE INTO `item_db` VALUES ('2436','Combat_Boots','Combat Boots','5','10','5','0','0','0','3','0','1','9014044','63','2','64','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,100; bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,1;','','');
-REPLACE INTO `item_db` VALUES ('2437','Battle_Boots','Battle Boots','5','10','5','0','0','0','3','0','1','16777216','63','2','64','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,100; bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,1;','','');
+REPLACE INTO `item_db` VALUES ('2435','Battle_Greave','Battle Greaves','5','10','5','0','0','0','4','0','1','40260834','63','2','64','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,100; bonus bMdef,1; bonus2 bSubRace,RC_DemiPlayer,1;','','');
+REPLACE INTO `item_db` VALUES ('2436','Combat_Boots','Combat Boots','5','10','5','0','0','0','3','0','1','9014044','63','2','64','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,100; bonus bMdef,1; bonus2 bSubRace,RC_DemiPlayer,1;','','');
+REPLACE INTO `item_db` VALUES ('2437','Battle_Boots','Battle Boots','5','10','5','0','0','0','3','0','1','16777216','63','2','64','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,100; bonus bMdef,1; bonus2 bSubRace,RC_DemiPlayer,1;','','');
REPLACE INTO `item_db` VALUES ('2438','Paw_Of_Cat','Paw Of Cat','5','10','5','300','0','0','0','0','0','4294967295','63','2','64','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bFlee,5; bonus bAgi,1; skill ALL_CATCRY, 1;','','');
REPLACE INTO `item_db` VALUES ('2439','Refresh_Shoes','Refresh Shoes','5','20','10','0','0','0','9','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,17; bonus bMaxSPrate,8; bonus2 bHPRegenRate,20,10000; bonus2 bSPRegenRate,3,10000;','','');
REPLACE INTO `item_db` VALUES ('2440','Sprint_Shoes','Sprint Shoes','5','20','10','300','0','0','2','0','1','13631360','2','2','64','0','70',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,1; bonus bSPrecovRate,5;','','');
REPLACE INTO `item_db` VALUES ('2441','Beach_Sandal','Beach Sandals','5','20','10','200','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bInt,1; bonus bAgi,1; bonus2 bSubEle,Ele_Fire,10;','','');
REPLACE INTO `item_db` VALUES ('2442','Boots_Perforated','Red Stocking Boots','5','0','0','0','0','0','7','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,2; bonus bHPrecovRate,10; bonus bSPrecovRate,10; bonus3 bAutoSpellWhenHit,WZ_QUAGMIRE,3,20; bonus bMdef,1;','','');
REPLACE INTO `item_db` VALUES ('2443','Fish_Shoes','Fisher\'s Boots','5','10','5','250','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('2444','Krieger_Shoes1','Glorious Shoes','5','20','10','0','0','0','0','0','0','2147483646','63','2','64','0','81',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,10; bonus2 bSubRace,RC_DemiHuman,4; bonus3 bAutoSpellWhenHit,AL_INCAGI,1,10;','','');
+REPLACE INTO `item_db` VALUES ('2444','Krieger_Shoes1','Glorious Shoes','5','20','10','0','0','0','0','0','0','2147483646','63','2','64','0','81',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,10; bonus2 bSubRace,RC_DemiPlayer,4; bonus3 bAutoSpellWhenHit,AL_INCAGI,1,10;','','');
REPLACE INTO `item_db` VALUES ('2445','Krieger_Shoes2','Glorious Popularized Shoes','5','20','10','0','0','0','0','0','0','2147483646','63','2','64','0','61',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,5; bonus bMaxSPrate,5;','','');
REPLACE INTO `item_db` VALUES ('2446','Krieger_Shoes3','Glorious Mass-Production Shoes','5','20','10','0','0','0','0','0','0','2147483646','63','2','64','0','0',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,5;','','');
REPLACE INTO `item_db` VALUES ('2447','Military_Boots','Army Boots','5','0','0','1000','0','0','5','0','0','2147483646','63','2','64','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -1397,9 +1397,9 @@ REPLACE INTO `item_db` VALUES ('2534','Ruffler','Ruffler','5','20','10','0','0',
REPLACE INTO `item_db` VALUES ('2535','Cloak_Of_Survival_C','Cloak Of Survival','5','1','0','0','0','0','5','0','0','8454660','63','2','4','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,10; bonus bMdef,10;','','');
REPLACE INTO `item_db` VALUES ('2536','Skin_Of_Ventus','Skin of Ventus','5','20','10','250','0','0','2','0','1','2147483646','63','2','4','0','60',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,2; bonus bMaxHP,200; bonus bFlee,10;','','');
REPLACE INTO `item_db` VALUES ('2537','Diabolus_Manteau','Diabolus Manteau','5','20','10','250','0','0','5','0','1','13631360','2','2','4','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Neutral,5; bonus bMaxHP,100; bonus2 bAddDamageClass,1916,10; bonus2 bAddDamageClass,1917,10;','','');
-REPLACE INTO `item_db` VALUES ('2538','Commander_Manteau','Captain\'s Manteau','5','10','5','0','0','0','4','0','1','40260834','63','2','4','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,50; bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,1;','','');
-REPLACE INTO `item_db` VALUES ('2539','Commander_Manteau_','Commander\'s Manteau','5','10','5','0','0','0','3','0','1','9014044','63','2','4','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,50; bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,1;','','');
-REPLACE INTO `item_db` VALUES ('2540','Sheriff_Manteau','Sheriff\'s Manteau','5','10','5','0','0','0','3','0','1','16777216','63','2','4','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,50; bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,1;','','');
+REPLACE INTO `item_db` VALUES ('2538','Commander_Manteau','Captain\'s Manteau','5','10','5','0','0','0','4','0','1','40260834','63','2','4','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,50; bonus bMdef,1; bonus2 bSubRace,RC_DemiPlayer,1;','','');
+REPLACE INTO `item_db` VALUES ('2539','Commander_Manteau_','Commander\'s Manteau','5','10','5','0','0','0','3','0','1','9014044','63','2','4','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,50; bonus bMdef,1; bonus2 bSubRace,RC_DemiPlayer,1;','','');
+REPLACE INTO `item_db` VALUES ('2540','Sheriff_Manteau','Sheriff\'s Manteau','5','10','5','0','0','0','3','0','1','16777216','63','2','4','0','80',NULL,'1','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,50; bonus bMdef,1; bonus2 bSubRace,RC_DemiPlayer,1;','','');
REPLACE INTO `item_db` VALUES ('2541','Asprika','Asprika','5','20','10','400','0','0','5','0','0','4294967295','63','2','4','0','94',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5; bonus3 bSubEle,Ele_Neutral,30,BF_SHORT; bonus3 bSubEle,Ele_Water,30,BF_SHORT; bonus3 bSubEle,Ele_Earth,30,BF_SHORT; bonus3 bSubEle,Ele_Fire,30,BF_SHORT; bonus3 bSubEle,Ele_Wind,30,BF_SHORT; bonus3 bSubEle,Ele_Poison,30,BF_SHORT; bonus3 bSubEle,Ele_Holy,30,BF_SHORT; bonus3 bSubEle,Ele_Dark,30,BF_SHORT; bonus3 bSubEle,Ele_Ghost,30,BF_SHORT; bonus3 bSubEle,Ele_Undead,30,BF_SHORT; bonus bFlee,30; skill AL_TELEPORT,1; bonus bUnbreakableGarment,0;','','');
REPLACE INTO `item_db` VALUES ('2542','Flame_Manteau','Flame Manteau of Naght Sieger','5','20','10','70','0','0','4','0','1','2147483646','2','2','4','0','70',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,5; bonus bMdef,2; bonus bMatkRate,1; bonus2 bAddEle,Ele_Fire,2;','','');
REPLACE INTO `item_db` VALUES ('2543','Sylphid_Manteau','Sylphid Manteau','5','20','10','0','0','0','9','0','0','4294967295','63','2','4','0','0',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bFlee,13; bonus2 bSubEle,Ele_Neutral,13; bonus bFlee2,1;','','');
@@ -1407,8 +1407,8 @@ REPLACE INTO `item_db` VALUES ('2544','Leather_Of_Tendrilion','Leather of Tendri
REPLACE INTO `item_db` VALUES ('2545','Musika','Musika','5','20','10','500','0','0','2','0','1','33024','2','2','4','0','70',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,3; bonus3 bAutoSpellWhenHit,AL_HEAL,max(getskilllv(AL_HEAL),1),20;','','');
REPLACE INTO `item_db` VALUES ('2546','Beach_Manteau','Beach Manteau','5','20','10','600','0','0','0','0','1','4294967295','63','2','4','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bInt,1; bonus2 bSubEle,Ele_Fire,10;','','');
REPLACE INTO `item_db` VALUES ('2547','Cheap_Running_Shirts','Cheap Undershirt','5','0','0','0','0','0','8','0','0','4294967295','63','2','4','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bFlee,10; bonus2 bSubEle,Ele_Neutral,10; bonus bMdef,1;','','');
-REPLACE INTO `item_db` VALUES ('2548','Muffler_C','Neo Muffler','5','0','0','0','0','0','5','0','0','2147483646','2','2','4','0','95',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,10; bonus bMaxHPrate,10; bonus2 bSubEle,Ele_Water,5; bonus2 bSubEle,Ele_Fire,5; bonus2 bSubEle,Ele_Holy,5; bonus2 bSubEle,Ele_Dark,5;','','');
-REPLACE INTO `item_db` VALUES ('2549','Krieger_Muffler1','Glorious Muffler','5','20','10','0','0','0','0','0','0','2147483646','63','2','4','0','81',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,5; bonus2 bSubRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('2548','Muffler_C','Neo Muffler','5','0','0','0','0','0','5','0','0','2147483646','2','2','4','0','95',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,10; bonus bMaxHPrate,10; bonus2 bSubEle,Ele_Water,5; bonus2 bSubEle,Ele_Fire,5; bonus2 bSubEle,Ele_Holy,5; bonus2 bSubEle,Ele_Dark,5;','','');
+REPLACE INTO `item_db` VALUES ('2549','Krieger_Muffler1','Glorious Muffler','5','20','10','0','0','0','0','0','0','2147483646','63','2','4','0','81',NULL,'1','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,5; bonus2 bSubRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('2550','Fisher\'s_Muffler','Fisher\'s Muffler','5','20','10','200','0','0','0','0','0','4294967295','63','2','4','0','0',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('2551','Rider_Insignia_M','Crest of the Rider','5','20','10','500','0','0','4','0','1','2147483646','2','2','4','0','55',NULL,'1','0','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,2;','','');
REPLACE INTO `item_db` VALUES ('2552','Mithril_Magic_Cape_M','Mithril Magic Manteau','5','20','10','400','0','0','3','0','1','625436','2','2','4','0','70',NULL,'1','0','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,3; bonus5 bAutoSpellWhenHit,NPC_ANTIMAGIC,1,200,BF_MAGIC,0;','','');
@@ -1568,7 +1568,7 @@ REPLACE INTO `item_db` VALUES ('2756','Chemical_Ring','Chemical Ring','5','0','0
REPLACE INTO `item_db` VALUES ('2757','Insecticide_Ring','Insecticide Ring','5','0','0','0','0','0','0','0','0','4294967295','63','2','136','0','1',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bExpAddRace,RC_Insect,15;','','');
REPLACE INTO `item_db` VALUES ('2758','Fisher_Ring','Fischer Ring','5','0','0','0','0','0','0','0','0','4294967295','63','2','136','0','1',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bExpAddRace,RC_Fish,15;','','');
REPLACE INTO `item_db` VALUES ('2759','Decussate_Ring','Decussate Ring','5','0','0','0','0','0','0','0','0','4294967295','63','2','136','0','1',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bExpAddRace,RC_Demon,15;','','');
-REPLACE INTO `item_db` VALUES ('2760','Bloody_Ring','Bloody Ring','5','0','0','0','0','0','0','0','0','4294967295','63','2','136','0','1',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bExpAddRace,RC_DemiHuman,15;','','');
+REPLACE INTO `item_db` VALUES ('2760','Bloody_Ring','Bloody Ring','5','0','0','0','0','0','0','0','0','4294967295','63','2','136','0','1',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bExpAddRace,RC_DemiPlayer,15;','','');
REPLACE INTO `item_db` VALUES ('2761','Satanic_Ring','Satanic Ring','5','0','0','0','0','0','0','0','0','4294967295','63','2','136','0','1',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bExpAddRace,RC_Angel,15;','','');
REPLACE INTO `item_db` VALUES ('2762','Dragoon_Ring','Dragon Ring','5','0','0','0','0','0','0','0','0','4294967295','63','2','136','0','1',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bExpAddRace,RC_Dragon,15;','','');
REPLACE INTO `item_db` VALUES ('2763','Skul_Ring_C','Neo Skull Ring','5','0','0','0','0','0','0','0','0','2147483646','2','2','136','0','95',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkRate,5; bonus bMatkRate,5; bonus bMaxHPrate,5; bonus2 bSkillHeal,AL_HEAL,5; skill MG_SIGHT,1;','','');
@@ -1646,7 +1646,7 @@ REPLACE INTO `item_db` VALUES ('4031','Pecopeco_Card','Peco Peco Card','6','20',
REPLACE INTO `item_db` VALUES ('4032','Ambernite_Card','Ambernite Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDef,2;','','');
REPLACE INTO `item_db` VALUES ('4033','Poporing_Card','Poporing Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill TF_DETOXIFY,1;','','');
REPLACE INTO `item_db` VALUES ('4034','Worm_Tail_Card','Wormtail Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2;','','');
-REPLACE INTO `item_db` VALUES ('4035','Hydra_Card','Hydra Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,20;','','');
+REPLACE INTO `item_db` VALUES ('4035','Hydra_Card','Hydra Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,20;','','');
REPLACE INTO `item_db` VALUES ('4036','Muka_Card','Muka Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHPrecovRate,10;','','');
REPLACE INTO `item_db` VALUES ('4037','Snake_Card','Snake Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Poison,500; bonus bBaseAtk,5;','','');
REPLACE INTO `item_db` VALUES ('4038','Zombie_Card','Zombie Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHPrecovRate,20;','','');
@@ -1669,7 +1669,7 @@ REPLACE INTO `item_db` VALUES ('4054','Angeling_Card','Angeling Card','6','20','
REPLACE INTO `item_db` VALUES ('4055','Marina_Card','Marina Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Freeze,500; bonus bBaseAtk,5;','','');
REPLACE INTO `item_db` VALUES ('4056','Dustiness_Card','Dustiness Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','4','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Wind,30; bonus bFlee,5;','','');
REPLACE INTO `item_db` VALUES ('4057','Metaller_Card','Metaller Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Silence,500; bonus bBaseAtk,5;','','');
-REPLACE INTO `item_db` VALUES ('4058','Thara_Frog_Card','Thara Frog Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,30;','','');
+REPLACE INTO `item_db` VALUES ('4058','Thara_Frog_Card','Thara Frog Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,30;','','');
REPLACE INTO `item_db` VALUES ('4059','Soldier_Andre_Card','Soldier Andre Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_Plant,30;','','');
REPLACE INTO `item_db` VALUES ('4060','Goblin_Card','Goblin Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Brute,20;','','');
REPLACE INTO `item_db` VALUES ('4061','Cornutus_Card','Cornutus Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableArmor,0; bonus bDef,1;','','');
@@ -1736,7 +1736,7 @@ REPLACE INTO `item_db` VALUES ('4121','Phreeoni_Card','Phreeoni Card','6','20','
REPLACE INTO `item_db` VALUES ('4122','Deviruchi_Card','Deviruchi Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus2 bResEff,Eff_Blind,10000;','','');
REPLACE INTO `item_db` VALUES ('4123','Eddga_Card','Eddga Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,-25;','sc_start4 SC_ENDURE,60000,10,0,0,1;','sc_end SC_ENDURE;');
REPLACE INTO `item_db` VALUES ('4124','Medusa_Card','Medusa Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_Demon,15; bonus2 bResEff,Eff_Stone,10000;','','');
-REPLACE INTO `item_db` VALUES ('4125','Deviace_Card','Deviace Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,7; bonus2 bAddRace,RC_Brute,7; bonus2 bAddRace,RC_Plant,7; bonus2 bAddRace,RC_Insect,7;','','');
+REPLACE INTO `item_db` VALUES ('4125','Deviace_Card','Deviace Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,7; bonus2 bAddRace,RC_Brute,7; bonus2 bAddRace,RC_Plant,7; bonus2 bAddRace,RC_Insect,7;','','');
REPLACE INTO `item_db` VALUES ('4126','Minorous_Card','Minorous Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddSize,Size_Large,15; bonus bBaseAtk,5;','','');
REPLACE INTO `item_db` VALUES ('4127','Nightmare_Card','Nightmare Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Sleep,10000; bonus bAgi,1;','','');
REPLACE INTO `item_db` VALUES ('4128','Golden_Bug_Card','Golden Thief Bug Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bNoMagicDamage,100; bonus bUseSPrate,100;','','');
@@ -1765,7 +1765,7 @@ REPLACE INTO `item_db` VALUES ('4150','Goat_Card','Goat Card','6','20','10','10'
REPLACE INTO `item_db` VALUES ('4151','Gajomart_Card','Gajomart Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_Plant,-20; bonus2 bExpAddRace,RC_Plant,10;','','');
REPLACE INTO `item_db` VALUES ('4152','Galapago_Card','Galapago Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddItemHealRate,Apple_Juice,50; bonus2 bAddItemHealRate,Banana_Juice,50; bonus2 bAddItemHealRate,Carrot_Juice,50; bonus3 bAddMonsterDropItem,531,RC_Insect,300; bonus3 bAddMonsterDropItem,532,RC_Insect,300; bonus3 bAddMonsterDropItem,534,RC_Insect,300;','','');
REPLACE INTO `item_db` VALUES ('4153','Crab_Card','Crab Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bBaseAtk,5; bonus2 bAddDamageClass,1266,30;','','');
-REPLACE INTO `item_db` VALUES ('4154','Rice_Cake_Boy_Card','Dumpling Child Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddItemHealRate,Candy,50; bonus2 bAddItemHealRate,Candy_Striper,50; bonus3 bAddMonsterDropItem,529,RC_DemiHuman,300; bonus3 bAddMonsterDropItem,530,RC_DemiHuman,100;','','');
+REPLACE INTO `item_db` VALUES ('4154','Rice_Cake_Boy_Card','Dumpling Child Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddItemHealRate,Candy,50; bonus2 bAddItemHealRate,Candy_Striper,50; bonus3 bAddMonsterDropItem,529,RC_DemiPlayer,300; bonus3 bAddMonsterDropItem,530,RC_DemiPlayer,100;','','');
REPLACE INTO `item_db` VALUES ('4155','Goblin_Leader_Card','Goblin Leader Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace2,1,30;','','');
REPLACE INTO `item_db` VALUES ('4156','Steam_Goblin_Card','Goblin Steamrider Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Formless,7;','','');
REPLACE INTO `item_db` VALUES ('4157','Goblin_Archer_Card','Goblin Archer Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_Undead,7;','','');
@@ -1856,8 +1856,8 @@ REPLACE INTO `item_db` VALUES ('4241','Archangeling_Card','Arc Angeling Card','6
REPLACE INTO `item_db` VALUES ('4242','Apocalips_Card','Apocalipse Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,2; if(getrefine()>8) bonus bMaxHP,800;','','');
REPLACE INTO `item_db` VALUES ('4243','Antonio_Card','Antonio Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpellWhenHit,AL_TELEPORT,1,500;','','');
REPLACE INTO `item_db` VALUES ('4244','Alarm_Card','Alarm Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpellWhenHit,MG_SIGHT,1,200; bonus bMaxHP,300; bonus bVit,1;','','');
-REPLACE INTO `item_db` VALUES ('4245','Am_Mut_Card','Am Mut Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,-20; bonus2 bExpAddRace,RC_DemiHuman,10;','','');
-REPLACE INTO `item_db` VALUES ('4246','Assulter_Card','Assaulter Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_DemiHuman,7;','','');
+REPLACE INTO `item_db` VALUES ('4245','Am_Mut_Card','Am Mut Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,-20; bonus2 bExpAddRace,RC_DemiPlayer,10;','','');
+REPLACE INTO `item_db` VALUES ('4246','Assulter_Card','Assaulter Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritAtkRate,10; bonus2 bCriticalAddRace,RC_DemiPlayer,7;','','');
REPLACE INTO `item_db` VALUES ('4247','Aster_Card','Aster Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bBaseAtk,5; bonus2 bAddDamageClass,1074,30;','','');
REPLACE INTO `item_db` VALUES ('4248','Ancient_Mummy_Card','Ancient Mummy Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpellWhenHit,AL_CRUCIS,5,30;','','');
REPLACE INTO `item_db` VALUES ('4249','Ancient_Worm_Card','Ancient Worm Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_Demon,-20; bonus2 bExpAddRace,RC_Demon,10;','','');
@@ -1867,7 +1867,7 @@ REPLACE INTO `item_db` VALUES ('4252','Alligator_Card','Alligator Card','6','20'
REPLACE INTO `item_db` VALUES ('4253','Alice_Card','Alice Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_Boss,40; bonus2 bSubRace,RC_NonBoss,-40;','','');
REPLACE INTO `item_db` VALUES ('4254','Tirfing_Card','Ogretooth Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubSize,Size_Medium,25; bonus bDef,1;','','');
REPLACE INTO `item_db` VALUES ('4255','Orc_Lady_Card','Orc Lady Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace2,3,30;','','');
-REPLACE INTO `item_db` VALUES ('4256','Orc_Archer_Card','Orc Archer Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAddMonsterDropItem,12034,RC_DemiHuman,100;','','');
+REPLACE INTO `item_db` VALUES ('4256','Orc_Archer_Card','Orc Archer Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAddMonsterDropItem,12034,RC_DemiPlayer,100;','','');
REPLACE INTO `item_db` VALUES ('4257','Wild_Rose_Card','Wild Rose Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,1; if(BaseClass==Job_Thief) bonus bFlee2,5;','','');
REPLACE INTO `item_db` VALUES ('4258','Wicked_Nymph_Card','Evil Nymph Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus bMaxSP,50;','','');
REPLACE INTO `item_db` VALUES ('4259','Wooden_Golem_Card','Wooden Golem Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDef,1; bonus bHPrecovRate,30;','','');
@@ -1940,7 +1940,7 @@ REPLACE INTO `item_db` VALUES ('4325','Harpy_Card','Harpy Card','6','20','10','1
REPLACE INTO `item_db` VALUES ('4326','See_Otter_Card','Sea-Otter Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddItemHealRate,Sushi,50; bonus2 bAddItemHealRate,Fish_Slice,50; bonus3 bAddMonsterDropItem,551,RC_Fish,300; bonus3 bAddMonsterDropItem,544,RC_Fish,300;','','');
REPLACE INTO `item_db` VALUES ('4327','Blood_Butterfly_Card','Bloody Butterfly Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCastrate,30; bonus bNoCastCancel,0; bonus2 bSkillAtk,MG_FIREWALL,5;','','');
REPLACE INTO `item_db` VALUES ('4328','Hyegun_Card','Yao Jun Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','4','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bFlee,15; bonus bCritical,1;','','');
-REPLACE INTO `item_db` VALUES ('4329','Phendark_Card','Phendark Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSPGainRace,RC_DemiHuman,5;','','heal 0,-5;');
+REPLACE INTO `item_db` VALUES ('4329','Phendark_Card','Phendark Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSPGainRace,RC_DemiPlayer,5;','','heal 0,-5;');
REPLACE INTO `item_db` VALUES ('4330','Dark_Snake_Lord_Card','Evil Snake Lord Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,3; bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Curse,10000;','','');
REPLACE INTO `item_db` VALUES ('4331','Heater_Card','Heater Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,3; if(BaseClass==Job_Swordman) bonus bFlee2,3;','','');
REPLACE INTO `item_db` VALUES ('4332','Waste_Stove_Card','Waste Stove Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bBaseAtk,5; bonus bInt,1;','','');
@@ -1971,7 +1971,7 @@ REPLACE INTO `item_db` VALUES ('4356','Beholder_Card','Beholder Card','6','20','
REPLACE INTO `item_db` VALUES ('4357','B_Seyren_Card','Lord Knight Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill LK_BERSERK,1; bonus bMaxHPrate,-50;','','');
REPLACE INTO `item_db` VALUES ('4358','Seyren_Card','Seyren Windsor Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,getrefine()-6;','','');
REPLACE INTO `item_db` VALUES ('4359','B_Eremes_Card','Assassin Cross Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','4','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill AS_CLOAKING,3;','','sc_end SC_CLOAKING;');
-REPLACE INTO `item_db` VALUES ('4360','Eremes_Card','Eremes Guile Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bCriticalAddRace,RC_DemiHuman,10;','','');
+REPLACE INTO `item_db` VALUES ('4360','Eremes_Card','Eremes Guile Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bCriticalAddRace,RC_DemiPlayer,10;','','');
REPLACE INTO `item_db` VALUES ('4361','B_Harword_Card','MasterSmith Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bBreakWeaponRate,1000; bonus bBreakArmorRate,700;','','');
REPLACE INTO `item_db` VALUES ('4362','Harword_Card','Howard Alt-Eisen Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,-5; bonus bHit,30;','','');
REPLACE INTO `item_db` VALUES ('4363','B_Magaleta_Card','High Priest Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','16','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus5 bAutoSpellWhenHit,HP_ASSUMPTIO,1,50,BF_WEAPON|BF_MAGIC,0;','','');
@@ -2046,13 +2046,13 @@ REPLACE INTO `item_db` VALUES ('4431','Kasa_Card','Kasa Card','6','20','10','10'
REPLACE INTO `item_db` VALUES ('4432','Magmaring_Card','Magmaring Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','4','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bBaseAtk,5; bonus2 bAddEle,Ele_Earth,10; bonus2 bCriticalAddRace,RC_Brute,15;','','');
REPLACE INTO `item_db` VALUES ('4433','Imp_Card','Imp Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,MG_FIREBOLT,25; bonus2 bCastrate,MG_FIREBOLT,-25;','','');
REPLACE INTO `item_db` VALUES ('4434','Knocker_Card','Knocker Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Formless,5; bonus3 bAddMonsterDropItem,756,RC_Formless,10; bonus3 bAddMonsterDropItem,757,RC_Formless,10;','','');
-REPLACE INTO `item_db` VALUES ('4435','Zombie_Slaughter_Card','Zombie Slaughter Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,1; bonus2 bMagicAddRace,RC_DemiHuman,1; bonus bHPGainValue,50;','','');
-REPLACE INTO `item_db` VALUES ('4436','Ragged_Zombie_Card','Ragged Zombie Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bCriticalAddRace,RC_DemiHuman,5; bonus2 bAddRace,RC_DemiHuman,1; bonus2 bMagicAddRace,RC_DemiHuman,1; bonus2 bAddEff2,Eff_Bleeding,10;','','');
+REPLACE INTO `item_db` VALUES ('4435','Zombie_Slaughter_Card','Zombie Slaughter Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,1; bonus2 bMagicAddRace,RC_DemiPlayer,1; bonus bHPGainValue,50;','','');
+REPLACE INTO `item_db` VALUES ('4436','Ragged_Zombie_Card','Ragged Zombie Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bCriticalAddRace,RC_DemiPlayer,5; bonus2 bAddRace,RC_DemiPlayer,1; bonus2 bMagicAddRace,RC_DemiPlayer,1; bonus2 bAddEff2,Eff_Bleeding,10;','','');
REPLACE INTO `item_db` VALUES ('4437','Hell_Poodle_Card','Hell Poodle Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','136','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHit,1; bonus2 bAddItemHealRate,517,100; bonus3 bAddEff,Eff_Bleeding,50,ATF_SHORT;','','');
REPLACE INTO `item_db` VALUES ('4438','Banshee_Card','Banshee Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(BaseClass==Job_Mage) { bonus bMaxSP,100; bonus bMaxHP,-100; bonus2 bSkillAtk,MG_NAPALMBEAT,20; bonus2 bSkillAtk,MG_SOULSTRIKE,20; bonus2 bSkillAtk,HW_NAPALMVULCAN,20; }','','');
REPLACE INTO `item_db` VALUES ('4439','Flame_Skull_Card','Flame Skull Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Blind,3000; bonus2 bResEff,Eff_Stun,3000; bonus2 bResEff,Eff_Curse,3000; bonus2 bResEff,Eff_Stone,3000; bonus2 bAddEffWhenHit,Eff_Blind,500; bonus2 bAddEffWhenHit,Eff_Stun,500; bonus2 bAddEffWhenHit,Eff_Curse,500; bonus2 bAddEffWhenHit,Eff_Stone,500;','','');
REPLACE INTO `item_db` VALUES ('4440','Necromancer_Card','Necromancer Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','2','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(getiteminfo(getequipid(EQI_HAND_R),11)==10) { bonus bInt,1; bonus bIgnoreMdefRate,2; }','','');
-REPLACE INTO `item_db` VALUES ('4441','Fallen_Bishop_Card','Fallen Bishop Hibram Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,10; bonus bMaxSPrate,-50; bonus2 bMagicAddRace,RC_Angel,50; bonus2 bMagicAddRace,RC_DemiHuman,50;','','');
+REPLACE INTO `item_db` VALUES ('4441','Fallen_Bishop_Card','Fallen Bishop Hibram Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','64','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,10; bonus bMaxSPrate,-50; bonus2 bMagicAddRace,RC_Angel,50; bonus2 bMagicAddRace,RC_DemiPlayer,50;','','');
REPLACE INTO `item_db` VALUES ('4442','Tatacho_Card','Tatacho Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Neutral,20; bonus2 bAddEle,Ele_Neutral,5;','','');
REPLACE INTO `item_db` VALUES ('4443','Aqua_Elemental_Card','Aqua Elemental Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Water,20; bonus2 bAddEle,Ele_Water,5;','','');
REPLACE INTO `item_db` VALUES ('4444','Draco_Card','Draco Card','6','20','10','10','0','0','0','0','0','4294967295','63','2','32','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Earth,20; bonus2 bAddEle,Ele_Earth,5;','','');
@@ -2269,7 +2269,7 @@ REPLACE INTO `item_db` VALUES ('5117','Mistic_Rose','Mystic Rose','5','20','10',
REPLACE INTO `item_db` VALUES ('5118','Ear_Of_Puppy','Puppy Headband','5','20','10','100','0','0','2','0','0','4294967295','63','2','256','0','0',NULL,'1','199','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5119','Super_Novice_Hat_','Super Novice Hat','5','8500','4250','400','0','0','4','0','1','1','63','2','256','0','40',NULL,'1','193','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,1;','','');
REPLACE INTO `item_db` VALUES ('5120','Fedora_','Bucket Hat','5','6000','3000','300','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','195','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('5121','Zherlthsh_Mask','Zealotus Mask','5','20','10','400','0','0','3','0','0','2147483646','63','2','768','0','70',NULL,'1','200','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,5; bonus2 bSubRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('5121','Zherlthsh_Mask','Zealotus Mask','5','20','10','400','0','0','3','0','0','2147483646','63','2','768','0','70',NULL,'1','200','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,5; bonus2 bSubRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('5122','Magni_Cap','Magni\'s Cap','5','30000','15000','1000','0','0','5','0','0','2147483646','63','2','256','0','65',NULL,'1','250','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2;','','');
REPLACE INTO `item_db` VALUES ('5123','Ulle_Cap','Ulle\'s Cap','5','30000','15000','500','0','0','3','0','1','2147483646','63','2','256','0','65',NULL,'1','254','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bAgi,1;','','');
REPLACE INTO `item_db` VALUES ('5124','Fricca_Circlet','Fricca\'s Circlet','5','30000','15000','300','0','0','3','0','0','2147483646','63','2','256','0','65',NULL,'1','251','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,10; bonus bInt,2; bonus bMaxSP,50;','','');
@@ -2280,17 +2280,17 @@ REPLACE INTO `item_db` VALUES ('5128','Goibne\'s_Helmet','Goibne\'s Helm','5','3
REPLACE INTO `item_db` VALUES ('5129','Bird_Nest','Bird Nest','5','20','10','400','0','0','1','0','0','4294967295','63','2','256','0','50',NULL,'0','201','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,2; bonus2 bSubRace,RC_Brute,10;','','');
REPLACE INTO `item_db` VALUES ('5130','Lion_Mask','Lion Mask','5','20','10','700','0','0','0','0','0','13623168','63','2','768','0','75',NULL,'1','202','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEffWhenHit,Eff_Silence,500; bonus bMdef,1;','','');
REPLACE INTO `item_db` VALUES ('5131','Close_Helmet','Close Helmet','5','20','10','1200','0','0','8','0','0','16514','63','2','769','0','75',NULL,'1','203','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,3; bonus bMaxHPrate,3;','','');
-REPLACE INTO `item_db` VALUES ('5132','Angeling_Hat','Angeling Hat','5','20','10','700','0','0','2','0','0','4294967295','63','2','256','0','0',NULL,'0','204','0','0','0','472',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,10;','','');
+REPLACE INTO `item_db` VALUES ('5132','Angeling_Hat','Angeling Hat','5','20','10','700','0','0','2','0','0','4294967295','63','2','256','0','0',NULL,'0','204','0','0','0','472',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,10;','','');
REPLACE INTO `item_db` VALUES ('5133','Sheep_Hat','Sheep Hat','5','20','10','150','0','0','1','0','0','33040','63','2','256','0','0',NULL,'0','205','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bShortWeaponDamageReturn,5;','','');
REPLACE INTO `item_db` VALUES ('5134','Pumpkin_Hat','Pumpkin-Head','5','20','10','200','0','0','2','0','0','4294967295','63','2','256','0','0',NULL,'1','206','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_Demon,5;','','');
REPLACE INTO `item_db` VALUES ('5135','Cyclops_Visor','Cyclop\'s Eye','5','0','0','200','0','0','0','0','0','2147483646','63','2','512','0','75',NULL,'0','207','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxSP,50;','','');
REPLACE INTO `item_db` VALUES ('5136','Santa\'s_Hat_','Antonio\'s Santa Hat','5','20','10','100','0','0','3','0','0','4294967295','63','2','256','0','0',NULL,'1','20','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('5137','Alice_Doll','Alice Doll','5','20','10','500','0','0','0','0','1','2147483646','63','2','256','0','30',NULL,'0','208','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddEff2,Eff_Sleep,10;','','');
+REPLACE INTO `item_db` VALUES ('5137','Alice_Doll','Alice Doll','5','20','10','500','0','0','0','0','1','2147483646','63','2','256','0','30',NULL,'0','208','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus2 bAddRace,RC_DemiPlayer,10; bonus2 bAddEff2,Eff_Sleep,10;','','');
REPLACE INTO `item_db` VALUES ('5138','Magic_Eyes','Magic Eyes','5','20','10','300','0','0','1','0','0','8454660','63','2','256','0','30',NULL,'1','209','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5; bonus bCastrate,-10; bonus bUseSPrate,20;','','');
REPLACE INTO `item_db` VALUES ('5139','Hibiscus','Hibiscus','5','20','10','200','0','0','0','0','0','4294967295','63','2','256','0','10',NULL,'0','210','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,1; bonus bInt,1; bonus bMdef,5;','','');
REPLACE INTO `item_db` VALUES ('5140','Charming_Ribbon','Charming Ribbon','5','20','10','400','0','0','1','0','1','4294967295','63','2','256','0','10',NULL,'1','211','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_Undead,5; bonus2 bSubRace,RC_Demon,5;','','');
REPLACE INTO `item_db` VALUES ('5141','Marionette_Doll','Marionette Doll','5','20','10','400','0','0','0','0','1','2147483646','63','2','256','0','30',NULL,'1','212','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1;','','');
-REPLACE INTO `item_db` VALUES ('5142','Crescent_Helm','Crescent Helm','5','20','10','3000','0','0','8','0','0','279714','63','2','768','0','50',NULL,'1','213','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,1; bonus2 bSubRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('5142','Crescent_Helm','Crescent Helm','5','20','10','3000','0','0','8','0','0','279714','63','2','768','0','50',NULL,'1','213','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,1; bonus2 bSubRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('5143','Kabuki_Mask','Kabuki Mask','5','20','10','1000','0','0','5','0','1','2147483646','63','1','769','0','30',NULL,'1','214','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Silence,3000;','','');
REPLACE INTO `item_db` VALUES ('5144','Gambler_Hat','Gambler Hat','5','20','10','200','0','0','2','0','0','4294967295','63','2','256','0','0',NULL,'1','16','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,5;','','');
REPLACE INTO `item_db` VALUES ('5145','Carnival_Joker_Jester','Carnival Joker Jester','5','10','5','100','0','0','0','0','0','4294967295','63','2','256','0','0',NULL,'1','89','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -2318,9 +2318,9 @@ REPLACE INTO `item_db` VALUES ('5166','Spinx_Helm_','Sphinx Hat','5','20','10','
REPLACE INTO `item_db` VALUES ('5167','Munak_Turban_','Munak Hat','5','20','10','300','0','0','5','0','1','4294967295','63','2','769','0','0',NULL,'0','51','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_Undead,10;','','');
REPLACE INTO `item_db` VALUES ('5168','Bongun_Hat_','Bongun Hat','5','20','10','300','0','0','5','0','1','4294967295','63','2','769','0','0',NULL,'0','139','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5169','Bride_Mask','Bride Mask','5','30000','15000','500','0','0','4','0','1','4294967295','63','2','768','0','40',NULL,'1','223','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(BaseClass==Job_Taekwon) { bonus bLuk,2; bonus bCritical,5; }','','');
-REPLACE INTO `item_db` VALUES ('5170','Feather_Beret','Feather Beret','5','30000','15000','600','0','0','1','0','0','2147483646','63','2','256','0','0',NULL,'1','224','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,1; bonus2 bSubRace,RC_DemiHuman,10;','','');
+REPLACE INTO `item_db` VALUES ('5170','Feather_Beret','Feather Beret','5','30000','15000','600','0','0','1','0','0','2147483646','63','2','256','0','0',NULL,'1','224','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,1; bonus2 bSubRace,RC_DemiPlayer,10;','','');
REPLACE INTO `item_db` VALUES ('5171','Valkyrie_Helm','Valkyrie Helm','5','100000','50000','1000','0','0','5','0','1','2147483646','2','2','256','0','0',NULL,'1','225','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5;','','');
-REPLACE INTO `item_db` VALUES ('5172','Beret','Beret','5','30000','15000','700','0','0','0','0','0','4294967295','63','2','256','0','0',NULL,'0','226','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,10;','','');
+REPLACE INTO `item_db` VALUES ('5172','Beret','Beret','5','30000','15000','700','0','0','0','0','0','4294967295','63','2','256','0','0',NULL,'0','226','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,10;','','');
REPLACE INTO `item_db` VALUES ('5173','Satto_Hat','Magistrate Hat','5','30000','15000','400','0','0','3','0','1','4294967295','63','2','256','0','60',NULL,'1','227','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(BaseClass==Job_Taekwon) { bonus bAgi,1; bonus bHPrecovRate,3; }','','');
REPLACE INTO `item_db` VALUES ('5174','Ayam','Ayam','5','30000','15000','400','0','0','3','0','1','4294967295','63','2','256','0','60',NULL,'1','228','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','if(BaseClass==Job_Taekwon) { bonus bInt,1; bonus bSPrecovRate,3; }','','');
REPLACE INTO `item_db` VALUES ('5175','Censor_Bar','Censor Bar','5','30000','15000','100','0','0','0','0','0','4294967295','63','2','512','0','0',NULL,'0','229','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Curse,500; bonus bMdef,1; bonus bHit,-5;','','');
@@ -2414,7 +2414,7 @@ REPLACE INTO `item_db` VALUES ('5262','Gold_Tiara_','Golden Tiara','5','20','10'
REPLACE INTO `item_db` VALUES ('5263','Ati_Atihan_Hat','Pagdayaw','5','20','10','100','0','0','1','0','0','2147483646','63','2','769','0','20',NULL,'1','303','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Water,1; bonus2 bSubEle,Ele_Earth,1; bonus2 bSubEle,Ele_Fire,1; bonus2 bSubEle,Ele_Wind,1; bonus2 bAddEff,Eff_Curse,3;','','');
REPLACE INTO `item_db` VALUES ('5264','Aussie_Flag_Hat','Australian Flag Hat','5','20','10','500','0','0','4','0','0','4294967295','63','2','256','0','0',NULL,'1','304','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,2;','','');
REPLACE INTO `item_db` VALUES ('5265','Apple_Of_Archer_C','Apple of Archer','5','1','0','0','0','0','7','0','0','2147483646','63','2','256','0','1',NULL,'0','72','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bDex,4;','','');
-REPLACE INTO `item_db` VALUES ('5266','Bunny_Band_C','Bunny Band','5','1','0','0','0','0','9','0','0','4294967295','63','2','256','0','1',NULL,'0','15','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5; bonus2 bSubRace,RC_DemiHuman,10;','','');
+REPLACE INTO `item_db` VALUES ('5266','Bunny_Band_C','Bunny Band','5','1','0','0','0','0','9','0','0','4294967295','63','2','256','0','1',NULL,'0','15','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5; bonus2 bSubRace,RC_DemiPlayer,10;','','');
REPLACE INTO `item_db` VALUES ('5267','Sahkkat_C','Sakkat','5','1','0','0','0','0','10','0','0','4294967295','63','2','256','0','0',NULL,'0','67','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,3;','','');
REPLACE INTO `item_db` VALUES ('5268','Lord_Circlet_C','Grand Circlet','5','1','0','0','0','0','10','0','0','2147483646','63','2','256','0','1',NULL,'0','93','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bStr,3; bonus bInt,3; bonus bLuk,3; bonus bMdef,4;','','');
REPLACE INTO `item_db` VALUES ('5269','Flying_Angel_','Flapping Angel Wing','5','20','10','300','0','0','1','0','0','4294967295','63','2','256','0','10',NULL,'1','264','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus bAgi,1; bonus bAspdRate,3; bonus bSpeedRate,25;','','');
@@ -2431,7 +2431,7 @@ REPLACE INTO `item_db` VALUES ('5279','Drooping_Kitty_C','Refined Drooping Cat',
REPLACE INTO `item_db` VALUES ('5280','Magestic_Goat_C','Baphomet Horns','5','2','1','0','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'0','41','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1;','','');
REPLACE INTO `item_db` VALUES ('5281','Deviruchi_Cap_C','Refined Deviruchi Hat','5','2','1','0','0','0','2','0','0','2147483646','63','2','256','0','0',NULL,'0','123','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bInt,1;','','');
REPLACE INTO `item_db` VALUES ('5282','euRO_Baseball_Cap','Europe Baseball Cap','5','0','0','200','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','216','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('5283','Chick_Hat','Chick Hat','5','20','10','100','0','0','1','0','0','4294967295','63','2','256','0','10',NULL,'0','311','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,2; bonus bMaxHP,50; bonus bMaxSP,50; skill TF_DOUBLE,2; bonus bDoubleRate,10; bonus2 bSubRace,RC_DemiHuman,3;','','');
+REPLACE INTO `item_db` VALUES ('5283','Chick_Hat','Chick Hat','5','20','10','100','0','0','1','0','0','4294967295','63','2','256','0','10',NULL,'0','311','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,2; bonus bMaxHP,50; bonus bMaxSP,50; skill TF_DOUBLE,2; bonus bDoubleRate,10; bonus2 bSubRace,RC_DemiPlayer,3;','','');
REPLACE INTO `item_db` VALUES ('5284','Water_Lily_Crown','Water Lily Crown','5','20','10','200','0','0','0','0','1','4294967295','63','2','256','0','30',NULL,'0','312','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bDex,1; bonus bAgi,1; bonus bHPrecovRate,5; bonus bSPrecovRate,3;','','');
REPLACE INTO `item_db` VALUES ('5285','Vane_Hairpin','Vane Hairpin','5','20','10','300','0','0','3','0','1','4294967295','63','2','256','0','30',NULL,'0','313','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,2;','','');
REPLACE INTO `item_db` VALUES ('5286','Pecopeco_Hairband','Pecopeco Hairband','5','20','10','0','0','0','3','0','0','4294967295','63','2','256','0','70',NULL,'0','314','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bSpeedRate,25; bonus bAspdRate,-10; bonus bCastrate,25;','','');
@@ -2454,15 +2454,15 @@ REPLACE INTO `item_db` VALUES ('5302','Lotus_Flower_Hat','Flower Lily','5','0','
REPLACE INTO `item_db` VALUES ('5303','Flower_Coronet','Flower Crown','5','20','10','300','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'1','325','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,3; bonus bMaxHP,50;','','');
REPLACE INTO `item_db` VALUES ('5304','Cap_Of_Blindness','Cap Of Blindness','5','20','10','800','0','0','4','0','1','4294967295','63','2','769','0','50',NULL,'1','326','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Curse,700; bonus2 bResEff,Eff_Blind,10000;','','');
REPLACE INTO `item_db` VALUES ('5305','Pirate_Dagger','Pirate Dagger','5','20','10','100','0','0','0','0','0','4294967295','63','2','1','0','0',NULL,'0','327','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bBaseAtk,5;','','');
-REPLACE INTO `item_db` VALUES ('5306','Freyja_Crown','Freya\'s Crown','5','0','0','500','0','0','12','0','0','2147483646','63','2','256','0','0',NULL,'0','328','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('5306','Freyja_Crown','Freya\'s Crown','5','0','0','500','0','0','12','0','0','2147483646','63','2','256','0','0',NULL,'0','328','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('5307','Carmen_Miranda\'s_Hat','Carmen Miranda\'s Hat','5','20','10','400','0','0','3','0','0','4294967295','63','2','256','0','0',NULL,'1','329','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,3; bonus3 bAutoSpellWhenHit,DC_WINKCHARM,1,50;','','');
REPLACE INTO `item_db` VALUES ('5308','Brazilian_Flag_Hat','Brazil National Flag Hat','5','20','10','300','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','330','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bSpeedAddRate,25;','','');
REPLACE INTO `item_db` VALUES ('5309','Mahican','Wool Mask','5','20','10','200','0','0','1','0','0','4294967295','63','2','769','0','0',NULL,'1','331','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill RG_GRAFFITI,1;','','');
REPLACE INTO `item_db` VALUES ('5310','Bulb_Hairband','Shining Electric Bulb Hairband','5','20','10','100','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','332','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Dark,10; skill MG_SIGHT,1;','','sc_end SC_SIGHT;');
REPLACE INTO `item_db` VALUES ('5311','Large_Hibiscus','Large Hisbiscus','5','20','10','100','0','0','1','0','1','4294967295','63','2','256','0','0',NULL,'1','333','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,15;','','');
-REPLACE INTO `item_db` VALUES ('5312','Ayothaya_Hat','Ayothaya King\'s Hat','5','20','10','100','0','0','5','0','1','414946','63','2','256','0','0',NULL,'1','334','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus2 bAddRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('5312','Ayothaya_Hat','Ayothaya King\'s Hat','5','20','10','100','0','0','5','0','1','414946','63','2','256','0','0',NULL,'1','334','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus2 bAddRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('5313','Diadem','Diadem','5','20','10','100','0','0','3','0','1','4294967295','63','2','768','0','0',NULL,'1','335','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus bMatkRate,3; bonus bCastrate,-3;','','');
-REPLACE INTO `item_db` VALUES ('5314','Hockey_Mask','Hockey Mask','5','20','10','100','0','0','1','0','0','4294967295','63','2','513','0','50',NULL,'0','336','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('5314','Hockey_Mask','Hockey Mask','5','20','10','100','0','0','1','0','0','4294967295','63','2','513','0','50',NULL,'0','336','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('5315','Observer','Observer','5','20','10','100','0','0','1','0','0','4294967295','63','2','512','0','35',NULL,'0','337','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','skill WZ_ESTIMATION,1;','','');
REPLACE INTO `item_db` VALUES ('5316','Umbrella_Hat','Umbrella Hat','5','20','10','100','0','0','2','0','0','4294967295','63','2','256','0','50',NULL,'1','338','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Water,3;','','');
REPLACE INTO `item_db` VALUES ('5317','Fisherman_Hat','Fisherman\'s Hat','5','20','10','100','0','0','2','0','0','4294967295','63','2','256','0','50',NULL,'1','339','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpell,WZ_WATERBALL,3,50;','','');
@@ -2474,7 +2474,7 @@ REPLACE INTO `item_db` VALUES ('5322','Scarf','Kerchief','5','20','10','100','0'
REPLACE INTO `item_db` VALUES ('5323','Misstrance_Crown','Misstrance Crown','5','20','10','0','0','0','10','0','0','4294967295','63','2','256','0','0',NULL,'0','165','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,2;','','');
REPLACE INTO `item_db` VALUES ('5324','Little_Angel_Doll','Little Angel Doll','5','20','10','300','0','0','2','0','0','4294967295','63','2','256','0','10',NULL,'1','344','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bDex,3; bonus4 bAutoSpellWhenHit,CR_GRANDCROSS,3,30,0;','','');
REPLACE INTO `item_db` VALUES ('5325','Robo_Eye','Robo Eye','5','20','10','200','0','0','2','0','0','4294967295','63','2','512','0','10',NULL,'0','345','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_NonBoss,2; bonus2 bAddRace,RC_Boss,2; bonus bMatkRate,2; bonus bDex,1;','','');
-REPLACE INTO `item_db` VALUES ('5326','Masquerade_C','Masquerade C','5','1','0','0','0','0','1','0','0','4294967295','63','2','512','0','0',NULL,'0','78','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,7;','','');
+REPLACE INTO `item_db` VALUES ('5326','Masquerade_C','Masquerade C','5','1','0','0','0','0','1','0','0','4294967295','63','2','512','0','0',NULL,'0','78','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,7;','','');
REPLACE INTO `item_db` VALUES ('5327','Orc_Hero_Helm_C','Refined Helmet of Orc Hero','5','1','0','0','0','0','10','0','0','2147483646','63','2','768','0','0',NULL,'0','178','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,5; bonus bVit,3;','','');
REPLACE INTO `item_db` VALUES ('5328','Evil_Wing_Ears_C','Evil Wing Ears C','5','1','0','0','0','0','2','0','0','4294967295','63','2','512','0','0',NULL,'0','152','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1;','','');
REPLACE INTO `item_db` VALUES ('5329','Dark_Blindfold_C','Dark Blindfold C','5','1','0','0','0','0','1','0','0','4294967295','63','2','512','0','0',NULL,'0','187','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Blind,10000; bonus2 bResEff,Eff_Stun,500;','','');
@@ -2488,12 +2488,12 @@ REPLACE INTO `item_db` VALUES ('5336','Guildsman_Recruiter','Guildsman Recruiter
REPLACE INTO `item_db` VALUES ('5337','Party_Recruiter_Hat','Party Recruiter Hat','5','0','0','0','0','0','2','0','0','4294967295','63','2','256','0','10',NULL,'1','351','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5338','Bf_Recruiter_Hat','Bf Recruiter Hat','5','0','0','0','0','0','2','0','0','4294967295','63','2','256','0','10',NULL,'1','352','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5339','Friend_Recruiter_Hat','Friend Recruiter Hat','5','0','0','0','0','0','2','0','0','4294967295','63','2','256','0','10',NULL,'1','353','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('5340','Deprotai_Doll_Hat','Defolty Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','354','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,5; bonus bStr,2; bonus3 bAutoSpellWhenHit,AL_ANGELUS,10,20;','','');
-REPLACE INTO `item_db` VALUES ('5341','Claris_Doll_Hat','Glaris Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','355','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,5; bonus bInt,2; bonus bMagicHPGainValue,50;','','');
-REPLACE INTO `item_db` VALUES ('5342','Sorin_Doll_Hat','Sorin Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','356','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,5; bonus bDex,2; autobonus \"{ bonus bBaseAtk,50; }\",20,10000,0,\"{ specialeffect2 EF_POTION_BERSERK; }\";','','');
-REPLACE INTO `item_db` VALUES ('5343','Tayelin_Doll_Hat','Telling Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','357','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,5; bonus bAgi,2; bonus2 bAddItemHealRate,504,10; bonus2 bAddItemHealRate,547,10;','','');
-REPLACE INTO `item_db` VALUES ('5344','Binit_Doll_Hat','Bennit Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','358','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,5; bonus bVit,2; autobonus \"{ bonus bAspdRate,5; }\",20,30000,0,\"{ specialeffect2 EF_HASTEUP; }\";','','');
-REPLACE INTO `item_db` VALUES ('5345','Debril_Doll_Hat','W Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','359','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,5; bonus bLuk,2; bonus2 bAddRace,RC_Undead,5; bonus2 bMagicAddRace,RC_Undead,5; bonus2 bSubRace,RC_Undead,5;','','');
+REPLACE INTO `item_db` VALUES ('5340','Deprotai_Doll_Hat','Defolty Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','354','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,5; bonus bStr,2; bonus3 bAutoSpellWhenHit,AL_ANGELUS,10,20;','','');
+REPLACE INTO `item_db` VALUES ('5341','Claris_Doll_Hat','Glaris Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','355','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,5; bonus bInt,2; bonus bMagicHPGainValue,50;','','');
+REPLACE INTO `item_db` VALUES ('5342','Sorin_Doll_Hat','Sorin Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','356','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,5; bonus bDex,2; autobonus \"{ bonus bBaseAtk,50; }\",20,10000,0,\"{ specialeffect2 EF_POTION_BERSERK; }\";','','');
+REPLACE INTO `item_db` VALUES ('5343','Tayelin_Doll_Hat','Telling Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','357','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,5; bonus bAgi,2; bonus2 bAddItemHealRate,504,10; bonus2 bAddItemHealRate,547,10;','','');
+REPLACE INTO `item_db` VALUES ('5344','Binit_Doll_Hat','Bennit Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','358','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,5; bonus bVit,2; autobonus \"{ bonus bAspdRate,5; }\",20,30000,0,\"{ specialeffect2 EF_HASTEUP; }\";','','');
+REPLACE INTO `item_db` VALUES ('5345','Debril_Doll_Hat','W Doll Hat','5','0','0','500','0','0','0','0','1','4294967295','63','2','256','0','60',NULL,'0','359','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,5; bonus bLuk,2; bonus2 bAddRace,RC_Undead,5; bonus2 bMagicAddRace,RC_Undead,5; bonus2 bSubRace,RC_Undead,5;','','');
REPLACE INTO `item_db` VALUES ('5346','Gf_Recruiter_Hat','Gf Recruiter Hat','5','0','0','0','0','0','2','0','0','4294967295','63','2','256','0','10',NULL,'1','360','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5347','Ph.D_Hat_','Ph.D Hat','5','20','10','200','0','0','3','0','1','2147483646','63','2','256','0','0',NULL,'1','98','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5348','Big_Sis\'_Ribbon_','Big Ribbon','5','15000','7500','200','0','0','2','0','1','2147483646','63','2','256','0','0',NULL,'1','28','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,3;','','');
@@ -2511,7 +2511,7 @@ REPLACE INTO `item_db` VALUES ('5359','J_Captain_Hat','Ship Captain Hat','5','20
REPLACE INTO `item_db` VALUES ('5360','Whikebain_Ears','Hyuke\'s Black Cat Ears','5','20','10','200','0','0','2','0','0','4294967295','63','2','256','0','45',NULL,'1','368','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bFlee,10; bonus bCritical,3; bonus bCritAtkRate,10; bonus bDefRate,-50; bonus bDef2Rate,-50;','','');
REPLACE INTO `item_db` VALUES ('5361','Gang_Scarf','Gangster Scarf','5','20','10','100','0','0','0','0','0','4294967295','63','2','1','0','60',NULL,'0','369','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bBaseAtk,5; if(BaseJob==Job_Rogue) skill RG_GANGSTER,1;','','');
REPLACE INTO `item_db` VALUES ('5362','Ninja_Scroll','Ninja Scroll','5','20','10','200','0','0','0','0','0','4294967295','63','2','1','0','60',NULL,'0','370','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,1;','','');
-REPLACE INTO `item_db` VALUES ('5363','Helm_Of_Abyss','Helm Of Abyss','5','20','10','1000','0','0','2','0','1','414946','63','2','256','0','70',NULL,'1','371','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,-10; bonus2 bSubRace,RC_Boss,10;','','');
+REPLACE INTO `item_db` VALUES ('5363','Helm_Of_Abyss','Helm Of Abyss','5','20','10','1000','0','0','2','0','1','414946','63','2','256','0','70',NULL,'1','371','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,-10; bonus2 bSubRace,RC_Boss,10;','','');
REPLACE INTO `item_db` VALUES ('5364','Dark_Snake_Lord_Hat','Evil Snake Lord Hat','5','20','10','500','0','0','2','0','1','4294967295','63','2','256','0','60',NULL,'1','372','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bInt,1; bonus bAgi,2;','','');
REPLACE INTO `item_db` VALUES ('5365','Fried_Egg','Magnolia Hat','5','20','10','100','0','0','3','0','1','4294967295','63','2','256','0','1',NULL,'0','373','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bResEff,Eff_Stun,500; skill HT_FLASHER,1;','','');
REPLACE INTO `item_db` VALUES ('5366','Hat_0f_King','Love Dad Bandana','5','20','10','200','0','0','3','0','0','4294967295','63','2','256','0','0',NULL,'1','374','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,5;','','');
@@ -2522,16 +2522,16 @@ REPLACE INTO `item_db` VALUES ('5370','Orchid_Hairband','Orchid Hairband','5','2
REPLACE INTO `item_db` VALUES ('5371','Hat_Of_Judge','Judge Hat','5','20','10','300','0','0','2','0','0','4294967295','63','2','768','0','0',NULL,'1','377','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,1; bonus bMaxSP,30;','','');
REPLACE INTO `item_db` VALUES ('5372','Drooping_White_Kitty','Koneko Hat','5','20','10','500','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'1','378','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus bDelayrate,-3; bonus bMatkRate,3; bonus bMaxSPrate,3; bonus bMdef,3;','','');
REPLACE INTO `item_db` VALUES ('5373','Darkness_Helm','Dark Randgris Helm','5','20','10','300','0','0','2','0','1','4294967295','63','2','768','0','0',NULL,'1','379','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bDex,3; bonus bMdef,1;','','');
-REPLACE INTO `item_db` VALUES ('5374','L_Magestic_Goat','Gigantic Majestic Goat','5','20','10','800','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'1','380','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,12; bonus bBaseAtk,(JobLevel*2)/7;','','');
+REPLACE INTO `item_db` VALUES ('5374','L_Magestic_Goat','Gigantic Majestic Goat','5','20','10','800','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'1','380','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,12; bonus bBaseAtk,(JobLevel*2)/7;','','');
REPLACE INTO `item_db` VALUES ('5375','L_Orc_Hero_Helm','Orc Hero Headdress','5','20','10','900','0','0','5','0','1','4294967295','63','2','768','0','0',NULL,'1','381','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus3 bAutoSpellWhenHit,BS_WEAPONPERFECT,3,10;','','');
REPLACE INTO `item_db` VALUES ('5376','Satanic_Chain_P','Flying Evil Wing','5','20','10','100','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','382','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bMaxSP,120; bonus2 bAddEff2,Eff_Curse,300;','','');
-REPLACE INTO `item_db` VALUES ('5377','Antique_Pipe','Gentleman\'s Pipe','5','20','10','100','0','0','0','0','0','4294967295','63','2','1','0','0',NULL,'0','383','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,2;','','');
+REPLACE INTO `item_db` VALUES ('5377','Antique_Pipe','Gentleman\'s Pipe','5','20','10','100','0','0','0','0','0','4294967295','63','2','1','0','0',NULL,'0','383','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,2;','','');
REPLACE INTO `item_db` VALUES ('5378','Rabbit_Ear_Hat','Bunny Top Hat','5','20','10','300','0','0','0','0','0','4294967295','63','2','256','0','0',NULL,'1','384','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,3; bonus3 bAutoSpellWhenHit,AL_INCAGI,5,10;','','');
REPLACE INTO `item_db` VALUES ('5379','Balloon_Hat','Tam','5','0','0','800','0','0','3','0','1','4294967295','63','2','256','0','50',NULL,'1','385','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,2; bonus bMatkRate,2+(getrefine()/2);','','');
REPLACE INTO `item_db` VALUES ('5380','Fish_Head_Hat','Fish Head Hat','5','20','10','400','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'1','386','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpell,SA_FROSTWEAPON,1,5;','','');
REPLACE INTO `item_db` VALUES ('5381','Santa_Poring_Hat','Santa Poring Hat','5','20','10','100','0','0','2','0','1','4294967295','63','2','256','0','0',NULL,'0','387','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,2; bonus2 bAddEle,Ele_Dark,3; bonus2 bSubEle,Ele_Dark,3;','','');
REPLACE INTO `item_db` VALUES ('5382','Bell_Ribbon','Bell Ribbon','5','20','10','200','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','388','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bVit,1; skill AL_ANGELUS,1;','','sc_end SC_ANGELUS;');
-REPLACE INTO `item_db` VALUES ('5383','Hunting_Cap','Hunter\'s Cap','5','20','10','250','0','0','3','0','1','2147483646','63','2','256','0','50',NULL,'1','389','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,1; bonus2 bAddRace,RC_Brute,10; bonus2 bAddRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('5383','Hunting_Cap','Hunter\'s Cap','5','20','10','250','0','0','3','0','1','2147483646','63','2','256','0','50',NULL,'1','389','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,1; bonus2 bAddRace,RC_Brute,10; bonus2 bAddRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('5384','Santa_Hat_1','Twin Pompom By JB','5','20','10','200','0','0','1','0','1','4294967295','63','2','256','0','20',NULL,'1','390','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,3; skill WZ_ESTIMATION,1; bonus3 bAutoSpell,AL_INCAGI,1,500;','','');
REPLACE INTO `item_db` VALUES ('5385','Yoyo_Hat','Yoyo Hat','5','20','10','300','0','0','1','0','0','4294967295','63','2','256','0','20',NULL,'1','391','0','0','0','457',NULL,'0',NULL,'0',NULL,'0','skill TF_HIDING, 1;','','sc_end SC_HIDING;');
REPLACE INTO `item_db` VALUES ('5386','Ayam_','Ayam','5','0','0','70','0','0','7','0','0','4294967295','63','2','256','0','1',NULL,'0','228','0','0','0','384',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,7; bonus bFlee,7; bonus2 bAddMonsterDropItem,12198,200;','','');
@@ -2558,7 +2558,7 @@ REPLACE INTO `item_db` VALUES ('5406','Academy_Freshman_Hat','Academy Freshman H
REPLACE INTO `item_db` VALUES ('5407','Academy_Graduating_Cap','Academy Completion Hat','5','0','0','200','0','0','2','0','1','4294967295','63','2','256','0','0',NULL,'1','410','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bMaxSP,30;','','');
REPLACE INTO `item_db` VALUES ('5408','Old_Bandanna','Old Bandana','5','0','0','0','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'0','6','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; bonus bMaxSP,50; bonus bCastrate,10;','','');
REPLACE INTO `item_db` VALUES ('5409','New_Cowboy_Hat','Purple Cowboy Hat','5','20','10','500','0','0','4','0','1','4294967295','63','2','256','0','0',NULL,'1','411','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; bonus bVit,2; bonus bMaxSP,50;','','');
-REPLACE INTO `item_db` VALUES ('5410','Bread_Bag2','Brown Paperbag Hat','5','20','10','200','0','0','6','0','0','4294967295','63','2','769','0','0',NULL,'0','412','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,100; bonus2 bResEff, Eff_Stun, 400; bonus2 bSubRace,RC_DemiHuman,4;','','');
+REPLACE INTO `item_db` VALUES ('5410','Bread_Bag2','Brown Paperbag Hat','5','20','10','200','0','0','6','0','0','4294967295','63','2','769','0','0',NULL,'0','412','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,100; bonus2 bResEff, Eff_Stun, 400; bonus2 bSubRace,RC_DemiPlayer,4;','','');
REPLACE INTO `item_db` VALUES ('5411','White_Snake_Hat','White Snake Hat','5','20','10','500','0','0','2','0','0','4294967295','63','2','256','0','0',NULL,'1','413','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2;','','');
REPLACE INTO `item_db` VALUES ('5412','Sweet_Candy','Sweet Candy','5','20','10','100','0','0','1','0','0','4294967295','63','2','1','0','0',NULL,'0','414','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableHelm, 0;','','');
REPLACE INTO `item_db` VALUES ('5413','Popcorn_Hat','Pop Corn Hat','5','20','10','300','0','0','2','0','0','4294967295','63','2','256','0','0',NULL,'0','415','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Wind, 10;','','');
@@ -2571,12 +2571,12 @@ REPLACE INTO `item_db` VALUES ('5419','Evolved_Leaf','Leaves Of Grass','5','20',
REPLACE INTO `item_db` VALUES ('5420','Mask_Of_Ifrit','Mask Of Ifrit','5','0','0','0','0','0','8','0','0','2147483646','63','2','769','0','70',NULL,'0','421','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bInt,1; bonus bMdef,5; bonus2 bSubEle,Ele_Fire,10; bonus2 bSubEle,Ele_Water,-10; skill MG_SIGHT,1; bonus3 bAutoSpellWhenHit,WZ_METEOR,3,50; bonus3 bAutoSpell,MG_FIREBOLT,3,50;','','sc_end SC_SIGHT;');
REPLACE INTO `item_db` VALUES ('5421','Ifrit\'s_Ear','Ears Of Ifrit','5','20','10','0','0','0','0','0','0','2147483646','63','2','512','0','70',NULL,'0','422','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bMdef,3; bonus2 bSkillAtk,MG_FIREBOLT,2; bonus2 bSkillAtk,WZ_FIREPILLAR,2; bonus2 bSkillAtk,WZ_METEOR,2; bonus2 bSkillAtk,SM_BASH,2; bonus2 bSkillAtk,SM_MAGNUM,2; bonus2 bSkillAtk,KN_PIERCE,2; bonus2 bSubEle,Ele_Fire,5; bonus2 bSubEle,Ele_Water,-5;','','');
REPLACE INTO `item_db` VALUES ('5422','Linguistic_Book_Cap','Linguistic Book Hat','5','20','10','70','0','0','0','0','0','4294967295','63','2','256','0','0',NULL,'1','423','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus bMdef,2;','','');
-REPLACE INTO `item_db` VALUES ('5423','Lovecap_China','I Love China','5','20','10','250','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'0','424','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bDex,3; bonus2 bSubRace,RC_DemiHuman,10;','','');
+REPLACE INTO `item_db` VALUES ('5423','Lovecap_China','I Love China','5','20','10','250','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'0','424','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bDex,3; bonus2 bSubRace,RC_DemiPlayer,10;','','');
REPLACE INTO `item_db` VALUES ('5424','Fanta_Orange_Can','Fanta Orange Can Hat','5','20','10','100','0','0','2','0','1','4294967295','63','2','256','0','0',NULL,'1','425','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5425','Fanta_Grape_Can','Fanta Grape Can Hat','5','20','10','100','0','0','2','0','1','4294967295','63','2','256','0','0',NULL,'1','426','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5426','Karada_Meguri_Tea_Hat','Karada Meguricha Hat','5','20','10','100','0','0','2','0','1','4294967295','63','2','256','0','0',NULL,'1','427','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,1;','','');
REPLACE INTO `item_db` VALUES ('5427','Royal_Milk_Tea_Hat','Black Tea Kochakaden Hat','5','20','10','100','0','0','2','0','1','4294967295','63','2','256','0','0',NULL,'1','428','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,1;','','');
-REPLACE INTO `item_db` VALUES ('5428','Bread_Bag1','RWC Anniversary Bread Envelope','5','0','0','100','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'1','429','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,12;','','');
+REPLACE INTO `item_db` VALUES ('5428','Bread_Bag1','RWC Anniversary Bread Envelope','5','0','0','100','0','0','0','0','0','4294967295','63','2','769','0','0',NULL,'1','429','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,12;','','');
REPLACE INTO `item_db` VALUES ('5429','Bogy_Cap','Bogy Cap','5','20','10','100','0','0','2','0','1','4294967295','63','2','256','0','0',NULL,'1','430','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bHPrecovRate, 5; bonus bSPrecovRate, 5;','','');
REPLACE INTO `item_db` VALUES ('5430','Sacred_Torch_Coronet','Torch Cap','5','20','10','0','0','0','3','0','0','4294967295','63','2','256','0','0',NULL,'0','431','0','0','0','65',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Fire,20; skill MG_FIREBOLT,5;','','');
REPLACE INTO `item_db` VALUES ('5431','Chicken_Hat','Chicken Hat','5','20','10','1000','0','0','0','0','1','4294967295','63','2','256','0','30',NULL,'1','432','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpell,MC_LOUD,1,30; bonus bAspdRate,5;','','');
@@ -2598,9 +2598,9 @@ REPLACE INTO `item_db` VALUES ('5447','Frog_Cap','Frog Hat','5','20','10','500',
REPLACE INTO `item_db` VALUES ('5448','Solo_Play_Box1','Soloplay Box1','5','0','0','300','0','0','0','0','1','4294967295','63','2','769','0','0',NULL,'1','449','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5449','Solo_Play_Box2','Soloplay Box2','5','0','0','300','0','0','0','0','1','4294967295','63','2','769','0','0',NULL,'1','450','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5450','Sun_Cap','Solar Hat','5','20','10','1000','0','0','0','0','0','2147483646','63','2','256','0','20',NULL,'1','451','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('5451','Dragonhelm_Gold','RWC 2008 Dragon Helm Gold','5','20','10','2500','0','0','7','0','1','4294967295','63','2','256','0','1',NULL,'0','452','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,10; bonus bAllStats,3; bonus2 bAddRace,RC_DemiHuman,5;','','');
-REPLACE INTO `item_db` VALUES ('5452','Dragonhelm_Silver','RWC 2008 Dragon Helm Silver','5','20','10','2500','0','0','5','0','1','4294967295','63','2','256','0','1',NULL,'0','453','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,7; bonus bAllStats,2; bonus2 bAddRace,RC_DemiHuman,3;','','');
-REPLACE INTO `item_db` VALUES ('5453','Dragonhelm_Copper','RWC 2008 Dragon Helm Copper','5','20','10','2500','0','0','0','0','1','4294967295','63','2','256','0','1',NULL,'0','454','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,5; bonus bAllStats,2; bonus2 bAddRace,RC_DemiHuman,1;','','');
+REPLACE INTO `item_db` VALUES ('5451','Dragonhelm_Gold','RWC 2008 Dragon Helm Gold','5','20','10','2500','0','0','7','0','1','4294967295','63','2','256','0','1',NULL,'0','452','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,10; bonus bAllStats,3; bonus2 bAddRace,RC_DemiPlayer,5;','','');
+REPLACE INTO `item_db` VALUES ('5452','Dragonhelm_Silver','RWC 2008 Dragon Helm Silver','5','20','10','2500','0','0','5','0','1','4294967295','63','2','256','0','1',NULL,'0','453','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,7; bonus bAllStats,2; bonus2 bAddRace,RC_DemiPlayer,3;','','');
+REPLACE INTO `item_db` VALUES ('5453','Dragonhelm_Copper','RWC 2008 Dragon Helm Copper','5','20','10','2500','0','0','0','0','1','4294967295','63','2','256','0','1',NULL,'0','454','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,5; bonus bAllStats,2; bonus2 bAddRace,RC_DemiPlayer,1;','','');
REPLACE INTO `item_db` VALUES ('5454','Dog_Cap_','Puppy Hat','5','20','10','500','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','234','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bInt,1; autobonus \"{ bonus bCritical,100; }\",10,3000,BF_WEAPON,\"{ specialeffect2 EF_ENHANCE; }\"; autobonus \"{ bonus bIgnoreMdefRate,100; }\",10,3000,BF_MAGIC,\"{ specialeffect2 EF_MAGICALATTHIT; }\";','','');
REPLACE INTO `item_db` VALUES ('5455','Geographer_Band_','Decorative Geographer','5','20','10','500','0','0','1','0','1','4294967295','63','2','256','0','0',NULL,'1','238','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus3 bAutoSpell,AL_HEAL,5,50; bonus3 bAutoSpellWhenHit,AL_HEAL,5,30;','','');
REPLACE INTO `item_db` VALUES ('5456','Vacation_Hat_','Summer Hat','5','20','10','200','0','0','0','0','1','4294967295','63','2','256','0','0',NULL,'1','315','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,5; bonus bHPrecovRate,20; bonus bSPrecovRate,15;','','');
@@ -2609,7 +2609,7 @@ REPLACE INTO `item_db` VALUES ('5458','Pinwheel_Cap','Pinwheel Hat','5','20','10
REPLACE INTO `item_db` VALUES ('5459','Drooping_Bunny_Chusuk','Drooping Bunny','5','0','0','100','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'1','249','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,1; bonus bFlee,2;','','');
REPLACE INTO `item_db` VALUES ('5460','Adv_Dragon_Skull','Evolved Dragon Skull Hat','5','20','10','1000','0','0','7','0','0','4294967295','63','2','256','0','60',NULL,'1','457','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats, 2; bonus bMaxHPrate, 3;','','');
REPLACE INTO `item_db` VALUES ('5461','Adv_Whisper_Mask','Evolved Whisper Mask','5','20','10','300','0','0','1','0','0','4294967295','63','2','769','0','50',NULL,'1','458','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bDex,3; bonus2 bSubEle,Ele_Ghost, 20;','','');
-REPLACE INTO `item_db` VALUES ('5462','Spiked_Scarf','Spiked Scarf','5','20','10','100','0','0','1','0','0','4294967295','63','2','1','0','90',NULL,'0','459','0','0','0','457',NULL,'0',NULL,'0',NULL,'0','bonus bVit,1; bonus2 bAddRace,RC_DemiHuman,1; bonus2 bSubRace,RC_DemiHuman,1;','','');
+REPLACE INTO `item_db` VALUES ('5462','Spiked_Scarf','Spiked Scarf','5','20','10','100','0','0','1','0','0','4294967295','63','2','1','0','90',NULL,'0','459','0','0','0','457',NULL,'0',NULL,'0',NULL,'0','bonus bVit,1; bonus2 bAddRace,RC_DemiPlayer,1; bonus2 bSubRace,RC_DemiPlayer,1;','','');
REPLACE INTO `item_db` VALUES ('5463','Rainbow_Scarf','Rainbow Scarf','5','20','10','100','0','0','1','0','0','4294967295','63','2','1','0','90',NULL,'0','460','0','0','0','457',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus bMdef,2; bonus bMatkRate,1;','','');
REPLACE INTO `item_db` VALUES ('5464','Zaha_Doll_Hat','Zaha Doll Hat','5','20','10','0','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'0','461','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; skill PR_MAGNIFICAT, 3;','','');
REPLACE INTO `item_db` VALUES ('5471','Hairband_Of_Reginleif','Hairband Of Reginleif','5','20','10','800','0','0','1','0','0','4294967295','63','2','512','0','50',NULL,'0','468','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubEle,Ele_Water,3; bonus2 bSubEle,Ele_Fire,3; bonus2 bSubEle,Ele_Undead,3; bonus2 bSubEle,Ele_Ghost,3;','','');
@@ -2620,7 +2620,7 @@ REPLACE INTO `item_db` VALUES ('5479','Shaman\'s_Hair_Ornament','Shaman\'s Hair
REPLACE INTO `item_db` VALUES ('5480','Bizofnil_Wing_Deco','Bijofnil Wings','5','20','10','1000','0','0','3','0','0','4294967295','63','2','256','0','30',NULL,'1','477','0','0','0','65',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,2; bonus3 bAutoSpell,PR_IMPOSITIO,3,3;','','');
REPLACE INTO `item_db` VALUES ('5481','Hermose_Cap','Hermode Cap','5','20','10','1000','0','0','1','0','1','4294967295','63','2','256','0','1',NULL,'1','478','0','0','0','65',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,10; bonus bBaseAtk,-20; bonus bMatkRate,-10;','','');
REPLACE INTO `item_db` VALUES ('5482','Dark_Knight_Mask','Dark Knight Mask','5','0','0','3000','0','0','5','0','0','4294967295','63','2','769','0','80',NULL,'1','479','0','0','0','65',NULL,'0',NULL,'0',NULL,'0','bonus bStr,3;','','');
-REPLACE INTO `item_db` VALUES ('5483','Odin_Mask','Odin Mask','5','20','10','100','0','0','1','0','0','4294967295','63','2','513','0','50',NULL,'0','480','0','0','0','65',NULL,'0',NULL,'0',NULL,'0','bonus bHit,-10; bonus2 bAddRace,RC_DemiHuman,6;','','');
+REPLACE INTO `item_db` VALUES ('5483','Odin_Mask','Odin Mask','5','20','10','100','0','0','1','0','0','4294967295','63','2','513','0','50',NULL,'0','480','0','0','0','65',NULL,'0',NULL,'0',NULL,'0','bonus bHit,-10; bonus2 bAddRace,RC_DemiPlayer,6;','','');
REPLACE INTO `item_db` VALUES ('5485','Tiger_Face','Tiger Face','5','20','10','1000','0','0','3','0','0','4294967295','63','2','769','0','60',NULL,'1','483','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_Brute,5; bonus2 bAddRace,RC_Brute,5; bonus2 bMagicAddRace,RC_Brute,5;','','');
REPLACE INTO `item_db` VALUES ('5486','J_Anniversary_Hat','Anniversary Hat','5','20','10','300','0','0','3','0','0','4294967295','63','2','256','0','0',NULL,'1','395','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats, 2;','','');
REPLACE INTO `item_db` VALUES ('5487','J_Poringcake_Hat','Poring Cake Hat','5','20','10','500','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'1','417','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,2;','','');
@@ -2628,7 +2628,7 @@ REPLACE INTO `item_db` VALUES ('5488','J_Twin_Santahat','Twin Santa Hat','5','20
REPLACE INTO `item_db` VALUES ('5489','Love_Daddy','Love Daddy Hat','5','20','10','100','0','0','0','0','0','4294967295','63','2','256','0','0',NULL,'1','484','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2;','','');
REPLACE INTO `item_db` VALUES ('5490','Anubis_Helm','Anubis Helm','5','20','10','0','0','0','3','0','0','4294967295','63','2','256','0','70',NULL,'0','485','0','0','0','457',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,5; bonus2 bSubRace,RC_Boss,10; bonus bHealPower2,10; bonus bAddItemHealRate,10;','','');
REPLACE INTO `item_db` VALUES ('5491','Hat_Of_Outlaw','Bandit Hat','5','20','10','800','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','486','0','0','0','457',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus2 bSubEle,Ele_Fire, 10;','','');
-REPLACE INTO `item_db` VALUES ('5492','Boy\'s_Cap_I','Student Cap','5','0','0','0','0','0','5','0','0','2147483646','63','2','256','0','0',NULL,'0','102','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,3; bonus2 bAddRace,RC_DemiHuman,5;','','');
+REPLACE INTO `item_db` VALUES ('5492','Boy\'s_Cap_I','Student Cap','5','0','0','0','0','0','5','0','0','2147483646','63','2','256','0','0',NULL,'0','102','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,3; bonus2 bAddRace,RC_DemiPlayer,5;','','');
REPLACE INTO `item_db` VALUES ('5493','Ulle_Cap_I','Ulle\'s Cap','5','0','0','0','0','0','3','0','0','2147483646','63','2','256','0','0',NULL,'0','254','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bAgi,1;','','');
REPLACE INTO `item_db` VALUES ('5494','Spinx_Helm_I','Sphinx Hat','5','0','0','0','0','0','5','0','0','16514','63','2','257','0','0',NULL,'0','137','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bStr,5;','','');
REPLACE INTO `item_db` VALUES ('5495','Power_Of_Thor','Power Of Thor','5','20','10','100','0','0','6','0','1','4294967295','63','2','256','0','75',NULL,'1','493','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus bDex,1; bonus bMdef,3; bonus bFlee,5;','','');
@@ -2654,7 +2654,7 @@ REPLACE INTO `item_db` VALUES ('5514','Pisces_Diadem','Pisces Diadem','5','20','
REPLACE INTO `item_db` VALUES ('5515','Pisces_Crown','Pisces Crown','5','20','10','300','0','0','6','0','0','4294967295','63','2','256','0','70',NULL,'1','512','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; bonus bMdef,5; bonus2 bSubEle,Ele_Water, 5; if(getrefine()>6) { bonus bDef, 1; bonus bMatkRate,2; }','','');
REPLACE INTO `item_db` VALUES ('5516','Hawk_Eyes01','hawk Eyes','5','10','5','100','0','0','0','0','0','2048','2','2','512','0','60',NULL,'0','23','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,1;','','');
REPLACE INTO `item_db` VALUES ('5517','Hawk_Eyes02','Hawk Eyes','5','10','5','100','0','0','0','0','0','526344','63','2','512','0','60',NULL,'0','23','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bDex,1;','','');
-REPLACE INTO `item_db` VALUES ('5518','L_Magestic_Goat2','Gigantic Majestic Goat','5','20','10','800','0','0','5','0','0','4294967295','63','2','256','0','50',NULL,'1','513','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,12; bonus bBaseAtk,(JobLevel*2)/7;','','');
+REPLACE INTO `item_db` VALUES ('5518','L_Magestic_Goat2','Gigantic Majestic Goat','5','20','10','800','0','0','5','0','0','4294967295','63','2','256','0','50',NULL,'1','513','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,12; bonus bBaseAtk,(JobLevel*2)/7;','','');
REPLACE INTO `item_db` VALUES ('5519','Peacock_Feather','Peacock Feather','5','20','10','800','0','0','4','0','1','4294967295','63','2','256','0','1',NULL,'1','514','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2;','','');
REPLACE INTO `item_db` VALUES ('5520','Rabbit_Earplug','Rabbit Earplugs','5','0','0','400','0','0','0','0','1','4294967295','63','2','768','0','1',NULL,'1','515','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_NonBoss,4; bonus2 bAddRace,RC_Boss,4; bonus bMatkRate,4;','','');
REPLACE INTO `item_db` VALUES ('5521','Angry_Mouth_C','Angry Mouth','5','0','0','0','0','0','0','0','0','4294967295','63','2','1','0','0',NULL,'0','194','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bDelayrate,-3;','','');
@@ -2669,7 +2669,7 @@ REPLACE INTO `item_db` VALUES ('5529','Evil\'s_Bone_Hat','Satanic Bone Helm','5'
REPLACE INTO `item_db` VALUES ('5530','Raven_Cap','Raven Cap','5','20','10','100','0','0','6','0','1','4294967295','63','2','256','0','30',NULL,'1','524','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5532','Pirate_Dagger_J','Pirate Dagger','5','20','10','100','0','0','0','0','0','4294967295','63','2','1','0','0',NULL,'1','327','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bShortWeaponDamageReturn,1;','','');
REPLACE INTO `item_db` VALUES ('5533','Emperor_Wreath_J','Emperor Wreath','5','20','10','800','0','0','3','0','1','4294967295','63','2','256','0','80',NULL,'1','261','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,1;','','');
-REPLACE INTO `item_db` VALUES ('5535','Side_Cap','Side Cap','5','0','0','500','0','0','3','0','0','4294967295','63','2','256','0','0',NULL,'1','529','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,1; bonus bDex,1; bonus bMdef,3; bonus2 bSubRace,RC_DemiHuman,5; bonus2 bAddRace,RC_DemiHuman,3;','','');
+REPLACE INTO `item_db` VALUES ('5535','Side_Cap','Side Cap','5','0','0','500','0','0','3','0','0','4294967295','63','2','256','0','0',NULL,'1','529','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bVit,1; bonus bDex,1; bonus bMdef,3; bonus2 bSubRace,RC_DemiPlayer,5; bonus2 bAddRace,RC_DemiPlayer,3;','','');
REPLACE INTO `item_db` VALUES ('5536','Spare_Card','Spare Card','5','20','10','10','0','0','1','0','0','4294967295','63','2','1','0','1',NULL,'0','526','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddMonsterDropItem,6187,1000;','','');
REPLACE INTO `item_db` VALUES ('5537','Quati_Hat','Kwati Hat','5','20','10','700','0','0','2','0','1','4294967295','63','2','256','0','45',NULL,'0','527','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,3;','','');
REPLACE INTO `item_db` VALUES ('5538','Tucan_Hat','Tucan Hat','5','20','10','600','0','0','2','0','1','4294967295','63','2','768','0','45',NULL,'0','528','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bDex,3;','','');
@@ -2686,7 +2686,7 @@ REPLACE INTO `item_db` VALUES ('5548','Scarlet_Rose','Scarlet Rose','5','20','10
REPLACE INTO `item_db` VALUES ('5549','Taurus_Diadem','Taurus Diadem','5','20','10','300','0','0','3','0','0','4294967295','63','2','256','0','70',NULL,'1','535','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bDelayrate,-2; bonus2 bSubEle,Ele_Earth,5; if(getrefine()>6) { bonus bDex,1; bonus bMatkRate,1; }','','');
REPLACE INTO `item_db` VALUES ('5550','Taurus_Crown','Taurus Crown','5','20','10','300','0','0','3','0','0','4294967295','63','2','256','0','70',NULL,'1','536','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bDelayrate,-2; bonus2 bSubEle,Ele_Earth,5; if(getrefine()>6) { bonus bDex,1; bonus bMatkRate,1; }','','');
REPLACE INTO `item_db` VALUES ('5552','Fest_Lord_Circlet','Festival Grand Circlet','5','0','0','0','0','0','8','0','0','4294967295','63','2','256','0','0',NULL,'0','93','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,3; bonus bInt,3; bonus bMdef,3;','','');
-REPLACE INTO `item_db` VALUES ('5553','Fest_Bunny_Band','Festival Bunny Band','5','0','0','0','0','0','7','0','0','4294967295','63','2','256','0','0',NULL,'0','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,4; bonus2 bSubRace,RC_DemiHuman,9;','','');
+REPLACE INTO `item_db` VALUES ('5553','Fest_Bunny_Band','Festival Bunny Band','5','0','0','0','0','0','7','0','0','4294967295','63','2','256','0','0',NULL,'0','15','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,4; bonus2 bSubRace,RC_DemiPlayer,9;','','');
REPLACE INTO `item_db` VALUES ('5554','Octopus_Hat','Octopus Hat','5','20','10','200','0','0','3','0','0','4294967295','63','2','256','0','20',NULL,'1','538','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus3 bAutoSpell,SM_PROVOKE,5,10; bonus bUnbreakableHelm,0;','','');
REPLACE INTO `item_db` VALUES ('5555','Leaf_Cat_Hat','Leaf Cat Hat','5','20','10','100','0','0','3','0','0','4294967295','63','2','256','0','0',NULL,'1','539','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,1; bonus3 bAutoSpellWhenHit,AL_HEAL,3,10;','','');
REPLACE INTO `item_db` VALUES ('5556','Fur_Seal_Hat','Seal Hat','5','20','10','500','0','0','3','0','0','4294967295','63','2','769','0','55',NULL,'1','540','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus3 bAutoSpell,WZ_FROSTNOVA,1,30;','','');
@@ -2697,8 +2697,8 @@ REPLACE INTO `item_db` VALUES ('5560','Bullock_Helm_J','Bullock Helm','5','20','
REPLACE INTO `item_db` VALUES ('5561','Rabbit_Magic_Hat_J','Magic Rabbit Hat','5','0','0','800','0','0','1','0','0','4294967295','63','2','256','0','0',NULL,'1','497','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,1; bonus bMaxSP,50; bonus4 bAutoSpellWhenHit,MG_FIREBOLT,3,10,3; bonus4 bAutoSpellWhenHit,MG_COLDBOLT,3,10,3; bonus4 bAutoSpellWhenHit,MG_LIGHTNINGBOLT,3,10,3; bonus3 bAutoSpellWhenHit,AL_HEAL,1,10;','','');
REPLACE INTO `item_db` VALUES ('5562','Good_Wedding_Veil_J','Luxurious Wedding Veil','5','0','0','500','0','0','0','0','1','4294967295','63','2','768','0','45',NULL,'0','489','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMdef,10; bonus bCastrate,-3; bonus bUseSPrate,-5;','','');
REPLACE INTO `item_db` VALUES ('5564','Crown_Of_Deceit','Crown of Deceit','5','20','10','300','0','0','3','0','1','4294967295','63','2','768','0','85',NULL,'1','544','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bInt,4; bonus bCastrate,-10;','','');
-REPLACE INTO `item_db` VALUES ('5565','Dragon_Arhat_Mask','Dragon Arhat Mask','5','0','0','0','0','0','5','0','0','4294967295','63','2','513','0','1',NULL,'0','545','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,10;','','');
-REPLACE INTO `item_db` VALUES ('5566','Tiger_Arhat_Mask','Tiger Arhat Mask','5','0','0','0','0','0','1','0','0','4294967295','63','2','513','0','1',NULL,'0','546','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,2;','','');
+REPLACE INTO `item_db` VALUES ('5565','Dragon_Arhat_Mask','Dragon Arhat Mask','5','0','0','0','0','0','5','0','0','4294967295','63','2','513','0','1',NULL,'0','545','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,10;','','');
+REPLACE INTO `item_db` VALUES ('5566','Tiger_Arhat_Mask','Tiger Arhat Mask','5','0','0','0','0','0','1','0','0','4294967295','63','2','513','0','1',NULL,'0','546','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,2;','','');
REPLACE INTO `item_db` VALUES ('5567','Bright_Fury','Bright Fury','5','20','10','300','0','0','1','0','1','4294967295','63','2','256','0','1',NULL,'1','548','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus2 bAddRace,RC_NonBoss,2; bonus2 bAddRace,RC_Boss,2; bonus bAspdRate,2;','','');
REPLACE INTO `item_db` VALUES ('5568','Rabbit_Bonnet','Rabbit Bonnet','5','20','10','1000','0','0','1','0','1','4294967295','63','2','768','0','0',NULL,'1','549','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2;','','');
REPLACE INTO `item_db` VALUES ('5569','Gemini_Diadem','Gemini Diadem','5','20','10','300','0','0','4','0','0','4294967295','63','2','256','0','70',NULL,'1','550','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,2; bonus bMatkRate,2; if(getrefine()>6) { bonus bMdef,7; bonus bMatkRate,8; bonus2 bSubEle,Ele_Wind,5; }','','');
@@ -2767,8 +2767,8 @@ REPLACE INTO `item_db` VALUES ('5796','Cheer_Scarf','Cheer Scarf','5','0','0','0
REPLACE INTO `item_db` VALUES ('5797','Cheer_Scarf2','Cheer Scarf2','5','0','0','0','0','0','0','0','0','4294967295','63','2','1','0','1',NULL,'0','369','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5798','Cheer_Scarf3','Cheer Scarf3','5','0','0','0','0','0','0','0','0','4294967295','63','2','1','0','1',NULL,'0','369','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5799','Cheer_Scarf4','Cheer Scarf4','5','0','0','0','0','0','0','0','0','4294967295','63','2','1','0','1',NULL,'0','369','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('5800','Blush_Of_Groom','Blush of Groom','5','20','10','50','0','0','0','0','0','4294967295','63','2','512','0','0',NULL,'0','125','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiHuman,3;','','');
-REPLACE INTO `item_db` VALUES ('5801','Ribbon_Of_Bride','Red Tailed Ribbon','5','20','10','100','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'1','167','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,2; bonus2 bSubRace,RC_DemiHuman,10; if(getskilllv(AL_HEAL)==10) { bonus3 bAutoSpellWhenHit,AL_HEAL,10,20; } else { bonus3 bAutoSpellWhenHit,AL_HEAL,5,20; }','','');
+REPLACE INTO `item_db` VALUES ('5800','Blush_Of_Groom','Blush of Groom','5','20','10','50','0','0','0','0','0','4294967295','63','2','512','0','0',NULL,'0','125','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSubRace,RC_DemiPlayer,3;','','');
+REPLACE INTO `item_db` VALUES ('5801','Ribbon_Of_Bride','Red Tailed Ribbon','5','20','10','100','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'1','167','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,2; bonus2 bSubRace,RC_DemiPlayer,10; if(getskilllv(AL_HEAL)==10) { bonus3 bAutoSpellWhenHit,AL_HEAL,10,20; } else { bonus3 bAutoSpellWhenHit,AL_HEAL,5,20; }','','');
REPLACE INTO `item_db` VALUES ('5802','Upgrade_Elephant_Hat','Upgraded Elephant Hat','5','0','0','500','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','215','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5803','Flower_Love_Hat','Love Flower Hat','5','20','10','100','0','0','2','0','0','4294967295','63','2','256','0','0',NULL,'1','5','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddMonsterDropItem,608,100;','','');
REPLACE INTO `item_db` VALUES ('5804','Pirate_Eyepatch','Pirate Eye Bandage','5','1000','500','100','0','0','0','0','0','4294967295','63','2','512','0','0',NULL,'0','13','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -2786,7 +2786,7 @@ REPLACE INTO `item_db` VALUES ('5817','Valentine_Pledge','Valentine Pledge','5',
REPLACE INTO `item_db` VALUES ('5818','Carnival_Hat','Carnival Hat','5','0','0','0','0','0','6','0','0','4294967295','63','2','256','0','0',NULL,'1','505','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats, 3;','','');
REPLACE INTO `item_db` VALUES ('5819','Carnival_Circlet','Carnival Circlet','5','0','0','0','0','0','6','0','0','4294967295','63','2','256','0','0',NULL,'1','506','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats, 3;','','');
REPLACE INTO `item_db` VALUES ('5821','Gold_Tulip_Hairpin','Gold Tulip Hairpin','5','10','5','100','0','0','2','0','0','4294967295','63','2','256','0','0',NULL,'1','499','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus2 bExpAddRace,RC_Boss,5; bonus2 bExpAddRace,RC_NonBoss,5;','','');
-REPLACE INTO `item_db` VALUES ('5822','Love_Chick_Hat','Love Chick Hat','5','10000','5000','100','0','0','4','0','0','4294967295','63','2','256','0','0',NULL,'1','500','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,4; bonus bMaxHP,100; bonus bMaxSP,100; bonus2 bSubRace,RC_DemiHuman,7; bonus2 bSubRace,RC_Undead,7;','','');
+REPLACE INTO `item_db` VALUES ('5822','Love_Chick_Hat','Love Chick Hat','5','10000','5000','100','0','0','4','0','0','4294967295','63','2','256','0','0',NULL,'1','500','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,4; bonus bMaxHP,100; bonus bMaxSP,100; bonus2 bSubRace,RC_DemiPlayer,7; bonus2 bSubRace,RC_Undead,7;','','');
REPLACE INTO `item_db` VALUES ('5824','Fools_Day_Hat','Fools Day Hat','5','20','10','300','0','0','6','0','1','4294967295','63','2','256','0','30',NULL,'1','265','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('5826','Valkyrie_Helmet','Valkyrie Helmet','5','0','0','0','0','0','10','0','0','4294967295','63','2','256','0','0',NULL,'0','225','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bInt,2; bonus bDex,2; bonus bAgi,2; bonus bMdef,5;','','');
REPLACE INTO `item_db` VALUES ('5827','Book_File_Hat','Book File Hat','5','20','10','100','0','0','1','0','0','4294967295','63','2','256','0','1',NULL,'1','423','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -5072,8 +5072,8 @@ REPLACE INTO `item_db` VALUES ('13008','Jitte_','Jitte','4','20000','10000','400
REPLACE INTO `item_db` VALUES ('13009','Kamaitachi','Kamaitachi','4','48000','24000','900','125','0','0','2','0','33554432','63','2','2','4','70',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Wind; bonus bCritical,3; bonus bAspdRate,3;','','');
REPLACE INTO `item_db` VALUES ('13010','Asura','Asura','4','3000','1500','600','50','0','0','1','2','33554432','63','2','2','1','12',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,10;','','');
REPLACE INTO `item_db` VALUES ('13011','Asura_','Asura','4','3000','1500','600','50','0','0','1','3','33554432','63','2','2','1','12',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,10;','','');
-REPLACE INTO `item_db` VALUES ('13012','Murasame','Murasame','4','20','10','700','95','0','0','1','1','33554432','63','2','2','2','24',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Water; bonus2 bCriticalAddRace,RC_DemiHuman,10;','','');
-REPLACE INTO `item_db` VALUES ('13013','Murasame_','Murasame','4','20','10','700','95','0','0','1','2','33554432','63','2','2','2','24',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Water; bonus2 bCriticalAddRace,RC_DemiHuman,10;','','');
+REPLACE INTO `item_db` VALUES ('13012','Murasame','Murasame','4','20','10','700','95','0','0','1','1','33554432','63','2','2','2','24',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Water; bonus2 bCriticalAddRace,RC_DemiPlayer,10;','','');
+REPLACE INTO `item_db` VALUES ('13013','Murasame_','Murasame','4','20','10','700','95','0','0','1','2','33554432','63','2','2','2','24',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Water; bonus2 bCriticalAddRace,RC_DemiPlayer,10;','','');
REPLACE INTO `item_db` VALUES ('13014','Hakujin','Hakujin','4','20','10','800','120','0','0','1','0','33554432','63','2','2','3','42',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; bonus3 bAutoSpell,AL_HEAL,1,10;','','');
REPLACE INTO `item_db` VALUES ('13015','Hakujin_','Hakujin','4','20','10','800','120','0','0','1','1','33554432','63','2','2','3','42',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; bonus3 bAutoSpell,AL_HEAL,1,10;','','');
REPLACE INTO `item_db` VALUES ('13016','Poison_Knife_','Poison Knife','4','20','10','800','64','0','0','1','2','42950382','63','2','2','3','65',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Poison; bonus2 bAddEff,Eff_Poison,3000;','','');
@@ -5081,7 +5081,7 @@ REPLACE INTO `item_db` VALUES ('13017','House_Auger_','Ice Pick','4','20','10','
REPLACE INTO `item_db` VALUES ('13018','Sucsamad_','Sucsamad','4','20','10','800','140','0','0','1','1','42950382','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEle,Ele_Earth,10; bonus2 bAddEle,Ele_Wind,10; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('13019','Ginnungagap_','Ginnungagap','4','20','10','700','148','0','0','1','1','2124381935','63','2','2','4','70',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Dark; bonus2 bAddEff,Eff_Blind,500; bonus2 bAddEff2,Eff_Blind,50;','','');
REPLACE INTO `item_db` VALUES ('13020','Warrior_Balmung_','Warrior\'s Balmung','4','20','10','1000','170','0','0','1','0','4294967295','63','2','2','4','48',NULL,'1','1','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bAllStats,5;','','');
-REPLACE INTO `item_db` VALUES ('13021','Combat_Knife_C','Combat Knife','4','1','0','0','129','0','0','1','0','42950382','63','2','2','4','1',NULL,'0','1','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiHuman; bonus2 bSubRace,RC_DemiHuman,10; bonus2 bSubRace,RC_Demon,-10; bonus bMaxSPrate,10; bonus bSPDrainValue,3;','','');
+REPLACE INTO `item_db` VALUES ('13021','Combat_Knife_C','Combat Knife','4','1','0','0','129','0','0','1','0','42950382','63','2','2','4','1',NULL,'0','1','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bIgnoreDefRace,RC_DemiPlayer; bonus2 bSubRace,RC_DemiPlayer,10; bonus2 bSubRace,RC_Demon,-10; bonus bMaxSPrate,10; bonus bSPDrainValue,3;','','');
REPLACE INTO `item_db` VALUES ('13022','Counter_Dagger_C','Dagger of Counter','4','1','0','0','209','0','0','1','0','8454660','63','2','2','4','1',NULL,'0','1','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,90;','','');
REPLACE INTO `item_db` VALUES ('13023','Asura_C','Ashura','4','1','0','0','120','0','0','1','0','33554432','63','2','2','1','1',NULL,'0','1','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bMatkRate,15;','','');
REPLACE INTO `item_db` VALUES ('13024','Sword_Breaker_C','Refined Swordbreaker','4','2','1','0','105','0','0','1','0','42950382','63','2','2','4','0',NULL,'0','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bBreakWeaponRate,500;','','');
@@ -5096,13 +5096,13 @@ REPLACE INTO `item_db` VALUES ('13032','Mail_Breaker_','Mailbreaker','4','20','1
REPLACE INTO `item_db` VALUES ('13033','Assasin_Dagger_','Assassin Dagger','4','20','10','600','140','0','0','1','1','4096','63','2','2','4','36',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHPrate,20; bonus bMaxSPrate,15; bonus bAspdRate,2; bonus bAtkEle,Ele_Dark;','','');
REPLACE INTO `item_db` VALUES ('13034','Twilight_Desert','Desert Twilight','4','20','10','600','130','0','0','1','2','4096','2','2','2','2','70',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('13035','Sandstorm','Sandstorm','4','20','10','600','50','0','0','1','4','4096','2','2','2','2','70',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('13036','BF_Dagger1','Brave Assassin\'s Damascus','4','20','10','0','120','0','0','1','0','2124381935','63','2','2','3','80',NULL,'1','1','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bAgi,1; bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(Class==Job_Ninja||Class==Job_Rogue||Class==Job_Stalker) bonus bMatkRate,15;','','');
-REPLACE INTO `item_db` VALUES ('13037','BF_Dagger2','Valorous Assassin\'s Damascus','4','20','10','0','120','0','0','1','0','2124381935','63','2','2','3','80',NULL,'1','1','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bAgi,1; bonus2 bAddRace,RC_DemiHuman,75; bonus bUnbreakableWeapon,0; autobonus \"{ bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss; }\",10,6000,BF_WEAPON,\"{ specialeffect2 EF_HASTEUP; }\"; if(Class==Job_Ninja||Class==Job_Rogue||Class==Job_Stalker) bonus bMatkRate,15;','','');
+REPLACE INTO `item_db` VALUES ('13036','BF_Dagger1','Brave Assassin\'s Damascus','4','20','10','0','120','0','0','1','0','2124381935','63','2','2','3','80',NULL,'1','1','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bAgi,1; bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(Class==Job_Ninja||Class==Job_Rogue||Class==Job_Stalker) bonus bMatkRate,15;','','');
+REPLACE INTO `item_db` VALUES ('13037','BF_Dagger2','Valorous Assassin\'s Damascus','4','20','10','0','120','0','0','1','0','2124381935','63','2','2','3','80',NULL,'1','1','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bAgi,1; bonus2 bAddRace,RC_DemiPlayer,75; bonus bUnbreakableWeapon,0; autobonus \"{ bonus bDefRatioAtkRace,RC_Boss; bonus bDefRatioAtkRace,RC_NonBoss; }\",10,6000,BF_WEAPON,\"{ specialeffect2 EF_HASTEUP; }\"; if(Class==Job_Ninja||Class==Job_Rogue||Class==Job_Stalker) bonus bMatkRate,15;','','');
REPLACE INTO `item_db` VALUES ('13038','Dagger_Of_Hunter','Dagger of Hunter','4','20','10','700','120','0','0','1','3','131072','2','2','2','3','70',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bAgi,2; bonus bDex,1; bonus4 bAutoSpellOnSkill,RG_BACKSTAP,SM_BASH,10,100; bonus2 bSkillAtk,RG_BACKSTAP,20;','','');
REPLACE INTO `item_db` VALUES ('13039','Ivory_Knife','Ivory Knife','4','20','10','700','130','0','0','1','2','42950382','2','2','2','3','50',NULL,'1','1','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAgi,2; bonus bAspdRate,3; bonus2 bAddEff,Eff_Bleeding,300; bonus3 bAutoSpell,NPC_CRITICALWOUND,1,30;','','');
REPLACE INTO `item_db` VALUES ('13040','N_Cutter','Novice Cutter','4','0','0','0','50','0','0','1','3','2124381935','63','2','2','1','1',NULL,'0','1','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('13041','N_Main_Gauche','Novice Main Gauche','4','0','0','0','63','0','0','1','3','2124381935','63','2','2','1','1',NULL,'0','1','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('13042','Krieger_Dagger1','Glorious Gladius','4','20','10','0','120','0','0','1','0','2124381935','63','2','2','4','80',NULL,'1','1','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus3 bAutoSpell,PR_LEXDIVINA,1,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) bonus4 bAutoSpellOnSkill,RG_RAID,NPC_WIDEBLEEDING,1,250;','','');
+REPLACE INTO `item_db` VALUES ('13042','Krieger_Dagger1','Glorious Gladius','4','20','10','0','120','0','0','1','0','2124381935','63','2','2','4','80',NULL,'1','1','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus3 bAutoSpell,PR_LEXDIVINA,1,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) bonus4 bAutoSpellOnSkill,RG_RAID,NPC_WIDEBLEEDING,1,250;','','');
REPLACE INTO `item_db` VALUES ('13043','Fortune_Sword_I','Fortune Sword','4','0','0','0','120','0','0','1','0','42950382','63','2','2','4','0',NULL,'0','1','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bLuk,5;','','');
REPLACE INTO `item_db` VALUES ('13044','House_Auger_I','Ice Pick','4','0','0','0','105','0','0','1','0','42950382','63','2','2','4','0',NULL,'0','1','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('13045','Kamaitachi_I','Kamaitachi','4','0','0','0','155','0','0','2','0','33554432','63','2','2','4','0',NULL,'0','1','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -5117,9 +5117,9 @@ REPLACE INTO `item_db` VALUES ('13104','The_Garrison','Garrison','4','48000','24
REPLACE INTO `item_db` VALUES ('13105','The_Garrison_','Garrison','4','48000','24000','500','70','0','0','7','2','16777216','63','2','34','2','55',NULL,'1','17','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHit,-10;','','');
REPLACE INTO `item_db` VALUES ('13106','Gold_Lux','Gold Lux','4','100000','50000','500','20','0','0','7','0','16777216','63','2','34','3','12',NULL,'1','17','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHit,-10; if(getskilllv(GS_GLITTERING)>0) bonus3 bAutoSpell,GS_GLITTERING,getskilllv(GS_GLITTERING),100;','','');
REPLACE INTO `item_db` VALUES ('13107','Wasteland_Outlaw','Wasteland\'s Outlaw','4','20','10','580','68','0','0','7','2','16777216','63','2','34','3','70',NULL,'1','17','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHit,readparam(bAgi)/10; bonus bAspdRate,readparam(bAgi)/14;','','');
-REPLACE INTO `item_db` VALUES ('13108','BF_Pistol1','Soldier Revolver','4','0','0','0','70','0','0','7','0','16777216','63','2','34','3','80',NULL,'1','17','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bHit,-10; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; autobonus \"{ bonus bAspdRate,100; }\",10,3000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\"; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('13108','BF_Pistol1','Soldier Revolver','4','0','0','0','70','0','0','7','0','16777216','63','2','34','3','80',NULL,'1','17','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bHit,-10; bonus2 bAddRace,RC_DemiPlayer,55; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; autobonus \"{ bonus bAspdRate,100; }\",10,3000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\"; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('13109','Wasteland_Outlaw_C','Wasteland Outlaw','4','20','10','0','100','0','0','7','0','16777216','63','2','34','3','0',NULL,'0','17','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHit,readparam(bAgi)/10; bonus bAspdRate,readparam(bAgi)/14; bonus2 bAddRace,RC_NonBoss,10; bonus2 bAddRace,RC_Boss,10; bonus bMatkRate,10;','','');
-REPLACE INTO `item_db` VALUES ('13110','Krieger_Pistol1','Glorious Pistol','4','0','0','0','80','0','0','7','0','16777216','63','2','34','4','80',NULL,'1','17','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,pow(getrefine()-4,2); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { bonus4 bAutoSpellOnSkill,GS_RAPIDSHOWER,GS_GLITTERING,1,1000; bonus2 bSkillAtk,GS_RAPIDSHOWER,getrefine()*2; }','','');
+REPLACE INTO `item_db` VALUES ('13110','Krieger_Pistol1','Glorious Pistol','4','0','0','0','80','0','0','7','0','16777216','63','2','34','4','80',NULL,'1','17','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,55; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,pow(getrefine()-4,2); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { bonus4 bAutoSpellOnSkill,GS_RAPIDSHOWER,GS_GLITTERING,1,1000; bonus2 bSkillAtk,GS_RAPIDSHOWER,getrefine()*2; }','','');
REPLACE INTO `item_db` VALUES ('13112','P_Revolver1','Eden Revlover I','4','0','0','0','4','0','0','7','0','16777216','63','2','34','1','26',NULL,'0','17','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bHit,-5;','','');
REPLACE INTO `item_db` VALUES ('13113','P_Revolver2','Eden Revlover II','4','0','0','0','60','0','0','7','0','16777216','63','2','34','1','40',NULL,'0','17','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bHit,-5;','','');
REPLACE INTO `item_db` VALUES ('13150','Branch','Branch','4','3000','1500','500','50','0','0','9','3','16777216','63','2','34','1','1',NULL,'1','18','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -5143,15 +5143,15 @@ REPLACE INTO `item_db` VALUES ('13167','Gate_KeeperDD','Gate Keeper-DD','4','720
REPLACE INTO `item_db` VALUES ('13168','Thunder_P','Thunder P','4','76000','38000','700','80','0','0','9','1','16777216','63','2','34','3','70',NULL,'1','20','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bSplashRange,1; bonus bHit,-5; bonus bAspdRate,20;','','');
REPLACE INTO `item_db` VALUES ('13169','Thunder_P_','Thunder P','4','76000','38000','700','80','0','0','9','2','16777216','63','2','34','3','70',NULL,'1','20','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bSplashRange,1; bonus bHit,-5; bonus bAspdRate,20;','','');
REPLACE INTO `item_db` VALUES ('13170','Lever_Action_Rifle','Lever Action Rifle','4','20','10','770','138','0','0','9','2','16777216','63','2','34','3','70',NULL,'1','18','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bHit,20; bonus bCritical,50; bonus bAspdRate,-5;','','');
-REPLACE INTO `item_db` VALUES ('13171','BF_Rifle1','Soldier Rifle','4','0','0','0','50','0','0','9','0','16777216','63','2','34','3','80',NULL,'1','18','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bHit,10; bonus bCritical,10; bonus2 bAddRace,RC_DemiHuman,75; bonus2 bCastrate,GS_TRACKING,-25; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('13172','BF_Gatling_Gun1','Soldier Gatling Gun','4','0','0','0','80','0','0','9','0','16777216','63','2','34','3','80',NULL,'1','19','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,35; bonus2 bIgnoreDefRate,RC_DemiHuman,20; autobonus \"{ bonus bBaseAtk,80; bonus2 bHPLossRate,120,1000; }\",10,6000,BF_WEAPON,\"{ specialeffect2 EF_BASH3D; }\"; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('13173','BF_Shotgun1','Soldier Shotgun','4','0','0','0','100','0','0','9','0','16777216','63','2','34','3','80',NULL,'1','20','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bSplashRange,1; bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; autobonus \"{ bonus bBaseAtk,80; bonus2 bHPLossRate,100,1000; }\",30,6000,BF_WEAPON,\"{ specialeffect2 EF_BASH3D; }\"; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('13174','BF_Launcher1','Soldier Grenade Launcher','4','0','0','0','300','0','0','9','0','16777216','63','2','34','3','80',NULL,'1','21','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiHuman,35; bonus2 bIgnoreDefRate,RC_DemiHuman,20; autobonus \"{ bonus bBaseAtk,300; bonus2 bHPLossRate,120,1000; }\",30,9000,BF_WEAPON,\"{ specialeffect2 EF_BASH3D; }\"; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('13171','BF_Rifle1','Soldier Rifle','4','0','0','0','50','0','0','9','0','16777216','63','2','34','3','80',NULL,'1','18','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bHit,10; bonus bCritical,10; bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bCastrate,GS_TRACKING,-25; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('13172','BF_Gatling_Gun1','Soldier Gatling Gun','4','0','0','0','80','0','0','9','0','16777216','63','2','34','3','80',NULL,'1','19','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiPlayer,35; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; autobonus \"{ bonus bBaseAtk,80; bonus2 bHPLossRate,120,1000; }\",10,6000,BF_WEAPON,\"{ specialeffect2 EF_BASH3D; }\"; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('13173','BF_Shotgun1','Soldier Shotgun','4','0','0','0','100','0','0','9','0','16777216','63','2','34','3','80',NULL,'1','20','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus bSplashRange,1; bonus2 bAddRace,RC_DemiPlayer,55; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; autobonus \"{ bonus bBaseAtk,80; bonus2 bHPLossRate,100,1000; }\",30,6000,BF_WEAPON,\"{ specialeffect2 EF_BASH3D; }\"; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('13174','BF_Launcher1','Soldier Grenade Launcher','4','0','0','0','300','0','0','9','0','16777216','63','2','34','3','80',NULL,'1','21','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bDex,2; bonus2 bAddRace,RC_DemiPlayer,35; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; autobonus \"{ bonus bBaseAtk,300; bonus2 bHPLossRate,120,1000; }\",30,9000,BF_WEAPON,\"{ specialeffect2 EF_BASH3D; }\"; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('13175','Lever_Action_Rifle_C','Lever Action Rifle','4','20','10','0','170','0','0','9','0','16777216','63','2','34','3','0',NULL,'0','18','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bHit,20; bonus bCritical,50; bonus bAspdRate,-5;','','');
-REPLACE INTO `item_db` VALUES ('13176','Krieger_Rifle1','Glorious Rifle','4','0','0','0','90','0','0','9','0','16777216','63','2','34','4','80',NULL,'1','18','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus2 bSkillAtk,GS_TRIPLEACTION,30; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { bonus2 bCastrate,GS_TRACKING,25; bonus2 bSkillAtk,GS_TRACKING,getrefine() * 3; }','','');
-REPLACE INTO `item_db` VALUES ('13177','Krieger_Gatling1','Glorious Gatling Gun','4','0','0','0','90','0','0','9','0','16777216','63','2','34','4','80',NULL,'1','19','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,35; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus2 bSkillAtk,GS_TRIPLEACTION,30; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { bonus2 bAddRace,RC_Boss,getrefine(); bonus2 bAddRace,RC_NonBoss,getrefine(); }','','');
-REPLACE INTO `item_db` VALUES ('13178','Krieger_Shotgun1','Glorious Shotgun','4','0','0','0','110','0','0','9','0','16777216','63','2','34','4','80',NULL,'1','20','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,55; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bSplashRange,1; bonus2 bSkillAtk,GS_TRIPLEACTION,30; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { bonus2 bSkillAtk,GS_SPREADATTACK,getrefine() * 2; bonus3 bAddEffOnSkill,GS_SPREADATTACK,Eff_Stun,2000; }','','');
-REPLACE INTO `item_db` VALUES ('13179','Krieger_Launcher1','Glorious Grenade Launcher','4','0','0','0','330','0','0','9','0','16777216','63','2','34','4','80',NULL,'1','21','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,35; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus2 bSkillAtk,GS_TRIPLEACTION,30; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { bonus2 bSkillAtk,GS_GROUNDDRIFT,getrefine() * 2; bonus3 bAddEffOnSkill,GS_SPREADATTACK,Eff_Stun,2000; autobonus \"{ bonus bAspdRate,20; }\",200,20000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\"; }','','');
+REPLACE INTO `item_db` VALUES ('13176','Krieger_Rifle1','Glorious Rifle','4','0','0','0','90','0','0','9','0','16777216','63','2','34','4','80',NULL,'1','18','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus2 bSkillAtk,GS_TRIPLEACTION,30; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { bonus2 bCastrate,GS_TRACKING,25; bonus2 bSkillAtk,GS_TRACKING,getrefine() * 3; }','','');
+REPLACE INTO `item_db` VALUES ('13177','Krieger_Gatling1','Glorious Gatling Gun','4','0','0','0','90','0','0','9','0','16777216','63','2','34','4','80',NULL,'1','19','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,35; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus2 bSkillAtk,GS_TRIPLEACTION,30; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { bonus2 bAddRace,RC_Boss,getrefine(); bonus2 bAddRace,RC_NonBoss,getrefine(); }','','');
+REPLACE INTO `item_db` VALUES ('13178','Krieger_Shotgun1','Glorious Shotgun','4','0','0','0','110','0','0','9','0','16777216','63','2','34','4','80',NULL,'1','20','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,55; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bSplashRange,1; bonus2 bSkillAtk,GS_TRIPLEACTION,30; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { bonus2 bSkillAtk,GS_SPREADATTACK,getrefine() * 2; bonus3 bAddEffOnSkill,GS_SPREADATTACK,Eff_Stun,2000; }','','');
+REPLACE INTO `item_db` VALUES ('13179','Krieger_Launcher1','Glorious Grenade Launcher','4','0','0','0','330','0','0','9','0','16777216','63','2','34','4','80',NULL,'1','21','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,35; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus2 bSkillAtk,GS_TRIPLEACTION,30; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { bonus2 bSkillAtk,GS_GROUNDDRIFT,getrefine() * 2; bonus3 bAddEffOnSkill,GS_SPREADATTACK,Eff_Stun,2000; autobonus \"{ bonus bAspdRate,20; }\",200,20000,BF_WEAPON,\"{ specialeffect2 EF_POTION_BERSERK; }\"; }','','');
REPLACE INTO `item_db` VALUES ('13200','Bullet','Bullet','10','1','0','2','10','0','0','0','0','16777216','63','2','32768','0','1',NULL,'0','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('13201','Silver_Bullet','Silver Bullet','10','15','7','2','15','0','0','0','0','16777216','63','2','32768','0','1',NULL,'0','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Holy;','','');
REPLACE INTO `item_db` VALUES ('13202','Shell_Of_Blood','Bloody Shell','10','30','15','2','30','0','0','0','0','16777216','63','2','32768','0','1',NULL,'0','3','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddEff,Eff_Bleeding,100;','','');
@@ -5206,9 +5206,9 @@ REPLACE INTO `item_db` VALUES ('13301','Huuma_Giant_Wheel','Huuma Giant Wheel Sh
REPLACE INTO `item_db` VALUES ('13302','Huuma_Giant_Wheel_','Huuma Giant Wheel Shuriken','4','40000','20000','2500','50','0','0','1','4','33554432','63','2','34','4','42',NULL,'1','22','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableWeapon,0; bonus2 bAddEff,Eff_Bleeding,100;','','');
REPLACE INTO `item_db` VALUES ('13303','Huuma_Blaze','Huuma Blaze Shuriken','4','78000','39000','1500','185','0','0','1','0','33554432','63','2','34','4','55',NULL,'1','22','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableWeapon,0; bonus bAtkEle,Ele_Fire; bonus bDex,-2; bonus3 bAutoSpell,MG_FIREBALL,5,30;','','');
REPLACE INTO `item_db` VALUES ('13304','Huuma_Calm_Mind','Huuma Calm Mind','4','20','10','1550','112','0','0','1','2','33554432','63','2','34','3','70',NULL,'1','22','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableWeapon,0; bonus2 bSkillAtk,NJ_HUUMA,30; bonus bNoCastCancel,0;','','');
-REPLACE INTO `item_db` VALUES ('13305','BF_Huuma_Shuriken1','Brave Huuma Front Shuriken','4','20','10','0','55','0','0','1','0','33554432','63','2','34','3','80',NULL,'1','22','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bDex,1; bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('13306','BF_Huuma_Shuriken2','Valorous Huuma Front Shuriken','4','20','10','0','55','0','0','1','0','33554432','63','2','34','3','80',NULL,'1','22','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bDex,1; bonus2 bAddRace,RC_DemiHuman,95; autobonus \"{ bonus2 bSkillAtk,NJ_HUUMA,100; bonus2 bSkillAtk,NJ_ISSEN,100; }\",50,10000,BF_WEAPON,\"{specialeffect2 EF_POTION_BERSERK; }\"; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('13307','Krieger_Huuma_Shuriken1','Glorious Shuriken','4','20','10','0','55','0','0','1','0','33554432','63','2','34','4','80',NULL,'1','22','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,95; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bMatkRate,15; autobonus \"{ bonus2 bSkillAtk,NJ_HUUMA,100; bonus2 bSkillAtk,NJ_ISSEN,100; }\",50,10000; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-3)*(getrefine()-3); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>8) { bonus5 bAutoSpellOnSkill,NJ_ISSEN,AL_HEAL,10,1000,1; bonus4 bAutoSpellOnSkill,NJ_HUUMA,NPC_CRITICALWOUND,2,200; }','','');
+REPLACE INTO `item_db` VALUES ('13305','BF_Huuma_Shuriken1','Brave Huuma Front Shuriken','4','20','10','0','55','0','0','1','0','33554432','63','2','34','3','80',NULL,'1','22','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bDex,1; bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('13306','BF_Huuma_Shuriken2','Valorous Huuma Front Shuriken','4','20','10','0','55','0','0','1','0','33554432','63','2','34','3','80',NULL,'1','22','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bDex,1; bonus2 bAddRace,RC_DemiPlayer,95; autobonus \"{ bonus2 bSkillAtk,NJ_HUUMA,100; bonus2 bSkillAtk,NJ_ISSEN,100; }\",50,10000,BF_WEAPON,\"{specialeffect2 EF_POTION_BERSERK; }\"; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('13307','Krieger_Huuma_Shuriken1','Glorious Shuriken','4','20','10','0','55','0','0','1','0','33554432','63','2','34','4','80',NULL,'1','22','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,95; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bMatkRate,15; autobonus \"{ bonus2 bSkillAtk,NJ_HUUMA,100; bonus2 bSkillAtk,NJ_ISSEN,100; }\",50,10000; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-3)*(getrefine()-3); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>8) { bonus5 bAutoSpellOnSkill,NJ_ISSEN,AL_HEAL,10,1000,1; bonus4 bAutoSpellOnSkill,NJ_HUUMA,NPC_CRITICALWOUND,2,200; }','','');
REPLACE INTO `item_db` VALUES ('13308','Huuma_Blaze_I','Huuma Blaze Shuriken','4','0','0','0','230','0','0','1','0','33554432','63','2','34','4','0',NULL,'0','22','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','bonus bUnbreakableWeapon,0; bonus bAtkEle,Ele_Fire; bonus bDex,2;','','');
REPLACE INTO `item_db` VALUES ('13309','Huuma_Giant_Wheel_C','Huuma Giant Wheel Shuriken','4','0','0','0','99','0','0','1','0','33554432','63','2','34','4','1',NULL,'0','22','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('13400','Cutlas_','Cutlus','4','20','10','900','150','0','0','1','1','414946','63','2','2','4','40',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill SM_BASH,5; bonus bStr,2; bonus bDef,1;','','');
@@ -5218,16 +5218,16 @@ REPLACE INTO `item_db` VALUES ('13403','Solar_Sword_C','Solar Sword','4','2','1'
REPLACE INTO `item_db` VALUES ('13404','Platinum_Shotel','Platinum Shotel','4','20','10','1500','130','0','0','1','1','414946','63','2','2','4','55',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bCritical,50;','','');
REPLACE INTO `item_db` VALUES ('13405','Curved_Sword','Curved Sword','4','20','10','800','125','0','0','1','2','414946','63','2','2','4','55',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,10; bonus2 bAddEff,Eff_Curse,300;','','');
REPLACE INTO `item_db` VALUES ('13406','Edger','Edger','4','20','10','0','120','0','0','1','0','414946','63','2','2','1','0',NULL,'0','2','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_Boss,50; bonus2 bAddRace,RC_NonBoss,50;','','');
-REPLACE INTO `item_db` VALUES ('13407','Nagan_C','Refined Nagan','4','1','0','0','148','0','0','1','0','414946','63','2','2','4','0',NULL,'0','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill TF_DOUBLE,5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,40;','','');
+REPLACE INTO `item_db` VALUES ('13407','Nagan_C','Refined Nagan','4','1','0','0','148','0','0','1','0','414946','63','2','2','4','0',NULL,'0','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill TF_DOUBLE,5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiPlayer,40;','','');
REPLACE INTO `item_db` VALUES ('13408','Fire_Brand_C','Refined Fireblend','4','1','0','0','120','0','0','1','0','414946','63','2','2','4','0',NULL,'0','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Fire; bonus bInt,2; skill MG_FIREBOLT,5; bonus3 bAutoSpell,MG_FIREBOLT,5,100;','','');
REPLACE INTO `item_db` VALUES ('13409','Immaterial_Sword_C','Refined Immaterial Sword','4','1','0','0','160','0','0','1','0','414946','63','2','2','4','0',NULL,'0','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Ghost; bonus2 bSPVanishRate,45,30; bonus bSPDrainValue,-1; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('13410','BF_Sword1','Valorous Gladiator Blade','4','20','10','0','115','0','0','1','0','414947','63','2','2','3','80',NULL,'1','2','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0;','','');
-REPLACE INTO `item_db` VALUES ('13411','BF_Sword2','Brave Gladiator Blade','4','20','10','0','115','0','0','1','0','414947','63','2','2','3','80',NULL,'1','2','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus2 bAddRace,RC_DemiHuman,75; bonus bMatkRate,10; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('13410','BF_Sword1','Valorous Gladiator Blade','4','20','10','0','115','0','0','1','0','414947','63','2','2','3','80',NULL,'1','2','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0;','','');
+REPLACE INTO `item_db` VALUES ('13411','BF_Sword2','Brave Gladiator Blade','4','20','10','0','115','0','0','1','0','414947','63','2','2','3','80',NULL,'1','2','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bDex,1; bonus2 bAddRace,RC_DemiPlayer,75; bonus bMatkRate,10; bonus bUnbreakableWeapon,0;','','');
REPLACE INTO `item_db` VALUES ('13412','Twin_Edge_B','Twin Edge of Naght Sieger','4','20','10','1500','150','0','0','1','3','414946','2','2','2','4','75',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Water; skill MG_FROSTDIVER,5; autobonus \"{ bonus bIgnoreDefRace,RC_NonBoss; }\",50,5000;','','');
REPLACE INTO `item_db` VALUES ('13413','Twin_Edge_R','Twin Edge of Naght Sieger','4','20','10','1500','160','0','0','1','3','414946','2','2','2','4','75',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkEle,Ele_Fire; skill WZ_METEOR,3; autobonus \"{ bonus bIgnoreDefRace,RC_NonBoss; }\",50,5000;','','');
REPLACE INTO `item_db` VALUES ('13414','Elemental_Sword','Elemental Sword','4','20','10','1200','105','0','0','1','3','414946','2','2','2','3','70',NULL,'1','2','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bInt,4; bonus bDex,1; bonus bMatkRate,5; bonus2 bAddEle,Ele_Neutral,10; bonus3 bAutoSpell,MG_COLDBOLT,3,50; bonus4 bAutoSpellOnSkill,MG_COLDBOLT,MG_FIREBOLT,3,1000; bonus4 bAutoSpellOnSkill,MG_FIREBOLT,MG_LIGHTNINGBOLT,3,1000; bonus4 bAutoSpellOnSkill,MG_LIGHTNINGBOLT,WZ_EARTHSPIKE,3,1000;','','');
REPLACE INTO `item_db` VALUES ('13415','N_Falchion','Novice Falchion','4','0','0','0','59','0','0','1','3','414947','63','2','2','1','2',NULL,'0','2','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('13416','Krieger_Onehand_Sword1','Glorious Flamberge','4','20','10','0','130','0','0','1','0','414947','63','2','2','4','80',NULL,'1','2','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiHuman,75; bonus2 bIgnoreDefRate,RC_DemiHuman,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiHuman,5; } if(getrefine()>6) bonus bAspdRate,5; if(getrefine()>8) { bonus bAspdRate,5; bonus4 bAutoSpellOnSkill,SM_BASH,NPC_CRITICALWOUND,2,200; }','','');
+REPLACE INTO `item_db` VALUES ('13416','Krieger_Onehand_Sword1','Glorious Flamberge','4','20','10','0','130','0','0','1','0','414947','63','2','2','4','80',NULL,'1','2','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus2 bAddRace,RC_DemiPlayer,75; bonus2 bIgnoreDefRate,RC_DemiPlayer,20; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiPlayer,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRate,RC_DemiPlayer,5; } if(getrefine()>6) bonus bAspdRate,5; if(getrefine()>8) { bonus bAspdRate,5; bonus4 bAutoSpellOnSkill,SM_BASH,NPC_CRITICALWOUND,2,200; }','','');
REPLACE INTO `item_db` VALUES ('13417','Krieger_Onehand_Sword2','Glorious Rapier','4','20','10','0','130','0','0','1','0','414947','63','2','2','4','80',NULL,'1','2','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bInt,getrefine()-5; bonus bMatkRate,10; bonus bUnbreakableWeapon,0; if(getrefine()>5) bonus bUseSPrate,-10; if(getrefine()>8) bonus bInt,5;','','');
REPLACE INTO `item_db` VALUES ('13418','Krieger_Onehand_Sword3','Glorious Holy Avenger','4','20','10','0','130','0','0','1','0','279714','63','2','2','4','80',NULL,'1','2','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','bonus bInt,getrefine()-5; bonus bMatkRate,10; bonus bUnbreakableWeapon,0; if(getrefine()>5) bonus bUseSPrate,-10; if(getrefine()>8) bonus4 bAutoSpellOnSkill,PA_PRESSURE,PR_LEXDIVINA,1,1000; if(getrefine()>9) bonus bInt,5;','','');
REPLACE INTO `item_db` VALUES ('13419','Holy_Saber','Holy saber','4','20','10','0','160','0','0','1','0','414946','63','2','2','3','0',NULL,'0','2','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
@@ -6136,7 +6136,7 @@ REPLACE INTO `item_db` VALUES ('14606','Job_Manual25','JOB Battle Manual','2','0
REPLACE INTO `item_db` VALUES ('14607','Luxurious_Dinner_W','Luxurious Western Food','2','10000','5000','600','0','0','0','0','0','4294967295','63','2','0','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','sc_start SC_INCALLSTATUS,3600000,3;','','');
REPLACE INTO `item_db` VALUES ('14608','Luxurious_Dinner_E','Manchu-Han Imperial Feast','2','20000','10000','1200','0','0','0','0','0','4294967295','63','2','0','0','0',NULL,'0','0','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','sc_start SC_INCALLSTATUS,3600000,6;','','');
REPLACE INTO `item_db` VALUES ('14609','Spoiled_Cuisine','Spoiled Cuisine','2','0','0','0','0','0','0','0','0','4294967295','63','2','0','0','0',NULL,'0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','percentheal 10,10;','','');
-REPLACE INTO `item_db` VALUES ('15000','Bone_Plate','Bone Plate','5','20','10','1000','0','0','7','0','1','414946','2','2','16','0','85',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bMdef,3; bonus2 bIgnoreDefRate,RC_DemiHuman,10; bonus2 bIgnoreDefRate,RC_Brute,10; bonus3 bAutoSpellWhenHit,NPC_WIDEBLEEDING,1,10;','','');
+REPLACE INTO `item_db` VALUES ('15000','Bone_Plate','Bone Plate','5','20','10','1000','0','0','7','0','1','414946','2','2','16','0','85',NULL,'1','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,1; bonus bMdef,3; bonus2 bIgnoreDefRate,RC_DemiPlayer,10; bonus2 bIgnoreDefRate,RC_Brute,10; bonus3 bAutoSpellWhenHit,NPC_WIDEBLEEDING,1,10;','','');
REPLACE INTO `item_db` VALUES ('15001','Odin\'s_Blessing_I','Odin\'s Blessing','5','0','0','0','0','0','10','0','0','2147483646','63','2','16','0','0',NULL,'0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('16000','Erde','Erde','4','20','10','500','130','0','0','1','2','312754','2','2','2','4','50',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus2 bSkillAtk,AM_ACIDTERROR,20; bonus2 bSkillAtk,AM_DEMONSTRATION,20; bonus bMaxSP,50; bonus bHealPower,10;','','');
REPLACE INTO `item_db` VALUES ('16001','Red_Square_Bag','Red Square Bag','4','20','10','500','130','0','0','1','2','312754','2','2','2','3','50',NULL,'1','8','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bMaxHP,200; bonus2 bSkillAtk,AM_ACIDTERROR,20; bonus2 bSkillAtk,AM_DEMONSTRATION,20; bonus2 bAddMonsterDropItem,501,50; bonus2 bAddMonsterDropItem,502,20; bonus2 bAddMonsterDropItem,503,20; bonus2 bAddMonsterDropItem,504,20; bonus2 bAddMonsterDropItem,505,10; if(readparam(bStr)>=95) bonus2 bAddEff,Eff_Stun,500;','','');
@@ -6171,7 +6171,7 @@ REPLACE INTO `item_db` VALUES ('18539','Skull_Cap','Skull Cap','5','40','20','20
REPLACE INTO `item_db` VALUES ('18595','Horn_Of_Ancient','Horn of Ancient','5','40','20','200','0','0','8','0','1','4294967295','63','2','256','0','50',NULL,'1','757','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','autobonus \"{ bonus bBaseAtk,100; }\",5,10000,0,\"{ specialeffect2 EF_POTION_BERSERK; }\";','','');
REPLACE INTO `item_db` VALUES ('18596','Sprout_Hat','Sprout Hat','5','20','10','200','0','0','4','0','0','4294967295','63','2','256','0','70',NULL,'1','758','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','skill WZ_HEAVENDRIVE,3;','','');
REPLACE INTO `item_db` VALUES ('18597','Mercury_Helm','Mercury Riser','5','40','20','200','0','0','10','0','1','4294967295','63','2','256','0','0',NULL,'0','759','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAspdRate,3; bonus bCritical,3; if(getrefine() >= 7) { bonus bAspdRate,2; bonus bCritical,2; } if(getrefine() >= 9) { bonus bAspdRate,2; bonus bCritical,2; }','','');
-REPLACE INTO `item_db` VALUES ('18600','Cat_Ears_Beret','Cat Ear Beret','5','20','10','100','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'1','761','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkRate,5; if(getrefine() > 5 && getrefine() <= 12) { bonus2 bAddRace,RC_DemiHuman,(getrefine() - 5); bonus2 bSubRace,RC_DemiHuman,(getrefine() - 5); } if(getrefine() > 12) { bonus2 bAddRace,RC_DemiHuman,7; bonus2 bSubRace,RC_DemiHuman,7; }','','');
+REPLACE INTO `item_db` VALUES ('18600','Cat_Ears_Beret','Cat Ear Beret','5','20','10','100','0','0','5','0','0','4294967295','63','2','256','0','0',NULL,'1','761','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bAtkRate,5; if(getrefine() > 5 && getrefine() <= 12) { bonus2 bAddRace,RC_DemiPlayer,(getrefine() - 5); bonus2 bSubRace,RC_DemiPlayer,(getrefine() - 5); } if(getrefine() > 12) { bonus2 bAddRace,RC_DemiPlayer,7; bonus2 bSubRace,RC_DemiPlayer,7; }','','');
REPLACE INTO `item_db` VALUES ('18612','White_Musang_Hat','White Musang Hat','5','40','20','200','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','770','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bStr,2; bonus bVit,2; bonus bLuk,1; bonus bUnbreakableHelm,0;','','');
REPLACE INTO `item_db` VALUES ('18613','Black_Musang_Hat','Black Musang Hat','5','40','20','200','0','0','3','0','1','4294967295','63','2','256','0','0',NULL,'1','771','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','bonus bInt,2; bonus bDex,2; bonus bAgi,1; bonus bUnbreakableHelm,0;','','');
REPLACE INTO `item_db` VALUES ('18620','Heart_Eyepatch','Heart Eyepatch','5','5','2','200','0','0','2','0','0','4294967295','63','2','512','0','20',NULL,'1','779','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
diff --git a/sql-files/upgrades/2013-04-16--01-24.sql b/sql-files/upgrades/2013-04-16--01-24.sql
index d011e27e3..951ca8cd2 100644
--- a/sql-files/upgrades/2013-04-16--01-24.sql
+++ b/sql-files/upgrades/2013-04-16--01-24.sql
@@ -1,3 +1,3 @@
#1366075474
--- Info http://hercules.ws/board/topic/410-skill-script-command-updatefix/
+-- Info http://herc.ws/board/topic/410-skill-script-command-updatefix/
UPDATE `skill` SET `flag` = 0 WHERE `flag` = 4 AND `id` != 2535 AND `id` != 681;
diff --git a/src/char/char.c b/src/char/char.c
index d8d9d386e..2b8f70969 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -148,11 +148,6 @@ struct fame_list smith_fame_list[MAX_FAME_LIST];
struct fame_list chemist_fame_list[MAX_FAME_LIST];
struct fame_list taekwon_fame_list[MAX_FAME_LIST];
-// check for exit signal
-// 0 is saving complete
-// other is char_id
-unsigned int save_flag = 0;
-
// Initial position (it's possible to set it in conf file)
struct point start_point = { 0, 53, 111 };
@@ -240,7 +235,7 @@ void char_set_char_online(int map_id, int char_id, int account_id)
{
ShowNotice("chr->set_char_online: Character %d:%d marked in map server %d, but map server %d claims to have (%d:%d) online!\n",
character->account_id, character->char_id, character->server, map_id, account_id, char_id);
- mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2);
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2); // 2: Already connected to server
}
//Update state data
@@ -345,7 +340,7 @@ static int char_db_kickoffline(DBKey key, DBData *data, va_list ap)
//Kick out any connected characters, and set them offline as appropriate.
if (character->server > -1 && character->server < MAX_MAP_SERVERS)
- mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 1);
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 1); // 1: Server closed
else if (character->waiting_disconnect == INVALID_TIMER)
chr->set_char_offline(character->char_id, character->account_id);
else
@@ -1998,7 +1993,8 @@ int char_mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p) {
#endif
//When the weapon is sent and your option is riding, the client crashes on login!?
- WBUFW(buf,56) = (p->option&(0x20|0x80000|0x100000|0x200000|0x400000|0x800000|0x1000000|0x2000000|0x4000000|0x8000000)) ? 0 : p->weapon;
+ // FIXME[Haru]: is OPTION_HANBOK intended to be part of this list? And if it is, should the list also include other OPTION_ costumes?
+ WBUFL(buf,56) = p->option&(OPTION_RIDING|OPTION_DRAGON|OPTION_WUG|OPTION_WUGRIDER|OPTION_MADOGEAR|OPTION_HANBOK) ? 0 : p->weapon;
WBUFW(buf,58) = p->base_level;
WBUFW(buf,60) = min(p->skill_point, INT16_MAX);
@@ -2247,7 +2243,7 @@ static void char_auth_ok(int fd, struct char_session_data *sd)
// check if character is not online already. [Skotlex]
if (character->server > -1) {
//Character already online. KICK KICK KICK
- mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2);
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2); // 2: Already connected to server
if (character->waiting_disconnect == INVALID_TIMER)
character->waiting_disconnect = timer->add(timer->gettick()+20000, chr->waiting_disconnect, character->account_id, 0);
character->pincode_enable = -1;
@@ -2534,7 +2530,7 @@ void char_parse_fromlogin_kick(int fd)
{// account is already marked as online!
if( character->server > -1 ) {
//Kick it from the map server it is on.
- mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2);
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2); // 2: Already connected to server
if (character->waiting_disconnect == INVALID_TIMER)
character->waiting_disconnect = timer->add(timer->gettick()+AUTH_TIMEOUT, chr->waiting_disconnect, character->account_id, 0);
}
@@ -3181,7 +3177,7 @@ void char_parse_frommap_set_users(int fd, int id)
if (character->server > -1 && character->server != id) {
ShowNotice("Set map user: Character (%d:%d) marked on map server %d, but map server %d claims to have (%d:%d) online!\n",
character->account_id, character->char_id, character->server, id, aid, cid);
- mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2);
+ mapif->disconnectplayer(chr->server[character->server].fd, character->account_id, character->char_id, 2); // 2: Already connected to server
}
character->server = id;
character->char_id = cid;
@@ -3547,36 +3543,37 @@ void char_parse_frommap_change_account(int fd)
#endif // 0
} else {
switch (type) {
- case 1: // block
- loginif->block_account(account_id, 5);
+ case CHAR_ASK_NAME_BLOCK:
+ loginif->block_account(account_id, 5);
break;
- case 2: // ban
- loginif->ban_account(account_id, year, month, day, hour, minute, second);
+ case CHAR_ASK_NAME_BAN:
+ loginif->ban_account(account_id, year, month, day, hour, minute, second);
break;
- case 3: // unblock
- loginif->block_account(account_id, 0);
+ case CHAR_ASK_NAME_UNBLOCK:
+ loginif->block_account(account_id, 0);
break;
- case 4: // unban
- loginif->unban_account(account_id);
+ case CHAR_ASK_NAME_UNBAN:
+ loginif->unban_account(account_id);
break;
- case 5: // changesex
- loginif->changesex(account_id);
+ case CHAR_ASK_NAME_CHANGESEX:
+ loginif->changesex(account_id);
break;
- case 6: // char ban - handled by char server, so no redirection
- chr->ban(account_id, char_id, &unban_time, year, month, day, hour, minute, second);
+ case CHAR_ASK_NAME_CHARBAN:
+ /* handled by char server, so no redirection */
+ chr->ban(account_id, char_id, &unban_time, year, month, day, hour, minute, second);
break;
- case 7: // char unban - handled by char server, so no redirection
- chr->unban(char_id, &result);
+ case CHAR_ASK_NAME_CHARUNBAN:
+ chr->unban(char_id, &result);
break;
- case 8: // changecharsex - handled by char server, so no redirection
- result = chr->changecharsex(char_id, sex);
+ case CHAR_ASK_NAME_CHANGECHARSEX:
+ result = chr->changecharsex(char_id, sex);
break;
}
}
}
// send answer if a player ask, not if the server ask
- if (acc != -1 && type != 5 && type != 8) { // Don't send answer for changesex
+ if (acc != -1 && type != CHAR_ASK_NAME_CHANGESEX && type != CHAR_ASK_NAME_CHANGECHARSEX) { // Don't send answer for changesex
chr->ask_name_ack(fd, acc, name, type, result);
}
}
@@ -3833,7 +3830,7 @@ void char_parse_frommap_request_stats_report(int fd)
opt.silent = 1;
opt.setTimeo = 1;
- if( (sfd = make_connection(host2ip("stats.hercules.ws"),(uint16)25427,&opt) ) == -1 ) {
+ if( (sfd = make_connection(host2ip("stats.herc.ws"),(uint16)25427,&opt) ) == -1 ) {
RFIFOSKIP(fd, RFIFOW(fd,2) );/* skip this packet */
RFIFOFLUSH(fd);
return;/* connection not possible, we drop the report */
@@ -4264,21 +4261,21 @@ static void char_delete2_req(int fd, struct char_session_data* sd)
ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == char_id );
if( i == MAX_CHARS )
{// character not found
- chr->delete2_ack(fd, char_id, 3, 0);
+ chr->delete2_ack(fd, char_id, 3, 0); // 3: A database error occurred
return;
}
if( SQL_SUCCESS != SQL->Query(inter->sql_handle, "SELECT `delete_date` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) || SQL_SUCCESS != SQL->NextRow(inter->sql_handle) )
{
Sql_ShowDebug(inter->sql_handle);
- chr->delete2_ack(fd, char_id, 3, 0);
+ chr->delete2_ack(fd, char_id, 3, 0); // 3: A database error occurred
return;
}
SQL->GetData(inter->sql_handle, 0, &data, NULL); delete_date = strtoul(data, NULL, 10);
if( delete_date ) {// character already queued for deletion
- chr->delete2_ack(fd, char_id, 0, 0);
+ chr->delete2_ack(fd, char_id, 0, 0); // 0: An unknown error occurred
return;
}
@@ -4291,7 +4288,7 @@ static void char_delete2_req(int fd, struct char_session_data* sd)
|| SQL_SUCCESS != SQL->NextRow(inter->sql_handle)
) {
Sql_ShowDebug(inter->sql_handle);
- chr->delete2_ack(fd, char_id, 3, 0);
+ chr->delete2_ack(fd, char_id, 3, 0); // 3: A database error occurred
return;
}
SQL->GetData(inter->sql_handle, 0, &data, NULL); party_id = atoi(data);
@@ -4299,13 +4296,13 @@ static void char_delete2_req(int fd, struct char_session_data* sd)
if( guild_id )
{
- chr->delete2_ack(fd, char_id, 4, 0);
+ chr->delete2_ack(fd, char_id, 4, 0); // 4: To delete a character you must withdraw from the guild
return;
}
if( party_id )
{
- chr->delete2_ack(fd, char_id, 5, 0);
+ chr->delete2_ack(fd, char_id, 5, 0); // 5: To delete a character you must withdraw from the party
return;
}
}
@@ -4316,11 +4313,11 @@ static void char_delete2_req(int fd, struct char_session_data* sd)
if( SQL_SUCCESS != SQL->Query(inter->sql_handle, "UPDATE `%s` SET `delete_date`='%lu' WHERE `char_id`='%d'", char_db, (unsigned long)delete_date, char_id) )
{
Sql_ShowDebug(inter->sql_handle);
- chr->delete2_ack(fd, char_id, 3, 0);
+ chr->delete2_ack(fd, char_id, 3, 0); // 3: A database error occurred
return;
}
- chr->delete2_ack(fd, char_id, 1, delete_date);
+ chr->delete2_ack(fd, char_id, 1, delete_date); // 1: success
}
static void char_delete2_accept(int fd, struct char_session_data* sd)
@@ -4349,14 +4346,14 @@ static void char_delete2_accept(int fd, struct char_session_data* sd)
ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == char_id );
if( i == MAX_CHARS )
{// character not found
- chr->delete2_accept_ack(fd, char_id, 3);
+ chr->delete2_accept_ack(fd, char_id, 3); // 3: A database error occurred
return;
}
if( SQL_SUCCESS != SQL->Query(inter->sql_handle, "SELECT `base_level`,`delete_date` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) || SQL_SUCCESS != SQL->NextRow(inter->sql_handle) )
{// data error
Sql_ShowDebug(inter->sql_handle);
- chr->delete2_accept_ack(fd, char_id, 3);
+ chr->delete2_accept_ack(fd, char_id, 3); // 3: A database error occurred
return;
}
@@ -4365,33 +4362,33 @@ static void char_delete2_accept(int fd, struct char_session_data* sd)
if( !delete_date || delete_date>time(NULL) )
{// not queued or delay not yet passed
- chr->delete2_accept_ack(fd, char_id, 4);
+ chr->delete2_accept_ack(fd, char_id, 4); // 4: Deleting not yet possible time
return;
}
if( strcmp(sd->birthdate+2, birthdate) ) // +2 to cut off the century
{// birth date is wrong
- chr->delete2_accept_ack(fd, char_id, 5);
+ chr->delete2_accept_ack(fd, char_id, 5); // 5: Date of birth do not match
return;
}
if( ( char_del_level > 0 && base_level >= (unsigned int)char_del_level ) || ( char_del_level < 0 && base_level <= (unsigned int)(-char_del_level) ) )
{// character level config restriction
- chr->delete2_accept_ack(fd, char_id, 2);
+ chr->delete2_accept_ack(fd, char_id, 2); // 2: Due to system settings can not be deleted
return;
}
// success
if( chr->delete_char_sql(char_id) < 0 )
{
- chr->delete2_accept_ack(fd, char_id, 3);
+ chr->delete2_accept_ack(fd, char_id, 3); // 3: A database error occurred
return;
}
// refresh character list cache
sd->found_char[i] = -1;
- chr->delete2_accept_ack(fd, char_id, 1);
+ chr->delete2_accept_ack(fd, char_id, 1); // 1: success
}
static void char_delete2_cancel(int fd, struct char_session_data* sd)
@@ -4403,7 +4400,7 @@ static void char_delete2_cancel(int fd, struct char_session_data* sd)
ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == char_id );
if( i == MAX_CHARS )
{// character not found
- chr->delete2_cancel_ack(fd, char_id, 2);
+ chr->delete2_cancel_ack(fd, char_id, 2); // 2: A database error occurred
return;
}
@@ -4413,11 +4410,11 @@ static void char_delete2_cancel(int fd, struct char_session_data* sd)
if( SQL_SUCCESS != SQL->Query(inter->sql_handle, "UPDATE `%s` SET `delete_date`='0' WHERE `char_id`='%d'", char_db, char_id) )
{
Sql_ShowDebug(inter->sql_handle);
- chr->delete2_cancel_ack(fd, char_id, 2);
+ chr->delete2_cancel_ack(fd, char_id, 2); // 2: A database error occurred
return;
}
- chr->delete2_cancel_ack(fd, char_id, 1);
+ chr->delete2_cancel_ack(fd, char_id, 1); // 1: success
}
void char_send_account_id(int fd, int account_id)
@@ -4587,7 +4584,7 @@ void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl)
//Not found?? May be forged packet.
Sql_ShowDebug(inter->sql_handle);
SQL->FreeResult(inter->sql_handle);
- chr->auth_error(fd, 0);
+ chr->auth_error(fd, 0); // rejected from server
return;
}
@@ -4596,7 +4593,7 @@ void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl)
/* client doesn't let it get to this point if you're banned, so its a forged packet */
if( sd->found_char[slot] == char_id && sd->unban_time[slot] > time(NULL) ) {
- chr->auth_error(fd, 0);
+ chr->auth_error(fd, 0); // rejected from server
return;
}
@@ -4605,7 +4602,7 @@ void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl)
if( !chr->mmo_char_fromsql(char_id, &char_dat, true) ) { /* failed? set it back offline */
chr->set_char_offline(char_id, sd->account_id);
/* failed to load something. REJECT! */
- chr->auth_error(fd, 0);
+ chr->auth_error(fd, 0); // rejected from server
return;/* jump off this boat */
}
@@ -4636,14 +4633,14 @@ void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl)
ARR_FIND( 0, ARRAYLENGTH(chr->server), j, chr->server[j].fd >= 0 && chr->server[j].map );
if (j == ARRAYLENGTH(chr->server)) {
ShowInfo("Connection Closed. No map servers available.\n");
- chr->authfail_fd(fd, 1);
+ chr->authfail_fd(fd, 1); // 1 = Server closed
return;
}
i = chr->search_default_maps_mapserver(cd);
if (i < 0)
{
ShowInfo("Connection Closed. No map server available that has a major city, and unable to find map-server for '%s'.\n", mapindex_id2name(cd->last_point.map));
- chr->authfail_fd(fd, 1);
+ chr->authfail_fd(fd, 1); // 1 = Server closed
return;
}
}
@@ -4655,8 +4652,7 @@ void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl)
ShowError("chr->parse_char: Attempting to write to invalid session %d! Map Server #%d disconnected.\n", map_fd, i);
chr->server[i].fd = -1;
memset(&chr->server[i], 0, sizeof(struct mmo_map_server));
- //Send server closed.
- chr->authfail_fd(fd, 1);
+ chr->authfail_fd(fd, 1); // 1 = Server closed
return;
}
@@ -4714,15 +4710,18 @@ void char_creation_ok(int fd, struct mmo_charstatus *char_dat)
void char_parse_char_create_new_char(int fd, struct char_session_data* sd)
{
int result;
- if( !char_new ) //turn character creation on/off [Kevin]
+ if( !char_new ) {
+ //turn character creation on/off [Kevin]
result = -2;
- else
+ } else {
#if PACKETVER >= 20120307
result = chr->make_new_char_sql(sd, (char*)RFIFOP(fd,2), 1, 1, 1, 1, 1, 1, RFIFOB(fd,26),RFIFOW(fd,27),RFIFOW(fd,29));
#else
result = chr->make_new_char_sql(sd, (char*)RFIFOP(fd,2),RFIFOB(fd,26),RFIFOB(fd,27),RFIFOB(fd,28),RFIFOB(fd,29),RFIFOB(fd,30),RFIFOB(fd,31),RFIFOB(fd,32),RFIFOW(fd,33),RFIFOW(fd,35));
#endif
+ }
+ //'Charname already exists' (-1), 'Char creation denied' (-2) and 'You are underaged' (-3)
if (result < 0) {
chr->creation_failed(fd, result);
} else {
@@ -4961,9 +4960,9 @@ void char_parse_char_login_map_server(int fd)
strcmp(l_user, chr->userid) != 0 ||
strcmp(l_pass, chr->passwd) != 0 )
{
- chr->login_map_server_ack(fd, 3);
+ chr->login_map_server_ack(fd, 3); // Failure
} else {
- chr->login_map_server_ack(fd, 0);
+ chr->login_map_server_ack(fd, 0); // Success
chr->server[i].fd = fd;
chr->server[i].ip = ntohl(RFIFOL(fd,54));
@@ -5101,7 +5100,6 @@ int char_parse_char(int fd)
FIFOSD_CHECK(3);
{
chr->parse_char_select(fd, sd, ipl);
-
}
break;
diff --git a/src/char/int_guild.c b/src/char/int_guild.c
index 3ba51e1f0..2753964e8 100644
--- a/src/char/int_guild.c
+++ b/src/char/int_guild.c
@@ -837,7 +837,7 @@ int inter_guild_calcinfo(struct guild *g)
g->next_exp = nextexp;
// Set the max number of members, Guild Extension skill - currently adds 6 to max per skill lv.
- g->max_member = 16 + inter_guild->checkskill(g, GD_EXTENSION) * 6;
+ g->max_member = BASE_GUILD_SIZE + inter_guild->checkskill(g, GD_EXTENSION) * 6;
if(g->max_member > MAX_GUILD)
{
ShowError("Guild %d:%s has capacity for too many guild members (%d), max supported is %d\n", g->guild_id, g->name, g->max_member, MAX_GUILD);
@@ -1186,7 +1186,7 @@ int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member
g->member[0].modified = GS_MEMBER_MODIFIED;
// Set default positions
- g->position[0].mode=0x11;
+ g->position[0].mode = GPERM_BOTH;
strcpy(g->position[0].name,"GuildMaster");
strcpy(g->position[MAX_GUILDPOSITION-1].name,"Newbie");
g->position[0].modified = g->position[MAX_GUILDPOSITION-1].modified = GS_POSITION_MODIFIED;
@@ -1196,10 +1196,10 @@ int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member
}
// Initialize guild property
- g->max_member=16;
- g->average_lv=master->lv;
- g->connect_member=1;
- g->guild_lv=1;
+ g->max_member = BASE_GUILD_SIZE;
+ g->average_lv = master->lv;
+ g->connect_member = 1;
+ g->guild_lv = 1;
for(i=0;i<MAX_GUILDSKILL;i++)
g->skill[i].id=i + GD_SKILLBASE;
@@ -1252,8 +1252,7 @@ int mapif_parse_GuildAddMember(int fd, int guild_id, struct guild_member *m)
nullpo_ret(m);
g = inter_guild->fromsql(guild_id);
if(g==NULL){
- // Failed to add
- mapif->guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
+ mapif->guild_memberadded(fd,guild_id,m->account_id,m->char_id,1); // 1: Failed to add
return 0;
}
@@ -1264,7 +1263,7 @@ int mapif_parse_GuildAddMember(int fd, int guild_id, struct guild_member *m)
{
memcpy(&g->member[i],m,sizeof(struct guild_member));
g->member[i].modified = (GS_MEMBER_NEW | GS_MEMBER_MODIFIED);
- mapif->guild_memberadded(fd,guild_id,m->account_id,m->char_id,0);
+ mapif->guild_memberadded(fd,guild_id,m->account_id,m->char_id,0); // 0: success
if (!inter_guild->calcinfo(g)) //Send members if it was not invoked.
mapif->guild_info(-1,g);
@@ -1275,8 +1274,7 @@ int mapif_parse_GuildAddMember(int fd, int guild_id, struct guild_member *m)
}
}
- // Failed to add
- mapif->guild_memberadded(fd,guild_id,m->account_id,m->char_id,1);
+ mapif->guild_memberadded(fd,guild_id,m->account_id,m->char_id,1); // 1: Failed to add
return 0;
}
@@ -1883,8 +1881,8 @@ int mapif_parse_GuildMasterChange(int fd, int guild_id, const char* name, int le
// Data packet length that you set to inter.c
//- Shouldn't do checking and packet length, RFIFOSKIP is done by the caller
// Must Return
-// 1 : ok
-// 0 : error
+// 1 : ok
+// 0 : error
int inter_guild_parse_frommap(int fd)
{
RFIFOHEAD(fd);
diff --git a/src/char/int_party.c b/src/char/int_party.c
index 79bd1139c..8d50c45fa 100644
--- a/src/char/int_party.c
+++ b/src/char/int_party.c
@@ -70,9 +70,10 @@ static void inter_party_calc_state(struct party_data *p)
if(p->party.member[i].online)
p->party.count++;
}
+ // FIXME[Haru]: What if the occupied positions aren't the first three? It can happen if some party members leave. This is the reason why family sharing some times stops working until you recreate your party
if( p->size == 2 && ( chr->char_child(p->party.member[0].char_id,p->party.member[1].char_id) || chr->char_child(p->party.member[1].char_id,p->party.member[0].char_id) ) ) {
//Child should be able to share with either of their parents [RoM]
- if(p->party.member[0].class_&0x2000) //first slot is the child?
+ if(p->party.member[0].class_&JOBL_BABY) //first slot is the child?
p->family = p->party.member[0].char_id;
else
p->family = p->party.member[1].char_id;
@@ -261,12 +262,12 @@ int inter_party_sql_init(void)
exit(EXIT_FAILURE);
}
- /* Uncomment the following if you want to do a party_db cleanup (remove parties with no members) on startup.[Skotlex]
+#if 0 // Enable if you want to do a party_db cleanup (remove parties with no members) on startup.[Skotlex]
ShowStatus("cleaning party table...\n");
if( SQL_ERROR == SQL->Query(inter->sql_handle, "DELETE FROM `%s` USING `%s` LEFT JOIN `%s` ON `%s`.leader_id =`%s`.account_id AND `%s`.leader_char = `%s`.char_id WHERE `%s`.account_id IS NULL",
party_db, party_db, char_db, party_db, char_db, party_db, char_db, char_db) )
Sql_ShowDebug(inter->sql_handle);
- */
+#endif // 0
return 0;
}
@@ -594,7 +595,7 @@ int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int
int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id)
{
struct party_data *p;
- int i,j=-1;
+ int i,j;
p = inter_party->fromsql(party_id);
if( p == NULL )
@@ -745,8 +746,8 @@ int mapif_parse_PartyLeaderChange(int fd, int party_id, int account_id, int char
// Data packet length is set to inter.c that you
// Do NOT go and check the packet length, RFIFOSKIP is done by the caller
// Return :
-// 0 : error
-// 1 : ok
+// 0 : error
+// 1 : ok
int inter_party_parse_frommap(int fd)
{
RFIFOHEAD(fd);
diff --git a/src/char/inter.c b/src/char/inter.c
index ec06df0f9..3571a3e2e 100644
--- a/src/char/inter.c
+++ b/src/char/inter.c
@@ -1219,9 +1219,9 @@ int mapif_parse_Registry(int fd)
int mapif_parse_RegistryRequest(int fd)
{
//Load Char Registry
- if (RFIFOB(fd,12)) mapif->account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),3);
+ if (RFIFOB(fd,12)) mapif->account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),3); // 3: char reg
//Load Account Registry
- if (RFIFOB(fd,11)) mapif->account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),2);
+ if (RFIFOB(fd,11)) mapif->account_reg_reply(fd,RFIFOL(fd,2),RFIFOL(fd,6),2); // 2: account reg
//Ask Login Server for Account2 values.
if (RFIFOB(fd,10)) chr->request_accreg2(RFIFOL(fd,2),RFIFOL(fd,6));
return 1;
diff --git a/src/common/HPM.c b/src/common/HPM.c
index 6e73d1b2a..346748cfe 100644
--- a/src/common/HPM.c
+++ b/src/common/HPM.c
@@ -114,9 +114,8 @@ bool hplugin_populate(struct hplugin *plugin, const char *filename) {
for(i = 0; i < length; i++) {
void **Link;
if (!( Link = plugin_import(plugin->dll, ToLink[i].name,void **))) {
- ShowWarning("HPM:plugin_load: failed to retrieve '%s' for '"CL_WHITE"%s"CL_RESET"', skipping...\n", ToLink[i].name, filename);
- HPM->unload(plugin);
- return false;
+ ShowFatalError("HPM:plugin_load: failed to retrieve '%s' for '"CL_WHITE"%s"CL_RESET"'!\n", ToLink[i].name, filename);
+ exit(EXIT_FAILURE);
}
*Link = ToLink[i].Ref;
}
@@ -144,15 +143,13 @@ struct hplugin *hplugin_load(const char* filename) {
if (!(plugin->dll = plugin_open(filename))) {
char buf[1024];
- ShowWarning("HPM:plugin_load: failed to load '"CL_WHITE"%s"CL_RESET"' (error: %s), skipping...\n", filename, plugin_geterror(buf));
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: failed to load '"CL_WHITE"%s"CL_RESET"' (error: %s)!\n", filename, plugin_geterror(buf));
+ exit(EXIT_FAILURE);
}
if( !( info = plugin_import(plugin->dll, "pinfo",struct hplugin_info*) ) ) {
- ShowDebug("HPM:plugin_load: failed to retrieve 'plugin_info' for '"CL_WHITE"%s"CL_RESET"', skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: failed to retrieve 'plugin_info' for '"CL_WHITE"%s"CL_RESET"'!\n", filename);
+ exit(EXIT_FAILURE);
}
if( !(info->type & SERVER_TYPE) ) {
@@ -161,40 +158,35 @@ struct hplugin *hplugin_load(const char* filename) {
}
if( !HPM->iscompatible(info->req_version) ) {
- ShowWarning("HPM:plugin_load: '"CL_WHITE"%s"CL_RESET"' incompatible version '%s' -> '%s', skipping...\n", filename, info->req_version, HPM_VERSION);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: '"CL_WHITE"%s"CL_RESET"' incompatible version '%s' -> '%s'!\n", filename, info->req_version, HPM_VERSION);
+ exit(EXIT_FAILURE);
}
plugin->info = info;
plugin->filename = aStrdup(filename);
if( !( import_symbol_ref = plugin_import(plugin->dll, "import_symbol",void **) ) ) {
- ShowWarning("HPM:plugin_load: failed to retrieve 'import_symbol' for '"CL_WHITE"%s"CL_RESET"', skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: failed to retrieve 'import_symbol' for '"CL_WHITE"%s"CL_RESET"'!\n", filename);
+ exit(EXIT_FAILURE);
}
*import_symbol_ref = HPM->import_symbol;
if( !( sql_handle = plugin_import(plugin->dll, "mysql_handle",Sql **) ) ) {
- ShowWarning("HPM:plugin_load: failed to retrieve 'mysql_handle' for '"CL_WHITE"%s"CL_RESET"', skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: failed to retrieve 'mysql_handle' for '"CL_WHITE"%s"CL_RESET"'!\n", filename);
+ exit(EXIT_FAILURE);
}
*sql_handle = HPM->import_symbol("sql_handle",plugin->idx);
if( !( HPMi = plugin_import(plugin->dll, "HPMi",struct HPMi_interface **) ) ) {
- ShowWarning("HPM:plugin_load: failed to retrieve 'HPMi' for '"CL_WHITE"%s"CL_RESET"', skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: failed to retrieve 'HPMi' for '"CL_WHITE"%s"CL_RESET"'!\n", filename);
+ exit(EXIT_FAILURE);
}
if( !( *HPMi = plugin_import(plugin->dll, "HPMi_s",struct HPMi_interface *) ) ) {
- ShowWarning("HPM:plugin_load: failed to retrieve 'HPMi_s' for '"CL_WHITE"%s"CL_RESET"', skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: failed to retrieve 'HPMi_s' for '"CL_WHITE"%s"CL_RESET"'!\n", filename);
+ exit(EXIT_FAILURE);
}
plugin->hpi = *HPMi;
@@ -214,37 +206,32 @@ struct hplugin *hplugin_load(const char* filename) {
anyEvent = true;
if( !anyEvent ) {
- ShowWarning("HPM:plugin_load: no events found for '"CL_WHITE"%s"CL_RESET"', skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowWarning("HPM:plugin_load: no events found for '"CL_WHITE"%s"CL_RESET"'!\n", filename);
+ exit(EXIT_FAILURE);
}
if( !HPM->populate(plugin,filename) )
return NULL;
if( !( HPMDataCheckLen = plugin_import(plugin->dll, "HPMDataCheckLen", unsigned int *) ) ) {
- ShowWarning("HPM:plugin_load: failed to retrieve 'HPMDataCheckLen' for '"CL_WHITE"%s"CL_RESET"', most likely not including HPMDataCheck.h, skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: failed to retrieve 'HPMDataCheckLen' for '"CL_WHITE"%s"CL_RESET"', most likely not including HPMDataCheck.h!\n", filename);
+ exit(EXIT_FAILURE);
}
if( !( HPMDataCheckVer = plugin_import(plugin->dll, "HPMDataCheckVer", int *) ) ) {
- ShowWarning("HPM:plugin_load: failed to retrieve 'HPMDataCheckVer' for '"CL_WHITE"%s"CL_RESET"', most likely an outdated plugin, skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: failed to retrieve 'HPMDataCheckVer' for '"CL_WHITE"%s"CL_RESET"', most likely an outdated plugin!\n", filename);
+ exit(EXIT_FAILURE);
}
if( !( HPMDataCheck = plugin_import(plugin->dll, "HPMDataCheck", struct s_HPMDataCheck *) ) ) {
- ShowWarning("HPM:plugin_load: failed to retrieve 'HPMDataCheck' for '"CL_WHITE"%s"CL_RESET"', most likely not including HPMDataCheck.h, skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: failed to retrieve 'HPMDataCheck' for '"CL_WHITE"%s"CL_RESET"', most likely not including HPMDataCheck.h!\n", filename);
+ exit(EXIT_FAILURE);
}
// TODO: Remove the HPM->DataCheck != NULL check once login and char support is complete
if (HPM->DataCheck != NULL && !HPM->DataCheck(HPMDataCheck,*HPMDataCheckLen,*HPMDataCheckVer,plugin->info->name)) {
- ShowWarning("HPM:plugin_load: '"CL_WHITE"%s"CL_RESET"' failed DataCheck, out of sync from the core (recompile plugin), skipping...\n", filename);
- HPM->unload(plugin);
- return NULL;
+ ShowFatalError("HPM:plugin_load: '"CL_WHITE"%s"CL_RESET"' failed DataCheck, out of sync from the core (recompile plugin)!\n", filename);
+ exit(EXIT_FAILURE);
}
/* id */
diff --git a/src/common/console.c b/src/common/console.c
index 97ca0650e..1eba48fa2 100644
--- a/src/common/console.c
+++ b/src/common/console.c
@@ -63,7 +63,7 @@ void display_title(void) {
ShowMessage(""CL_BG_RED""CL_BT_WHITE" | | | | __/ | | (__| |_| | | __/\\__ \\ "CL_CLL""CL_NORMAL"\n");
ShowMessage(""CL_BG_RED""CL_BT_WHITE" \\_| |_/\\___|_| \\___|\\__,_|_|\\___||___/ "CL_CLL""CL_NORMAL"\n");
ShowMessage(""CL_BG_RED""CL_BT_WHITE" "CL_CLL""CL_NORMAL"\n");
- ShowMessage(""CL_BG_RED""CL_BT_WHITE" http://hercules.ws/board/ "CL_CLL""CL_NORMAL"\n");
+ ShowMessage(""CL_BG_RED""CL_BT_WHITE" http://herc.ws/board/ "CL_CLL""CL_NORMAL"\n");
ShowMessage(""CL_BG_RED""CL_BT_WHITE" "CL_CLL""CL_NORMAL"\n");
ShowInfo("Hercules %d-bit for %s\n", sysinfo->is64bit() ? 64 : 32, sysinfo->platform());
diff --git a/src/common/core.c b/src/common/core.c
index 8bf381589..ea028002a 100644
--- a/src/common/core.c
+++ b/src/common/core.c
@@ -250,7 +250,7 @@ static CMDLINEARG(help)
*/
static CMDLINEARG(version)
{
- ShowInfo(CL_GREEN"Website/Forum:"CL_RESET"\thttp://hercules.ws/\n");
+ ShowInfo(CL_GREEN"Website/Forum:"CL_RESET"\thttp://herc.ws/\n");
ShowInfo(CL_GREEN"IRC Channel:"CL_RESET"\tirc://irc.rizon.net/#Hercules\n");
ShowInfo("Open "CL_WHITE"readme.txt"CL_RESET" for more information.\n");
return false;
diff --git a/src/common/db.h b/src/common/db.h
index cd61e1543..4883489d7 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -71,10 +71,10 @@
* @see #db_custom_release(DBRelease)
*/
typedef enum DBRelease {
- DB_RELEASE_NOTHING = 0,
- DB_RELEASE_KEY = 1,
- DB_RELEASE_DATA = 2,
- DB_RELEASE_BOTH = 3
+ DB_RELEASE_NOTHING = 0x0,
+ DB_RELEASE_KEY = 0x1,
+ DB_RELEASE_DATA = 0x2,
+ DB_RELEASE_BOTH = DB_RELEASE_KEY|DB_RELEASE_DATA,
} DBRelease;
/**
@@ -127,13 +127,13 @@ typedef enum DBType {
* @see #db_alloc(const char *,int,DBType,DBOptions,unsigned short)
*/
typedef enum DBOptions {
- DB_OPT_BASE = 0,
- DB_OPT_DUP_KEY = 1,
- DB_OPT_RELEASE_KEY = 2,
- DB_OPT_RELEASE_DATA = 4,
- DB_OPT_RELEASE_BOTH = 6,
- DB_OPT_ALLOW_NULL_KEY = 8,
- DB_OPT_ALLOW_NULL_DATA = 16,
+ DB_OPT_BASE = 0x00,
+ DB_OPT_DUP_KEY = 0x01,
+ DB_OPT_RELEASE_KEY = 0x02,
+ DB_OPT_RELEASE_DATA = 0x04,
+ DB_OPT_RELEASE_BOTH = DB_OPT_RELEASE_KEY|DB_OPT_RELEASE_DATA,
+ DB_OPT_ALLOW_NULL_KEY = 0x08,
+ DB_OPT_ALLOW_NULL_DATA = 0x10,
} DBOptions;
/**
diff --git a/src/common/ers.h b/src/common/ers.h
index 85ddfed7a..0117237d7 100644
--- a/src/common/ers.h
+++ b/src/common/ers.h
@@ -71,11 +71,11 @@
#endif /* not ERS_ALIGN_ENTRY */
enum ERSOptions {
- ERS_OPT_NONE = 0x0,
- ERS_OPT_CLEAR = 0x1,/* silently clears any entries left in the manager upon destruction */
- ERS_OPT_WAIT = 0x2,/* wait for entries to come in order to list! */
- ERS_OPT_FREE_NAME = 0x4,/* name is dynamic memory, and should be freed */
- ERS_OPT_CLEAN = 0x8,/* clears used memory upon ers_free so that its all new to be reused on the next alloc */
+ ERS_OPT_NONE = 0x00,
+ ERS_OPT_CLEAR = 0x01,/* silently clears any entries left in the manager upon destruction */
+ ERS_OPT_WAIT = 0x02,/* wait for entries to come in order to list! */
+ ERS_OPT_FREE_NAME = 0x04,/* name is dynamic memory, and should be freed */
+ ERS_OPT_CLEAN = 0x08,/* clears used memory upon ers_free so that its all new to be reused on the next alloc */
ERS_OPT_FLEX_CHUNK = 0x10,/* signs that it should look for its own cache given it'll have a dynamic chunk size, so that it doesn't affect the other ERS it'd otherwise be sharing */
/* Compound, is used to determine whether it should be looking for a cache of matching options */
diff --git a/src/common/grfio.c b/src/common/grfio.c
index e95163569..41a888267 100644
--- a/src/common/grfio.c
+++ b/src/common/grfio.c
@@ -36,8 +36,8 @@ typedef struct FILELIST {
} FILELIST;
#define FILELIST_TYPE_FILE 0x01 // entry is a file
-#define FILELIST_TYPE_ENCRYPT_HEADER 0x04 // encryption mode 1 (header DES only)
#define FILELIST_TYPE_ENCRYPT_MIXED 0x02 // encryption mode 0 (header DES + periodic DES/shuffle)
+#define FILELIST_TYPE_ENCRYPT_HEADER 0x04 // encryption mode 1 (header DES only)
//gentry ... > 0 : data read from a grf file (gentry_table[gentry-1])
//gentry ... 0 : data read from a local file (data directory)
diff --git a/src/common/mapindex.c b/src/common/mapindex.c
index 035518f68..e07ccd679 100644
--- a/src/common/mapindex.c
+++ b/src/common/mapindex.c
@@ -193,7 +193,7 @@ void mapindex_defaults(void) {
mapindex = &mapindex_s;
/* TODO: place it in inter-server.conf? */
- snprintf(mapindex->config_file, 80, "%s","db/map_index.txt");
+ snprintf(mapindex->config_file, sizeof(mapindex->config_file), "%s","db/map_index.txt");
/* */
mapindex->db = NULL;
mapindex->num = 0;
diff --git a/src/common/mmo.h b/src/common/mmo.h
index 48eba0041..766ccf182 100644
--- a/src/common/mmo.h
+++ b/src/common/mmo.h
@@ -7,6 +7,7 @@
#include <time.h>
+#include "../config/core.h"
#include "../common/cbasetypes.h"
#include "../common/db.h"
@@ -118,15 +119,16 @@
#define MAX_STORAGE 600
#define MAX_GUILD_STORAGE 600
#define MAX_PARTY 12
-#define MAX_GUILD (16+10*6) // Increased max guild members +6 per 1 extension levels [Lupus]
-#define MAX_GUILDPOSITION 20 // Increased max guild positions to accommodate for all members [Valaris] (removed) [PoW]
+#define BASE_GUILD_SIZE 16 // Base guild members (without GD_EXTENSION)
+#define MAX_GUILD (BASE_GUILD_SIZE+10*6) // Increased max guild members +6 per 1 extension levels [Lupus]
+#define MAX_GUILDPOSITION 20 // Increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
#define MAX_GUILDEXPULSION 32
#define MAX_GUILDALLIANCE 16
-#define MAX_GUILDSKILL 15 // Increased max guild skills because of new skills [Sara-chan]
+#define MAX_GUILDSKILL 15 // Increased max guild skills because of new skills [Sara-chan]
#define MAX_GUILDLEVEL 50
-#define MAX_GUARDIANS 8 // Local max per castle. [Skotlex]
-#define MAX_QUEST_OBJECTIVES 3 // Max quest objectives for a quest
-#define MAX_START_ITEMS 32 // Max number of items allowed to be given to a char whenever it's created. [mkbu95]
+#define MAX_GUARDIANS 8 // Local max per castle. [Skotlex]
+#define MAX_QUEST_OBJECTIVES 3 // Max quest objectives for a quest
+#define MAX_START_ITEMS 32 // Max number of items allowed to be given to a char whenever it's created. [mkbu95]
// for produce
#define MIN_ATTRIBUTE 0
@@ -189,6 +191,16 @@
#define EL_CLASS_BASE 2114
#define EL_CLASS_MAX (EL_CLASS_BASE+MAX_ELEMENTAL_CLASS-1)
+// The following system marks a different job ID system used by the map server,
+// which makes a lot more sense than the normal one. [Skotlex]
+// These marks the "level" of the job.
+#define JOBL_2_1 0x100 //256
+#define JOBL_2_2 0x200 //512
+#define JOBL_2 0x300
+#define JOBL_UPPER 0x1000 //4096
+#define JOBL_BABY 0x2000 //8192
+#define JOBL_THIRD 0x4000 //16384
+
struct HPluginData;
enum item_types {
@@ -298,6 +310,49 @@ enum e_item_bound_type {
IBT_MAX = 0x4,
};
+enum {
+ OPTION_NOTHING = 0x00000000,
+ OPTION_SIGHT = 0x00000001,
+ OPTION_HIDE = 0x00000002,
+ OPTION_CLOAK = 0x00000004,
+ OPTION_FALCON = 0x00000010,
+ OPTION_RIDING = 0x00000020,
+ OPTION_INVISIBLE = 0x00000040,
+ OPTION_ORCISH = 0x00000800,
+ OPTION_WEDDING = 0x00001000,
+ OPTION_RUWACH = 0x00002000,
+ OPTION_CHASEWALK = 0x00004000,
+ OPTION_FLYING = 0x00008000, //Note that clientside Flying and Xmas are 0x8000 for clients prior to 2007.
+ OPTION_XMAS = 0x00010000,
+ OPTION_TRANSFORM = 0x00020000,
+ OPTION_SUMMER = 0x00040000,
+ OPTION_DRAGON1 = 0x00080000,
+ OPTION_WUG = 0x00100000,
+ OPTION_WUGRIDER = 0x00200000,
+ OPTION_MADOGEAR = 0x00400000,
+ OPTION_DRAGON2 = 0x00800000,
+ OPTION_DRAGON3 = 0x01000000,
+ OPTION_DRAGON4 = 0x02000000,
+ OPTION_DRAGON5 = 0x04000000,
+ OPTION_HANBOK = 0x08000000,
+ OPTION_OKTOBERFEST = 0x10000000,
+
+#ifndef NEW_CARTS
+ OPTION_CART1 = 0x00000008,
+ OPTION_CART2 = 0x00000080,
+ OPTION_CART3 = 0x00000100,
+ OPTION_CART4 = 0x00000200,
+ OPTION_CART5 = 0x00000400,
+
+ /* compound constant for older carts */
+ OPTION_CART = OPTION_CART1|OPTION_CART2|OPTION_CART3|OPTION_CART4|OPTION_CART5,
+#endif
+
+ // compound constants
+ OPTION_DRAGON = OPTION_DRAGON1|OPTION_DRAGON2|OPTION_DRAGON3|OPTION_DRAGON4|OPTION_DRAGON5,
+ OPTION_COSTUME = OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER|OPTION_HANBOK|OPTION_OKTOBERFEST,
+};
+
struct s_skill {
unsigned short id;
unsigned char lv;
@@ -677,6 +732,12 @@ enum { //Change Member Infos
GMI_LEVEL,
};
+enum guild_permission { // Guild permissions
+ GPERM_INVITE = 0x01,
+ GPERM_EXPEL = 0x10,
+ GPERM_BOTH = GPERM_INVITE|GPERM_EXPEL,
+};
+
enum {
GD_SKILLBASE=10000,
GD_APPROVAL=10000,
@@ -927,6 +988,30 @@ enum e_pc_reg_loading {
PRL_ALL = 0xFF,
};
+/**
+ * Values to be used as operation_type in chrif_char_ask_name
+ */
+enum zh_char_ask_name_type {
+ CHAR_ASK_NAME_BLOCK = 1, // account block
+ CHAR_ASK_NAME_BAN = 2, // account ban
+ CHAR_ASK_NAME_UNBLOCK = 3, // account unblock
+ CHAR_ASK_NAME_UNBAN = 4, // account unban
+ CHAR_ASK_NAME_CHANGESEX = 5, // change sex
+ CHAR_ASK_NAME_CHARBAN = 6, // character ban
+ CHAR_ASK_NAME_CHARUNBAN = 7, // character unban
+ CHAR_ASK_NAME_CHANGECHARSEX = 8, // change character sex
+};
+
+/**
+ * Values to be used as answer in chrig_char_ask_name_answer
+ */
+enum hz_char_ask_name_answer {
+ CHAR_ASK_NAME_ANS_DONE = 0, // login-server request done
+ CHAR_ASK_NAME_ANS_NOTFOUND = 1, // player not found
+ CHAR_ASK_NAME_ANS_GMLOW = 2, // gm level too low
+ CHAR_ASK_NAME_ANS_OFFLINE = 3, // login-server offline
+};
+
/* packet size constant for itemlist */
#if MAX_INVENTORY > MAX_STORAGE && MAX_INVENTORY > MAX_CART
#define MAX_ITEMLIST MAX_INVENTORY
diff --git a/src/common/nullpo.c b/src/common/nullpo.c
index e61d52257..97b206835 100644
--- a/src/common/nullpo.c
+++ b/src/common/nullpo.c
@@ -8,7 +8,11 @@
#include <stdio.h>
#include <stdarg.h>
+#include <stdlib.h>
#include <string.h>
+#ifdef __GNUC__
+#include <execinfo.h>
+#endif
#include "../common/showmsg.h"
@@ -24,6 +28,12 @@ struct nullpo_interface nullpo_s;
* @param title Message title to display (i.e. failed assertion or nullpo info)
*/
void assert_report(const char *file, int line, const char *func, const char *targetname, const char *title) {
+#ifdef __GNUC__
+ void *array[10];
+ int size;
+ char **strings;
+ int i;
+#endif
if (file == NULL)
file = "??";
@@ -32,6 +42,13 @@ void assert_report(const char *file, int line, const char *func, const char *tar
ShowError("--- %s --------------------------------------------\n", title);
ShowError("%s:%d: '%s' in function `%s'\n", file, line, targetname, func);
+#ifdef __GNUC__
+ size = backtrace (array, 10);
+ strings = backtrace_symbols (array, size);
+ for (i = 0; i < size; i++)
+ ShowError("%s\n", strings[i]);
+ free (strings);
+#endif
ShowError("--- end %s ----------------------------------------\n", title);
}
diff --git a/src/common/showmsg.h b/src/common/showmsg.h
index 48e763c25..0624f1786 100644
--- a/src/common/showmsg.h
+++ b/src/common/showmsg.h
@@ -23,58 +23,55 @@
// \033[0m : reset color parameter
// \033[1m : use bold for font
-#define CL_RESET "\033[0m"
-#define CL_CLS "\033[2J"
-#define CL_CLL "\033[K"
+#define CL_RESET "\033[0m"
+#define CL_CLS "\033[2J"
+#define CL_CLL "\033[K"
// font settings
-#define CL_BOLD "\033[1m"
-#define CL_NORM CL_RESET
-#define CL_NORMAL CL_RESET
-#define CL_NONE CL_RESET
-// foreground color and bold font (bright color on windows)
-#define CL_WHITE "\033[1;37m"
-#define CL_GRAY "\033[1;30m"
-#define CL_RED "\033[1;31m"
-#define CL_GREEN "\033[1;32m"
-#define CL_YELLOW "\033[1;33m"
-#define CL_BLUE "\033[1;34m"
-#define CL_MAGENTA "\033[1;35m"
-#define CL_CYAN "\033[1;36m"
+#define CL_BOLD "\033[1m"
+#define CL_NORM CL_RESET
+#define CL_NORMAL CL_RESET
+#define CL_NONE CL_RESET
// background color
-#define CL_BG_BLACK "\033[40m"
-#define CL_BG_RED "\033[41m"
-#define CL_BG_GREEN "\033[42m"
-#define CL_BG_YELLOW "\033[43m"
-#define CL_BG_BLUE "\033[44m"
-#define CL_BG_MAGENTA "\033[45m"
-#define CL_BG_CYAN "\033[46m"
-#define CL_BG_WHITE "\033[47m"
+#define CL_BG_BLACK "\033[40m"
+#define CL_BG_RED "\033[41m"
+#define CL_BG_GREEN "\033[42m"
+#define CL_BG_YELLOW "\033[43m"
+#define CL_BG_BLUE "\033[44m"
+#define CL_BG_MAGENTA "\033[45m"
+#define CL_BG_CYAN "\033[46m"
+#define CL_BG_WHITE "\033[47m"
// foreground color and normal font (normal color on windows)
-#define CL_LT_BLACK "\033[0;30m"
-#define CL_LT_RED "\033[0;31m"
-#define CL_LT_GREEN "\033[0;32m"
-#define CL_LT_YELLOW "\033[0;33m"
-#define CL_LT_BLUE "\033[0;34m"
-#define CL_LT_MAGENTA "\033[0;35m"
-#define CL_LT_CYAN "\033[0;36m"
-#define CL_LT_WHITE "\033[0;37m"
+#define CL_LT_BLACK "\033[0;30m"
+#define CL_LT_RED "\033[0;31m"
+#define CL_LT_GREEN "\033[0;32m"
+#define CL_LT_YELLOW "\033[0;33m"
+#define CL_LT_BLUE "\033[0;34m"
+#define CL_LT_MAGENTA "\033[0;35m"
+#define CL_LT_CYAN "\033[0;36m"
+#define CL_LT_WHITE "\033[0;37m"
// foreground color and bold font (bright color on windows)
-#define CL_BT_BLACK "\033[1;30m"
-#define CL_BT_RED "\033[1;31m"
-#define CL_BT_GREEN "\033[1;32m"
-#define CL_BT_YELLOW "\033[1;33m"
-#define CL_BT_BLUE "\033[1;34m"
-#define CL_BT_MAGENTA "\033[1;35m"
-#define CL_BT_CYAN "\033[1;36m"
-#define CL_BT_WHITE "\033[1;37m"
+#define CL_BT_BLACK "\033[1;30m"
+#define CL_BT_RED "\033[1;31m"
+#define CL_BT_GREEN "\033[1;32m"
+#define CL_BT_YELLOW "\033[1;33m"
+#define CL_BT_BLUE "\033[1;34m"
+#define CL_BT_MAGENTA "\033[1;35m"
+#define CL_BT_CYAN "\033[1;36m"
+#define CL_BT_WHITE "\033[1;37m"
-#define CL_WTBL "\033[37;44m" // white on blue
-#define CL_XXBL "\033[0;44m" // default on blue
-#define CL_PASS "\033[0;32;42m" // green on green
+// foreground color and bold font (bright color on windows)
+#define CL_WHITE CL_BT_WHITE
+#define CL_GRAY CL_BT_BLACK
+#define CL_RED CL_BT_RED
+#define CL_GREEN CL_BT_GREEN
+#define CL_YELLOW CL_BT_YELLOW
+#define CL_BLUE CL_BT_BLUE
+#define CL_MAGENTA CL_BT_MAGENTA
+#define CL_CYAN CL_BT_CYAN
-#define CL_SPACE " " // space equivalent of the print messages
+#define CL_SPACE " " // space aquivalent of the print messages
enum msg_type {
MSG_NONE,
diff --git a/src/common/sysinfo.c b/src/common/sysinfo.c
index a1dbed4d1..7edc5c72e 100644
--- a/src/common/sysinfo.c
+++ b/src/common/sysinfo.c
@@ -1,6 +1,6 @@
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
-// Base Author: Haru @ http://hercules.ws
+// Base Author: Haru @ http://herc.ws
/// See sysinfo.h for a description of this file
diff --git a/src/common/sysinfo.h b/src/common/sysinfo.h
index 70f665071..8c8f6dbe6 100644
--- a/src/common/sysinfo.h
+++ b/src/common/sysinfo.h
@@ -1,6 +1,6 @@
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
-// Base Author: Haru @ http://hercules.ws
+// Base Author: Haru @ http://herc.ws
#ifndef COMMON_SYSINFO_H
#define COMMON_SYSINFO_H
diff --git a/src/config/classes/general.h b/src/config/classes/general.h
index b75c907e3..bf9c05bf5 100644
--- a/src/config/classes/general.h
+++ b/src/config/classes/general.h
@@ -5,7 +5,7 @@
#define CONFIG_GENERAL_H
/**
- * Hercules configuration file (http://hercules.ws)
+ * Hercules configuration file (http://herc.ws)
**/
/**
diff --git a/src/config/const.h b/src/config/const.h
index e10d2ad2a..b6eb5db77 100644
--- a/src/config/const.h
+++ b/src/config/const.h
@@ -6,8 +6,8 @@
#define CONFIG_CONSTANTS_H
/**
- * Hercules configuration file (http://hercules.ws)
- * For detailed guidance on these check http://hercules.ws/wiki/SRC/config/
+ * Hercules configuration file (http://herc.ws)
+ * For detailed guidance on these check http://herc.ws/wiki/SRC/config/
**/
/**
diff --git a/src/config/renewal.h b/src/config/renewal.h
index 939ad9b73..e4b8e699b 100644
--- a/src/config/renewal.h
+++ b/src/config/renewal.h
@@ -5,8 +5,8 @@
#define CONFIG_RENEWAL_H
/**
- * Hercules configuration file (http://hercules.ws)
- * For detailed guidance on these check http://hercules.ws/wiki/SRC/config/
+ * Hercules configuration file (http://herc.ws)
+ * For detailed guidance on these check http://herc.ws/wiki/SRC/config/
**/
/**
@@ -74,7 +74,6 @@
#define RENEWAL_EDP
/// renewal ASPD [malufett]
-/// (disable by commenting the line)
///
/// leave this line to enable renewal ASPD
/// - shield penalty is applied
diff --git a/src/config/secure.h b/src/config/secure.h
index 418d24751..67f7a972b 100644
--- a/src/config/secure.h
+++ b/src/config/secure.h
@@ -5,8 +5,8 @@
#define CONFIG_SECURE_H
/**
- * Hercules configuration file (http://hercules.ws)
- * For detailed guidance on these check http://hercules.ws/wiki/SRC/config/
+ * Hercules configuration file (http://herc.ws)
+ * For detailed guidance on these check http://herc.ws/wiki/SRC/config/
**/
/**
diff --git a/src/login/login.c b/src/login/login.c
index 95cbab70d..9c01c3956 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -227,17 +227,14 @@ bool login_check_password(const char* md5key, int passwdenc, const char* passwd,
{
nullpo_ret(passwd);
nullpo_ret(refpass);
- if(passwdenc == 0)
- {
+ if(passwdenc == PWENC_NONE) {
return (0==strcmp(passwd, refpass));
- }
- else
- {
- // password mode set to 1 -> md5(md5key, refpass) enable with <passwordencrypt></passwordencrypt>
- // password mode set to 2 -> md5(refpass, md5key) enable with <passwordencrypt2></passwordencrypt2>
+ } else {
+ // password mode set to PWENC_ENCRYPT -> md5(md5key, refpass) enable with <passwordencrypt></passwordencrypt>
+ // password mode set to PWENC_ENCRYPT2 -> md5(refpass, md5key) enable with <passwordencrypt2></passwordencrypt2>
- return ((passwdenc&0x01) && login->check_encrypted(md5key, refpass, passwd)) ||
- ((passwdenc&0x02) && login->check_encrypted(refpass, md5key, passwd));
+ return ((passwdenc&PWENC_ENCRYPT) && login->check_encrypted(md5key, refpass, passwd)) ||
+ ((passwdenc&PWENC_ENCRYPT2) && login->check_encrypted(refpass, md5key, passwd));
}
}
@@ -396,7 +393,7 @@ void login_fromchar_parse_request_change_email(int fd, int id, const char *const
if( !accounts->load_num(accounts, &acc, account_id) || strcmp(acc.email, "a@a.com") == 0 || acc.email[0] == '\0' )
ShowNotice("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - account doesn't exist or e-mail of account isn't default e-mail (account: %d, ip: %s).\n", server[id].name, account_id, ip);
else {
- memcpy(acc.email, email, 40);
+ memcpy(acc.email, email, sizeof(acc.email));
ShowNotice("Char-server '%s': Create an e-mail on an account with a default e-mail (account: %d, new e-mail: %s, ip: %s).\n", server[id].name, account_id, email, ip);
// Save
accounts->save(accounts, &acc);
@@ -503,7 +500,7 @@ void login_fromchar_parse_change_email(int fd, int id, const char *const ip)
if( strcmpi(acc.email, actual_email) != 0 )
ShowNotice("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual e-mail is incorrect (account: %d (%s), actual e-mail: %s, proposed e-mail: %s, ip: %s).\n", server[id].name, account_id, acc.userid, acc.email, actual_email, ip);
else {
- safestrncpy(acc.email, new_email, 40);
+ safestrncpy(acc.email, new_email, sizeof(acc.email));
ShowNotice("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s).\n", server[id].name, account_id, acc.userid, new_email, ip);
// Save
accounts->save(accounts, &acc);
@@ -733,9 +730,9 @@ void login_fromchar_parse_change_pincode(int fd)
{
struct mmo_account acc;
- if( accounts->load_num(accounts, &acc, RFIFOL(fd,2) ) ) {
- safestrncpy( acc.pincode, (char*)RFIFOP(fd,6), sizeof(acc.pincode) );
- acc.pincode_change = ((unsigned int)time( NULL ));
+ if (accounts->load_num(accounts, &acc, RFIFOL(fd,2))) {
+ safestrncpy(acc.pincode, (char*)RFIFOP(fd,6), sizeof(acc.pincode));
+ acc.pincode_change = ((unsigned int)time(NULL));
accounts->save(accounts, &acc);
}
RFIFOSKIP(fd,11);
@@ -753,7 +750,7 @@ bool login_fromchar_parse_wrong_pincode(int fd)
return true;
}
- login_log(host2ip(acc.last_ip), acc.userid, 100, "PIN Code check failed");
+ login_log(host2ip(acc.last_ip), acc.userid, 100, "PIN Code check failed"); // FIXME: Do we really want to log this with the same code as successful logins?
}
login->remove_online_user(acc.account_id);
@@ -1077,6 +1074,7 @@ int login_mmo_auth_new(const char* userid, const char* pass, const char sex, con
//-----------------------------------------------------
// Check/authentication of a connection
//-----------------------------------------------------
+// TODO: Map result values to an enum (or at least document them)
int login_mmo_auth(struct login_session_data* sd, bool isServer) {
struct mmo_account acc;
size_t len;
@@ -1113,7 +1111,7 @@ int login_mmo_auth(struct login_session_data* sd, bool isServer) {
// Account creation with _M/_F
if( login_config.new_account_flag ) {
if (len > 2 && sd->passwd[0] != '\0' && // valid user and password lengths
- sd->passwdenc == 0 && // unencoded password
+ sd->passwdenc == PWENC_NONE && // unencoded password
sd->userid[len-2] == '_' && memchr("FfMm", sd->userid[len-1], 4)) // _M/_F suffix
{
int result;
@@ -1392,7 +1390,7 @@ void login_auth_failed(struct login_session_data* sd, int result)
default : error = "Unknown Error."; break;
}
- login_log(ip, sd->userid, result, error);
+ login_log(ip, sd->userid, result, error); // FIXME: result can be 100, conflicting with the value 100 we use for successful login...
}
if( result == 1 && login_config.dynamic_pass_failure_ban )
@@ -1502,7 +1500,7 @@ bool login_parse_client_login(int fd, struct login_session_data* sd, const char
safestrncpy(sd->passwd, password, PASSWD_LEN);
if( login_config.use_md5_passwds )
MD5_String(sd->passwd, sd->passwd);
- sd->passwdenc = 0;
+ sd->passwdenc = PWENC_NONE;
}
else
{
@@ -1511,8 +1509,7 @@ bool login_parse_client_login(int fd, struct login_session_data* sd, const char
sd->passwdenc = PASSWORDENC;
}
- if( sd->passwdenc != 0 && login_config.use_md5_passwds )
- {
+ if (sd->passwdenc != PWENC_NONE && login_config.use_md5_passwds) {
login->auth_failed(sd, 3); // send "rejected from server"
return true;
}
@@ -1566,7 +1563,7 @@ void login_parse_request_connection(int fd, struct login_session_data* sd, const
safestrncpy(sd->passwd, (char*)RFIFOP(fd,26), NAME_LENGTH);
if( login_config.use_md5_passwds )
MD5_String(sd->passwd, sd->passwd);
- sd->passwdenc = 0;
+ sd->passwdenc = PWENC_NONE;
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));
diff --git a/src/login/login.h b/src/login/login.h
index 7254b5db2..22bae50e0 100644
--- a/src/login/login.h
+++ b/src/login/login.h
@@ -18,8 +18,15 @@ enum E_LOGINSERVER_ST
LOGINSERVER_ST_LAST
};
-// supported encryption types: 1- passwordencrypt, 2- passwordencrypt2, 3- both
-#define PASSWORDENC 3
+enum password_enc {
+ PWENC_NONE = 0x0, ///< No encryption
+ PWENC_ENCRYPT = 0x1, ///< passwordencrypt
+ PWENC_ENCRYPT2 = 0x2, ///< passwordencrypt2
+ PWENC_BOTH = PWENC_ENCRYPT|PWENC_ENCRYPT2, ///< both the above
+};
+
+#define PASSWORDENC PWENC_BOTH
+
#define PASSWD_LEN (32+1) // 23+1 for plaintext, 32+1 for md5-ed passwords
struct login_session_data {
@@ -53,9 +60,9 @@ struct mmo_char_server {
int fd;
uint32 ip;
uint16 port;
- uint16 users; // user count on this server
- uint16 type; // 0=normal, 1=maintenance, 2=over 18, 3=paying, 4=P2P
- uint16 new_; // should display as 'new'?
+ uint16 users; ///< user count on this server
+ uint16 type; ///< 0=normal, 1=maintenance, 2=over 18, 3=paying, 4=P2P (@see e_char_server_type in mmo.h)
+ uint16 new_; ///< should display as 'new'?
};
struct client_hash_node {
diff --git a/src/login/loginlog_sql.c b/src/login/loginlog_sql.c
index 8ed6e395a..2c6f76e38 100644
--- a/src/login/loginlog_sql.c
+++ b/src/login/loginlog_sql.c
@@ -62,6 +62,7 @@ unsigned long loginlog_failedattempts(uint32 ip, unsigned int minutes)
/*=============================================
* Records an event in the login log
*---------------------------------------------*/
+// TODO: add an enum of rcode values
void login_log(uint32 ip, const char* username, int rcode, const char* message)
{
char esc_username[NAME_LENGTH*2+1];
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index a1666b44e..f3ee84197 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -209,9 +209,10 @@ ACMD(send)
long num;
// read message type as hex number (without the 0x)
- if(!message || !*message ||
- !((sscanf(message, "len %x", &type)==1 && (len=1))
- || sscanf(message, "%x", &type)==1) ) {
+ if (!message || !*message
+ || !((sscanf(message, "len %x", &type)==1 && (len=1))
+ || sscanf(message, "%x", &type)==1)
+ ) {
clif->message(fd, msg_fd(fd,900)); // Usage:
clif->message(fd, msg_fd(fd,901)); // @send len <packet hex number>
clif->message(fd, msg_fd(fd,902)); // @send <packet hex number> {<value>}*
@@ -663,7 +664,7 @@ ACMD(who) {
break;
}
}
- clif->colormes(fd, COLOR_DEFAULT, StrBuf->Value(&buf));/** for whatever reason clif->message crashes with some patterns, see bugreport:8186 **/
+ clif->messagecolor_self(fd, COLOR_DEFAULT, StrBuf->Value(&buf));/** for whatever reason clif->message crashes with some patterns, see bugreport:8186 **/
StrBuf->Clear(&buf);
count++;
}
@@ -875,12 +876,12 @@ ACMD(guildstorage)
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.trading)
return false;
- if (sd->state.storage_flag == 1) {
+ if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) {
clif->message(fd, msg_fd(fd,250));
return false;
}
- if (sd->state.storage_flag == 2) {
+ if (sd->state.storage_flag == STORAGE_FLAG_GUILD) {
clif->message(fd, msg_fd(fd,251));
return false;
}
@@ -1124,7 +1125,7 @@ ACMD(heal)
if ( hp < 0 && sp <= 0 ) {
status->damage(NULL, &sd->bl, -hp, -sp, 0, 0);
- clif->damage(&sd->bl,&sd->bl, 0, 0, -hp, 0, 4, 0);
+ clif->damage(&sd->bl,&sd->bl, 0, 0, -hp, 0, BDT_ENDURE, 0);
clif->message(fd, msg_fd(fd,156)); // HP or/and SP modified.
return true;
}
@@ -1135,7 +1136,7 @@ ACMD(heal)
status->heal(&sd->bl, hp, 0, 0);
else {
status->damage(NULL, &sd->bl, -hp, 0, 0, 0);
- clif->damage(&sd->bl,&sd->bl, 0, 0, -hp, 0, 4, 0);
+ clif->damage(&sd->bl,&sd->bl, 0, 0, -hp, 0, BDT_ENDURE, 0);
}
}
@@ -1344,7 +1345,7 @@ ACMD(itemreset)
for (i = 0; i < MAX_INVENTORY; i++) {
if (sd->status.inventory[i].amount && sd->status.inventory[i].equip == 0) {
- pc->delitem(sd, i, sd->status.inventory[i].amount, 0, 0, LOG_TYPE_COMMAND);
+ pc->delitem(sd, i, sd->status.inventory[i].amount, 0, DELITEM_NORMAL, LOG_TYPE_COMMAND);
}
}
clif->message(fd, msg_fd(fd,20)); // All of your items have been removed.
@@ -1443,7 +1444,7 @@ ACMD(joblevelup)
level = sd->status.job_level-1;
sd->status.job_level -= (unsigned int)level;
if (sd->status.skill_point < level)
- pc->resetskill(sd,0); //Reset skills since we need to subtract more points.
+ pc->resetskill(sd, PCRESETSKILL_NONE); //Reset skills since we need to subtract more points.
if (sd->status.skill_point < level)
sd->status.skill_point = 0;
else
@@ -2086,9 +2087,9 @@ ACMD(refine)
if (sd->status.inventory[idx].refine != final_refine) {
sd->status.inventory[idx].refine = final_refine;
current_position = sd->status.inventory[idx].equip;
- pc->unequipitem(sd, idx, 3);
+ pc->unequipitem(sd, idx, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
clif->refine(fd, 0, idx, sd->status.inventory[idx].refine);
- clif->delitem(sd, idx, 1, 3);
+ clif->delitem(sd, idx, 1, DELITEM_MATERIALCHANGE);
clif->additem(sd, idx, 1, 0);
pc->equipitem(sd, idx, current_position);
clif->misceffect(&sd->bl, 3);
@@ -2730,7 +2731,7 @@ ACMD(char_block)
return false;
}
- chrif->char_ask_name(sd->status.account_id, atcmd_player_name, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
+ chrif->char_ask_name(sd->status.account_id, atcmd_player_name, CHAR_ASK_NAME_BLOCK, 0, 0, 0, 0, 0, 0);
clif->message(fd, msg_fd(fd,88)); // Character name sent to char-server to ask it.
return true;
@@ -2826,7 +2827,8 @@ ACMD(char_ban)
return false;
}
- chrif->char_ask_name(sd->status.account_id, atcmd_player_name, !strcmpi(info->command,"charban") ? 6 : 2, year, month, day, hour, minute, second); // type: 2 - ban; 6 - charban
+ chrif->char_ask_name(sd->status.account_id, atcmd_player_name,
+ !strcmpi(info->command,"charban") ? CHAR_ASK_NAME_CHARBAN : CHAR_ASK_NAME_BAN, year, month, day, hour, minute, second);
clif->message(fd, msg_fd(fd,88)); // Character name sent to char-server to ask it.
return true;
@@ -2845,7 +2847,7 @@ ACMD(char_unblock)
}
// send answer to login server via char-server
- chrif->char_ask_name(sd->status.account_id, atcmd_player_name, 3, 0, 0, 0, 0, 0, 0); // type: 3 - unblock
+ chrif->char_ask_name(sd->status.account_id, atcmd_player_name, CHAR_ASK_NAME_UNBLOCK, 0, 0, 0, 0, 0, 0);
clif->message(fd, msg_fd(fd,88)); // Character name sent to char-server to ask it.
return true;
@@ -2864,7 +2866,8 @@ ACMD(char_unban)
}
// send answer to login server via char-server
- chrif->char_ask_name(sd->status.account_id, atcmd_player_name, !strcmpi(info->command,"charunban") ? 7 : 4, 0, 0, 0, 0, 0, 0); // type: 4 - unban account; type 7 - unban character
+ chrif->char_ask_name(sd->status.account_id, atcmd_player_name,
+ !strcmpi(info->command,"charunban") ? CHAR_ASK_NAME_CHARUNBAN : CHAR_ASK_NAME_UNBAN, 0, 0, 0, 0, 0, 0);
clif->message(fd, msg_fd(fd,88)); // Character name sent to char-server to ask it.
return true;
@@ -3101,7 +3104,7 @@ ACMD(questskill)
return false;
}
- pc->skill(sd, skill_id, 1, 0);
+ pc->skill(sd, skill_id, 1, SKILL_GRANT_PERMANENT);
clif->message(fd, msg_fd(fd,70)); // You have learned the skill.
return true;
@@ -5096,7 +5099,7 @@ ACMD(dropall)
for (i = 0; i < MAX_INVENTORY; i++) {
if (sd->status.inventory[i].amount) {
if(sd->status.inventory[i].equip != 0)
- pc->unequipitem(sd, i, 3);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
pc->dropitem(sd, i, sd->status.inventory[i].amount);
}
}
@@ -5111,7 +5114,7 @@ ACMD(storeall)
{
int i;
- if (sd->state.storage_flag != 1) {
+ if (sd->state.storage_flag != STORAGE_FLAG_NORMAL) {
//Open storage.
if( storage->open(sd) == 1 ) {
clif->message(fd, msg_fd(fd,1161)); // You currently cannot open your storage.
@@ -5122,7 +5125,7 @@ ACMD(storeall)
for (i = 0; i < MAX_INVENTORY; i++) {
if (sd->status.inventory[i].amount) {
if(sd->status.inventory[i].equip != 0)
- pc->unequipitem(sd, i, 3);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
storage->add(sd, i, sd->status.inventory[i].amount);
}
}
@@ -5136,7 +5139,7 @@ ACMD(clearstorage)
{
int i, j;
- if (sd->state.storage_flag == 1) {
+ if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) {
clif->message(fd, msg_fd(fd,250));
return false;
}
@@ -5164,12 +5167,12 @@ ACMD(cleargstorage)
return false;
}
- if (sd->state.storage_flag == 1) {
+ if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) {
clif->message(fd, msg_fd(fd,250));
return false;
}
- if (sd->state.storage_flag == 2) {
+ if (sd->state.storage_flag == STORAGE_FLAG_GUILD) {
clif->message(fd, msg_fd(fd,251));
return false;
}
@@ -5200,7 +5203,7 @@ ACMD(clearcart)
return false;
}
- if( sd->state.vending == 1 ) {
+ if (sd->state.vending) {
clif->message(fd, msg_fd(fd,548)); // You can't clean a cart while vending!
return false;
}
@@ -5326,7 +5329,7 @@ ACMD(displayskill) {
}
st = status->get_status_data(&sd->bl);
tick = timer->gettick();
- clif->skill_damage(&sd->bl,&sd->bl, tick, st->amotion, st->dmotion, 1, 1, skill_id, skill_lv, 5);
+ clif->skill_damage(&sd->bl,&sd->bl, tick, st->amotion, st->dmotion, 1, 1, skill_id, skill_lv, BDT_SPLASH);
clif->skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1);
clif->skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
return true;
@@ -5603,7 +5606,7 @@ ACMD(partyoption)
return false;
}
- option = (config_switch(w1)?1:0)|(config_switch(w2)?2:0);
+ option = (config_switch(w1)?1:0)|(config_switch(w2)?2:0); // TODO: Add documentation for these values
//Change item share type.
if (option != p->party.item)
@@ -6075,14 +6078,14 @@ ACMD(cleanmap) {
}
ACMD(cleanarea) {
- int x0 = 0, y0 = 0, x1 = 0, y1 = 0;
+ int x0 = 0, y0 = 0, x1 = 0, y1 = 0, n = 0;
- if (!message || !*message || sscanf(message, "%d %d %d %d", &x0, &y0, &x1, &y1) < 1) {
+ if (!message || !*message || (n=sscanf(message, "%d %d %d %d", &x0, &y0, &x1, &y1)) < 1) {
map->foreachinrange(atcommand->cleanfloor_sub, &sd->bl, AREA_SIZE * 2, BL_ITEM);
- } else if (sscanf(message, "%d %d %d %d", &x0, &y0, &x1, &y1) == 1) {
- map->foreachinrange(atcommand->cleanfloor_sub, &sd->bl, x0, BL_ITEM);
- } else if (sscanf(message, "%d %d %d %d", &x0, &y0, &x1, &y1) == 4) {
+ } else if (n == 4) {
map->foreachinarea(atcommand->cleanfloor_sub, sd->bl.m, x0, y0, x1, y1, BL_ITEM);
+ } else {
+ map->foreachinrange(atcommand->cleanfloor_sub, &sd->bl, x0, BL_ITEM);
}
clif->message(fd, msg_fd(fd,1221)); // All dropped items have been cleaned up.
@@ -6244,10 +6247,9 @@ ACMD(users)
/*==========================================
*
*------------------------------------------*/
-ACMD(reset)
-{
+ACMD(reset) {
pc->resetstate(sd);
- pc->resetskill(sd,1);
+ pc->resetskill(sd, PCRESETSKILL_RESYNC);
sprintf(atcmd_output, msg_fd(fd,208), sd->status.name); // '%s' skill and stats points reseted!
clif->message(fd, atcmd_output);
return true;
@@ -6288,9 +6290,9 @@ ACMD(summon)
if(!md)
return false;
- md->master_id=sd->bl.id;
- md->special_state.ai=1;
- md->deletetimer=timer->add(tick+(duration*60000),mob->timer_delete,md->bl.id,0);
+ md->master_id = sd->bl.id;
+ md->special_state.ai = AI_ATTACK;
+ md->deletetimer = timer->add(tick+(duration*60000),mob->timer_delete,md->bl.id,0);
clif->specialeffect(&md->bl,344,AREA);
mob->spawn(md);
sc_start4(NULL,&md->bl, SC_MODECHANGE, 100, 1, 0, MD_AGGRESSIVE, 0, 60000);
@@ -6423,14 +6425,13 @@ ACMD(uptime)
* @changesex <sex>
* => Changes one's sex. Argument sex can be 0 or 1, m or f, male or female.
*------------------------------------------*/
-ACMD(changesex)
-{
+ACMD(changesex) {
int i;
- pc->resetskill(sd,4);
+ pc->resetskill(sd, PCRESETSKILL_CHSEX);
// to avoid any problem with equipment and invalid sex, equipment is unequipped.
for( i=0; i<EQI_MAX; i++ )
- if( sd->equip_index[i] >= 0 ) pc->unequipitem(sd, sd->equip_index[i], 3);
+ if( sd->equip_index[i] >= 0 ) pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
chrif->changesex(sd, true);
return true;
}
@@ -6745,7 +6746,7 @@ ACMD(showmobs)
continue;
if( mob_id != -1 && md->class_ != mob_id )
continue;
- if( md->special_state.ai || md->master_id )
+ if (md->special_state.ai != AI_NONE || md->master_id)
continue; // hide slaves and player summoned mobs
if( md->spawn_timer != INVALID_TIMER )
continue; // hide mobs waiting for respawn
@@ -7940,10 +7941,10 @@ ACMD(feelreset)
/*==========================================
* AUCTION SYSTEM
*------------------------------------------*/
-ACMD(auction) {
-
- if( !battle_config.feature_auction ) {
- clif->colormes(sd->fd,COLOR_RED,msg_fd(fd,1484));
+ACMD(auction)
+{
+ if (!battle_config.feature_auction) {
+ clif->messagecolor_self(sd->fd, COLOR_RED, msg_fd(fd,1484));
return false;
}
@@ -7955,31 +7956,22 @@ ACMD(auction) {
/*==========================================
* Kill Steal Protection
*------------------------------------------*/
-ACMD(ksprotection)
-{
+ACMD(ksprotection) {
if( sd->state.noks ) {
- sd->state.noks = 0;
+ sd->state.noks = KSPROTECT_NONE;
clif->message(fd, msg_fd(fd,1325)); // [ K.S Protection Inactive ]
- }
- else
- {
- if( !message || !*message || !strcmpi(message, "party") )
- { // Default is Party
- sd->state.noks = 2;
- clif->message(fd, msg_fd(fd,1326)); // [ K.S Protection Active - Option: Party ]
- }
- else if( !strcmpi(message, "self") )
- {
- sd->state.noks = 1;
- clif->message(fd, msg_fd(fd,1327)); // [ K.S Protection Active - Option: Self ]
- }
- else if( !strcmpi(message, "guild") )
- {
- sd->state.noks = 3;
- clif->message(fd, msg_fd(fd,1328)); // [ K.S Protection Active - Option: Guild ]
- }
- else
- clif->message(fd, msg_fd(fd,1329)); // Usage: @noks <self|party|guild>
+ } else if( !message || !*message || strcmpi(message, "party") == 0 ) {
+ // Default is Party
+ sd->state.noks = KSPROTECT_PARTY;
+ clif->message(fd, msg_fd(fd,1326)); // [ K.S Protection Active - Option: Party ]
+ } else if( strcmpi(message, "self") == 0 ) {
+ sd->state.noks = KSPROTECT_SELF;
+ clif->message(fd, msg_fd(fd,1327)); // [ K.S Protection Active - Option: Self ]
+ } else if( strcmpi(message, "guild") == 0 ) {
+ sd->state.noks = KSPROTECT_GUILD;
+ clif->message(fd, msg_fd(fd,1328)); // [ K.S Protection Active - Option: Guild ]
+ } else {
+ clif->message(fd, msg_fd(fd,1329)); // Usage: @noks <self|party|guild>
}
return true;
}
@@ -8008,7 +8000,7 @@ ACMD(resetstat)
ACMD(resetskill)
{
- pc->resetskill(sd,1);
+ pc->resetskill(sd, PCRESETSKILL_RESYNC);
sprintf(atcmd_output, msg_fd(fd,206), sd->status.name);
clif->message(fd, atcmd_output);
return true;
@@ -8255,7 +8247,7 @@ ACMD(delitem) {
{// delete pet
intif->delete_petdata(MakeDWord(sd->status.inventory[idx].card[1], sd->status.inventory[idx].card[2]));
}
- pc->delitem(sd, idx, delamount, 0, 0, LOG_TYPE_COMMAND);
+ pc->delitem(sd, idx, delamount, 0, DELITEM_NORMAL, LOG_TYPE_COMMAND);
amount-= delamount;
}
@@ -8793,13 +8785,7 @@ ACMD(channel) {
unsigned short msg_len = 1;
msg_len += sprintf(mout, "[ %s list colors ] : %s", command, channel->config->colors_name[k]);
- WFIFOHEAD(fd,msg_len + 12);
- WFIFOW(fd,0) = 0x2C1;
- WFIFOW(fd,2) = msg_len + 12;
- WFIFOL(fd,4) = 0;
- WFIFOL(fd,8) = channel->config->colors[k];
- safestrncpy((char*)WFIFOP(fd,12), mout, msg_len);
- WFIFOSET(fd, msg_len + 12);
+ clif->messagecolor_self(fd, channel->config->colors[k], mout);
}
} else {
DBIterator *iter = db_iterator(channel->db);
@@ -9185,13 +9171,7 @@ ACMD(fontcolor) {
for( k = 0; k < channel->config->colors_count; k++ ) {
msg_len += sprintf(mout, "[ %s ] : %s", command, channel->config->colors_name[k]);
- WFIFOHEAD(fd,msg_len + 12);
- WFIFOW(fd,0) = 0x2C1;
- WFIFOW(fd,2) = msg_len + 12;
- WFIFOL(fd,4) = 0;
- WFIFOL(fd,8) = channel->config->colors[k];
- safestrncpy((char*)WFIFOP(fd,12), mout, msg_len);
- WFIFOSET(fd, msg_len + 12);
+ clif->messagecolor_self(fd, channel->config->colors[k], mout);
}
return false;
}
@@ -9214,13 +9194,8 @@ ACMD(fontcolor) {
sd->fontcolor = k + 1;
msg_len += sprintf(mout, "Color changed to '%s'", channel->config->colors_name[k]);
- WFIFOHEAD(fd,msg_len + 12);
- WFIFOW(fd,0) = 0x2C1;
- WFIFOW(fd,2) = msg_len + 12;
- WFIFOL(fd,4) = 0;
- WFIFOL(fd,8) = channel->config->colors[k];
- safestrncpy((char*)WFIFOP(fd,12), mout, msg_len);
- WFIFOSET(fd, msg_len + 12);
+ clif->messagecolor_self(fd, channel->config->colors[k], mout);
+
return true;
}
ACMD(searchstore){
@@ -9959,11 +9934,12 @@ bool atcommand_exec(const int fd, struct map_session_data *sd, const char *messa
}
for(i = 0; i < map->list[sd->bl.m].zone->disabled_commands_count; i++) {
if( info->func == map->list[sd->bl.m].zone->disabled_commands[i]->cmd ) {
- if( pc_get_group_level(sd) < map->list[sd->bl.m].zone->disabled_commands[i]->group_lv ) {
- clif->colormes(sd->fd,COLOR_RED,"This command is disabled in this area");
+ if (pc_get_group_level(sd) < map->list[sd->bl.m].zone->disabled_commands[i]->group_lv) {
+ clif->messagecolor_self(sd->fd, COLOR_RED, "This command is disabled in this area");
return true;
- } else
+ } else {
break;/* already found the matching command, no need to keep checking -- just go on */
+ }
}
}
}
diff --git a/src/map/battle.c b/src/map/battle.c
index 603db4738..b7ee23d09 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -300,10 +300,10 @@ int battle_delay_damage(int64 tick, int amotion, struct block_list *src, struct
int battle_attr_ratio(int atk_elem,int def_type, int def_lv)
{
- if (atk_elem < 0 || atk_elem >= ELE_MAX)
+ if (atk_elem < ELE_NEUTRAL || atk_elem >= ELE_MAX)
return 100;
- if (def_type < 0 || def_type >= ELE_MAX || def_lv < 1 || def_lv > 4)
+ if (def_type < ELE_NEUTRAL || def_type >= ELE_MAX || def_lv < 1 || def_lv > 4)
return 100;
return battle->attr_fix_table[def_lv-1][atk_elem][def_type];
@@ -322,10 +322,10 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
if (src) sc = status->get_sc(src);
if (target) tsc = status->get_sc(target);
- if (atk_elem < 0 || atk_elem >= ELE_MAX)
+ if (atk_elem < ELE_NEUTRAL || atk_elem >= ELE_MAX)
atk_elem = rnd()%ELE_MAX;
- if (def_type < 0 || def_type >= ELE_MAX ||
+ if (def_type < ELE_NEUTRAL || def_type >= ELE_MAX ||
def_lv < 1 || def_lv > 4) {
ShowError("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n",atk_elem,def_type,def_lv);
return damage;
@@ -407,6 +407,8 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d
else
return damage + (damage * (ratio - 100) / 100);
}
+
+//FIXME: Missing documentation for flag, flag2
int64 battle_calc_weapon_damage(struct block_list *src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, struct weapon_atk *watk, int nk, bool n_ele, short s_ele, short s_ele_, int size, int type, int flag, int flag2){ // [malufett]
#ifdef RENEWAL
int64 damage, eatk = 0;
@@ -485,7 +487,7 @@ int64 battle_calc_weapon_damage(struct block_list *src, struct block_list *bl, u
* it calculates nothing extra fancy, is needed for magnum breaks WATK_ELEMENT bonus. [Skotlex]
*------------------------------------------
* Pass damage2 as NULL to not calc it.
- * Flag values:
+ * Flag values: // TODO: Check whether these values are correct (the flag parameter seems to be passed through to other functions), and replace them with an enum.
* &1: Critical hit
* &2: Arrow attack
* &4: Skill is Magic Crasher
@@ -493,6 +495,7 @@ int64 battle_calc_weapon_damage(struct block_list *src, struct block_list *bl, u
*&16: Arrow attack but BOW, REVOLVER, RIFLE, SHOTGUN, GATLING or GRENADE type weapon not equipped (i.e. shuriken, kunai and venom knives not affected by DEX)
*/
/* 'battle_calc_base_damage' is used on renewal, 'battle_calc_base_damage2' otherwise. */
+// FIXME: Missing documentation for flag2
int64 battle_calc_base_damage(struct block_list *src, struct block_list *bl, uint16 skill_id, uint16 skill_lv, int nk, bool n_ele, short s_ele, short s_ele_, int type, int flag, int flag2) {
int64 damage;
struct status_data *st = status->get_status_data(src);
@@ -616,6 +619,7 @@ int64 battle_calc_sizefix(struct map_session_data *sd, int64 damage, int type, i
/*==========================================
* Passive skill damages increases
*------------------------------------------*/
+// FIXME: type is undocumented
int64 battle_addmastery(struct map_session_data *sd,struct block_list *target,int64 dmg,int type) {
int64 damage;
struct status_data *st = status->get_status_data(target);
@@ -866,6 +870,7 @@ void battle_calc_masteryfix_unknown(struct block_list *src, struct block_list *t
/*==========================================
* Elemental attribute fix.
*------------------------------------------*/
+// FIXME: flag is undocumented
int64 battle_calc_elefix(struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int64 damage, int nk, int n_ele, int s_ele, int s_ele_, bool left, int flag){
struct status_data *tstatus;
@@ -930,8 +935,6 @@ int64 battle_calc_cardfix2(struct block_list *src, struct block_list *bl, int64
// RaceAddTolerance
damage -= damage * tsd->race_tolerance[sstatus->race] / 100;
damage -= damage * tsd->race_tolerance[is_boss(src) ? RC_BOSS : RC_NONBOSS] / 100;
- if ( sstatus->race != RC_DEMIHUMAN )
- damage -= damage *tsd->race_tolerance[RC_NONDEMIHUMAN] / 100;
if ( flag&BF_SHORT )
damage -= damage * tsd->bonus.near_attack_def_rate / 100;
else // SubRangeAttackDamage or bLongAtkDef
@@ -950,6 +953,7 @@ int64 battle_calc_cardfix2(struct block_list *src, struct block_list *bl, int64
* &1 - calc for left hand.
* &2 - atker side cardfix(BF_WEAPON) otherwise target side(BF_WEAPON).
*------------------------------------------*/
+// FIXME: wflag is undocumented
int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_list *target, int nk, int s_ele, int s_ele_, int64 damage, int cflag, int wflag){
struct map_session_data *sd, *tsd;
short cardfix =
@@ -1013,8 +1017,6 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_
cardfix = cardfix * (100 - tsd->subrace2[s_race2]) / 100;
cardfix = cardfix * (100 - tsd->subrace[sstatus->race]) / 100;
cardfix = cardfix * (100 - tsd->subrace[is_boss(src)?RC_BOSS:RC_NONBOSS]) / 100;
- if( sstatus->race != RC_DEMIHUMAN )
- cardfix = cardfix * (100-tsd->subrace[RC_NONDEMIHUMAN]) / 100;
for(i=0; i < ARRAYLENGTH(tsd->add_mdef) && tsd->add_mdef[i].rate;i++) {
if(tsd->add_mdef[i].class_ == s_class) {
@@ -1070,8 +1072,6 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_
cardfix = cardfix * (100 + sd->right_weapon.addsize[tstatus->size]+sd->arrow_addsize[tstatus->size]) / 100;
cardfix = cardfix * (100 + sd->right_weapon.addrace2[t_race2]) / 100;
cardfix = cardfix * (100 + sd->right_weapon.addrace[is_boss(target)?RC_BOSS:RC_NONBOSS] + sd->arrow_addrace[is_boss(target)?RC_BOSS:RC_NONBOSS]) / 100;
- if( tstatus->race != RC_DEMIHUMAN )
- cardfix = cardfix * (100 + sd->right_weapon.addrace[RC_NONDEMIHUMAN]+sd->arrow_addrace[RC_NONDEMIHUMAN]) / 100;
}else{ // Melee attack
if( !battle_config.left_cardfix_to_right ){
cardfix=cardfix*(100+sd->right_weapon.addrace[tstatus->race])/100;
@@ -1090,8 +1090,6 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_
cardfix = cardfix * (100+sd->right_weapon.addsize[tstatus->size]) / 100;
cardfix = cardfix * (100+sd->right_weapon.addrace2[t_race2]) / 100;
cardfix = cardfix * (100+sd->right_weapon.addrace[is_boss(target)?RC_BOSS:RC_NONBOSS]) / 100;
- if( tstatus->race != RC_DEMIHUMAN )
- cardfix = cardfix * (100 + sd->right_weapon.addrace[RC_NONDEMIHUMAN]) / 100;
if( cflag&1 ){
cardfix_ = cardfix_*(100+sd->left_weapon.addrace[tstatus->race])/100;
@@ -1110,8 +1108,6 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_
cardfix_ = cardfix_ * (100+sd->left_weapon.addsize[tstatus->size]) / 100;
cardfix_ = cardfix_ * (100+sd->left_weapon.addrace2[t_race2]) / 100;
cardfix_ = cardfix_ * (100+sd->left_weapon.addrace[is_boss(target)?RC_BOSS:RC_NONBOSS]) / 100;
- if( tstatus->race != RC_DEMIHUMAN )
- cardfix_ = cardfix_*(100+sd->left_weapon.addrace[RC_NONDEMIHUMAN])/100;
}
}else{
int ele_fix = sd->right_weapon.addele[tstatus->def_ele] + sd->left_weapon.addele[tstatus->def_ele];
@@ -1137,8 +1133,6 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_
cardfix = cardfix * (100 + sd->right_weapon.addsize[tstatus->size] + sd->left_weapon.addsize[tstatus->size])/100;
cardfix = cardfix * (100 + sd->right_weapon.addrace2[t_race2] + sd->left_weapon.addrace2[t_race2])/100;
cardfix = cardfix * (100 + sd->right_weapon.addrace[is_boss(target)?RC_BOSS:RC_NONBOSS] + sd->left_weapon.addrace[is_boss(target)?RC_BOSS:RC_NONBOSS]) / 100;
- if( tstatus->race != RC_DEMIHUMAN )
- cardfix = cardfix * (100+sd->right_weapon.addrace[RC_NONDEMIHUMAN] + sd->left_weapon.addrace[RC_NONDEMIHUMAN]) / 100;
}
}
@@ -1203,8 +1197,6 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_
cardfix = cardfix * (100-tsd->subrace2[s_race2]) / 100;
cardfix = cardfix * (100-tsd->subrace[sstatus->race]) / 100;
cardfix = cardfix * (100-tsd->subrace[is_boss(src)?RC_BOSS:RC_NONBOSS]) / 100;
- if( sstatus->race != RC_DEMIHUMAN )
- cardfix = cardfix * (100 - tsd->subrace[RC_NONDEMIHUMAN]) / 100;
for( i = 0; i < ARRAYLENGTH(tsd->add_def) && tsd->add_def[i].rate;i++ ){
if( tsd->add_def[i].class_ == s_class )
@@ -1251,8 +1243,6 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_
}
cardfix = cardfix*(100-tsd->subrace[sstatus->race]) / 100;
cardfix = cardfix*(100-tsd->subrace[is_boss(src)?RC_BOSS:RC_NONBOSS]) / 100;
- if( sstatus->race != RC_DEMIHUMAN )
- cardfix = cardfix * (100 - tsd->subrace[RC_NONDEMIHUMAN]) / 100;
if( wflag&BF_SHORT )
cardfix = cardfix * ( 100 - tsd->bonus.near_attack_def_rate ) / 100;
else // BF_LONG (there's no other choice)
@@ -1282,6 +1272,7 @@ int64 battle_calc_cardfix(int attack_type, struct block_list *src, struct block_
* &2 - pdef(Pierce defense)
* &4 - tdef(Total defense reduction)
*------------------------------------------*/
+// TODO: Add an enum for flag
int64 battle_calc_defense(int attack_type, struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int64 damage, int flag, int pdef){
struct status_data *sstatus, *tstatus;
struct map_session_data *sd, *tsd;
@@ -1485,6 +1476,7 @@ int battle_calc_chorusbonus(struct map_session_data *sd) {
return members - 2; // Effect bonus from additional Minstrel's/Wanderer's if not above the max possible
}
+// FIXME: flag is undocumented
int battle_calc_skillratio(int attack_type, struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, int skillratio, int flag){
int i;
struct status_change *sc, *tsc;
@@ -2788,6 +2780,8 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
group->val2 -= (int)cap_value(damage,INT_MIN,INT_MAX);
} else
skill->del_unitgroup(group,ALC_MARK);
+ if (--group->val3<=0)
+ skill->del_unitgroup(group,ALC_MARK);
#else
if (--group->val2<=0)
skill->del_unitgroup(group,ALC_MARK);
@@ -3159,28 +3153,31 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
if( sc->data[SC__DEADLYINFECT] && flag&BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->data[SC__DEADLYINFECT]->val1 && !is_boss(src) )
status->change_spread(bl, src); // Deadly infect attacked side
+
+ if ( sd && damage > 0 && (sce = sc->data[SC_GENTLETOUCH_ENERGYGAIN]) ) {
+ if ( rnd() % 100 < sce->val2 )
+ pc->addspiritball(sd, skill->get_time(MO_CALLSPIRITS, 1), pc->getmaxspiritball(sd, 0));
+ }
}
//SC effects from caster side.
- sc = status->get_sc(src);
-
- if (sc && sc->count) {
- if( sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] )
+ if (tsc && tsc->count) {
+ if( tsc->data[SC_INVINCIBLE] && !tsc->data[SC_INVINCIBLEOFF] )
damage += damage * 75 / 100;
// [Epoque]
if (bl->type == BL_MOB) {
int i;
- if ( ((sce=sc->data[SC_MANU_ATK]) && (flag&BF_WEAPON)) ||
- ((sce=sc->data[SC_MANU_MATK]) && (flag&BF_MAGIC))
+ if ( ((sce=tsc->data[SC_MANU_ATK]) && (flag&BF_WEAPON)) ||
+ ((sce=tsc->data[SC_MANU_MATK]) && (flag&BF_MAGIC))
)
for (i=0;ARRAYLENGTH(mob->manuk)>i;i++)
if (((TBL_MOB*)bl)->class_==mob->manuk[i]) {
damage += damage * sce->val1 / 100;
break;
}
- if ( ((sce=sc->data[SC_SPL_ATK]) && (flag&BF_WEAPON)) ||
- ((sce=sc->data[SC_SPL_MATK]) && (flag&BF_MAGIC))
+ if ( ((sce=tsc->data[SC_SPL_ATK]) && (flag&BF_WEAPON)) ||
+ ((sce=tsc->data[SC_SPL_MATK]) && (flag&BF_MAGIC))
)
for (i=0;ARRAYLENGTH(mob->splendide)>i;i++)
if (((TBL_MOB*)bl)->class_==mob->splendide[i]) {
@@ -3197,14 +3194,19 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
sc_start(src,bl,tsc->data[SC_POISONINGWEAPON]->val2,rate,tsc->data[SC_POISONINGWEAPON]->val1,skill->get_time2(GC_POISONINGWEAPON,1) - (tstatus->vit + tstatus->luk) / 2 * 1000);
}
}
- if( sc->data[SC__DEADLYINFECT] && flag&BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * sc->data[SC__DEADLYINFECT]->val1 && !is_boss(src) )
+ if( tsc->data[SC__DEADLYINFECT] && flag&BF_SHORT && damage > 0 && rnd()%100 < 30 + 10 * tsc->data[SC__DEADLYINFECT]->val1 && !is_boss(src) )
status->change_spread(src, bl);
- if (sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 1 && damage > 0)
+ if (tsc->data[SC_SHIELDSPELL_REF] && tsc->data[SC_SHIELDSPELL_REF]->val1 == 1 && damage > 0)
skill->break_equip(bl,EQP_ARMOR,10000,BCT_ENEMY );
- if (sc->data[SC_STYLE_CHANGE] && rnd()%2) {
+ if (tsc->data[SC_STYLE_CHANGE] && rnd()%2) {
TBL_HOM *hd = BL_CAST(BL_HOM,bl);
if (hd) homun->addspiritball(hd, 10);
}
+ if ( src->type == BL_PC && damage > 0 && (sce = tsc->data[SC_GENTLETOUCH_ENERGYGAIN]) ) {
+ struct map_session_data *tsd = (struct map_session_data *)src;
+ if ( tsd && rnd() % 100 < sce->val2 )
+ pc->addspiritball(tsd, skill->get_time(MO_CALLSPIRITS, 1), pc->getmaxspiritball(tsd, 0));
+ }
}
/* no data claims these settings affect anything other than players */
if( damage && sd && bl->type == BL_PC ) {
@@ -3274,6 +3276,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
/*==========================================
* Calculates BG related damage adjustments.
*------------------------------------------*/
+// FIXME: flag is undocumented
int64 battle_calc_bg_damage(struct block_list *src, struct block_list *bl, int64 damage, int div_, uint16 skill_id, uint16 skill_lv, int flag)
{
if( !damage )
@@ -3292,6 +3295,7 @@ int64 battle_calc_bg_damage(struct block_list *src, struct block_list *bl, int64
/*==========================================
* Calculates GVG related damage adjustments.
*------------------------------------------*/
+// FIXME: flag is undocumented
int64 battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int64 damage,int div_,uint16 skill_id,uint16 skill_lv,int flag) {
struct mob_data* md = BL_CAST(BL_MOB, bl);
int class_ = status->get_class(bl);
@@ -3368,13 +3372,13 @@ void battle_consume_ammo(TBL_PC*sd, int skill_id, int lv) {
if (!battle_config.arrow_decrement)
return;
- if (skill_id) {
+ if (skill_id && lv) {
qty = skill->get_ammo_qty(skill_id, lv);
if (!qty) qty = 1;
}
if(sd->equip_index[EQI_AMMO]>=0) //Qty check should have been done in skill_check_condition
- pc->delitem(sd,sd->equip_index[EQI_AMMO],qty,0,1,LOG_TYPE_CONSUME);
+ pc->delitem(sd, sd->equip_index[EQI_AMMO], qty, 0, DELITEM_SKILLUSE, LOG_TYPE_CONSUME);
sd->state.arrow_atk = 0;
}
@@ -3428,6 +3432,7 @@ int battle_blewcount_bonus(struct map_session_data *sd, uint16 skill_id) {
/*==========================================
* battle_calc_magic_attack [DracoRPG]
*------------------------------------------*/
+// FIXME: mflag is undocumented
struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv,int mflag) {
int nk;
short s_ele = 0;
@@ -3606,7 +3611,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
skillratio = sc->data[SC_SPELLFIST]->val2 * 50 + sc->data[SC_SPELLFIST]->val4 * 100;// val4 = used bolt level, val2 = used spellfist level. [Rytech]
ad.div_ = 1;// ad mods, to make it work similar to regular hits [Xazax]
ad.flag = BF_WEAPON|BF_SHORT;
- ad.type = 0;
+ ad.type = BDT_NORMAL;
}
/* Fall through */
default:
@@ -3754,6 +3759,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
/*==========================================
* Calculate Misc damage for skill_id
*------------------------------------------*/
+// FIXME: mflag is undocumented
struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv,int mflag) {
int temp;
short i, nk;
@@ -4185,6 +4191,7 @@ void battle_calc_misc_attack_unknown(struct block_list *src, struct block_list *
/*==========================================
* battle_calc_weapon_attack (by Skotlex)
*------------------------------------------*/
+// FIXME: wflag is undocumented
struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv,int wflag)
{
unsigned int skillratio = 100; //Skill dmg modifiers.
@@ -4235,7 +4242,7 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list
flag.infdef = 1; // Reverberation takes 1 damage
//Initial Values
- wd.type=0; //Normal attack
+ wd.type = BDT_NORMAL;
wd.div_ = skill_id ? skill->get_num(skill_id,skill_lv) : 1;
wd.amotion=(skill_id && skill->get_inf(skill_id)&INF_GROUND_SKILL)?0:sstatus->amotion; //Amotion should be 0 for ground skills.
if(skill_id == KN_AUTOCOUNTER)
@@ -4302,7 +4309,7 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list
case TF_DOUBLE: //For NPC used skill.
case GS_CHAINACTION:
- wd.type = 0x08;
+ wd.type = BDT_MULTIHIT;
break;
case GS_GROUNDDRIFT:
@@ -4341,6 +4348,10 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list
if( tsc && (tsc->data[SC_WUGBITE] || tsc->data[SC_ANKLESNARE] || tsc->data[SC_ELECTRICSHOCKER]) )
wd.div_ = tstatus->size + 2 + ( (rnd()%100 < 50-tstatus->size*10) ? 1 : 0 );
break;
+
+ case NPC_EARTHQUAKE:
+ wd.flag = (wd.flag&~(BF_WEAPON)) | BF_MAGIC;
+ break;
#ifdef RENEWAL
case MO_EXTREMITYFIST:
case GS_PIERCINGSHOT:
@@ -4367,7 +4378,7 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list
wd.flag |= flag.arrow?BF_LONG:BF_SHORT;
if ((!skill_id || skill_id == PA_SACRIFICE) && tstatus->flee2 && rnd()%1000 < tstatus->flee2) {
//Check for Lucky Dodge
- wd.type=0x0b;
+ wd.type = BDT_PDODGE;
wd.dmg_lv=ATK_LUCKY;
if (wd.div_ < 0) wd.div_*=-1;
return wd;
@@ -4435,13 +4446,13 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list
if( rnd()%100 < ( 5*skill_lv > sd->bonus.double_rate ? 5*skill_lv : sc && sc->data[SC_KAGEMUSYA]?sc->data[SC_KAGEMUSYA]->val1*3:sd->bonus.double_rate ) )
{
wd.div_ = skill->get_num(TF_DOUBLE,skill_lv?skill_lv:1);
- wd.type = 0x08;
+ wd.type = BDT_MULTIHIT;
}
}
else if( sd->weapontype1 == W_REVOLVER && (skill_lv = pc->checkskill(sd,GS_CHAINACTION)) > 0 && rnd()%100 < 5*skill_lv )
{
wd.div_ = skill->get_num(GS_CHAINACTION,skill_lv);
- wd.type = 0x08;
+ wd.type = BDT_MULTIHIT;
}
else if(sc && sc->data[SC_FEARBREEZE] && sd->weapontype1==W_BOW
&& (i = sd->equip_index[EQI_AMMO]) >= 0 && sd->inventory_data[i] && sd->status.inventory[i].amount > 1){
@@ -4472,13 +4483,13 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list
if ( wd.div_ > 1 ) {
wd.div_ = min(wd.div_, sd->status.inventory[i].amount);
sc->data[SC_FEARBREEZE]->val4 = wd.div_ - 1;
- wd.type = 0x08;
+ wd.type = BDT_MULTIHIT;
}
}
}
//Check for critical
- if( !flag.cri && !(wd.type&0x08) && sstatus->cri &&
+ if( !flag.cri && wd.type != BDT_MULTIHIT && sstatus->cri &&
(!skill_id ||
skill_id == KN_AUTOCOUNTER ||
skill_id == SN_SHARPSHOOTING || skill_id == MA_SHARPSHOOTING ||
@@ -4530,7 +4541,7 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list
flag.cri = 1;
}
if (flag.cri) {
- wd.type = 0x0a;
+ wd.type = BDT_CRIT;
#ifndef RENEWAL
flag.idef = flag.idef2 =
#endif
@@ -5528,7 +5539,7 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list
rnd()%100 < tsc->data[SC_SWORDREJECT]->val2
) {
ATK_RATER(50);
- status_fix_damage(target,src,wd.damage,clif->damage(target,src,0,0,wd.damage,0,0,0));
+ status_fix_damage(target,src,wd.damage,clif->damage(target,src,0,0,wd.damage,0,BDT_NORMAL,0));
clif->skill_nodamage(target,target,ST_REJECTSWORD,tsc->data[SC_SWORDREJECT]->val1,1);
if( --(tsc->data[SC_SWORDREJECT]->val3) <= 0 )
status_change_end(target, SC_SWORDREJECT, INVALID_TIMER);
@@ -5634,8 +5645,8 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st
rdamage = ratio + (damage)* (10 + sc->data[SC_CRESCENTELBOW]->val1 * 20 / 10) / 10;
skill->blown(target, src, skill->get_blewcount(SR_CRESCENTELBOW_AUTOSPELL, sc->data[SC_CRESCENTELBOW]->val1), unit->getdir(src), 0);
clif->skill_damage(target, src, tick, status_get_amotion(src), 0, rdamage,
- 1, SR_CRESCENTELBOW_AUTOSPELL, sc->data[SC_CRESCENTELBOW]->val1, 6); // This is how official does
- clif->delay_damage(tick + delay, src, target,status_get_amotion(src)+1000,0, rdamage/10, 1, 0);
+ 1, SR_CRESCENTELBOW_AUTOSPELL, sc->data[SC_CRESCENTELBOW]->val1, BDT_SKILL); // This is how official does
+ clif->delay_damage(tick + delay, src, target,status_get_amotion(src)+1000,0, rdamage/10, 1, BDT_NORMAL);
status->damage(src, target, status->damage(target, src, rdamage, 0, 0, 1)/10, 0, 0, 1);
status_change_end(target, SC_CRESCENTELBOW, INVALID_TIMER);
/* shouldn't this trigger skill->additional_effect? */
@@ -5653,7 +5664,7 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st
int64 rd1 = damage * sc->data[SC_DEATHBOUND]->val2 / 100; // Amplify damage.
trdamage += rdamage = rd1 - (damage = rd1 * 30 / 100); // not normalized as intended.
- rdelay = clif->skill_damage(src, target, tick, status_get_amotion(src), status_get_dmotion(src), -3000, 1, RK_DEATHBOUND, sc->data[SC_DEATHBOUND]->val1, 6);
+ rdelay = clif->skill_damage(src, target, tick, status_get_amotion(src), status_get_dmotion(src), -3000, 1, RK_DEATHBOUND, sc->data[SC_DEATHBOUND]->val1, BDT_SKILL);
skill->blown(target, src, skill->get_blewcount(RK_DEATHBOUND, sc->data[SC_DEATHBOUND]->val1), unit->getdir(src), 0);
if( tsd ) /* is this right? rdamage as both left and right? */
@@ -5680,7 +5691,7 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st
if ( tsd && tsd->bonus.short_weapon_damage_return ) {
NORMALIZE_RDAMAGE(damage * tsd->bonus.short_weapon_damage_return / 100);
- rdelay = clif->delay_damage(tick+delay,src, src, status_get_amotion(src), status_get_dmotion(src), rdamage, 1, 4);
+ rdelay = clif->delay_damage(tick+delay,src, src, status_get_amotion(src), status_get_dmotion(src), rdamage, 1, BDT_ENDURE);
/* is this right? rdamage as both left and right? */
battle->drain(tsd, src, rdamage, rdamage, status_get_race(src), 0);
@@ -5705,9 +5716,9 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st
NORMALIZE_RDAMAGE(damage * sc->data[SC_REFLECTSHIELD]->val2 / 100);
#ifndef RENEWAL
- rdelay = clif->delay_damage(tick+delay,src, src, status_get_amotion(src), status_get_dmotion(src), rdamage, 1, 4);
+ rdelay = clif->delay_damage(tick+delay,src, src, status_get_amotion(src), status_get_dmotion(src), rdamage, 1, BDT_ENDURE);
#else
- rdelay = clif->skill_damage(src, src, tick, delay, status_get_dmotion(src), rdamage, 1, CR_REFLECTSHIELD, 1, 4);
+ rdelay = clif->skill_damage(src, src, tick, delay, status_get_dmotion(src), rdamage, 1, CR_REFLECTSHIELD, 1, BDT_ENDURE);
#endif
/* is this right? rdamage as both left and right? */
if( tsd )
@@ -5741,7 +5752,7 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st
if( sc->data[SC_SHIELDSPELL_DEF] && sc->data[SC_SHIELDSPELL_DEF]->val1 == 2 ){
NORMALIZE_RDAMAGE(damage * sc->data[SC_SHIELDSPELL_DEF]->val2 / 100);
- rdelay = clif->delay_damage(tick+delay,src, src, status_get_amotion(src), status_get_dmotion(src), rdamage, 1, 4);
+ rdelay = clif->delay_damage(tick+delay,src, src, status_get_amotion(src), status_get_dmotion(src), rdamage, 1, BDT_ENDURE);
/* is this right? rdamage as both left and right? */
if( tsd )
@@ -5755,7 +5766,7 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st
if( ssc->data[SC_INSPIRATION] ) {
NORMALIZE_RDAMAGE(damage / 100);
- rdelay = clif->delay_damage(tick+delay,target, target, status_get_amotion(target), status_get_dmotion(target), rdamage, 1, 4);
+ rdelay = clif->delay_damage(tick+delay,target, target, status_get_amotion(target), status_get_dmotion(target), rdamage, 1, BDT_ENDURE);
/* is this right? rdamage as both left and right? */
if( sd )
@@ -5770,7 +5781,7 @@ void battle_reflect_damage(struct block_list *target, struct block_list *src, st
if ( tsd && tsd->bonus.long_weapon_damage_return ) {
NORMALIZE_RDAMAGE(damage * tsd->bonus.long_weapon_damage_return / 100);
- rdelay = clif->delay_damage(tick+delay,src, src, status_get_amotion(src), status_get_dmotion(src), rdamage, 1, 4);
+ rdelay = clif->delay_damage(tick+delay,src, src, status_get_amotion(src), status_get_dmotion(src), rdamage, 1, BDT_ENDURE);
/* is this right? rdamage as both left and right? */
battle->drain(tsd, src, rdamage, rdamage, status_get_race(src), 0);
@@ -5865,7 +5876,7 @@ int battle_damage_area(struct block_list *bl, va_list ap) {
battle->delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true);
else
status_fix_damage(src,bl,damage,0);
- clif->damage(bl,bl,amotion,dmotion,damage,1,ATK_BLOCK,0);
+ clif->damage(bl,bl,amotion,dmotion,damage,1,BDT_ENDURE,0);
if( !(src->type == BL_PC && ((TBL_PC*)src)->state.autocast) )
skill->additional_effect(src, bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL,ATK_DEF,tick);
map->freeblock_unlock();
@@ -5876,6 +5887,7 @@ int battle_damage_area(struct block_list *bl, va_list ap) {
/*==========================================
* Do a basic physical attack (call trough unit_attack_timer)
*------------------------------------------*/
+// FIXME: flag is undocumented
enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* target, int64 tick, int flag) {
struct map_session_data *sd = NULL, *tsd = NULL;
struct status_data *sstatus, *tstatus;
@@ -5957,7 +5969,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if(dist <= 0 || (!map->check_dir(dir,t_dir) && dist <= tstatus->rhw.range+1)) {
uint16 skill_lv = tsc->data[SC_AUTOCOUNTER]->val1;
clif->skillcastcancel(target); //Remove the casting bar. [Skotlex]
- clif->damage(src, target, sstatus->amotion, 1, 0, 1, 0, 0); //Display MISS.
+ clif->damage(src, target, sstatus->amotion, 1, 0, 1, BDT_NORMAL, 0); //Display MISS.
status_change_end(target, SC_AUTOCOUNTER, INVALID_TIMER);
skill->attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
return ATK_BLOCK;
@@ -5970,7 +5982,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
status_change_end(target, SC_BLADESTOP_WAIT, INVALID_TIMER);
if(sc_start4(target, src, SC_BLADESTOP, 100, sd?pc->checkskill(sd, MO_BLADESTOP):5, 0, 0, target->id, duration)) {
//Target locked.
- clif->damage(src, target, sstatus->amotion, 1, 0, 1, 0, 0); //Display MISS.
+ clif->damage(src, target, sstatus->amotion, 1, 0, 1, BDT_NORMAL, 0); //Display MISS.
clif->bladestop(target, src->id, 1);
sc_start4(target, target, SC_BLADESTOP, 100, skill_lv, 0, 0, src->id, duration);
return ATK_BLOCK;
@@ -6014,18 +6026,6 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
return ATK_DEF;
return ATK_MISS;
}
- if( sc->data[SC_GENTLETOUCH_ENERGYGAIN] ) {
- if( sd && rnd()%100 < 10 + 5 * sc->data[SC_GENTLETOUCH_ENERGYGAIN]->val1)
- pc->addspiritball(sd,
- skill->get_time(MO_CALLSPIRITS, sc->data[SC_GENTLETOUCH_ENERGYGAIN]->val1),
- sc->data[SC_GENTLETOUCH_ENERGYGAIN]->val1);
- }
- if( tsc && tsc->data[SC_GENTLETOUCH_ENERGYGAIN] ) {
- if( tsd && rnd()%100 < 10 + 5 * tsc->data[SC_GENTLETOUCH_ENERGYGAIN]->val1)
- pc->addspiritball(tsd,
- skill->get_time(MO_CALLSPIRITS, tsc->data[SC_GENTLETOUCH_ENERGYGAIN]->val1),
- tsc->data[SC_GENTLETOUCH_ENERGYGAIN]->val1);
- }
if( tsc && tsc->data[SC_MTF_MLEATKED] && rnd()%100 < 20 )
clif->skill_nodamage(target, target, SM_ENDURE, 5,
@@ -6048,7 +6048,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
}
if( sd && sc->data[SC_FEARBREEZE] && sc->data[SC_FEARBREEZE]->val4 > 0 && sd->status.inventory[sd->equip_index[EQI_AMMO]].amount >= sc->data[SC_FEARBREEZE]->val4 && battle_config.arrow_decrement){
- pc->delitem(sd,sd->equip_index[EQI_AMMO],sc->data[SC_FEARBREEZE]->val4,0,1,LOG_TYPE_CONSUME);
+ pc->delitem(sd, sd->equip_index[EQI_AMMO], sc->data[SC_FEARBREEZE]->val4, 0, DELITEM_SKILLUSE, LOG_TYPE_CONSUME);
sc->data[SC_FEARBREEZE]->val4 = 0;
}
}
@@ -6096,7 +6096,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce->val2] == target->id)
) && check_distance_bl(target, d_bl, sce->val3) )
{
- clif->damage(d_bl, d_bl, 0, 0, damage, 0, 0, 0);
+ clif->damage(d_bl, d_bl, 0, 0, damage, 0, BDT_NORMAL, 0);
status_fix_damage(NULL, d_bl, damage, 0);
}
else
@@ -6104,7 +6104,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
} else if( tsc->data[SC_CIRCLE_OF_FIRE_OPTION] && (wd.flag&BF_SHORT) && target->type == BL_PC ) {
struct elemental_data *ed = ((TBL_PC*)target)->ed;
if( ed ) {
- clif->skill_damage(&ed->bl, target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1, 6);
+ clif->skill_damage(&ed->bl, target, tick, status_get_amotion(src), 0, -30000, 1, EL_CIRCLE_OF_FIRE, tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1, BDT_SKILL);
skill->attack(BF_MAGIC,&ed->bl,&ed->bl,src,EL_CIRCLE_OF_FIRE,tsc->data[SC_CIRCLE_OF_FIRE_OPTION]->val1,tick,wd.flag);
}
} else if( tsc->data[SC_WATER_SCREEN_OPTION] && tsc->data[SC_WATER_SCREEN_OPTION]->val1 ) {
@@ -6373,15 +6373,20 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
}
break;
case BL_MOB:
- if(((((TBL_MOB*)target)->special_state.ai == 2 || //Marine Spheres
- (((TBL_MOB*)target)->special_state.ai == 3 && battle_config.summon_flora&1)) && //Floras
- s_bl->type == BL_PC && src->type != BL_MOB) || (((TBL_MOB*)target)->special_state.ai == 4 && t_bl->id != s_bl->id)) //Zanzoe
- {
+ {
+ TBL_MOB *md = BL_CAST(BL_MOB, target);
+ if((
+ (md->special_state.ai == AI_SPHERE || (md->special_state.ai == AI_FLORA && battle_config.summon_flora&1))
+ && s_bl->type == BL_PC && src->type != BL_MOB
+ )
+ || (md->special_state.ai == AI_ZANZOU && t_bl->id != s_bl->id)
+ ) {
//Targetable by players
state |= BCT_ENEMY;
strip_enemy = 0;
}
break;
+ }
case BL_SKILL:
{
TBL_SKILL *su = (TBL_SKILL*)target;
@@ -6544,19 +6549,16 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
&& md->guardian_data && (md->guardian_data->g || md->guardian_data->castle->guild_id) )
return 0; // Disable guardians/emperium owned by Guilds on non-woe times.
- if( !md->special_state.ai )
- { //Normal mobs
- if(
- ( target->type == BL_MOB && t_bl->type == BL_PC && ( ((TBL_MOB*)target)->special_state.ai != 4 && ((TBL_MOB*)target)->special_state.ai != 1 ) ) ||
- ( t_bl->type == BL_MOB && !((TBL_MOB*)t_bl)->special_state.ai )
- )
+ if (md->special_state.ai == AI_NONE) {
+ //Normal mobs
+ struct mob_data *target_md = BL_CAST(BL_MOB, target);
+ if( (target_md && t_bl->type == BL_PC && target_md->special_state.ai != AI_ZANZOU && target_md->special_state.ai != AI_ATTACK)
+ || (t_bl->type == BL_MOB && !((TBL_MOB*)t_bl)->special_state.ai) )
state |= BCT_PARTY; //Normal mobs with no ai are friends.
else
state |= BCT_ENEMY; //However, all else are enemies.
- }
- else
- {
- if( t_bl->type == BL_MOB && !((TBL_MOB*)t_bl)->special_state.ai )
+ } else {
+ if (t_bl->type == BL_MOB && ((TBL_MOB*)t_bl)->special_state.ai == AI_NONE)
state |= BCT_ENEMY; //Natural enemy for AI mobs are normal mobs.
}
break;
diff --git a/src/map/battle.h b/src/map/battle.h
index b3437dbc3..58490e869 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -77,6 +77,27 @@ enum e_battle_check_target { //New definitions [Skotlex]
};
/**
+ * Values used by (struct Damage).type, as well as clif->damage(type) and clif->skill_damage(type)
+ *
+ * Note: some values may not apply in some contexts.
+ */
+enum battle_dmg_type {
+ BDT_NORMAL = 0, // Normal attack
+ //BDT_PICKUP = 1, // Pick up item
+ //BDT_SITDOWN = 2, // Sit down
+ //BDT_STANDUP = 3, // Stand up
+ BDT_ENDURE = 4, // Damage (endure)
+ BDT_SPLASH = 5, // Splash
+ BDT_SKILL = 6, // Skill
+ //BDT_REPEAT = 7, // (repeat damage?)
+ BDT_MULTIHIT = 8, // Multi-hit damage
+ BDT_MULTIENDURE = 9, // Multi-hit damage (endure)
+ BDT_CRIT = 10, // Critical hit
+ BDT_PDODGE = 11, // Lucky dodge
+ //BDT_TOUCH = 12, // (touch skill?)
+};
+
+/**
* Structures
**/
diff --git a/src/map/battleground.c b/src/map/battleground.c
index f0bad2b3d..3c7c1db43 100644
--- a/src/map/battleground.c
+++ b/src/map/battleground.c
@@ -211,7 +211,7 @@ int bg_team_get_id(struct block_list *bl) {
{
struct map_session_data *msd;
struct mob_data *md = (TBL_MOB*)bl;
- if( md->special_state.ai && (msd = map->id2sd(md->master_id)) != NULL )
+ if (md->special_state.ai != AI_NONE && (msd = map->id2sd(md->master_id)) != NULL)
return msd->bg_id;
return md->bg_id;
}
@@ -538,11 +538,10 @@ void bg_match_over(struct bg_arena *arena, bool canceled) {
bg->team_leave(sd, 0);
bg->queue_pc_cleanup(sd);
}
- if( canceled )
- clif->colormes(sd->fd,COLOR_RED,"BG Match Canceled: not enough players");
- else {
+ if (canceled)
+ clif->messagecolor_self(sd->fd, COLOR_RED, "BG Match Canceled: not enough players");
+ else
pc_setglobalreg(sd, script->add_str(arena->delay_var), (unsigned int)time(NULL));
- }
}
}
@@ -766,7 +765,7 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
sprintf(response, "You are a deserter! Wait %d minute(s) before you can apply again",(tick-tsec)/60);
else
sprintf(response, "You are a deserter! Wait %d seconds before you can apply again",(tick-tsec));
- clif->colormes(sd->fd,COLOR_RED,response);
+ clif->messagecolor_self(sd->fd, COLOR_RED, response);
return BGQA_FAIL_DESERTER;
}
@@ -776,7 +775,7 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
sprintf(response, "You can't reapply to this arena so fast. Apply to the different arena or wait %d minute(s)",(tick-tsec)/60);
else
sprintf(response, "You can't reapply to this arena so fast. Apply to the different arena or wait %d seconds",(tick-tsec));
- clif->colormes(sd->fd,COLOR_RED,response);
+ clif->messagecolor_self(sd->fd, COLOR_RED, response);
return BGQA_FAIL_COOLDOWN;
}
@@ -800,7 +799,7 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
sprintf(response, "Can't apply: not enough members in your team/guild that have not entered the queue in individual mode, minimum is %d",arena->min_team_players);
else
sprintf(response, "Can't apply: not enough members in your team/guild, minimum is %d",arena->min_team_players);
- clif->colormes(sd->fd,COLOR_RED,response);
+ clif->messagecolor_self(sd->fd, COLOR_RED, response);
return BGQA_FAIL_TEAM_COUNT;
}
}
@@ -832,7 +831,7 @@ enum BATTLEGROUNDS_QUEUE_ACK bg_canqueue(struct map_session_data *sd, struct bg_
sprintf(response, "Can't apply: not enough members in your team/party that have not entered the queue in individual mode, minimum is %d",arena->min_team_players);
else
sprintf(response, "Can't apply: not enough members in your team/party, minimum is %d",arena->min_team_players);
- clif->colormes(sd->fd,COLOR_RED,response);
+ clif->messagecolor_self(sd->fd, COLOR_RED, response);
return BGQA_FAIL_TEAM_COUNT;
}
} else
diff --git a/src/map/buyingstore.c b/src/map/buyingstore.c
index 85fef98aa..531a55e71 100644
--- a/src/map/buyingstore.c
+++ b/src/map/buyingstore.c
@@ -353,7 +353,7 @@ void buyingstore_trade(struct map_session_data* sd, int account_id, unsigned int
// move item
pc->additem(pl_sd, &sd->status.inventory[index], amount, LOG_TYPE_BUYING_STORE);
- pc->delitem(sd, index, amount, 1, 0, LOG_TYPE_BUYING_STORE);
+ pc->delitem(sd, index, amount, 1, DELITEM_NORMAL, LOG_TYPE_BUYING_STORE);
pl_sd->buyingstore.items[listidx].amount-= amount;
// pay up
diff --git a/src/map/channel.c b/src/map/channel.c
index 58ff98c2b..f7ab978a6 100644
--- a/src/map/channel.c
+++ b/src/map/channel.c
@@ -258,7 +258,7 @@ void channel_send(struct channel_data *chan, struct map_session_data *sd, const
if (sd && chan->msg_delay != 0
&& DIFF_TICK(sd->hchsysch_tick + chan->msg_delay*1000, timer->gettick()) > 0
&& !pc_has_permission(sd, PC_PERM_HCHSYS_ADMIN)) {
- clif->colormes(sd->fd,COLOR_RED,msg_sd(sd,1455));
+ clif->messagecolor_self(sd->fd, COLOR_RED, msg_sd(sd,1455));
return;
} else if (sd) {
snprintf(message, 150, "[ #%s ] %s : %s",chan->name,sd->status.name, msg);
@@ -352,7 +352,7 @@ enum channel_operation_status channel_join(struct channel_data *chan, struct map
} else {
sprintf(output, msg_sd(sd,1403), chan->name); // You're now in the '%s' channel
}
- clif->colormes(sd->fd, COLOR_DEFAULT, output);
+ clif->messagecolor_self(sd->fd, COLOR_DEFAULT, output);
}
if (chan->type == HCS_TYPE_ALLY) {
@@ -693,7 +693,6 @@ void read_channels_config(void)
safestrncpy(channel->config->colors_name[i], config_setting_name(color), HCS_NAME_LENGTH);
channel->config->colors[i] = (unsigned int)strtoul(libconfig->setting_get_string_elem(colors,i),NULL,0);
- channel->config->colors[i] = (channel->config->colors[i] & 0x0000FF) << 16 | (channel->config->colors[i] & 0x00FF00) | (channel->config->colors[i] & 0xFF0000) >> 16;//RGB to BGR
}
channel->config->colors_count = color_count;
}
diff --git a/src/map/chat.c b/src/map/chat.c
index a232781ca..e296fddec 100644
--- a/src/map/chat.c
+++ b/src/map/chat.c
@@ -93,7 +93,7 @@ bool chat_createpcchat(struct map_session_data* sd, const char* title, const cha
return false;
}
- pc_stop_walking(sd,1);
+ pc_stop_walking(sd, STOPWALKING_FLAG_FIXPOS);
cd = chat->create(&sd->bl, title, pass, limit, pub, 0, "", 0, 1, MAX_LEVEL);
if( cd ) {
@@ -101,7 +101,7 @@ bool chat_createpcchat(struct map_session_data* sd, const char* title, const cha
cd->usersd[0] = sd;
pc_setchatid(sd,cd->bl.id);
pc_stop_attack(sd);
- clif->createchat(sd,0);
+ clif->createchat(sd,0); // 0 = success
clif->dispchat(cd,0);
return true;
}
@@ -150,7 +150,7 @@ bool chat_joinchat(struct map_session_data* sd, int chatid, const char* pass) {
return false;
}
- pc_stop_walking(sd,1);
+ pc_stop_walking(sd, STOPWALKING_FLAG_FIXPOS);
cd->usersd[cd->users] = sd;
cd->users++;
@@ -339,7 +339,7 @@ bool chat_kickchat(struct map_session_data* sd, const char* kickusername) {
idb_iput(cd->kick_list,cd->usersd[i]->status.char_id,1);
- chat->leave(cd->usersd[i],1);
+ chat->leave(cd->usersd[i], true);
return true;
}
@@ -440,7 +440,7 @@ bool chat_npckickall(struct chat_data* cd)
nullpo_ret(cd);
while( cd->users > 0 )
- chat->leave(cd->usersd[cd->users-1],0);
+ chat->leave(cd->usersd[cd->users-1], false);
return true;
}
diff --git a/src/map/chrif.c b/src/map/chrif.c
index 6ac7d5695..d3d0aa10c 100644
--- a/src/map/chrif.c
+++ b/src/map/chrif.c
@@ -247,6 +247,7 @@ int chrif_isconnected(void) {
* Flag = 1: Character is quitting
* Flag = 2: Character is changing map-servers
*------------------------------------------*/
+// TODO: Flag enum
bool chrif_save(struct map_session_data *sd, int flag) {
nullpo_ret(sd);
@@ -263,11 +264,11 @@ bool chrif_save(struct map_session_data *sd, int flag) {
chrif_check(false); //Character is saved on reconnect.
//For data sync
- if (sd->state.storage_flag == 2)
+ if (sd->state.storage_flag == STORAGE_FLAG_GUILD)
gstorage->save(sd->status.account_id, sd->status.guild_id, flag);
if (flag)
- sd->state.storage_flag = 0; //Force close it.
+ sd->state.storage_flag = STORAGE_FLAG_CLOSED; //Force close it.
//Saving of registry values.
if (sd->vars_dirty)
@@ -401,7 +402,7 @@ bool chrif_changemapserverack(int account_id, int login_id1, int login_id2, int
if ( !login_id1 ) {
ShowError("chrif_changemapserverack: map server change failed.\n");
- clif->authfail_fd(node->fd, 0);
+ clif->authfail_fd(node->fd, 0); // Disconnected from server
} else
clif->changemapserver(node->sd, map_index, x, y, ntohl(ip), ntohs(port));
@@ -465,7 +466,7 @@ int chrif_reconnect(DBKey key, DBData *data, va_list ap) {
if( map->mapname2ipport(sd->mapindex,&ip,&port) == 0 )
chrif->changemapserver(sd, ip, port);
else //too much lag/timeout is the closest explanation for this error.
- clif->authfail_fd(sd->fd, 3);
+ clif->authfail_fd(sd->fd, 3); // timeout
break;
}
}
@@ -643,7 +644,7 @@ void chrif_authfail(int fd) {/* HELLO WORLD. ip in RFIFOL 15 is not being used (
node->sex == sex &&
node->state == ST_LOGIN )
{// found a match
- clif->authfail_fd(node->fd, 0);
+ clif->authfail_fd(node->fd, 0); // Disconnected from server
chrif->auth_delete(account_id, char_id, ST_LOGIN);
}
}
@@ -747,15 +748,15 @@ bool chrif_changeemail(int id, const char *actual_email, const char *new_email)
* S 2b0e <accid>.l <name>.24B <type>.w { <additional fields>.12B }
* { <year>.w <month>.w <day>.w <hour>.w <minute>.w <second>.w }
* Send an account modification request to the login server (via char server).
- * type of operation {additional fields}:
- * 1: block { n/a }
- * 2: ban { <year>.w <month>.w <day>.w <hour>.w <minute>.w <second>.w }
- * 3: unblock { n/a }
- * 4: unban { n/a }
- * 5: changesex { n/a } -- use chrif_changesex
- * 6: charban { <year>.w <month>.w <day>.w <hour>.w <minute>.w <second>.w }
- * 7: charunban { n/a }
- * 8: changecharsex { <sex>.b } -- use chrif_changesex
+ * type of operation: @see enum zh_char_ask_name
+ * block { n/a }
+ * ban { <year>.w <month>.w <day>.w <hour>.w <minute>.w <second>.w }
+ * unblock { n/a }
+ * unban { n/a }
+ * changesex { n/a } -- use chrif_changesex
+ * charban { <year>.w <month>.w <day>.w <hour>.w <minute>.w <second>.w }
+ * charunban { n/a }
+ * changecharsex { <sex>.b } -- use chrif_changesex
*------------------------------------------*/
bool chrif_char_ask_name(int acc, const char* character_name, unsigned short operation_type, int year, int month, int day, int hour, int minute, int second)
{
@@ -767,7 +768,7 @@ bool chrif_char_ask_name(int acc, const char* character_name, unsigned short ope
safestrncpy((char*)WFIFOP(chrif->fd,6), character_name, NAME_LENGTH);
WFIFOW(chrif->fd,30) = operation_type;
- if ( operation_type == 2 || operation_type == 6 ) {
+ if (operation_type == CHAR_ASK_NAME_BAN || operation_type == CHAR_ASK_NAME_CHARBAN) {
WFIFOW(chrif->fd,32) = year;
WFIFOW(chrif->fd,34) = month;
WFIFOW(chrif->fd,36) = day;
@@ -795,7 +796,7 @@ bool chrif_changesex(struct map_session_data *sd, bool change_account)
WFIFOW(chrif->fd,0) = 0x2b0e;
WFIFOL(chrif->fd,2) = sd->status.account_id;
safestrncpy((char*)WFIFOP(chrif->fd,6), sd->status.name, NAME_LENGTH);
- WFIFOW(chrif->fd,30) = change_account ? 5 : 8;
+ WFIFOW(chrif->fd,30) = change_account ? CHAR_ASK_NAME_CHANGESEX : CHAR_ASK_NAME_CHANGECHARSEX;
if (!change_account)
WFIFOB(chrif->fd,32) = sd->status.sex == SEX_MALE ? SEX_FEMALE : SEX_MALE;
WFIFOSET(chrif->fd,44);
@@ -812,19 +813,14 @@ bool chrif_changesex(struct map_session_data *sd, bool change_account)
/*==========================================
* R 2b0f <accid>.l <name>.24B <type>.w <answer>.w
* Processing a reply to chrif->char_ask_name() (request to modify an account).
- * type of operation:
- * 1: block, 2: ban, 3: unblock, 4: unban, 5: changesex, 6: charban, 7: charunban, 8: changecharsex
- * type of answer:
- * 0: login-server request done
- * 1: player not found
- * 2: gm level too low
- * 3: login-server offline
+ * type of operation: @see chrif_char_ask_name
+ * type of answer: @see hz_char_ask_name_answer
*------------------------------------------*/
bool chrif_char_ask_name_answer(int acc, const char* player_name, uint16 type, uint16 answer) {
struct map_session_data* sd;
char action[25];
char output[256];
- bool charsrv = ( type == 6 || type == 7 ) ? true : false;
+ bool charsrv = ( type == CHAR_ASK_NAME_CHARBAN || type == CHAR_ASK_NAME_CHARUNBAN ) ? true : false;
sd = map->id2sd(acc);
@@ -834,19 +830,19 @@ bool chrif_char_ask_name_answer(int acc, const char* player_name, uint16 type, u
}
/* re-use previous msg_number */
- if( type == 6 ) type = 2;
- if( type == 7 ) type = 4;
+ if( type == CHAR_ASK_NAME_CHARBAN ) type = CHAR_ASK_NAME_BAN;
+ if( type == CHAR_ASK_NAME_CHARUNBAN ) type = CHAR_ASK_NAME_UNBAN;
- if( type > 0 && type <= 5 )
+ if( type >= CHAR_ASK_NAME_BLOCK && type <= CHAR_ASK_NAME_CHANGESEX )
snprintf(action,25,"%s",msg_sd(sd,427+type)); //block|ban|unblock|unban|change the sex of
else
snprintf(action,25,"???");
switch( answer ) {
- case 0 : sprintf(output, msg_sd(sd,charsrv?434:424), action, NAME_LENGTH, player_name); break;
- case 1 : sprintf(output, msg_sd(sd,425), NAME_LENGTH, player_name); break;
- case 2 : sprintf(output, msg_sd(sd,426), action, NAME_LENGTH, player_name); break;
- case 3 : sprintf(output, msg_sd(sd,427), action, NAME_LENGTH, player_name); break;
+ case CHAR_ASK_NAME_ANS_DONE: sprintf(output, msg_sd(sd,charsrv?434:424), action, NAME_LENGTH, player_name); break;
+ case CHAR_ASK_NAME_ANS_NOTFOUND: sprintf(output, msg_sd(sd,425), NAME_LENGTH, player_name); break;
+ case CHAR_ASK_NAME_ANS_GMLOW: sprintf(output, msg_sd(sd,426), action, NAME_LENGTH, player_name); break;
+ case CHAR_ASK_NAME_ANS_OFFLINE: sprintf(output, msg_sd(sd,427), action, NAME_LENGTH, player_name); break;
default: output[0] = '\0'; break;
}
@@ -904,14 +900,14 @@ bool chrif_divorceack(int char_id, int partner_id) {
sd->status.partner_id = 0;
for(i = 0; i < MAX_INVENTORY; i++)
if (sd->status.inventory[i].nameid == WEDDING_RING_M || sd->status.inventory[i].nameid == WEDDING_RING_F)
- pc->delitem(sd, i, 1, 0, 0, LOG_TYPE_OTHER);
+ pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_OTHER);
}
if( ( sd = map->charid2sd(partner_id) ) != NULL && sd->status.partner_id == char_id ) {
sd->status.partner_id = 0;
for(i = 0; i < MAX_INVENTORY; i++)
if (sd->status.inventory[i].nameid == WEDDING_RING_M || sd->status.inventory[i].nameid == WEDDING_RING_F)
- pc->delitem(sd, i, 1, 0, 0, LOG_TYPE_OTHER);
+ pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_OTHER);
}
return true;
diff --git a/src/map/clif.c b/src/map/clif.c
index 0dc04a3b8..a8fa2e6e7 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -688,6 +688,7 @@ void clif_authrefuse(int fd, uint8 error_code)
/// 109 = BAN_INVALID_PWD_CNT
/// 110 = BAN_NOT_ALLOWED_JOBCLASS
/// ? = disconnected -> MsgStringTable[3]
+// TODO: type enum
void clif_authfail_fd(int fd, int type)
{
if (!fd || !session[fd] || session[fd]->func_parse != clif->parse) //clif_authfail should only be invoked on players!
@@ -1520,21 +1521,24 @@ void clif_homskillinfoblock(struct map_session_data *sd) {
WFIFOHEAD(fd, 4+37*MAX_HOMUNSKILL);
WFIFOW(fd,0)=0x235;
- for ( i = 0; i < MAX_HOMUNSKILL; i++){
+ for ( i = 0; i < MAX_HOMUNSKILL; i++ ) {
int id = hd->homunculus.hskill[i].id;
- if (id != 0) {
+ if ( id != 0 ) {
j = id - HM_SKILLBASE;
+ WFIFOW(fd, len) = id;
+ WFIFOW(fd, len + 2) = skill->get_inf(id);
+ WFIFOW(fd, len + 4) = 0;
+ WFIFOW(fd, len + 6) = hd->homunculus.hskill[j].lv;
if ( hd->homunculus.hskill[j].lv ) {
- WFIFOW(fd, len) = id;
- WFIFOW(fd, len + 2) = skill->get_inf(id);
- WFIFOW(fd, len + 4) = 0;
- WFIFOW(fd, len + 6) = hd->homunculus.hskill[j].lv;
WFIFOW(fd, len + 8) = skill->get_sp(id, hd->homunculus.hskill[j].lv);
WFIFOW(fd, len + 10) = skill->get_range2(&sd->hd->bl, id, hd->homunculus.hskill[j].lv);
- safestrncpy((char*)WFIFOP(fd, len + 12), skill->get_name(id), NAME_LENGTH);
- WFIFOB(fd, len + 36) = (hd->homunculus.hskill[j].lv < homun->skill_tree_get_max(id, hd->homunculus.class_)) ? 1 : 0;
- len += 37;
+ } else {
+ WFIFOW(fd, len + 8) = 0;
+ WFIFOW(fd, len + 10) = 0;
}
+ safestrncpy((char*)WFIFOP(fd, len + 12), skill->get_name(id), NAME_LENGTH);
+ WFIFOB(fd, len + 36) = (hd->homunculus.hskill[j].lv < homun->skill_tree_get_max(id, hd->homunculus.class_)) ? 1 : 0;
+ len += 37;
}
}
WFIFOW(fd,2)=len;
@@ -2294,15 +2298,7 @@ void clif_dropitem(struct map_session_data *sd,int n,int amount)
/// Notifies the client, that an inventory item was deleted (ZC_DELETE_ITEM_FROM_BODY).
/// 07fa <delete type>.W <index>.W <amount>.W
-/// delete type:
-/// 0 = Normal
-/// 1 = Item used for a skill
-/// 2 = Refine failed
-/// 3 = Material changed
-/// 4 = Moved to storage
-/// 5 = Moved to cart
-/// 6 = Item sold
-/// 7 = Consumed by Four Spirit Analysis (SO_EL_ANALYSIS) skill
+/// delete type: @see enum delitem_reason
void clif_delitem(struct map_session_data *sd,int n,int amount, short reason)
{
#if PACKETVER < 20091117
@@ -3464,6 +3460,7 @@ void clif_useitemack(struct map_session_data *sd,int index,int amount,bool ok)
/// 0 = Room has been successfully created (opens chat room)
/// 1 = Room limit exceeded
/// 2 = Same room already exists
+// TODO: Flag enum
void clif_createchat(struct map_session_data* sd, int flag)
{
int fd;
@@ -4017,11 +4014,11 @@ void clif_getareachar_pc(struct map_session_data* sd,struct map_session_data* ds
clif->hpmeter_single(sd->fd, dstsd->bl.id, dstsd->battle_status.hp, dstsd->battle_status.max_hp);
// display link (sd - dstsd) to sd
- ARR_FIND( 0, 5, i, sd->devotion[i] == dstsd->bl.id );
- if( i < 5 ) clif->devotion(&sd->bl, sd);
+ ARR_FIND( 0, MAX_PC_DEVOTION, i, sd->devotion[i] == dstsd->bl.id );
+ if( i < MAX_PC_DEVOTION ) clif->devotion(&sd->bl, sd);
// display links (dstsd - devotees) to sd
- ARR_FIND( 0, 5, i, dstsd->devotion[i] > 0 );
- if( i < 5 ) clif->devotion(&dstsd->bl, sd);
+ ARR_FIND( 0, MAX_PC_DEVOTION, i, dstsd->devotion[i] > 0 );
+ if( i < MAX_PC_DEVOTION ) clif->devotion(&dstsd->bl, sd);
// display link (dstsd - crusader) to sd
if( dstsd->sc.data[SC_DEVOTION] && (d_bl = map->id2bl(dstsd->sc.data[SC_DEVOTION]->val1)) != NULL )
clif->devotion(d_bl, sd);
@@ -4136,20 +4133,8 @@ int clif_calc_walkdelay(struct block_list *bl,int delay, int type, int damage, i
/// Sends a 'damage' packet (src performs action on dst)
/// 008a <src ID>.L <dst ID>.L <server tick>.L <src speed>.L <dst speed>.L <damage>.W <div>.W <type>.B <damage2>.W (ZC_NOTIFY_ACT)
/// 02e1 <src ID>.L <dst ID>.L <server tick>.L <src speed>.L <dst speed>.L <damage>.L <div>.W <type>.B <damage2>.L (ZC_NOTIFY_ACT2)
-/// type:
-/// 0 = damage [ damage: total damage, div: amount of hits, damage2: assassin dual-wield damage ]
-/// 1 = pick up item
-/// 2 = sit down
-/// 3 = stand up
-/// 4 = damage (endure)
-/// 5 = (splash?)
-/// 6 = (skill?)
-/// 7 = (repeat damage?)
-/// 8 = multi-hit damage
-/// 9 = multi-hit damage (endure)
-/// 10 = critical hit
-/// 11 = lucky dodge
-/// 12 = (touch skill?)
+/// type: @see enum battle_dmg_type
+/// for BDT_NORMAL: [ damage: total damage, div: amount of hits, damage2: assassin dual-wield damage ]
int clif_damage(struct block_list* src, struct block_list* dst, int sdelay, int ddelay, int64 in_damage, short div, unsigned char type, int64 in_damage2) {
struct packet_damage p;
struct status_change *sc;
@@ -4227,7 +4212,7 @@ int clif_damage(struct block_list* src, struct block_list* dst, int sdelay, int
*------------------------------------------*/
void clif_takeitem(struct block_list* src, struct block_list* dst)
{
- //clif->damage(src,dst,0,0,0,0,1,0);
+ //clif->damage(src,dst,0,0,0,0,BDT_PICKUP,0);
unsigned char buf[32];
nullpo_retv(src);
@@ -4625,26 +4610,33 @@ void clif_skillinfoblock(struct map_session_data *sd)
/// 0111 <skill id>.W <type>.L <level>.W <sp cost>.W <attack range>.W <skill name>.24B <upgradable>.B
void clif_addskill(struct map_session_data *sd, int id)
{
- int fd, idx = skill->get_index(id);
+ int fd, skill_lv, idx = skill->get_index(id);
nullpo_retv(sd);
fd = sd->fd;
if (!fd) return;
- if( sd->status.skill[idx].id <= 0 )
+ if (sd->status.skill[idx].id <= 0)
return;
+ skill_lv = sd->status.skill[idx].lv;
+
WFIFOHEAD(fd, packet_len(0x111));
WFIFOW(fd,0) = 0x111;
WFIFOW(fd,2) = id;
WFIFOL(fd,4) = skill->get_inf(id);
- WFIFOW(fd,8) = sd->status.skill[idx].lv;
- WFIFOW(fd,10) = skill->get_sp(id,sd->status.skill[idx].lv);
- WFIFOW(fd,12)= skill->get_range2(&sd->bl, id,sd->status.skill[idx].lv);
+ WFIFOW(fd,8) = skill_lv;
+ if (skill_lv > 0) {
+ WFIFOW(fd,10) = skill->get_sp(id, skill_lv);
+ WFIFOW(fd,12) = skill->get_range2(&sd->bl, id, skill_lv);
+ } else {
+ WFIFOW(fd,10) = 0;
+ WFIFOW(fd,12) = 0;
+ }
safestrncpy((char*)WFIFOP(fd,14), skill->get_name(id), NAME_LENGTH);
- if( sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT )
- WFIFOB(fd,38) = (sd->status.skill[idx].lv < skill->tree_get_max(id, sd->status.class_))? 1:0;
+ if (sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT)
+ WFIFOB(fd,38) = (skill_lv < skill->tree_get_max(id, sd->status.class_))? 1:0;
else
WFIFOB(fd,38) = 0;
WFIFOSET(fd,packet_len(0x111));
@@ -4704,16 +4696,22 @@ void clif_skillinfo(struct map_session_data *sd,int skill_id, int inf)
{
const int fd = sd->fd;
int idx = skill->get_index(skill_id);
+ int skill_lv = sd->status.skill[idx].lv;
WFIFOHEAD(fd,packet_len(0x7e1));
WFIFOW(fd,0) = 0x7e1;
WFIFOW(fd,2) = skill_id;
WFIFOL(fd,4) = inf?inf:skill->get_inf(skill_id);
- WFIFOW(fd,8) = sd->status.skill[idx].lv;
- WFIFOW(fd,10) = skill->get_sp(skill_id,sd->status.skill[idx].lv);
- WFIFOW(fd,12) = skill->get_range2(&sd->bl,skill_id,sd->status.skill[idx].lv);
- if( sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT )
- WFIFOB(fd,14) = (sd->status.skill[idx].lv < skill->tree_get_max(skill_id, sd->status.class_))? 1:0;
+ WFIFOW(fd,8) = skill_lv;
+ if (skill_lv > 0) {
+ WFIFOW(fd,10) = skill->get_sp(skill_id, skill_lv);
+ WFIFOW(fd,12) = skill->get_range2(&sd->bl, skill_id, skill_lv);
+ } else {
+ WFIFOW(fd,10) = 0;
+ WFIFOW(fd,12) = 0;
+ }
+ if (sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT)
+ WFIFOB(fd,14) = (skill_lv < skill->tree_get_max(skill_id, sd->status.class_))? 1:0;
else
WFIFOB(fd,14) = 0;
WFIFOSET(fd,packet_len(0x7e1));
@@ -5351,7 +5349,7 @@ void clif_displaymessage(const int fd, const char* mes) {
#if PACKETVER == 20141022
/** for some reason game client crashes depending on message pattern (only for this packet) **/
/** so we redirect to ZC_NPC_CHAT **/
- clif->colormes(fd,COLOR_DEFAULT,mes);
+ clif->messagecolor_self(fd, COLOR_DEFAULT, mes);
#else
size_t len;
@@ -5571,6 +5569,7 @@ void clif_map_type(struct map_session_data* sd, enum map_type type) {
/// Updates PvP ranking (ZC_NOTIFY_RANKING).
/// 019a <id>.L <ranking>.L <total>.L
+// FIXME: missing documentation for the 'type' parameter
void clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type)
{
if(type == 2) {
@@ -6898,7 +6897,7 @@ void clif_devotion(struct block_list *src, struct map_session_data *tsd)
if( sd == NULL )
return;
- for( i = 0; i < 5; i++ )
+ for( i = 0; i < MAX_PC_DEVOTION; i++ )
WBUFL(buf,6+4*i) = sd->devotion[i];
WBUFW(buf,26) = skill->get_range2(src, CR_DEVOTION, pc->checkskill(sd, CR_DEVOTION));
}
@@ -7055,9 +7054,7 @@ void clif_guild_created(struct map_session_data *sd,int flag)
/// Notifies the client that it is belonging to a guild (ZC_UPDATE_GDID).
/// 016c <guild id>.L <emblem id>.L <mode>.L <ismaster>.B <inter sid>.L <guild name>.24B
-/// mode:
-/// &0x01 = allow invite
-/// &0x10 = allow expel
+/// mode: @see enum guild_permission
void clif_guild_belonginfo(struct map_session_data *sd, struct guild *g)
{
int ps,fd;
@@ -7307,9 +7304,7 @@ void clif_guild_positionnamelist(struct map_session_data *sd) {
/// Guild position information (ZC_POSITION_INFO).
/// 0160 <packet len>.W { <position id>.L <mode>.L <ranking>.L <pay rate>.L }*
-/// mode:
-/// &0x01 = allow invite
-/// &0x10 = allow expel
+/// mode: @see enum guild_permission
/// ranking:
/// TODO
void clif_guild_positioninfolist(struct map_session_data *sd) {
@@ -7337,9 +7332,7 @@ void clif_guild_positioninfolist(struct map_session_data *sd) {
/// Notifies clients in a guild about updated position information (ZC_ACK_CHANGE_GUILD_POSITIONINFO).
/// 0174 <packet len>.W { <position id>.L <mode>.L <ranking>.L <pay rate>.L <position name>.24B }*
-/// mode:
-/// &0x01 = allow invite
-/// &0x10 = allow expel
+/// mode: @see enum guild_permission
/// ranking:
/// TODO
void clif_guild_positionchanged(struct guild *g,int idx)
@@ -7453,8 +7446,13 @@ void clif_guild_skillinfo(struct map_session_data* sd)
WFIFOW(fd,p+0) = id;
WFIFOL(fd,p+2) = skill->get_inf(id);
WFIFOW(fd,p+6) = g->skill[i].lv;
- WFIFOW(fd,p+8) = skill->get_sp(id, g->skill[i].lv);
- WFIFOW(fd,p+10) = skill->get_range(id, g->skill[i].lv);
+ if ( g->skill[i].lv ) {
+ WFIFOW(fd, p + 8) = skill->get_sp(id, g->skill[i].lv);
+ WFIFOW(fd, p + 10) = skill->get_range(id, g->skill[i].lv);
+ } else {
+ WFIFOW(fd, p + 8) = 0;
+ WFIFOW(fd, p + 10) = 0;
+ }
safestrncpy((char*)WFIFOP(fd,p+12), skill->get_name(id), NAME_LENGTH);
WFIFOB(fd,p+36)= (g->skill[i].lv < guild->skill_get_max(id) && sd == g->member[0].sd) ? 1 : 0;
c++;
@@ -8128,28 +8126,41 @@ void clif_specialeffect_value(struct block_list* bl, int effect_id, int num, sen
clif->send(buf, packet_len(0x284), bl, SELF);
}
}
-// Modification of clif_messagecolor to send colored messages to players to chat log only (doesn't display overhead)
-/// 02c1 <packet len>.W <id>.L <color>.L <message>.?B
-int clif_colormes(int fd, enum clif_colors color, const char* msg) {
+/**
+ * Modification of clif_messagecolor to send colored messages to players to chat log only (doesn't display overhead).
+ *
+ * 02c1 <packet len>.W <id>.L <color>.L <message>.?B
+ *
+ * @param fd Target fd to send the message to
+ * @param color Message color (RGB format: 0xRRGGBB)
+ * @param msg Message text
+ */
+void clif_messagecolor_self(int fd, uint32 color, const char *msg)
+{
size_t msg_len = strlen(msg) + 1;
WFIFOHEAD(fd,msg_len + 12);
WFIFOW(fd,0) = 0x2C1;
WFIFOW(fd,2) = msg_len + 12;
WFIFOL(fd,4) = 0;
- WFIFOL(fd,8) = color_table[color];
+ WFIFOL(fd,8) = RGB2BGR(color);
safestrncpy((char*)WFIFOP(fd,12), msg, msg_len);
WFIFOSET(fd, msg_len + 12);
-
- return 0;
}
-/// Monster/NPC color chat [SnakeDrak] (ZC_NPC_CHAT).
-/// 02c1 <packet len>.W <id>.L <color>.L <message>.?B
-void clif_messagecolor(struct block_list* bl, unsigned int color, const char* msg) {
+/**
+ * Monster/NPC color chat [SnakeDrak] (ZC_NPC_CHAT).
+ *
+ * 02c1 <packet len>.W <id>.L <color>.L <message>.?B
+ *
+ * @param bl Source block list.
+ * @param color Message color (RGB format: 0xRRGGBB)
+ * @param msg Message text
+ */
+void clif_messagecolor(struct block_list* bl, uint32 color, const char *msg)
+{
size_t msg_len = strlen(msg) + 1;
uint8 buf[256];
- color = (color & 0x0000FF) << 16 | (color & 0x00FF00) | (color & 0xFF0000) >> 16; // RGB to BGR
nullpo_retv(bl);
@@ -8161,48 +8172,29 @@ void clif_messagecolor(struct block_list* bl, unsigned int color, const char* ms
WBUFW(buf,0) = 0x2C1;
WBUFW(buf,2) = msg_len + 12;
WBUFL(buf,4) = bl->id;
- WBUFL(buf,8) = color;
+ WBUFL(buf,8) = RGB2BGR(color);
memcpy(WBUFP(buf,12), msg, msg_len);
clif->send(buf, WBUFW(buf,2), bl, AREA_CHAT_WOC);
}
-/// Public chat message [Valaris] (ZC_NOTIFY_CHAT).
-/// 008d <packet len>.W <id>.L <message>.?B
-void clif_message(struct block_list* bl, const char* msg) {
- unsigned short msg_len = strlen(msg) + 1;
- uint8 buf[256];
- nullpo_retv(bl);
-
- if( msg_len > sizeof(buf)-8 ) {
- ShowWarning("clif_message: Truncating too long message '%s' (len=%u).\n", msg, msg_len);
- msg_len = sizeof(buf)-8;
- }
-
- WBUFW(buf,0) = 0x8d;
- WBUFW(buf,2) = msg_len + 8;
- WBUFL(buf,4) = bl->id;
- safestrncpy((char*)WBUFP(buf,8), msg, msg_len);
-
- clif->send(buf, WBUFW(buf,2), bl, AREA_CHAT_WOC);
-}
-
/**
* Notifies the client that the storage window is still open
*
* Should only be used in cases where the client closed the
* storage window without server's consent
**/
-void clif_refresh_storagewindow( struct map_session_data *sd ) {
+void clif_refresh_storagewindow(struct map_session_data *sd)
+{
// Notify the client that the storage is open
- if( sd->state.storage_flag == 1 ) {
+ if (sd->state.storage_flag == STORAGE_FLAG_NORMAL) {
storage->sortitem(sd->status.storage.items, ARRAYLENGTH(sd->status.storage.items));
clif->storagelist(sd, sd->status.storage.items, ARRAYLENGTH(sd->status.storage.items));
clif->updatestorageamount(sd, sd->status.storage.storage_amount, MAX_STORAGE);
}
// Notify the client that the gstorage is open otherwise it will
// remain locked forever and nobody will be able to access it
- if( sd->state.storage_flag == 2 ) {
+ if (sd->state.storage_flag == STORAGE_FLAG_GUILD) {
struct guild_storage *gstor;
if( (gstor = idb_get(gstorage->db,sd->status.guild_id)) == NULL) {
// Shouldn't happen... The information should already be at the map-server
@@ -8252,7 +8244,7 @@ void clif_refresh(struct map_session_data *sd)
map->foreachinrange(clif->getareachar,&sd->bl,AREA_SIZE,BL_ALL,sd);
clif->weather_check(sd);
if( sd->chatID )
- chat->leave(sd,0);
+ chat->leave(sd, false);
if( sd->state.vending )
clif->openvending(sd, sd->bl.id, sd->vending);
if( pc_issit(sd) )
@@ -8900,12 +8892,13 @@ void clif_channel_msg(struct channel_data *chan, struct map_session_data *sd, ch
DBIterator *iter = db_iterator(chan->users);
struct map_session_data *user;
unsigned short msg_len = strlen(msg) + 1;
+ uint32 color = channel->config->colors[chan->color];
WFIFOHEAD(sd->fd,msg_len + 12);
WFIFOW(sd->fd,0) = 0x2C1;
WFIFOW(sd->fd,2) = msg_len + 12;
WFIFOL(sd->fd,4) = 0;
- WFIFOL(sd->fd,8) = channel->config->colors[chan->color];
+ WFIFOL(sd->fd,8) = RGB2BGR(color);
safestrncpy((char*)WFIFOP(sd->fd,12), msg, msg_len);
for (user = dbi_first(iter); dbi_exists(iter); user = dbi_next(iter)) {
@@ -8927,11 +8920,12 @@ void clif_channel_msg2(struct channel_data *chan, char *msg)
struct map_session_data *user;
unsigned char buf[210];
unsigned short msg_len = strlen(msg) + 1;
+ uint32 color = channel->config->colors[chan->color];
WBUFW(buf,0) = 0x2C1;
WBUFW(buf,2) = msg_len + 12;
WBUFL(buf,4) = 0;
- WBUFL(buf,8) = channel->config->colors[chan->color];
+ WBUFL(buf,8) = RGB2BGR(color);
safestrncpy((char*)WBUFP(buf,12), msg, msg_len);
for (user = dbi_first(iter); dbi_exists(iter); user = dbi_next(iter)) {
@@ -9027,9 +9021,6 @@ void clif_parse_WantToConnection(int fd, struct map_session_data* sd) {
/// Notification from the client, that it has finished map loading and is about to display player's character (CZ_NOTIFY_ACTORINIT).
/// 007d
void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) {
-#if PACKETVER >= 20090218
- int i;
-#endif
bool first_time = false;
if(sd->bl.prev != NULL)
@@ -9214,10 +9205,13 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) {
//Auron reported that This skill only triggers when you logon on the map o.O [Skotlex]
if ((lv = pc->checkskill(sd,SG_KNOWLEDGE)) > 0) {
- if(sd->bl.m == sd->feel_map[0].m
- || sd->bl.m == sd->feel_map[1].m
- || sd->bl.m == sd->feel_map[2].m)
- sc_start(NULL,&sd->bl, SC_KNOWLEDGE, 100, lv, skill->get_time(SG_KNOWLEDGE, lv));
+ int i;
+ for (i = 0; i < MAX_PC_FEELHATE; i++) {
+ if (sd->bl.m == sd->feel_map[i].m) {
+ sc_start(NULL,&sd->bl, SC_KNOWLEDGE, 100, lv, skill->get_time(SG_KNOWLEDGE, lv));
+ break;
+ }
+ }
}
if(sd->pd && sd->pd->pet.intimate > 900)
@@ -9363,14 +9357,17 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) {
// NPC Quest / Event Icon Check [Kisuka]
#if PACKETVER >= 20090218
- for(i = 0; i < map->list[sd->bl.m].qi_count; i++) {
- struct questinfo *qi = &map->list[sd->bl.m].qi_data[i];
- if( quest->check(sd, qi->quest_id, HAVEQUEST) == -1 ) {// Check if quest is not started
- if( qi->hasJob ) { // Check if quest is job-specific, check is user is said job class.
- if( sd->class_ == qi->job )
+ {
+ int i;
+ for(i = 0; i < map->list[sd->bl.m].qi_count; i++) {
+ struct questinfo *qi = &map->list[sd->bl.m].qi_data[i];
+ if( quest->check(sd, qi->quest_id, HAVEQUEST) == -1 ) {// Check if quest is not started
+ if( qi->hasJob ) { // Check if quest is job-specific, check is user is said job class.
+ if( sd->class_ == qi->job )
+ clif->quest_show_event(sd, &qi->nd->bl, qi->icon, qi->color);
+ } else {
clif->quest_show_event(sd, &qi->nd->bl, qi->icon, qi->color);
- } else {
- clif->quest_show_event(sd, &qi->nd->bl, qi->icon, qi->color);
+ }
}
}
}
@@ -9679,6 +9676,7 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data* sd)
} else if ( sd->fontcolor && !sd->chatID ) {
char mout[200];
unsigned char mylen = 1;
+ uint32 color = 0;
if( sd->disguise == -1 ) {
sd->fontcolor_tid = timer->add(timer->gettick()+5000, clif->undisguise_timer, sd->bl.id, 0);
@@ -9696,11 +9694,12 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data* sd)
mylen += snprintf(mout, 200, "%s : %s",sd->fakename[0]?sd->fakename:sd->status.name,message);
+ color = channel->config->colors[sd->fontcolor - 1];
WFIFOHEAD(fd,mylen + 12);
WFIFOW(fd,0) = 0x2C1;
WFIFOW(fd,2) = mylen + 12;
WFIFOL(fd,4) = sd->bl.id;
- WFIFOL(fd,8) = channel->config->colors[sd->fontcolor - 1];
+ WFIFOL(fd,8) = RGB2BGR(color);
safestrncpy((char*)WFIFOP(fd,12), mout, mylen);
clif->send(WFIFOP(fd,0), WFIFOW(fd,2), &sd->bl, AREA_WOS);
WFIFOL(fd,4) = -sd->bl.id;
@@ -9887,7 +9886,7 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type,
return;
if(action_type != 0x00 && action_type != 0x07)
- pc_stop_walking(sd, 1);
+ pc_stop_walking(sd, STOPWALKING_FLAG_FIXPOS);
pc_stop_attack(sd);
if(target_id<0 && -target_id == sd->bl.id) // for disguises [Valaris]
@@ -10291,7 +10290,7 @@ void clif_parse_EquipItem(int fd,struct map_session_data *sd) {
if( sd->npc_id ) {
if ( !sd->npc_item_flag )
return;
- } else if ( sd->state.storage_flag || sd->sc.opt1 )
+ } else if (sd->state.storage_flag != STORAGE_FLAG_CLOSED || sd->sc.opt1)
; //You can equip/unequip stuff while storage is open/under status changes
else if ( pc_cant_act2(sd) || sd->state.prerefining )
return;
@@ -10333,7 +10332,7 @@ void clif_parse_UnequipItem(int fd,struct map_session_data *sd)
if( sd->npc_id ) {
if ( !sd->npc_item_flag )
return;
- } else if ( sd->state.storage_flag || sd->sc.opt1 )
+ } else if (sd->state.storage_flag != STORAGE_FLAG_CLOSED || sd->sc.opt1)
; //You can equip/unequip stuff while storage is open/under status changes
else if ( pc_cant_act2(sd) || sd->state.prerefining )
return;
@@ -10343,7 +10342,7 @@ void clif_parse_UnequipItem(int fd,struct map_session_data *sd)
if( battle_config.idletime_criteria & BCIDLE_USEITEM )
sd->idletime = sockt->last_tick;
- pc->unequipitem(sd,index,1);
+ pc->unequipitem(sd,index, PCUNEQUIPITEM_RECALC);
}
@@ -10571,7 +10570,7 @@ void clif_parse_KickFromChat(int fd,struct map_session_data *sd)
/// 00e3
void clif_parse_ChatLeave(int fd, struct map_session_data* sd)
{
- chat->leave(sd,0);
+ chat->leave(sd, false);
}
@@ -10926,7 +10925,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
if( pc_cant_act(sd)
&& skill_id != RK_REFRESH
&& !(skill_id == SR_GENTLETOUCH_CURE && (sd->sc.opt1 == OPT1_STONE || sd->sc.opt1 == OPT1_FREEZE || sd->sc.opt1 == OPT1_STUN))
- && ( sd->state.storage_flag && !(tmp&INF_SELF_SKILL) ) // SELF skills can be used with the storage open, issue: 8027
+ && (sd->state.storage_flag != STORAGE_FLAG_CLOSED && !(tmp&INF_SELF_SKILL)) // SELF skills can be used with the storage open, issue: 8027
)
return;
@@ -11131,7 +11130,7 @@ void clif_parse_UseSkillMap(int fd, struct map_session_data* sd)
return;
// It is possible to use teleport with the storage window open issue:8027
- if( pc_cant_act(sd) && (!sd->state.storage_flag && skill_id != AL_TELEPORT) ) {
+ if (pc_cant_act(sd) && (sd->state.storage_flag == STORAGE_FLAG_CLOSED && skill_id != AL_TELEPORT)) {
clif_menuskill_clear(sd);
return;
}
@@ -11474,9 +11473,9 @@ void clif_parse_MoveToKafra(int fd, struct map_session_data *sd)
if (item_index < 0 || item_index >= MAX_INVENTORY || item_amount < 1)
return;
- if (sd->state.storage_flag == 1)
+ if (sd->state.storage_flag == STORAGE_FLAG_NORMAL)
storage->add(sd, item_index, item_amount);
- else if (sd->state.storage_flag == 2)
+ else if (sd->state.storage_flag == STORAGE_FLAG_GUILD)
gstorage->add(sd, item_index, item_amount);
}
@@ -11492,9 +11491,9 @@ void clif_parse_MoveFromKafra(int fd,struct map_session_data *sd)
item_index = RFIFOW(fd,packet_db[RFIFOW(fd,0)].pos[0])-1;
item_amount = RFIFOL(fd,packet_db[RFIFOW(fd,0)].pos[1]);
- if (sd->state.storage_flag == 1)
+ if (sd->state.storage_flag == STORAGE_FLAG_NORMAL)
storage->get(sd, item_index, item_amount);
- else if(sd->state.storage_flag == 2)
+ else if(sd->state.storage_flag == STORAGE_FLAG_GUILD)
gstorage->get(sd, item_index, item_amount);
}
@@ -11508,9 +11507,9 @@ void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd)
if (!pc_iscarton(sd))
return;
- if (sd->state.storage_flag == 1)
+ if (sd->state.storage_flag == STORAGE_FLAG_NORMAL)
storage->addfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4));
- else if (sd->state.storage_flag == 2)
+ else if (sd->state.storage_flag == STORAGE_FLAG_GUILD)
gstorage->addfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4));
}
@@ -11524,9 +11523,9 @@ void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd)
if (!pc_iscarton(sd))
return;
- if (sd->state.storage_flag == 1)
+ if (sd->state.storage_flag == STORAGE_FLAG_NORMAL)
storage->gettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4));
- else if (sd->state.storage_flag == 2)
+ else if (sd->state.storage_flag == STORAGE_FLAG_GUILD)
gstorage->gettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4));
}
@@ -11535,9 +11534,9 @@ void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd)
/// 00f7
void clif_parse_CloseKafra(int fd, struct map_session_data *sd)
{
- if( sd->state.storage_flag == 1 )
+ if( sd->state.storage_flag == STORAGE_FLAG_NORMAL )
storage->close(sd);
- else if( sd->state.storage_flag == 2 )
+ else if( sd->state.storage_flag == STORAGE_FLAG_GUILD )
gstorage->close(sd);
}
@@ -14188,7 +14187,7 @@ void clif_parse_AutoRevive(int fd, struct map_session_data *sd) {
if (item_position == INDEX_NOT_FOUND)
status_change_end(&sd->bl,SC_LIGHT_OF_REGENE,INVALID_TIMER);
else
- pc->delitem(sd, item_position, 1, 0, 1, LOG_TYPE_CONSUME);
+ pc->delitem(sd, item_position, 1, 0, DELITEM_SKILLUSE, LOG_TYPE_CONSUME);
clif->skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
}
@@ -14718,7 +14717,7 @@ void clif_Auction_openwindow(struct map_session_data *sd)
{
int fd = sd->fd;
- if( sd->state.storage_flag || sd->state.vending || sd->state.buyingstore || sd->state.trading )
+ if (sd->state.storage_flag != STORAGE_FLAG_CLOSED || sd->state.vending || sd->state.buyingstore || sd->state.trading)
return;
if( !battle_config.feature_auction )
@@ -14964,7 +14963,7 @@ void clif_parse_Auction_register(int fd, struct map_session_data *sd)
{
int zeny = auction.hours*battle_config.auction_feeperhour;
- pc->delitem(sd, sd->auction.index, sd->auction.amount, 1, 6, LOG_TYPE_AUCTION);
+ pc->delitem(sd, sd->auction.index, sd->auction.amount, 1, DELITEM_SOLD, LOG_TYPE_AUCTION);
sd->auction.amount = 0;
pc->payzeny(sd, zeny, LOG_TYPE_AUCTION, NULL);
@@ -15678,8 +15677,13 @@ void clif_mercenary_skillblock(struct map_session_data *sd)
WFIFOW(fd,len) = id;
WFIFOL(fd,len+2) = skill->get_inf(id);
WFIFOW(fd,len+6) = md->db->skill[j].lv;
- WFIFOW(fd,len+8) = skill->get_sp(id, md->db->skill[j].lv);
- WFIFOW(fd,len+10) = skill->get_range2(&md->bl, id, md->db->skill[j].lv);
+ if ( md->db->skill[j].lv ) {
+ WFIFOW(fd, len + 8) = skill->get_sp(id, md->db->skill[j].lv);
+ WFIFOW(fd, len + 10) = skill->get_range2(&md->bl, id, md->db->skill[j].lv);
+ } else {
+ WFIFOW(fd, len + 8) = 0;
+ WFIFOW(fd, len + 10) = 0;
+ }
safestrncpy((char*)WFIFOP(fd,len+12), skill->get_name(id), NAME_LENGTH);
WFIFOB(fd,len+36) = 0; // Skillable for Mercenary?
len += 37;
@@ -17119,8 +17123,8 @@ void __attribute__ ((unused)) clif_parse_dull(int fd,struct map_session_data *sd
}
void clif_parse_CashShopOpen(int fd, struct map_session_data *sd) {
- if( map->list[sd->bl.m].flag.nocashshop ) {
- clif->colormes(fd,COLOR_RED,msg_fd(fd,1489)); //Cash Shop is disabled in this map
+ if (map->list[sd->bl.m].flag.nocashshop) {
+ clif->messagecolor_self(fd, COLOR_RED, msg_fd(fd,1489)); //Cash Shop is disabled in this map
return;
}
@@ -17160,8 +17164,8 @@ void clif_parse_CashShopBuy(int fd, struct map_session_data *sd) {
unsigned short limit = RFIFOW(fd, 4), i, j;
unsigned int kafra_pay = RFIFOL(fd, 6);// [Ryuuzaki] - These are free cash points (strangely #CASH = main cash currently for us, confusing)
- if( map->list[sd->bl.m].flag.nocashshop ) {
- clif->colormes(fd,COLOR_RED,msg_fd(fd,1489)); //Cash Shop is disabled in this map
+ if (map->list[sd->bl.m].flag.nocashshop) {
+ clif->messagecolor_self(fd, COLOR_RED, msg_fd(fd,1489)); //Cash Shop is disabled in this map
return;
}
@@ -17562,8 +17566,8 @@ void clif_parse_BankDeposit(int fd, struct map_session_data* sd) {
struct packet_banking_deposit_req *p = P2PTR(fd);
int money;
- if( !battle_config.feature_banking ) {
- clif->colormes(fd,COLOR_RED,msg_fd(fd,1483));
+ if (!battle_config.feature_banking) {
+ clif->messagecolor_self(fd, COLOR_RED, msg_fd(fd,1483));
return;
}
@@ -17576,8 +17580,8 @@ void clif_parse_BankWithdraw(int fd, struct map_session_data* sd) {
struct packet_banking_withdraw_req *p = P2PTR(fd);
int money;
- if( !battle_config.feature_banking ) {
- clif->colormes(fd,COLOR_RED,msg_fd(fd,1483));
+ if (!battle_config.feature_banking) {
+ clif->messagecolor_self(fd, COLOR_RED, msg_fd(fd,1483));
return;
}
@@ -17589,8 +17593,8 @@ void clif_parse_BankWithdraw(int fd, struct map_session_data* sd) {
void clif_parse_BankCheck(int fd, struct map_session_data* sd) {
struct packet_banking_check p;
- if( !battle_config.feature_banking ) {
- clif->colormes(fd,COLOR_RED,msg_fd(fd,1483));
+ if (!battle_config.feature_banking) {
+ clif->messagecolor_self(fd, COLOR_RED, msg_fd(fd,1483));
return;
}
@@ -17665,7 +17669,7 @@ void clif_parse_GMFullStrip(int fd, struct map_session_data *sd) {
for( i = 0; i < EQI_MAX; i++ ) {
if( tsd->equip_index[ i ] >= 0 )
- pc->unequipitem( tsd , tsd->equip_index[ i ] , 2 );
+ pc->unequipitem(tsd, tsd->equip_index[i], PCUNEQUIPITEM_FORCE);
}
}
/**
@@ -18370,21 +18374,11 @@ void clif_bc_ready(void) {
/*==========================================
*
*------------------------------------------*/
-int do_init_clif(bool minimal) {
- const char* colors[COLOR_MAX] = { "0xFF0000", "0x00ff00", "0xffffff" };
- int i;
-
+int do_init_clif(bool minimal)
+{
if (minimal)
return 0;
- /**
- * Setup Color Table (saves unnecessary load of strtoul on every call)
- **/
- for(i = 0; i < COLOR_MAX; i++) {
- color_table[i] = (unsigned int)strtoul(colors[i],NULL,0);
- color_table[i] = (color_table[i] & 0x0000FF) << 16 | (color_table[i] & 0x00FF00) | (color_table[i] & 0xFF0000) >> 16;//RGB to BGR
- }
-
packetdb_loaddb();
set_defaultparse(clif->parse);
@@ -18679,6 +18673,7 @@ void clif_defaults(void) {
clif->disp_message = clif_disp_message;
clif->broadcast = clif_broadcast;
clif->broadcast2 = clif_broadcast2;
+ clif->messagecolor_self = clif_messagecolor_self;
clif->messagecolor = clif_messagecolor;
clif->disp_overhead = clif_disp_overhead;
clif->msgtable_skill = clif_msgtable_skill;
@@ -18687,7 +18682,6 @@ void clif_defaults(void) {
clif->message = clif_displaymessage;
clif->messageln = clif_displaymessage2;
clif->messages = clif_displaymessage_sprintf;
- clif->colormes = clif_colormes;
clif->process_message = clif_process_message;
clif->wisexin = clif_wisexin;
clif->wisall = clif_wisall;
diff --git a/src/map/clif.h b/src/map/clif.h
index 4426be974..f4402bdf7 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -49,6 +49,12 @@ struct channel_data;
#define clif_disp_onlyself(sd,mes,len) clif->disp_message( &(sd)->bl, (mes), (len), SELF )
#define MAX_ROULETTE_LEVEL 7 /** client-defined value **/
#define MAX_ROULETTE_COLUMNS 9 /** client-defined value **/
+#define RGB2BGR(c) ((c & 0x0000FF) << 16 | (c & 0x00FF00) | (c & 0xFF0000) >> 16)
+
+#define COLOR_RED 0xff0000U
+#define COLOR_GREEN 0x00ff00U
+#define COLOR_WHITE 0xffffffU
+#define COLOR_DEFAULT COLOR_GREEN
/**
* Enumerations
@@ -385,16 +391,6 @@ enum cashshop_error {
ERROR_TYPE_NOT_ALL = 8, ///< Some items could not be purchased. (ERROR_TYPE_NOT_ALL)
};
-/**
- * Color Table
- **/
-enum clif_colors {
- COLOR_RED,
- COLOR_DEFAULT,
- COLOR_WHITE,
- COLOR_MAX
-};
-
enum CASH_SHOP_TABS {
CASHSHOP_TAB_NEW = 0,
CASHSHOP_TAB_POPULAR = 1,
@@ -515,6 +511,20 @@ enum CLOSE_ROULETTE_ACK {
};
/**
+ * Reason for item deletion (clif->delitem)
+ */
+enum delitem_reason {
+ DELITEM_NORMAL = 0, /// Normal
+ DELITEM_SKILLUSE = 1, /// Item used for a skill
+ DELITEM_FAILREFINE = 2, /// Refine failed
+ DELITEM_MATERIALCHANGE = 3, /// Material changed
+ DELITEM_TOSTORAGE = 4, /// Moved to storage
+ DELITEM_TOCART = 5, /// Moved to cart
+ DELITEM_SOLD = 6, /// Item sold
+ DELITEM_ANALYSIS = 7, /// Consumed by Four Spirit Analysis (SO_EL_ANALYSIS) skill
+};
+
+/**
* Structures
**/
typedef void (*pFunc)(int, struct map_session_data *); //cant help but put it first
@@ -538,7 +548,6 @@ struct cdelayed_damage {
* Vars
**/
struct s_packet_db packet_db[MAX_PACKET_DB + 1];
-unsigned int color_table[COLOR_MAX];
/**
* Clif.c Interface
@@ -816,7 +825,8 @@ struct clif_interface {
void (*disp_message) (struct block_list* src, const char* mes, size_t len, enum send_target target);
void (*broadcast) (struct block_list* bl, const char* mes, size_t len, int type, enum send_target target);
void (*broadcast2) (struct block_list* bl, const char* mes, size_t len, unsigned int fontColor, short fontType, short fontSize, short fontAlign, short fontY, enum send_target target);
- void (*messagecolor) (struct block_list* bl, unsigned int color, const char* msg);
+ void (*messagecolor_self) (int fd, uint32 color, const char *msg);
+ void (*messagecolor) (struct block_list* bl, uint32 color, const char* msg);
void (*disp_overhead) (struct block_list *bl, const char* mes);
void (*msgtable) (struct map_session_data* sd, unsigned short msg_id);
void (*msgtable_num) (struct map_session_data *sd, unsigned short msg_id, int value);
@@ -825,7 +835,6 @@ struct clif_interface {
void (*messageln) (const int fd, const char* mes);
/* message+s(printf) */
void (*messages) (const int fd, const char *mes, ...) __attribute__((format(printf, 2, 3)));
- int (*colormes) (int fd, enum clif_colors color, const char* msg);
bool (*process_message) (struct map_session_data *sd, int format, char **name_, size_t *namelen_, char **message_, size_t *messagelen_);
void (*wisexin) (struct map_session_data *sd,int type,int flag);
void (*wisall) (struct map_session_data *sd,int type,int flag);
diff --git a/src/map/elemental.c b/src/map/elemental.c
index dd97e1970..92915d168 100644
--- a/src/map/elemental.c
+++ b/src/map/elemental.c
@@ -560,7 +560,7 @@ int elemental_unlocktarget(struct elemental_data *ed) {
ed->target_id = 0;
elemental_stop_attack(ed);
- elemental_stop_walking(ed,1);
+ elemental_stop_walking(ed, STOPWALKING_FLAG_FIXPOS);
return 0;
}
diff --git a/src/map/guild.c b/src/map/guild.c
index 936b4c900..b9c0c8267 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -343,14 +343,12 @@ int guild_create(struct map_session_data *sd, const char *name)
if( !tname[0] )
return 0; // empty name
- if( sd->status.guild_id )
- {// already in a guild
- clif->guild_created(sd,1);
+ if( sd->status.guild_id ) {
+ clif->guild_created(sd,1); // You're already in a guild
return 0;
}
if (battle_config.guild_emperium_check && pc->search_inventory(sd, ITEMID_EMPERIUM) == INDEX_NOT_FOUND) {
- // item required
- clif->guild_created(sd,3);
+ clif->guild_created(sd,3); // You need the necessary item to create a guild
return 0;
}
@@ -367,14 +365,14 @@ int guild_created(int account_id,int guild_id) {
if(sd==NULL)
return 0;
if(!guild_id) {
- clif->guild_created(sd, 2); // Creation failure (presence of the same name Guild)
+ clif->guild_created(sd, 2); // Creation failure (The guild name already exists)
return 0;
}
//struct guild *g;
sd->status.guild_id=guild_id;
- clif->guild_created(sd,0);
+ clif->guild_created(sd,0); // Success
if(battle_config.guild_emperium_check)
- pc->delitem(sd,pc->search_inventory(sd,ITEMID_EMPERIUM),1,0,0,LOG_TYPE_CONSUME); //emperium consumption
+ pc->delitem(sd, pc->search_inventory(sd, ITEMID_EMPERIUM), 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME); //emperium consumption
return 0;
}
@@ -615,7 +613,7 @@ int guild_invite(struct map_session_data *sd, struct map_session_data *tsd) {
if(tsd==NULL || g==NULL)
return 0;
- if( (i=guild->getposition(g,sd))<0 || !(g->position[i].mode&0x0001) )
+ if( (i=guild->getposition(g,sd)) < 0 || !(g->position[i].mode&GPERM_INVITE) )
return 0; //Invite permission.
if(!battle_config.invite_request_check) {
@@ -840,7 +838,7 @@ int guild_expulsion(struct map_session_data* sd, int guild_id, int account_id, i
if(sd->status.guild_id!=guild_id)
return 0;
- if( (ps=guild->getposition(g,sd))<0 || !(g->position[ps].mode&0x0010) )
+ if ((ps=guild->getposition(g,sd))<0 || !(g->position[ps].mode&GPERM_EXPEL))
return 0; //Expulsion permission
//Can't leave inside guild castles.
@@ -895,7 +893,7 @@ int guild_member_withdraw(int guild_id, int account_id, int char_id, int flag, c
// update char, if online
if(sd != NULL && sd->status.guild_id == guild_id) {
// do stuff that needs the guild_id first, BEFORE we wipe it
- if (sd->state.storage_flag == 2) //Close the guild storage.
+ if (sd->state.storage_flag == STORAGE_FLAG_GUILD) //Close the guild storage.
gstorage->close(sd);
guild->send_dot_remove(sd);
if (channel->config->ally) {
@@ -926,7 +924,7 @@ void guild_retrieveitembound(int char_id,int aid,int guild_id) {
if(gstor && gstor->storage_status == 1) { //Someone is in guild storage, close them
struct s_mapiterator* iter = mapit_getallusers();
for( sd = (TBL_PC*)mapit->first(iter); mapit->exists(iter); sd = (TBL_PC*)mapit->next(iter) ) {
- if(sd->status.guild_id == guild_id && sd->state.storage_flag == 2) {
+ if(sd->status.guild_id == guild_id && sd->state.storage_flag == STORAGE_FLAG_GUILD) {
gstorage->close(sd);
break;
}
@@ -1095,9 +1093,7 @@ int guild_change_position(int guild_id,int idx,int mode,int exp_mode,const char
struct guild_position p;
exp_mode = cap_value(exp_mode, 0, battle_config.guild_exp_limit);
- //Mode 0x01 <- Invite
- //Mode 0x10 <- Expel.
- p.mode=mode&0x11;
+ p.mode=mode&GPERM_BOTH; // Invite and Expel
p.exp_mode=exp_mode;
safestrncpy(p.name,name,NAME_LENGTH);
return intif->guild_position(guild_id,idx,&p);
@@ -1750,7 +1746,7 @@ int guild_broken(int guild_id,int flag)
for(i=0;i<g->max_member;i++){
// Destroy all relationships
if((sd=g->member[i].sd)!=NULL){
- if(sd->state.storage_flag == 2)
+ if(sd->state.storage_flag == STORAGE_FLAG_GUILD)
gstorage->pc_quit(sd,1);
sd->status.guild_id=0;
sd->guild = NULL;
@@ -1910,7 +1906,7 @@ int guild_break(struct map_session_data *sd,char *name) {
}
}
- for(i = 0; i < count; i++) {
+ for(i = 0; i < count; i++) { // FIXME: Why is this not done in the above loop?
skill->del_unitgroup(groups[i],ALC_MARK);
}
}
diff --git a/src/map/homunculus.c b/src/map/homunculus.c
index 6bbe1eb20..ee88bf3dc 100644
--- a/src/map/homunculus.c
+++ b/src/map/homunculus.c
@@ -584,7 +584,7 @@ bool homunculus_feed(struct map_session_data *sd, struct homun_data *hd) {
clif->hom_food(sd,foodID,0);
return false;
}
- pc->delitem(sd,i,1,0,0,LOG_TYPE_CONSUME);
+ pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME);
if ( hd->homunculus.hunger >= 91 ) {
homun->consume_intimacy(hd, 50);
diff --git a/src/map/irc-bot.c b/src/map/irc-bot.c
index d492ad9ca..f7e693191 100644
--- a/src/map/irc-bot.c
+++ b/src/map/irc-bot.c
@@ -1,6 +1,6 @@
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
-// Base Author: shennetsind @ http://hercules.ws
+// Base Author: shennetsind @ http://herc.ws
#define HERCULES_CORE
diff --git a/src/map/irc-bot.h b/src/map/irc-bot.h
index 8dcfea5bd..acd014e71 100644
--- a/src/map/irc-bot.h
+++ b/src/map/irc-bot.h
@@ -1,6 +1,6 @@
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
-// Base Author: shennetsind @ http://hercules.ws
+// Base Author: shennetsind @ http://herc.ws
#ifndef MAP_IRC_BOT_H
diff --git a/src/map/mail.c b/src/map/mail.c
index 7ba7d7470..d7ce9c830 100644
--- a/src/map/mail.c
+++ b/src/map/mail.c
@@ -14,6 +14,7 @@
#include "itemdb.h"
#include "log.h"
#include "pc.h"
+#include "storage.h"
#include "../common/nullpo.h"
#include "../common/showmsg.h"
@@ -36,7 +37,7 @@ int mail_removeitem(struct map_session_data *sd, short flag)
if( sd->mail.amount )
{
if (flag) // Item send
- pc->delitem(sd, sd->mail.index, sd->mail.amount, 1, 0, LOG_TYPE_MAIL);
+ pc->delitem(sd, sd->mail.index, sd->mail.amount, 1, DELITEM_NORMAL, LOG_TYPE_MAIL);
else
clif->additem(sd, sd->mail.index, sd->mail.amount, 0);
}
@@ -151,7 +152,7 @@ int mail_openmail(struct map_session_data *sd)
{
nullpo_ret(sd);
- if( sd->state.storage_flag || sd->state.vending || sd->state.buyingstore || sd->state.trading )
+ if (sd->state.storage_flag != STORAGE_FLAG_CLOSED || sd->state.vending || sd->state.buyingstore || sd->state.trading)
return 0;
clif->mail_window(sd->fd, 0);
diff --git a/src/map/map.c b/src/map/map.c
index a407722bb..f8c9e7c01 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -1844,13 +1844,13 @@ int map_quit(struct map_session_data *sd) {
for( i = 0; i < EQI_MAX; i++ ) {
if( sd->equip_index[ i ] >= 0 )
if( !pc->isequip( sd , sd->equip_index[ i ] ) )
- pc->unequipitem( sd , sd->equip_index[ i ] , 2 );
+ pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_FORCE);
}
// Return loot to owner
if( sd->pd ) pet->lootitem_drop(sd->pd, sd);
- if( sd->state.storage_flag == 1 ) sd->state.storage_flag = 0; // No need to Double Save Storage on Quit.
+ if( sd->state.storage_flag == STORAGE_FLAG_NORMAL ) sd->state.storage_flag = STORAGE_FLAG_CLOSED; // No need to Double Save Storage on Quit.
if( sd->ed ) {
elemental->clean_effect(sd->ed);
diff --git a/src/map/map.h b/src/map/map.h
index 63d2d381f..ab2274d78 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -65,16 +65,6 @@ enum MOBID {
MOBID_MAGICDECOY_WIND = 2046,
};
-// The following system marks a different job ID system used by the map server,
-// which makes a lot more sense than the normal one. [Skotlex]
-// These marks the "level" of the job.
-#define JOBL_2_1 0x100 //256
-#define JOBL_2_2 0x200 //512
-#define JOBL_2 0x300
-#define JOBL_UPPER 0x1000 //4096
-#define JOBL_BABY 0x2000 //8192
-#define JOBL_THIRD 0x4000 //16384
-
// For filtering and quick checking.
#define MAPID_BASEMASK 0x00ff
#define MAPID_UPPERMASK 0x0fff
@@ -266,10 +256,15 @@ enum {
RC_DEMIHUMAN,
RC_ANGEL,
RC_DRAGON,
+ RC_PLAYER,
RC_BOSS,
RC_NONBOSS,
+ RC_MAX,
RC_NONDEMIHUMAN,
- RC_MAX
+ RC_NONPLAYER,
+ RC_DEMIPLAYER,
+ RC_NONDEMIPLAYER,
+ RC_ALL = 0xFF
};
enum {
@@ -296,7 +291,8 @@ enum elements {
ELE_DARK,
ELE_GHOST,
ELE_UNDEAD,
- ELE_MAX
+ ELE_MAX,
+ ELE_ALL = 0xFF
};
/**
diff --git a/src/map/mob.c b/src/map/mob.c
index 8a8e96508..d3aec6e46 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -378,14 +378,14 @@ bool mob_ksprotected(struct block_list *src, struct block_list *target) {
break; // No KS Protected
if( sd->bl.id == sce->val1 || // Same Owner
- (sce->val2 == 2 && sd->status.party_id && sd->status.party_id == sce->val3) || // Party KS allowed
- (sce->val2 == 3 && sd->status.guild_id && sd->status.guild_id == sce->val4) ) // Guild KS allowed
+ (sce->val2 == KSPROTECT_PARTY && sd->status.party_id && sd->status.party_id == sce->val3) || // Party KS allowed
+ (sce->val2 == KSPROTECT_GUILD && sd->status.guild_id && sd->status.guild_id == sce->val4) ) // Guild KS allowed
break;
if( t_sd && (
- (sce->val2 == 1 && sce->val1 != t_sd->bl.id) ||
- (sce->val2 == 2 && sce->val3 && sce->val3 != t_sd->status.party_id) ||
- (sce->val2 == 3 && sce->val4 && sce->val4 != t_sd->status.guild_id)) )
+ (sce->val2 == KSPROTECT_SELF && sce->val1 != t_sd->bl.id) ||
+ (sce->val2 == KSPROTECT_PARTY && sce->val3 && sce->val3 != t_sd->status.party_id) ||
+ (sce->val2 == KSPROTECT_GUILD && sce->val4 && sce->val4 != t_sd->status.guild_id)) )
break;
if( (pl_sd = map->id2sd(sce->val1)) == NULL || pl_sd->bl.m != md->bl.m )
@@ -1298,7 +1298,7 @@ int mob_unlocktarget(struct mob_data *md, int64 tick) {
break;
default:
mob_stop_attack(md);
- mob_stop_walking(md,1); //Stop chasing.
+ mob_stop_walking(md, STOPWALKING_FLAG_FIXPOS); //Stop chasing.
md->state.skillstate = MSS_IDLE;
if(battle_config.mob_ai&0x8) //Walk instantly after dropping target
md->next_walktime = tick+rnd()%1000;
@@ -1975,7 +1975,7 @@ void mob_log_damage(struct mob_data *md, struct block_list *src, int damage)
case BL_MOB:
{
struct mob_data* md2 = (TBL_MOB*)src;
- if( md2->special_state.ai && md2->master_id ) {
+ if (md2->special_state.ai != AI_NONE && md2->master_id) {
struct map_session_data* msd = map->id2sd(md2->master_id);
if( msd )
char_id = msd->status.char_id;
@@ -2170,7 +2170,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) {
if( !(type&2) //No exp
&& (!map->list[m].flag.pvp || battle_config.pvp_exp) //Pvp no exp rule [MouseJstr]
- && (!md->master_id || !md->special_state.ai) //Only player-summoned mobs do not give exp. [Skotlex]
+ && (!md->master_id || md->special_state.ai == AI_NONE) //Only player-summoned mobs do not give exp. [Skotlex]
&& (!map->list[m].flag.nobaseexp || !map->list[m].flag.nojobexp) //Gives Exp
) { //Experience calculation.
int bonus = 100; //Bonus on top of your share (common to all attackers).
@@ -2298,9 +2298,9 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) {
} //End EXP giving.
if( !(type&1) && !map->list[m].flag.nomobloot && !md->state.rebirth && (
- !md->special_state.ai || //Non special mob
+ md->special_state.ai == AI_NONE || //Non special mob
battle_config.alchemist_summon_reward == 2 || //All summoned give drops
- (md->special_state.ai==2 && battle_config.alchemist_summon_reward == 1) //Marine Sphere Drops items.
+ (md->special_state.ai == AI_SPHERE && battle_config.alchemist_summon_reward == 1) //Marine Sphere Drops items.
) )
{ // Item Drop
struct item_drop_list *dlist = ers_alloc(item_drop_list_ers, struct item_drop_list);
@@ -2473,7 +2473,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type) {
timer->add(tick + (!battle_config.delay_battle_damage?500:0), mob->delay_item_drop, 0, (intptr_t)dlist);
}
- if(mvp_sd && md->db->mexp > 0 && !md->special_state.ai) {
+ if(mvp_sd && md->db->mexp > 0 && md->special_state.ai == AI_NONE) {
int log_mvp[2] = {0};
unsigned int mexp;
double exp;
@@ -2746,7 +2746,7 @@ int mob_class_change (struct mob_data *md, int class_)
if( mob_is_treasure(md) )
return 0; //Treasure Boxes
- if( md->special_state.ai > 1 )
+ if( md->special_state.ai > AI_ATTACK )
return 0; //Marine Spheres and Floras.
if( mob->is_clone(md->class_) )
@@ -2764,7 +2764,7 @@ int mob_class_change (struct mob_data *md, int class_)
memcpy(md->name,md->db->jname,NAME_LENGTH);
mob_stop_attack(md);
- mob_stop_walking(md, 0);
+ mob_stop_walking(md, STOPWALKING_FLAG_NONE);
unit->skillcastcancel(&md->bl, 0);
status->set_viewdata(&md->bl, class_);
clif->class_change(&md->bl, md->vd->class_, 1);
@@ -3016,7 +3016,7 @@ struct block_list *mob_getfriendhprate(struct mob_data *md,int min_rate,int max_
nullpo_retr(NULL, md);
- if (md->special_state.ai) //Summoned creatures. [Skotlex]
+ if (md->special_state.ai != AI_NONE) //Summoned creatures. [Skotlex]
type = BL_PC;
map->foreachinrange(mob->getfriendhprate_sub, &md->bl, 8, type,md,min_rate,max_rate,&fr);
@@ -3302,7 +3302,7 @@ int mobskill_event(struct mob_data *md, struct block_list *src, int64 tick, int
if(md->bl.prev == NULL || md->status.hp <= 0)
return 0;
- if( md->special_state.ai == 2 ) {//LOne WOlf explained that ANYONE can trigger the marine countdown skill. [Skotlex]
+ if (md->special_state.ai == AI_SPHERE) {//LOne WOlf explained that ANYONE can trigger the marine countdown skill. [Skotlex]
md->state.alchemist = 1;
return mob->skill_use(md, timer->gettick(), MSC_ALCHEMIST);
}
diff --git a/src/map/mob.h b/src/map/mob.h
index 02ae1630a..0a5844f39 100644
--- a/src/map/mob.h
+++ b/src/map/mob.h
@@ -38,7 +38,7 @@
#define MOB_CLONE_END MAX_MOB_DB
//Used to determine default enemy type of mobs (for use in each in range calls)
-#define DEFAULT_ENEMY_TYPE(md) ((md)->special_state.ai?BL_CHAR:BL_MOB|BL_PC|BL_HOM|BL_MER)
+#define DEFAULT_ENEMY_TYPE(md) ((md)->special_state.ai != AI_NONE ?BL_CHAR:BL_MOB|BL_PC|BL_HOM|BL_MER)
#define MAX_MOB_CHAT 250 //Max Skill's messages
@@ -79,11 +79,23 @@ enum size {
};
enum ai {
- AI_NONE = 0,
- AI_ATTACK,
- AI_SPHERE,
- AI_FLORA,
- AI_ZANZOU,
+ AI_NONE = 0, //0: Normal mob.
+ AI_ATTACK, //1: Standard summon, attacks mobs.
+ AI_SPHERE, //2: Alchemist Marine Sphere
+ AI_FLORA, //3: Alchemist Summon Flora
+ AI_ZANZOU, //4: Summon Zanzou
+
+ AI_MAX
+};
+
+/**
+ * Acceptable values for map_session_data.state.noks
+ */
+enum ksprotection_mode {
+ KSPROTECT_NONE = 0,
+ KSPROTECT_SELF = 1,
+ KSPROTECT_PARTY = 2,
+ KSPROTECT_GUILD = 3,
};
struct mob_skill {
@@ -141,13 +153,8 @@ struct mob_data {
struct mob_db *db; //For quick data access (saves doing mob_db(md->class_) all the time) [Skotlex]
char name[NAME_LENGTH];
struct {
- unsigned int size : 2; //Small/Big monsters.
- unsigned int ai : 4; //Special AI for summoned monsters.
- //0: Normal mob.
- //1: Standard summon, attacks mobs.
- //2: Alchemist Marine Sphere
- //3: Alchemist Summon Flora
- //4: Summon Zanzou
+ unsigned int size : 2; //Small/Big monsters. @see enum size
+ unsigned int ai : 4; //Special AI for summoned monsters. @see enum ai
unsigned int clone : 1;/* is clone? 1:0 */
} special_state; //Special mob information that does not needs to be zero'ed on mob respawn.
struct {
diff --git a/src/map/npc.c b/src/map/npc.c
index e60a655f0..ef56c7872 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -203,7 +203,7 @@ int npc_enable_sub(struct block_list *bl, va_list ap)
if (sd->npc_id != 0)
return 0;
- pc_stop_walking(sd,1);
+ pc_stop_walking(sd, STOPWALKING_FLAG_FIXPOS);
npc->click(sd,nd);
}
}
@@ -1583,8 +1583,8 @@ bool npc_trader_open(struct map_session_data *sd, struct npc_data *nd) {
}
/* nothing to display, no items available */
- if( i == nd->u.scr.shop->items ) {
- clif->colormes(sd->fd,COLOR_RED, msg_sd(sd,881));
+ if (i == nd->u.scr.shop->items) {
+ clif->messagecolor_self(sd->fd, COLOR_RED, msg_sd(sd,881));
return false;
}
@@ -2145,7 +2145,7 @@ int npc_selllist(struct map_session_data* sd, int n, unsigned short* item_list)
}
}
- pc->delitem(sd, idx, amount, 0, 6, LOG_TYPE_NPC);
+ pc->delitem(sd, idx, amount, 0, DELITEM_SOLD, LOG_TYPE_NPC);
}
if( z > MAX_ZENY )
@@ -3555,7 +3555,7 @@ const char* npc_parse_mob(char* w1, char* w2, char* w3, char* w4, const char* st
return strchr(start, '\n');
}
- if (mobspawn.state.ai > 4 && ai != -1) {
+ if (mobspawn.state.ai >= AI_MAX && ai != -1) {
ShowError("npc_parse_mob: Invalid ai %d for mob ID %d in file '%s', line '%d'.\n", mobspawn.state.ai, class_, filepath, strline(buffer, start - buffer));
if (retval) *retval = EXIT_FAILURE;
return strchr(start, '\n');
@@ -3578,7 +3578,7 @@ const char* npc_parse_mob(char* w1, char* w2, char* w3, char* w4, const char* st
mobspawn.level = mob_lv;
if (size > 0 && size <= 2)
mobspawn.state.size = size;
- if (ai > 0 && ai <= 4)
+ if (ai > AI_NONE && ai < AI_MAX)
mobspawn.state.ai = ai;
if (mobspawn.num > 1 && battle_config.mob_count_rate != 100) {
diff --git a/src/map/packets.h b/src/map/packets.h
index db332c033..53278f66e 100644
--- a/src/map/packets.h
+++ b/src/map/packets.h
@@ -2885,7 +2885,7 @@ packet(0x020d,-1);
packet(0x0a2e,6,clif->pDull); //TITLE
#endif
-/* PacketKeys: http://hercules.ws/board/topic/1105-hercules-wpe-free-june-14th-patch/ */
+/* PacketKeys: http://herc.ws/board/topic/1105-hercules-wpe-free-june-14th-patch/ */
#if PACKETVER >= 20110817
packetKeys(0x053D5CED,0x3DED6DED,0x6DED6DED); /* Thanks to Shakto */
#endif
diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h
index 71471e5c6..47e566662 100644
--- a/src/map/packets_struct.h
+++ b/src/map/packets_struct.h
@@ -1,7 +1,7 @@
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
-/* Hercules Renewal: Phase Two http://hercules.ws/board/topic/383-hercules-renewal-phase-two/ */
+/* Hercules Renewal: Phase Two http://herc.ws/board/topic/383-hercules-renewal-phase-two/ */
#ifndef MAP_PACKETS_STRUCT_H
#define MAP_PACKETS_STRUCT_H
diff --git a/src/map/party.c b/src/map/party.c
index fb738a12b..ccb522809 100644
--- a/src/map/party.c
+++ b/src/map/party.c
@@ -640,7 +640,7 @@ int party_optionchanged(int party_id,int account_id,int exp,int item,int flag) {
if( (p=party->search(party_id))==NULL)
return 0;
- //Flag&1: Exp change denied. Flag&2: Item change denied.
+ //Flag&0x1: Exp change denied. Flag&0x10: Item change denied.
if(!(flag&0x01) && p->party.exp != exp)
p->party.exp=exp;
if(!(flag&0x10) && p->party.item != item) {
diff --git a/src/map/pc.c b/src/map/pc.c
index 5fc6469f3..ce4f31f25 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -174,6 +174,28 @@ int pc_spiritball_timer(int tid, int64 tick, int id, intptr_t data) {
return 0;
}
+/**
+* Get the possible number of spiritball that a player can call.
+* @param sd the affected player structure
+* @param min the minimum number of spiritball regardless the level of MO_CALLSPIRITS
+* @retval total number of spiritball
+**/
+int pc_getmaxspiritball(struct map_session_data *sd, int min) {
+ int result;
+
+ nullpo_ret(sd);
+
+ result = pc->checkskill(sd, MO_CALLSPIRITS);
+
+ if ( min && result < min )
+ result = min;
+ else if ( sd->sc.data[SC_RAISINGDRAGON] )
+ result += sd->sc.data[SC_RAISINGDRAGON]->val1;
+ if ( result > MAX_SPIRITBALL )
+ result = MAX_SPIRITBALL;
+ return result;
+}
+
int pc_addspiritball(struct map_session_data *sd,int interval,int max)
{
int tid, i;
@@ -495,7 +517,7 @@ void pc_rental_expire(struct map_session_data *sd, int i) {
}
clif->rental_expired(sd->fd, i, sd->status.inventory[i].nameid);
- pc->delitem(sd, i, sd->status.inventory[i].amount, 0, 0, LOG_TYPE_OTHER);
+ pc->delitem(sd, i, sd->status.inventory[i].amount, 0, DELITEM_NORMAL, LOG_TYPE_OTHER);
}
void pc_inventory_rentals(struct map_session_data *sd)
{
@@ -861,12 +883,12 @@ bool pc_adoption(struct map_session_data *p1_sd, struct map_session_data *p2_sd,
clif->updatestatus(b_sd, SP_JOBEXP);
// Baby Skills
- pc->skill(b_sd, WE_BABY, 1, 0);
- pc->skill(b_sd, WE_CALLPARENT, 1, 0);
+ pc->skill(b_sd, WE_BABY, 1, SKILL_GRANT_PERMANENT);
+ pc->skill(b_sd, WE_CALLPARENT, 1, SKILL_GRANT_PERMANENT);
// Parents Skills
- pc->skill(p1_sd, WE_CALLBABY, 1, 0);
- pc->skill(p2_sd, WE_CALLBABY, 1, 0);
+ pc->skill(p1_sd, WE_CALLBABY, 1, SKILL_GRANT_PERMANENT);
+ pc->skill(p2_sd, WE_CALLBABY, 1, SKILL_GRANT_PERMANENT);
return true;
}
@@ -1119,7 +1141,7 @@ bool pc_authok(struct map_session_data *sd, int login_id2, time_t expiration_tim
// Rental Timer
sd->rental_timer = INVALID_TIMER;
- for( i = 0; i < 3; i++ )
+ for( i = 0; i < MAX_PC_FEELHATE; i++ )
sd->hate_mob[i] = -1;
sd->quest_log = NULL;
@@ -1217,7 +1239,7 @@ void pc_authfail(struct map_session_data *sd)
int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl)
{
int class_;
- if (!sd || !bl || pos < 0 || pos > 2)
+ if (!sd || !bl || pos < 0 || pos >= MAX_PC_FEELHATE)
return 0;
if (sd->hate_mob[pos] != -1) {
//Can't change hate targets.
@@ -1777,7 +1799,7 @@ int pc_disguise(struct map_session_data *sd, int class_) {
if( class_ == -1 && sd->disguise == sd->status.class_ ) {
clif->clearunit_single(-sd->bl.id,CLR_OUTSIGHT,sd->fd);
} else if ( class_ != sd->status.class_ ) {
- pc_stop_walking(sd, 0);
+ pc_stop_walking(sd, STOPWALKING_FLAG_NONE);
clif->clearunit_area(&sd->bl, CLR_OUTSIGHT);
}
}
@@ -2783,24 +2805,56 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
switch(type){
case SP_ADDELE:
- if(type2 >= ELE_MAX) {
+ if( (type2 >= ELE_MAX && type2 != ELE_ALL) || (type2 < ELE_NEUTRAL) ) {
ShowError("pc_bonus2: SP_ADDELE: Invalid element %d\n", type2);
break;
}
- if(!sd->state.lr_flag)
- sd->right_weapon.addele[type2]+=val;
- else if(sd->state.lr_flag == 1)
- sd->left_weapon.addele[type2]+=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_addele[type2]+=val;
+ if ( type2 == ELE_ALL ) {
+ for ( i = ELE_NEUTRAL; i < ELE_MAX; i++ ) {
+ if ( !sd->state.lr_flag )
+ sd->right_weapon.addele[i] += val;
+ else if ( sd->state.lr_flag == 1 )
+ sd->left_weapon.addele[i] += val;
+ else if ( sd->state.lr_flag == 2 )
+ sd->arrow_addele[i] += val;
+ }
+ } else {
+ if(!sd->state.lr_flag)
+ sd->right_weapon.addele[type2] += val;
+ else if(sd->state.lr_flag == 1)
+ sd->left_weapon.addele[type2] += val;
+ else if(sd->state.lr_flag == 2)
+ sd->arrow_addele[type2] += val;
+ }
break;
case SP_ADDRACE:
- if(!sd->state.lr_flag)
- sd->right_weapon.addrace[type2]+=val;
- else if(sd->state.lr_flag == 1)
- sd->left_weapon.addrace[type2]+=val;
- else if(sd->state.lr_flag == 2)
- sd->arrow_addrace[type2]+=val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_ADDRACE: Invalid Race(%d)\n",type2);
+ break;
+ }
+ if ( type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ) {
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ if ( !sd->state.lr_flag )
+ sd->right_weapon.addrace[i] += val;
+ else if ( sd->state.lr_flag == 1 )
+ sd->left_weapon.addrace[i] += val;
+ else if ( sd->state.lr_flag == 2 )
+ sd->arrow_addrace[i] += val;
+ }
+ } else {
+ if(!sd->state.lr_flag)
+ sd->right_weapon.addrace[type2] += val;
+ else if(sd->state.lr_flag == 1)
+ sd->left_weapon.addrace[type2] += val;
+ else if(sd->state.lr_flag == 2)
+ sd->arrow_addrace[type2] += val;
+ }
break;
case SP_ADDSIZE:
if(!sd->state.lr_flag)
@@ -2811,16 +2865,40 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
sd->arrow_addsize[type2]+=val;
break;
case SP_SUBELE:
- if(type2 >= ELE_MAX) {
+ if( (type2 >= ELE_MAX && type2 != ELE_ALL) || (type2 < ELE_NEUTRAL) ) {
ShowError("pc_bonus2: SP_SUBELE: Invalid element %d\n", type2);
break;
}
- if(sd->state.lr_flag != 2)
- sd->subele[type2]+=val;
+ if(sd->state.lr_flag != 2) {
+ if ( type2 == ELE_ALL ) {
+ for ( i = ELE_NEUTRAL; i < ELE_MAX; i++ ){
+ sd->subele[i] += val;
+ }
+ } else {
+ sd->subele[type2] += val;
+ }
+ }
break;
case SP_SUBRACE:
- if(sd->state.lr_flag != 2)
- sd->subrace[type2]+=val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_SUBRACE: Invalid Race(%d)\n",type2);
+ break;
+ }
+ if(sd->state.lr_flag != 2) {
+ if (type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->subrace[i] += val;
+ }
+ } else {
+ sd->subrace[type2]+=val;
+ }
+ }
break;
case SP_ADDEFF:
if (type2 > SC_MAX) {
@@ -2849,24 +2927,57 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
sd->reseff[type2-SC_COMMON_MIN]= cap_value(i, 0, 10000);
break;
case SP_MAGIC_ADDELE:
- if(type2 >= ELE_MAX) {
+ if( (type2 >= ELE_MAX && type2 != ELE_ALL) || (type2 < ELE_NEUTRAL) ) {
ShowError("pc_bonus2: SP_MAGIC_ADDELE: Invalid element %d\n", type2);
break;
}
- if(sd->state.lr_flag != 2)
- sd->magic_addele[type2]+=val;
+ if ( sd->state.lr_flag != 2 ) {
+ if ( type2 == ELE_ALL ) {
+ for ( i = ELE_NEUTRAL; i < ELE_MAX; i++ )
+ sd->magic_addele[i] += val;
+ } else {
+ sd->magic_addele[type2] += val;
+ }
+ }
break;
case SP_MAGIC_ADDRACE:
- if(sd->state.lr_flag != 2)
- sd->magic_addrace[type2]+=val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_MAGIC_ADDRACE: Invalid Race(%d)\n",type2);
+ break;
+ }
+ if(sd->state.lr_flag != 2){
+ if ( type2 >= RC_MAX ){
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->magic_addrace[i] += val;
+ }
+ } else {
+ sd->magic_addrace[type2]+=val;
+ }
+ }
break;
case SP_MAGIC_ADDSIZE:
if(sd->state.lr_flag != 2)
sd->magic_addsize[type2]+=val;
break;
case SP_MAGIC_ATK_ELE:
- if(sd->state.lr_flag != 2)
- sd->magic_atk_ele[type2]+=val;
+ if( (type2 >= ELE_MAX && type2 != ELE_ALL) || (type2 < ELE_NEUTRAL) ) {
+ ShowError("pc_bonus2: SP_MAGIC_ATK_ELE: Invalid element %d\n", type2);
+ break;
+ }
+ if ( sd->state.lr_flag != 2 ) {
+ if ( type2 == ELE_ALL ) {
+ for ( i = ELE_NEUTRAL; i < ELE_MAX; i++ )
+ sd->magic_atk_ele[i] += val;
+ } else {
+ sd->magic_atk_ele[type2] += val;
+ }
+ }
break;
case SP_ADD_DAMAGE_CLASS:
switch (sd->state.lr_flag) {
@@ -3015,19 +3126,40 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
}
break;
case SP_WEAPON_COMA_ELE:
- if(type2 >= ELE_MAX) {
+ if( (type2 >= ELE_MAX && type2 != ELE_ALL) || (type2 < ELE_NEUTRAL) ) {
ShowError("pc_bonus2: SP_WEAPON_COMA_ELE: Invalid element %d\n", type2);
break;
}
if(sd->state.lr_flag == 2)
break;
- sd->weapon_coma_ele[type2] += val;
+ if ( type2 == ELE_ALL ) {
+ for ( i = ELE_NEUTRAL; i < ELE_MAX; i++ )
+ sd->weapon_coma_ele[i] += val;
+ } else {
+ sd->weapon_coma_ele[type2] += val;
+ }
sd->special_state.bonus_coma = 1;
break;
case SP_WEAPON_COMA_RACE:
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_WEAPON_COMA_RACE: Invalid Race(%d)\n",type2);
+ break;
+ }
if(sd->state.lr_flag == 2)
break;
- sd->weapon_coma_race[type2] += val;
+ if ( type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->weapon_coma_race[i] += val;
+ }
+ } else {
+ sd->weapon_coma_race[type2] += val;
+ }
sd->special_state.bonus_coma = 1;
break;
case SP_WEAPON_ATK:
@@ -3039,8 +3171,25 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
sd->weapon_atk_rate[type2]+=val;
break;
case SP_CRITICAL_ADDRACE:
- if(sd->state.lr_flag != 2)
- sd->critaddrace[type2] += val*10;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_CRITICAL_ADDRACE: Invalid Race(%d)\n",type2);
+ break;
+ }
+ if(sd->state.lr_flag != 2){
+ if ( type2 >= RC_MAX ){
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->critaddrace[i] += val*10;
+ }
+ } else {
+ sd->critaddrace[type2] += val*10;
+ }
+ }
break;
case SP_ADDEFF_WHENHIT:
if (type2 > SC_MAX) {
@@ -3211,12 +3360,46 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
sd->itemhealrate[i].rate += val;
break;
case SP_EXP_ADDRACE:
- if(sd->state.lr_flag != 2)
- sd->expaddrace[type2]+=val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_EXP_ADDRACE: Invalid Race(%d)\n",type2);
+ break;
+ }
+ if(sd->state.lr_flag != 2) {
+ if ( type2 >= RC_MAX ){
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->expaddrace[i] += val;
+ }
+ } else {
+ sd->expaddrace[type2] += val;
+ }
+ }
break;
case SP_SP_GAIN_RACE:
- if(sd->state.lr_flag != 2)
- sd->sp_gain_race[type2]+=val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_SP_GAIN_RACE: Invalid Race(%d)\n",type2);
+ break;
+ }
+ if(sd->state.lr_flag != 2) {
+ if ( type2 >= RC_MAX ){
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->sp_gain_race[i] += val;
+ }
+ } else {
+ sd->sp_gain_race[type2] += val;
+ }
+ }
break;
case SP_ADD_MONSTER_DROP_ITEM:
if (sd->state.lr_flag != 2)
@@ -3235,19 +3418,61 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
}
break;
case SP_HP_DRAIN_VALUE_RACE:
- if(!sd->state.lr_flag) {
- sd->right_weapon.hp_drain[type2].value += val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_HP_DRAIN_VALUE_RACE: Invalid Race(%d)\n",type2);
+ break;
}
- else if(sd->state.lr_flag == 1) {
- sd->left_weapon.hp_drain[type2].value += val;
+ if ( type2 >= RC_MAX ){
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ if(!sd->state.lr_flag) {
+ sd->right_weapon.hp_drain[i].value += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->left_weapon.hp_drain[i].value += val;
+ }
+ }
+ } else {
+ if(!sd->state.lr_flag) {
+ sd->right_weapon.hp_drain[type2].value += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->left_weapon.hp_drain[type2].value += val;
+ }
}
break;
case SP_SP_DRAIN_VALUE_RACE:
- if(!sd->state.lr_flag) {
- sd->right_weapon.sp_drain[type2].value += val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_SP_DRAIN_VALUE_RACE: Invalid Race(%d)\n",type2);
+ break;
}
- else if(sd->state.lr_flag == 1) {
- sd->left_weapon.sp_drain[type2].value += val;
+ if ( type2 >= RC_MAX ){
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ if(!sd->state.lr_flag) {
+ sd->right_weapon.sp_drain[i].value += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->left_weapon.sp_drain[i].value += val;
+ }
+ }
+ } else {
+ if(!sd->state.lr_flag) {
+ sd->right_weapon.sp_drain[type2].value += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->left_weapon.sp_drain[type2].value += val;
+ }
}
break;
case SP_IGNORE_MDEF_RATE:
@@ -3259,12 +3484,46 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
sd->ignore_def[type2] += val;
break;
case SP_SP_GAIN_RACE_ATTACK:
- if(sd->state.lr_flag != 2)
- sd->sp_gain_race_attack[type2] = cap_value(sd->sp_gain_race_attack[type2] + val, 0, INT16_MAX);
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_SP_GAIN_RACE_ATTACK: Invalid Race(%d)\n",type2);
+ break;
+ }
+ if(sd->state.lr_flag != 2) {
+ if ( type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->sp_gain_race_attack[i] = cap_value(sd->sp_gain_race_attack[i] + val, 0, INT16_MAX);
+ }
+ } else {
+ sd->sp_gain_race_attack[type2] = cap_value(sd->sp_gain_race_attack[type2] + val, 0, INT16_MAX);
+ }
+ }
break;
case SP_HP_GAIN_RACE_ATTACK:
- if(sd->state.lr_flag != 2)
- sd->hp_gain_race_attack[type2] = cap_value(sd->hp_gain_race_attack[type2] + val, 0, INT16_MAX);
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_HP_GAIN_RACE_ATTACK: Invalid Race(%d)\n",type2);
+ break;
+ }
+ if(sd->state.lr_flag != 2) {
+ if ( type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->hp_gain_race_attack[i] = cap_value(sd->hp_gain_race_attack[i] + val, 0, INT16_MAX);
+ }
+ } else {
+ sd->hp_gain_race_attack[type2] = cap_value(sd->hp_gain_race_attack[type2] + val, 0, INT16_MAX);
+ }
+ }
break;
case SP_SKILL_USE_SP_RATE: //bonus2 bSkillUseSPrate,n,x;
if(sd->state.lr_flag == 2)
@@ -3370,8 +3629,25 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
break;
#ifdef RENEWAL
case SP_RACE_TOLERANCE:
- if ( sd->state.lr_flag != 2 )
- sd->race_tolerance[type2] += val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus2: SP_RACE_TOLERANCE: Invalid Race(%d)\n",type2);
+ break;
+ }
+ if(sd->state.lr_flag != 2) {
+ if ( type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->race_tolerance[i] += val;
+ }
+ } else {
+ sd->race_tolerance[type2] += val;
+ }
+ }
break;
#endif
default:
@@ -3383,6 +3659,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
{
+ int i;
nullpo_ret(sd);
switch(type){
@@ -3432,23 +3709,69 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
}
break;
case SP_HP_DRAIN_RATE_RACE:
- if(!sd->state.lr_flag) {
- sd->right_weapon.hp_drain[type2].rate += type3;
- sd->right_weapon.hp_drain[type2].per += val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus3: SP_HP_DRAIN_RATE_RACE: Invalid Race(%d)\n",type2);
+ break;
}
- else if(sd->state.lr_flag == 1) {
- sd->left_weapon.hp_drain[type2].rate += type3;
- sd->left_weapon.hp_drain[type2].per += val;
+ if ( type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ if(!sd->state.lr_flag) {
+ sd->right_weapon.hp_drain[i].rate += type3;
+ sd->right_weapon.hp_drain[i].per += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->left_weapon.hp_drain[i].rate += type3;
+ sd->left_weapon.hp_drain[i].per += val;
+ }
+ }
+ } else {
+ if(!sd->state.lr_flag) {
+ sd->right_weapon.hp_drain[type2].rate += type3;
+ sd->right_weapon.hp_drain[type2].per += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->left_weapon.hp_drain[type2].rate += type3;
+ sd->left_weapon.hp_drain[type2].per += val;
+ }
}
break;
case SP_SP_DRAIN_RATE_RACE:
- if(!sd->state.lr_flag) {
- sd->right_weapon.sp_drain[type2].rate += type3;
- sd->right_weapon.sp_drain[type2].per += val;
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus3: SP_SP_DRAIN_RATE_RACE: Invalid Race(%d)\n",type2);
+ break;
}
- else if(sd->state.lr_flag == 1) {
- sd->left_weapon.sp_drain[type2].rate += type3;
- sd->left_weapon.sp_drain[type2].per += val;
+ if ( type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ if(!sd->state.lr_flag) {
+ sd->right_weapon.sp_drain[i].rate += type3;
+ sd->right_weapon.sp_drain[i].per += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->left_weapon.sp_drain[i].rate += type3;
+ sd->left_weapon.sp_drain[i].per += val;
+ }
+ }
+ } else {
+ if(!sd->state.lr_flag) {
+ sd->right_weapon.sp_drain[type2].rate += type3;
+ sd->right_weapon.sp_drain[type2].per += val;
+ }
+ else if(sd->state.lr_flag == 1) {
+ sd->left_weapon.sp_drain[type2].rate += type3;
+ sd->left_weapon.sp_drain[type2].per += val;
+ }
}
break;
case SP_ADDEFF:
@@ -3479,21 +3802,33 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
break;
case SP_ADDELE:
- if (type2 > ELE_MAX) {
- ShowWarning("pc_bonus3 (SP_ADDELE): element %d is out of range.\n", type2);
+ if( (type2 >= ELE_MAX && type2 != ELE_ALL) || (type2 < ELE_NEUTRAL) ) {
+ ShowError("pc_bonus3: SP_ADDELE: Invalid element %d\n", type2);
break;
}
- if (sd->state.lr_flag != 2)
- pc_bonus_addele(sd, (unsigned char)type2, type3, val);
+ if ( sd->state.lr_flag != 2 ) {
+ if ( type2 == ELE_ALL ) {
+ for ( i = ELE_NEUTRAL; i < ELE_MAX; i++ )
+ pc_bonus_addele(sd, (unsigned char)i, type3, val);
+ } else {
+ pc_bonus_addele(sd, (unsigned char)type2, type3, val);
+ }
+ }
break;
case SP_SUBELE:
- if (type2 > ELE_MAX) {
- ShowWarning("pc_bonus3 (SP_SUBELE): element %d is out of range.\n", type2);
+ if( (type2 >= ELE_MAX && type2 != ELE_ALL) || (type2 < ELE_NEUTRAL) ) {
+ ShowError("pc_bonus3: SP_SUBELE: Invalid element %d\n", type2);
break;
}
- if (sd->state.lr_flag != 2)
- pc_bonus_subele(sd, (unsigned char)type2, type3, val);
+ if ( sd->state.lr_flag != 2 ) {
+ if ( type2 == ELE_ALL ) {
+ for ( i = ELE_NEUTRAL; i < ELE_MAX; i++ )
+ pc_bonus_subele(sd, (unsigned char)i, type3, val);
+ } else {
+ pc_bonus_subele(sd, (unsigned char)type2, type3, val);
+ }
+ }
break;
case SP_SP_VANISH_RATE:
if(sd->state.lr_flag != 2) {
@@ -3512,6 +3847,7 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val)
}
int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4,int val) {
+ int i;
nullpo_ret(sd);
switch(type) {
@@ -3544,27 +3880,55 @@ int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4
break;
case SP_SET_DEF_RACE: //bonus4 bSetDefRace,n,x,r,y;
- if( type2 >= RC_MAX ) {
- ShowWarning("pc_bonus4 (DEF_SET): %d is not supported.\n", type2);
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus4: SP_SET_DEF_RACE: Invalid Race(%d)\n",type2);
break;
}
if(sd->state.lr_flag == 2)
break;
- sd->def_set_race[type2].rate = type3;
- sd->def_set_race[type2].tick = type4;
- sd->def_set_race[type2].value = val;
+ if ( type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->def_set_race[i].rate = type3;
+ sd->def_set_race[i].tick = type4;
+ sd->def_set_race[i].value = val;
+ }
+ } else {
+ sd->def_set_race[type2].rate = type3;
+ sd->def_set_race[type2].tick = type4;
+ sd->def_set_race[type2].value = val;
+ }
break;
case SP_SET_MDEF_RACE: //bonus4 bSetMDefRace,n,x,r,y;
- if( type2 >= RC_MAX ) {
- ShowWarning("pc_bonus4 (MDEF_SET): %d is not supported.\n", type2);
+ if (type2 == RC_MAX || (type2 > RC_NONDEMIPLAYER && type2 != RC_ALL) || type2 < RC_FORMLESS ){
+ ShowWarning("pc_bonus4: SP_SET_MDEF_RACE: Invalid Race(%d)\n",type2);
break;
}
if(sd->state.lr_flag == 2)
break;
- sd->mdef_set_race[type2].rate = type3;
- sd->mdef_set_race[type2].tick = type4;
- sd->mdef_set_race[type2].value = val;
+ if ( type2 >= RC_MAX ) {
+ for ( i = RC_FORMLESS; i < RC_MAX; i++ ){
+ if ( (type2 == RC_NONPLAYER && i == RC_PLAYER) ||
+ (type2 == RC_NONDEMIHUMAN && i == RC_DEMIHUMAN) ||
+ (type2 == RC_DEMIPLAYER && (i != RC_PLAYER && i != RC_DEMIHUMAN)) ||
+ (type2 == RC_NONDEMIPLAYER && (i == RC_PLAYER || i == RC_DEMIHUMAN))
+ )
+ continue;
+ sd->mdef_set_race[i].rate = type3;
+ sd->mdef_set_race[i].tick = type4;
+ sd->mdef_set_race[i].value = val;
+ }
+ } else {
+ sd->mdef_set_race[type2].rate = type3;
+ sd->mdef_set_race[type2].tick = type4;
+ sd->mdef_set_race[type2].value = val;
+ }
break;
case SP_ADDEFF:
@@ -3622,13 +3986,11 @@ int pc_bonus5(struct map_session_data *sd,int type,int type2,int type3,int type4
}
/*==========================================
- * Grants a player a given skill. Flag values are:
- * 0 - Grant permanent skill to be bound to skill tree
- * 1 - Grant an item skill (temporary)
- * 2 - Like 1, except the level granted can stack with previously learned level.
- * 3 - Grant skill unconditionally and forever (persistent to job changes and skill resets)
+ * Grants a player a given skill.
+ * Flag values: @see enum pc_skill_flag
*------------------------------------------*/
-int pc_skill(TBL_PC* sd, int id, int level, int flag) {
+int pc_skill(TBL_PC* sd, int id, int level, int flag)
+{
uint16 index = 0;
nullpo_ret(sd);
@@ -3640,13 +4002,13 @@ int pc_skill(TBL_PC* sd, int id, int level, int flag) {
ShowError("pc_skill: Skill level %d too high. Max lv supported is %d\n", level, MAX_SKILL_LEVEL);
return 0;
}
- if( flag == 2 && sd->status.skill[index].lv + level > MAX_SKILL_LEVEL ) {
+ if( flag == SKILL_GRANT_TEMPSTACK && sd->status.skill[index].lv + level > MAX_SKILL_LEVEL ) {
ShowError("pc_skill: Skill level bonus %d too high. Max lv supported is %d. Curr lv is %d\n", level, MAX_SKILL_LEVEL, sd->status.skill[index].lv);
return 0;
}
switch( flag ){
- case 0: //Set skill data overwriting whatever was there before.
+ case SKILL_GRANT_PERMANENT: //Set skill data overwriting whatever was there before.
sd->status.skill[index].id = id;
sd->status.skill[index].lv = level;
sd->status.skill[index].flag = SKILL_FLAG_PERMANENT;
@@ -3658,7 +4020,7 @@ int pc_skill(TBL_PC* sd, int id, int level, int flag) {
if( !skill->db[index].inf ) //Only recalculate for passive skills.
status_calc_pc(sd, SCO_NONE);
break;
- case 1: //Item bonus skill.
+ case SKILL_GRANT_TEMPORARY: //Item bonus skill.
if( sd->status.skill[index].id == id ) {
if( sd->status.skill[index].lv >= level )
return 0;
@@ -3670,7 +4032,7 @@ int pc_skill(TBL_PC* sd, int id, int level, int flag) {
}
sd->status.skill[index].lv = level;
break;
- case 2: //Add skill bonus on top of what you had.
+ case SKILL_GRANT_TEMPSTACK: //Add skill bonus on top of what you had.
if( sd->status.skill[index].id == id ) {
if( sd->status.skill[index].flag == SKILL_FLAG_PERMANENT )
sd->status.skill[index].flag = SKILL_FLAG_REPLACED_LV_0 + sd->status.skill[index].lv; // Store previous level.
@@ -3680,7 +4042,7 @@ int pc_skill(TBL_PC* sd, int id, int level, int flag) {
}
sd->status.skill[index].lv += level;
break;
- case 3:
+ case SKILL_GRANT_UNCONDITIONAL:
sd->status.skill[index].id = id;
sd->status.skill[index].lv = level;
sd->status.skill[index].flag = SKILL_FLAG_PERM_GRANTED;
@@ -3692,8 +4054,8 @@ int pc_skill(TBL_PC* sd, int id, int level, int flag) {
if( !skill->db[index].inf ) //Only recalculate for passive skills.
status_calc_pc(sd, SCO_NONE);
break;
- default: //Unknown flag?
- return 0;
+ default: //Unknown flag?
+ return 0;
}
return 1;
}
@@ -3737,7 +4099,7 @@ int pc_insert_card(struct map_session_data* sd, int idx_card, int idx_equip)
// remember the card id to insert
nameid = sd->status.inventory[idx_card].nameid;
- if( pc->delitem(sd,idx_card,1,1,0,LOG_TYPE_OTHER) == 1 )
+ if( pc->delitem(sd, idx_card, 1, 1, DELITEM_NORMAL, LOG_TYPE_OTHER) == 1 )
{// failed
clif->insert_card(sd,idx_equip,idx_card,1);
}
@@ -4144,6 +4506,7 @@ int pc_additem(struct map_session_data *sd,struct item *item_data,int amount,e_l
* @type
* 1 : don't notify deletion
* 2 : don't notify weight change
+ * reason: @see enum delitem_reason
* Return:
* 0 = success
* 1 = invalid itemid or negative amount
@@ -4161,7 +4524,7 @@ int pc_delitem(struct map_session_data *sd,int n,int amount,int type, short reas
sd->weight -= sd->inventory_data[n]->weight*amount ;
if( sd->status.inventory[n].amount <= 0 ){
if(sd->status.inventory[n].equip)
- pc->unequipitem(sd,n,3);
+ pc->unequipitem(sd, n, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
memset(&sd->status.inventory[n],0,sizeof(sd->status.inventory[0]));
sd->inventory_data[n] = NULL;
}
@@ -4211,7 +4574,7 @@ int pc_dropitem(struct map_session_data *sd,int n,int amount)
if (!map->addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 2))
return 0;
- pc->delitem(sd, n, amount, 1, 0, LOG_TYPE_PICKDROP_PLAYER);
+ pc->delitem(sd, n, amount, 1, DELITEM_NORMAL, LOG_TYPE_PICKDROP_PLAYER);
clif->dropitem(sd, n, amount);
return 1;
}
@@ -4308,12 +4671,12 @@ int pc_isUseitem(struct map_session_data *sd,int n)
if ((item->item_usage.flag&INR_SITTING) && (pc_issit(sd) == 1) && (pc_get_group_level(sd) < item->item_usage.override)) {
clif->msgtable(sd, MSG_ITEM_NEED_STANDING);
- //clif->colormes(sd->fd,COLOR_WHITE,msg_txt(1474));
+ //clif->messagecolor_self(sd->fd, COLOR_WHITE, msg_txt(1474));
return 0; // You cannot use this item while sitting.
}
- if (sd->state.storage_flag && item->type != IT_CASH) {
- clif->colormes(sd->fd, COLOR_RED, msg_sd(sd,1475));
+ if (sd->state.storage_flag != STORAGE_FLAG_CLOSED && item->type != IT_CASH) {
+ clif->messagecolor_self(sd->fd, COLOR_RED, msg_sd(sd,1475));
return 0; // You cannot use this item while storage is open.
}
@@ -4416,8 +4779,8 @@ int pc_isUseitem(struct map_session_data *sd,int n)
clif->msgtable(sd, MSG_ITEM_CANT_OBTAIN_WEIGHT);
return 0;
}
- if( !pc->inventoryblank(sd) ) {
- clif->colormes(sd->fd,COLOR_RED,msg_sd(sd,1477));
+ if (!pc->inventoryblank(sd)) {
+ clif->messagecolor_self(sd->fd, COLOR_RED, msg_sd(sd,1477));
return 0;
}
}
@@ -4573,7 +4936,7 @@ int pc_useitem(struct map_session_data *sd,int n) {
clif->msgtable(sd, MSG_ITEM_CANT_USE_AREA); // This item cannot be used within this area
if( battle_config.item_restricted_consumption_type && sd->status.inventory[n].expire_time == 0 ) {
clif->useitemack(sd,n,sd->status.inventory[n].amount-1,true);
- pc->delitem(sd,n,1,1,0,LOG_TYPE_CONSUME);
+ pc->delitem(sd, n, 1, 1, DELITEM_NORMAL, LOG_TYPE_CONSUME);
}
return 0;
}
@@ -4596,7 +4959,7 @@ int pc_useitem(struct map_session_data *sd,int n) {
else {
if (sd->status.inventory[n].expire_time == 0) {
clif->useitemack(sd, n, amount - 1, true);
- pc->delitem(sd, n, 1, 1, 0, LOG_TYPE_CONSUME); // Rental Usable Items are not deleted until expiration
+ pc->delitem(sd, n, 1, 1, DELITEM_NORMAL, LOG_TYPE_CONSUME); // Rental Usable Items are not deleted until expiration
} else {
clif->useitemack(sd, n, 0, false);
}
@@ -4744,7 +5107,7 @@ int pc_putitemtocart(struct map_session_data *sd,int idx,int amount)
return 1;
if( (flag = pc->cart_additem(sd,item_data,amount,LOG_TYPE_NONE)) == 0 )
- return pc->delitem(sd,idx,amount,0,5,LOG_TYPE_NONE);
+ return pc->delitem(sd, idx, amount, 0, DELITEM_TOCART, LOG_TYPE_NONE);
return flag;
}
@@ -4803,7 +5166,7 @@ void pc_bound_clear(struct map_session_data *sd, enum e_item_bound_type type) {
case IBT_CHARACTER:
for( i = 0; i < MAX_INVENTORY; i++ ){
if( sd->status.inventory[i].bound == type ) {
- pc->delitem(sd,i,sd->status.inventory[i].amount,0,1,LOG_TYPE_OTHER);
+ pc->delitem(sd, i, sd->status.inventory[i].amount, 0, DELITEM_SKILLUSE, LOG_TYPE_OTHER); // FIXME: is this the correct reason flag?
}
}
break;
@@ -4817,7 +5180,7 @@ void pc_bound_clear(struct map_session_data *sd, enum e_item_bound_type type) {
if(sd->status.inventory[i].bound == type) {
if( gstor )
gstorage->additem(sd,gstor,&sd->status.inventory[i],sd->status.inventory[i].amount);
- pc->delitem(sd,i,sd->status.inventory[i].amount,0,1,gstor?LOG_TYPE_GSTORAGE:LOG_TYPE_OTHER);
+ pc->delitem(sd, i, sd->status.inventory[i].amount, 0, DELITEM_SKILLUSE, gstor ? LOG_TYPE_GSTORAGE : LOG_TYPE_OTHER); // FIXME: is this the correct reason flag?
}
}
if( gstor )
@@ -5086,7 +5449,7 @@ int pc_setpos(struct map_session_data* sd, unsigned short map_index, int x, int
for( i = 0; i < EQI_MAX; i++ ) {
if( sd->equip_index[ i ] >= 0 )
if( !pc->isequip( sd , sd->equip_index[ i ] ) )
- pc->unequipitem( sd , sd->equip_index[ i ] , 2 );
+ pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_FORCE);
}
if (battle_config.clear_unit_onwarp&BL_PC)
skill->clear_unitgroup(&sd->bl);
@@ -6083,7 +6446,7 @@ int pc_stop_following (struct map_session_data *sd)
sd->followtarget = -1;
sd->ud.target_to = 0;
- unit->stop_walking(&sd->bl, 1);
+ unit->stop_walking(&sd->bl, STOPWALKING_FLAG_FIXPOS);
return 0;
}
@@ -6156,7 +6519,7 @@ void pc_baselevelchanged(struct map_session_data *sd) {
for( i = 0; i < EQI_MAX; i++ ) {
if( sd->equip_index[i] >= 0 ) {
if( sd->inventory_data[ sd->equip_index[i] ]->elvmax && sd->status.base_level > (unsigned int)sd->inventory_data[ sd->equip_index[i] ]->elvmax )
- pc->unequipitem(sd, sd->equip_index[i], 3);
+ pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
}
}
}
@@ -6625,14 +6988,12 @@ int pc_skillup(struct map_session_data *sd,uint16 skill_id) {
if (!pc_has_permission(sd, PC_PERM_ALL_SKILL)) // may skill everything at any time anyways, and this would cause a huge slowdown
clif->skillinfoblock(sd);
} else if( battle_config.skillup_limit ){
- if( sd->sktree.second )
+ if (sd->sktree.second)
clif->msgtable_num(sd, MSG_SKILL_POINTS_LEFT_JOB1, sd->sktree.second);
- else if( sd->sktree.third )
+ else if (sd->sktree.third)
clif->msgtable_num(sd, MSG_SKILL_POINTS_LEFT_JOB2, sd->sktree.third);
- else if( pc->calc_skillpoint(sd) < 9 ) {
- /* TODO: official response? */
- clif->colormes(sd->fd,COLOR_RED,"You need the basic skills");
- }
+ else if (pc->calc_skillpoint(sd) < 9) /* TODO: official response? */
+ clif->messagecolor_self(sd->fd, COLOR_RED, "You need the basic skills");
}
return 0;
}
@@ -6702,9 +7063,9 @@ int pc_resetlvl(struct map_session_data* sd,int type)
nullpo_ret(sd);
if (type != 3) //Also reset skills
- pc->resetskill(sd, 0);
+ pc->resetskill(sd, PCRESETSKILL_NONE);
- if(type == 1){
+ if(type == 1) {
sd->status.skill_point=0;
sd->status.base_level=1;
sd->status.job_level=1;
@@ -6722,8 +7083,8 @@ int pc_resetlvl(struct map_session_data* sd,int type)
if(sd->status.class_ == JOB_NOVICE_HIGH) {
sd->status.status_point=100; // not 88 [celest]
// give platinum skills upon changing
- pc->skill(sd,142,1,0);
- pc->skill(sd,143,1,0);
+ pc->skill(sd, NV_FIRSTAID, 1, SKILL_GRANT_PERMANENT);
+ pc->skill(sd, NV_TRICKDEAD, 1, SKILL_GRANT_PERMANENT);
}
}
@@ -6769,7 +7130,7 @@ int pc_resetlvl(struct map_session_data* sd,int type)
for(i=0;i<EQI_MAX;i++) { // unequip items that can't be equipped by base 1 [Valaris]
if(sd->equip_index[i] >= 0)
if(!pc->isequip(sd,sd->equip_index[i]))
- pc->unequipitem(sd,sd->equip_index[i],2);
+ pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_FORCE);
}
if ((type == 1 || type == 2 || type == 3) && sd->status.party_id)
@@ -6847,19 +7208,17 @@ int pc_resetstate(struct map_session_data* sd)
/*==========================================
* /resetskill
- * if flag&1, perform block resync and status_calc call.
- * if flag&2, just count total amount of skill points used by player, do not really reset.
- * if flag&4, just reset the skills if the player class is a bard/dancer type (for changesex.)
+ * @param flag: @see enum pc_resetskill_flag
*------------------------------------------*/
int pc_resetskill(struct map_session_data* sd, int flag)
{
int i, inf2, skill_point=0;
nullpo_ret(sd);
- if( flag&4 && (sd->class_&MAPID_UPPERMASK) != MAPID_BARDDANCER )
+ if( flag&PCRESETSKILL_CHSEX && (sd->class_&MAPID_UPPERMASK) != MAPID_BARDDANCER )
return 0;
- if( !(flag&2) ) { //Remove stuff lost when resetting skills.
+ if( !(flag&PCRESETSKILL_RECOUNT) ) { //Remove stuff lost when resetting skills.
/**
* It has been confirmed on official server that when you reset skills with a ranked tweakwon your skills are not reset (because you have all of them anyway)
@@ -6924,12 +7283,12 @@ int pc_resetskill(struct map_session_data* sd, int flag)
if( sd->status.skill[i].flag == SKILL_FLAG_PERM_GRANTED )
continue;
- if( flag&4 && !skill_ischangesex(i) )
+ if( flag&PCRESETSKILL_CHSEX && !skill_ischangesex(i) )
continue;
if( inf2&INF2_QUEST_SKILL && !battle_config.quest_skill_learn ) {
//Only handle quest skills in a special way when you can't learn them manually
- if( battle_config.quest_skill_reset && !(flag&2) ) { //Wipe them
+ if( battle_config.quest_skill_reset && !(flag&PCRESETSKILL_RECOUNT) ) { //Wipe them
sd->status.skill[i].lv = 0;
sd->status.skill[i].flag = 0;
}
@@ -6940,18 +7299,18 @@ int pc_resetskill(struct map_session_data* sd, int flag)
else if( sd->status.skill[i].flag >= SKILL_FLAG_REPLACED_LV_0 )
skill_point += (sd->status.skill[i].flag - SKILL_FLAG_REPLACED_LV_0);
- if( !(flag&2) ) {// reset
+ if( !(flag&PCRESETSKILL_RECOUNT) ) {// reset
sd->status.skill[i].lv = 0;
sd->status.skill[i].flag = 0;
}
}
- if( flag&2 || !skill_point ) return skill_point;
+ if( flag&PCRESETSKILL_RECOUNT || !skill_point ) return skill_point;
sd->status.skill_point += skill_point;
- if( !(flag&2) ) {
+ if (!(flag&PCRESETSKILL_RECOUNT)) {
// Remove all SCs that can't be inactivated without a skill
if( sd->sc.data[SC_STORMKICK_READY] )
status_change_end(&sd->bl, SC_STORMKICK_READY, INVALID_TIMER);
@@ -6965,7 +7324,7 @@ int pc_resetskill(struct map_session_data* sd, int flag)
status_change_end(&sd->bl, SC_DODGE_READY, INVALID_TIMER);
}
- if( flag&1 ) {
+ if (flag&PCRESETSKILL_RESYNC) {
clif->updatestatus(sd,SP_SKILLPOINT);
clif->skillinfoblock(sd);
status_calc_pc(sd,SCO_FORCE);
@@ -6997,8 +7356,7 @@ int pc_resethate(struct map_session_data* sd)
int i;
nullpo_ret(sd);
- for (i=0; i<3; i++)
- {
+ for (i = 0; i < MAX_PC_FEELHATE; i++) {
sd->hate_mob[i] = -1;
pc_setglobalreg(sd,script->add_str(pc->sg_info[i].hate_var),0);
}
@@ -7115,8 +7473,8 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) {
nullpo_retr(0, sd);
- for(j = 0; j < 5; j++) {
- if (sd->devotion[j]){
+ for (j = 0; j < MAX_PC_DEVOTION; j++) {
+ if (sd->devotion[j]) {
struct map_session_data *devsd = map->id2sd(sd->devotion[j]);
if (devsd)
status_change_end(&devsd->bl, SC_DEVOTION, INVALID_TIMER);
@@ -7220,7 +7578,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) {
mob->unlocktarget(md,tick);
if (battle_config.mobs_level_up && md->status.hp
&& (unsigned int)md->level < pc->maxbaselv(sd)
- && !md->guardian_data && !md->special_state.ai// Guardians/summons should not level. [Skotlex]
+ && !md->guardian_data && md->special_state.ai == AI_NONE// Guardians/summons should not level. [Skotlex]
) {
// monster level up [Valaris]
clif->misceffect(&md->bl,0);
@@ -7400,7 +7758,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) {
int n = eq_n[rnd()%eq_num];
if(rnd()%10000 < per){
if(sd->status.inventory[n].equip)
- pc->unequipitem(sd,n,3);
+ pc->unequipitem(sd, n, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
pc->dropitem(sd,n,1);
}
}
@@ -7413,7 +7771,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) {
|| (type == 2 && sd->status.inventory[i].equip)
|| type == 3) ){
if(sd->status.inventory[i].equip)
- pc->unequipitem(sd,i,3);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
pc->dropitem(sd,i,1);
break;
}
@@ -8062,7 +8420,7 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper)
for(i=0;i<EQI_MAX;i++) {
if(sd->equip_index[i] >= 0)
if(!pc->isequip(sd,sd->equip_index[i]))
- pc->unequipitem(sd,sd->equip_index[i],2); // unequip invalid item for class
+ pc->unequipitem(sd,sd->equip_index[i], PCUNEQUIPITEM_FORCE); // unequip invalid item for class
}
//Change look, if disguised, you need to undisguise
@@ -8257,7 +8615,7 @@ int pc_setoption(struct map_session_data *sd,int type)
if(pc->checkskill(sd, MC_PUSHCART) < 10)
status_calc_pc(sd,SCO_NONE); //Remove speed penalty.
if ( sd->equip_index[EQI_AMMO] > 0 )
- pc->unequipitem(sd, sd->equip_index[EQI_AMMO], 2);
+ pc->unequipitem(sd, sd->equip_index[EQI_AMMO], PCUNEQUIPITEM_FORCE);
}
#endif
@@ -8294,7 +8652,7 @@ int pc_setoption(struct map_session_data *sd,int type)
status_change_end(&sd->bl, (sc_type)i, INVALID_TIMER);
}
if ( sd->equip_index[EQI_AMMO] > 0 )
- pc->unequipitem(sd, sd->equip_index[EQI_AMMO], 2);
+ pc->unequipitem(sd, sd->equip_index[EQI_AMMO], PCUNEQUIPITEM_FORCE);
}
if (type&OPTION_FLYING && !(p_type&OPTION_FLYING))
@@ -8348,7 +8706,7 @@ int pc_setcart(struct map_session_data *sd,int type) {
clif->clearcart(sd->fd);
clif->updatestatus(sd, SP_CARTINFO);
if ( sd->equip_index[EQI_AMMO] > 0 )
- pc->unequipitem(sd, sd->equip_index[EQI_AMMO], 2);
+ pc->unequipitem(sd, sd->equip_index[EQI_AMMO], PCUNEQUIPITEM_FORCE);
break;
default:/* everything else is an allowed ID so we can move on */
if( !sd->sc.data[SC_PUSH_CART] ) /* first time, so fill cart data */
@@ -9199,7 +9557,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos)
for(i=0;i<EQI_MAX;i++) {
if(pos & pc->equip_pos[i]) {
if(sd->equip_index[i] >= 0) //Slot taken, remove item from there.
- pc->unequipitem(sd,sd->equip_index[i],2);
+ pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_FORCE);
sd->equip_index[i] = n;
}
@@ -9320,15 +9678,13 @@ void pc_unequipitem_pos(struct map_session_data *sd, int n, int pos)
/*==========================================
* Called when attemting to unequip an item from player
- * type:
- * 0 - only unequip
- * 1 - calculate status after unequipping
- * 2 - force unequip
+ * type: @see enum pc_unequipitem_flag
* Return:
* 0 = fail
* 1 = success
*------------------------------------------*/
-int pc_unequipitem(struct map_session_data *sd,int n,int flag) {
+int pc_unequipitem(struct map_session_data *sd,int n,int flag)
+{
int i,iflag;
bool status_cacl = false;
int pos;
@@ -9340,13 +9696,13 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) {
}
// if player is berserk then cannot unequip
- if (!(flag & 2) && sd->sc.count && (sd->sc.data[SC_BERSERK] || sd->sc.data[SC_NO_SWITCH_EQUIP]) )
+ if (!(flag&PCUNEQUIPITEM_FORCE) && sd->sc.count && (sd->sc.data[SC_BERSERK] || sd->sc.data[SC_NO_SWITCH_EQUIP]) )
{
clif->unequipitemack(sd,n,0,UIA_FAIL);
return 0;
}
- if( !(flag&2) && sd->sc.count && sd->sc.data[SC_KYOUGAKU] )
+ if( !(flag&PCUNEQUIPITEM_FORCE) && sd->sc.count && sd->sc.data[SC_KYOUGAKU] )
{
clif->unequipitemack(sd,n,0,UIA_FAIL);
return 0;
@@ -9407,7 +9763,7 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) {
}
}
- if(flag&1 || status_cacl) {
+ if(flag&PCUNEQUIPITEM_RECALC || status_cacl) {
pc->checkallowskill(sd);
status_calc_pc(sd,SCO_NONE);
}
@@ -9478,7 +9834,7 @@ int pc_checkitem(struct map_session_data *sd)
if (!itemdb_available(id)) {
ShowWarning("Removed invalid/disabled item id %d from inventory (amount=%d, char_id=%d).\n", id, sd->status.inventory[i].amount, sd->status.char_id);
- pc->delitem(sd, i, sd->status.inventory[i].amount, 0, 0, LOG_TYPE_OTHER);
+ pc->delitem(sd, i, sd->status.inventory[i].amount, 0, DELITEM_NORMAL, LOG_TYPE_OTHER);
continue;
}
@@ -9552,28 +9908,28 @@ int pc_checkitem(struct map_session_data *sd)
continue;
if( sd->status.inventory[i].equip&~pc->equippoint(sd,i) ) {
- pc->unequipitem(sd, i, 2);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_FORCE);
calc_flag = 1;
continue;
}
- if ( battle_config.unequip_restricted_equipment & 1 ) {
+ if (battle_config.unequip_restricted_equipment&1) {
int j;
- for ( j = 0; j < map->list[sd->bl.m].zone->disabled_items_count; j++ ) {
- if ( map->list[sd->bl.m].zone->disabled_items[j] == sd->status.inventory[i].nameid ) {
- pc->unequipitem( sd, i, 2 );
+ for (j = 0; j < map->list[sd->bl.m].zone->disabled_items_count; j++) {
+ if (map->list[sd->bl.m].zone->disabled_items[j] == sd->status.inventory[i].nameid) {
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_FORCE);
calc_flag = 1;
}
}
}
- if ( battle_config.unequip_restricted_equipment & 2 ) {
- if ( !itemdb_isspecial( sd->status.inventory[i].card[0] ) ) {
+ if (battle_config.unequip_restricted_equipment&2) {
+ if (!itemdb_isspecial(sd->status.inventory[i].card[0])) {
int j, slot;
- for ( slot = 0; slot < MAX_SLOTS; slot++ ) {
- for ( j = 0; j < map->list[sd->bl.m].zone->disabled_items_count; j++ ) {
- if ( map->list[sd->bl.m].zone->disabled_items[j] == sd->status.inventory[i].card[slot] ) {
- pc->unequipitem( sd, i, 2 );
+ for (slot = 0; slot < MAX_SLOTS; slot++) {
+ for (j = 0; j < map->list[sd->bl.m].zone->disabled_items_count; j++) {
+ if (map->list[sd->bl.m].zone->disabled_items[j] == sd->status.inventory[i].card[slot]) {
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_FORCE);
calc_flag = 1;
}
}
@@ -9709,9 +10065,9 @@ int pc_divorce(struct map_session_data *sd)
for( i = 0; i < MAX_INVENTORY; i++ )
{
if( sd->status.inventory[i].nameid == WEDDING_RING_M || sd->status.inventory[i].nameid == WEDDING_RING_F )
- pc->delitem(sd, i, 1, 0, 0, LOG_TYPE_OTHER);
+ pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_OTHER);
if( p_sd->status.inventory[i].nameid == WEDDING_RING_M || p_sd->status.inventory[i].nameid == WEDDING_RING_F )
- pc->delitem(p_sd, i, 1, 0, 0, LOG_TYPE_OTHER);
+ pc->delitem(p_sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_OTHER);
}
clif->divorced(sd, p_sd->status.name);
@@ -10477,8 +10833,8 @@ int pc_readdb(void) {
// Reset then read attr_fix
for(i=0;i<4;i++)
- for(j=0;j<ELE_MAX;j++)
- for(k=0;k<ELE_MAX;k++)
+ for ( j = ELE_NEUTRAL; j<ELE_MAX; j++ )
+ for ( k = ELE_NEUTRAL; k<ELE_MAX; k++ )
battle->attr_fix_table[i][j][k]=100;
sprintf(line, "%s/"DBPATH"attr_fix.txt", map->db_path);
@@ -10505,13 +10861,13 @@ int pc_readdb(void) {
lv=atoi(split[0]);
n=atoi(split[1]);
count++;
- for(i=0;i<n && i<ELE_MAX;){
+ for ( i = ELE_NEUTRAL; i<n && i<ELE_MAX; ) {
if( !fgets(line, sizeof(line), fp) )
break;
if(line[0]=='/' && line[1]=='/')
continue;
- for(j=0,p=line;j<n && j<ELE_MAX && p;j++){
+ for ( j = ELE_NEUTRAL, p = line; j<n && j<ELE_MAX && p; j++ ) {
while(*p==32 && *p>0)
p++;
battle->attr_fix_table[lv-1][i][j]=atoi(p);
@@ -10639,15 +10995,15 @@ void pc_bank_deposit(struct map_session_data *sd, int money) {
void pc_bank_withdraw(struct map_session_data *sd, int money) {
unsigned int limit_check = money+sd->status.zeny;
- if( money <= 0 ) {
+ if (money <= 0) {
clif->bank_withdraw(sd,BWA_UNKNOWN_ERROR);
return;
- } else if ( money > sd->status.bank_vault ) {
+ } else if (money > sd->status.bank_vault) {
clif->bank_withdraw(sd,BWA_NO_MONEY);
return;
- } else if ( limit_check > MAX_ZENY ) {
+ } else if (limit_check > MAX_ZENY) {
/* no official response for this scenario exists. */
- clif->colormes(sd->fd,COLOR_RED,msg_sd(sd,1482));
+ clif->messagecolor_self(sd->fd, COLOR_RED, msg_sd(sd,1482));
return;
}
@@ -11247,6 +11603,7 @@ void pc_defaults(void) {
pc->addfame = pc_addfame;
pc->famerank = pc_famerank;
pc->set_hate_mob = pc_set_hate_mob;
+ pc->getmaxspiritball = pc_getmaxspiritball;
pc->readdb = pc_readdb;
pc->map_day_timer = map_day_timer; // by [yor]
diff --git a/src/map/pc.h b/src/map/pc.h
index c3bf1e4cc..8a110a6d1 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -29,7 +29,8 @@
#define MAX_PC_BONUS 10
#define MAX_PC_SKILL_REQUIRE 5
#define MAX_PC_FEELHATE 3
-#define PVP_CALCRANK_INTERVAL 1000 // PVP calculation interval
+#define MAX_PC_DEVOTION 5 ///< Max amount of devotion targets
+#define PVP_CALCRANK_INTERVAL 1000 ///< PVP calculation interval
//Equip indexes constants. (eg: sd->equip_index[EQI_AMMO] returns the index
//where the arrows are equipped)
@@ -57,6 +58,20 @@ enum equip_index {
EQI_SHADOW_ACC_L,
EQI_MAX
};
+
+enum pc_unequipitem_flag {
+ PCUNEQUIPITEM_NONE = 0x0, ///< Just unequip
+ PCUNEQUIPITEM_RECALC = 0x1, ///< Recalculate status after unequipping
+ PCUNEQUIPITEM_FORCE = 0x2, ///< Force unequip
+};
+
+enum pc_resetskill_flag {
+ PCRESETSKILL_NONE = 0x0,
+ PCRESETSKILL_RESYNC = 0x1, // perform block resync and status_calc call
+ PCRESETSKILL_RECOUNT = 0x2, // just count total amount of skill points used by player, do not really reset
+ PCRESETSKILL_CHSEX = 0x4, // just reset the skills if the player class is a bard/dancer type (for changesex.)
+};
+
struct weapon_data {
int atkmods[3];
BEGIN_ZEROED_BLOCK; // all the variables within this block get zero'ed in each call of status_calc_pc
@@ -144,7 +159,7 @@ struct map_session_data {
unsigned int arrow_atk : 1;
unsigned int gangsterparadise : 1;
unsigned int rest : 1;
- unsigned int storage_flag : 2; //0: closed, 1: Normal Storage open, 2: guild storage open [Skotlex]
+ unsigned int storage_flag : 2; // @see enum storage_flag
unsigned int snovice_dead_flag : 1; //Explosion spirits on death: 0 off, 1 used.
unsigned int abra_flag : 2; // Abracadabra bugfix by Aru
unsigned int autocast : 1; // Autospell flag [Inkfish]
@@ -377,7 +392,7 @@ END_ZEROED_BLOCK;
unsigned char mission_count; //Stores the bounty kill count for TK_MISSION
short mission_mobid; //Stores the target mob_id for TK_MISSION
int die_counter; //Total number of times you've died
- int devotion[5]; //Stores the account IDs of chars devoted to.
+ int devotion[MAX_PC_DEVOTION]; //Stores the account IDs of chars devoted to.
int trade_partner;
struct {
struct {
@@ -409,11 +424,11 @@ END_ZEROED_BLOCK;
struct mercenary_data *md;
struct elemental_data *ed;
- struct{
+ struct {
int m; //-1 - none, other: map index corresponding to map name.
unsigned short index; //map index
- } feel_map[3];// 0 - Sun; 1 - Moon; 2 - Stars
- short hate_mob[3];
+ } feel_map[MAX_PC_FEELHATE];// 0 - Sun; 1 - Moon; 2 - Stars
+ short hate_mob[MAX_PC_FEELHATE];
int pvp_timer;
short pvp_point;
@@ -727,6 +742,16 @@ enum e_pc_autotrade_update_action {
};
/**
+ * Flag values for pc->skill
+ */
+enum pc_skill_flag {
+ SKILL_GRANT_PERMANENT = 0, // Grant permanent skill to be bound to skill tree
+ SKILL_GRANT_TEMPORARY = 1, // Grant an item skill (temporary)
+ SKILL_GRANT_TEMPSTACK = 2, // Like 1, except the level granted can stack with previously learned level.
+ SKILL_GRANT_UNCONDITIONAL = 3, // Grant skill unconditionally and forever (persistent to job changes and skill resets)
+};
+
+/**
* Used to temporarily remember vending data
**/
struct autotrade_vending {
@@ -957,6 +982,7 @@ END_ZEROED_BLOCK; /* End */
int (*addspiritball) (struct map_session_data *sd,int interval,int max);
int (*delspiritball) (struct map_session_data *sd,int count,int type);
+ int (*getmaxspiritball) (struct map_session_data *sd, int min);
void (*addfame) (struct map_session_data *sd,int count);
unsigned char (*famerank) (int char_id, int job);
int (*set_hate_mob) (struct map_session_data *sd, int pos, struct block_list *bl);
diff --git a/src/map/pet.c b/src/map/pet.c
index 52a8017b4..8160f88b0 100644
--- a/src/map/pet.c
+++ b/src/map/pet.c
@@ -91,7 +91,7 @@ int pet_unlocktarget(struct pet_data *pd)
pd->target_id=0;
pet_stop_attack(pd);
- pet_stop_walking(pd,1);
+ pet_stop_walking(pd, STOPWALKING_FLAG_FIXPOS);
return 0;
}
@@ -280,7 +280,7 @@ int pet_performance(struct map_session_data *sd, struct pet_data *pd)
else
val = 1;
- pet_stop_walking(pd,2000<<8);
+ pet_stop_walking(pd,STOPWALKING_FLAG_NONE | (2000<<8)); // Stop walking for 2000ms
clif->send_petdata(NULL, pd, 4, rnd()%val + 1);
pet->lootitem_drop(pd,NULL);
return 1;
@@ -445,7 +445,7 @@ int pet_recv_petdata(int account_id,struct s_pet *p,int flag) {
return 1;
}
if (!pet->birth_process(sd,p)) //Pet hatched. Delete egg.
- pc->delitem(sd,i,1,0,0,LOG_TYPE_OTHER);
+ pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_OTHER);
} else {
pet->data_init(sd,p);
if(sd->pd && sd->bl.prev != NULL) {
@@ -678,7 +678,7 @@ int pet_equipitem(struct map_session_data *sd,int index) {
return 1;
}
- pc->delitem(sd,index,1,0,0,LOG_TYPE_OTHER);
+ pc->delitem(sd, index, 1, 0, DELITEM_NORMAL, LOG_TYPE_OTHER);
pd->pet.equip = nameid;
status->set_viewdata(&pd->bl, pd->pet.class_); //Updates view_data.
clif->send_petdata(NULL, sd->pd, 3, sd->pd->vd.head_bottom);
@@ -743,7 +743,7 @@ int pet_food(struct map_session_data *sd, struct pet_data *pd) {
clif->pet_food(sd, food_id, 0);
return 1;
}
- pc->delitem(sd,i,1,0,0,LOG_TYPE_CONSUME);
+ pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME);
if (pd->pet.hungry > 90) {
pet->set_intimate(pd, pd->pet.intimate - pd->petDB->r_full);
@@ -1144,7 +1144,7 @@ int pet_skill_support_timer(int tid, int64 tick, int id, intptr_t data) {
}
pet_stop_attack(pd);
- pet_stop_walking(pd,1);
+ pet_stop_walking(pd, STOPWALKING_FLAG_FIXPOS);
pd->s_skill->timer=timer->add(tick+pd->s_skill->delay*1000,pet->skill_support_timer,sd->bl.id,0);
if (skill->get_inf(pd->s_skill->id) & INF_GROUND_SKILL)
unit->skilluse_pos(&pd->bl, sd->bl.x, sd->bl.y, pd->s_skill->id, pd->s_skill->lv);
diff --git a/src/map/script.c b/src/map/script.c
index 1559a2cfa..724b3b135 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -7444,7 +7444,7 @@ void buildin_delitem_delete(struct map_session_data* sd, int idx, int* amount, b
{// delete associated pet
intif->delete_petdata(MakeDWord(inv->card[1], inv->card[2]));
}
- pc->delitem(sd, idx, delamount, 0, 0, LOG_TYPE_SCRIPT);
+ pc->delitem(sd, idx, delamount, 0, DELITEM_NORMAL, LOG_TYPE_SCRIPT);
}
amount[0]-= delamount;
@@ -8492,10 +8492,10 @@ BUILDIN(successrefitem)
sd->status.inventory[i].refine += up;
sd->status.inventory[i].refine = cap_value( sd->status.inventory[i].refine, 0, MAX_REFINE);
- pc->unequipitem(sd,i,2); // status calc will happen in pc->equipitem() below
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_FORCE); // status calc will happen in pc->equipitem() below
clif->refine(sd->fd,0,i,sd->status.inventory[i].refine);
- clif->delitem(sd,i,1,3);
+ clif->delitem(sd, i, 1, DELITEM_MATERIALCHANGE);
//Logs items, got from (N)PC scripts [Lupus]
logs->pick_pc(sd, LOG_TYPE_SCRIPT, 1, &sd->status.inventory[i],sd->inventory_data[i]);
@@ -8541,10 +8541,10 @@ BUILDIN(failedrefitem)
i=pc->checkequip(sd,script->equip[num-1]);
if(i >= 0) {
sd->status.inventory[i].refine = 0;
- pc->unequipitem(sd,i,3); //recalculate bonus
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE); //recalculate bonus
clif->refine(sd->fd,1,i,sd->status.inventory[i].refine); //notify client of failure
- pc->delitem(sd,i,1,0,2,LOG_TYPE_SCRIPT);
+ pc->delitem(sd, i, 1, 0, DELITEM_FAILREFINE, LOG_TYPE_SCRIPT);
clif->misceffect(&sd->bl,2); // display failure effect
}
@@ -8575,12 +8575,12 @@ BUILDIN(downrefitem)
//Logs items, got from (N)PC scripts [Lupus]
logs->pick_pc(sd, LOG_TYPE_SCRIPT, -1, &sd->status.inventory[i],sd->inventory_data[i]);
- pc->unequipitem(sd,i,2); // status calc will happen in pc->equipitem() below
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_FORCE); // status calc will happen in pc->equipitem() below
sd->status.inventory[i].refine -= down;
sd->status.inventory[i].refine = cap_value( sd->status.inventory[i].refine, 0, MAX_REFINE);
clif->refine(sd->fd,2,i,sd->status.inventory[i].refine);
- clif->delitem(sd,i,1,3);
+ clif->delitem(sd, i, 1, DELITEM_MATERIALCHANGE);
//Logs items, got from (N)PC scripts [Lupus]
logs->pick_pc(sd, LOG_TYPE_SCRIPT, 1, &sd->status.inventory[i],sd->inventory_data[i]);
@@ -8609,8 +8609,8 @@ BUILDIN(delequip)
if (num > 0 && num <= ARRAYLENGTH(script->equip))
i=pc->checkequip(sd,script->equip[num-1]);
if(i >= 0) {
- pc->unequipitem(sd,i,3); //recalculate bonus
- pc->delitem(sd,i,1,0,2,LOG_TYPE_SCRIPT);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE); //recalculate bonus
+ pc->delitem(sd, i, 1, 0, DELITEM_FAILREFINE, LOG_TYPE_SCRIPT);
return true;
}
@@ -8866,7 +8866,7 @@ BUILDIN(autobonus3) {
BUILDIN(skill) {
int id;
int level;
- int flag = 1;
+ int flag = SKILL_GRANT_TEMPORARY;
TBL_PC* sd;
sd = script->rid2sd(st);
@@ -8894,7 +8894,7 @@ BUILDIN(skill) {
BUILDIN(addtoskill) {
int id;
int level;
- int flag = 2;
+ int flag = SKILL_GRANT_TEMPSTACK;
TBL_PC* sd;
sd = script->rid2sd(st);
@@ -9739,8 +9739,7 @@ BUILDIN(monster)
if (script_hasdata(st, 10))
{
ai = script_getnum(st, 10);
- if (ai > 4)
- {
+ if (ai > AI_FLORA) {
ShowWarning("buildin_monster: Attempted to spawn non-existing ai %d for monster class %d\n", ai, class_);
return false;
}
@@ -9844,7 +9843,7 @@ BUILDIN(areamonster) {
if (script_hasdata(st, 12)) {
ai = script_getnum(st, 12);
- if (ai > 4) {
+ if (ai > AI_FLORA) {
ShowWarning("buildin_monster: Attempted to spawn non-existing ai %d for monster class %d\n", ai, class_);
return false;
}
@@ -11014,7 +11013,7 @@ BUILDIN(homunculus_mutate)
if (m_class == HT_EVO && m_id == HT_S &&
sd->hd->homunculus.level >= 99 && i != INDEX_NOT_FOUND &&
- !pc->delitem(sd, i, 1, 0, 0, LOG_TYPE_SCRIPT) ) {
+ !pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_SCRIPT) ) {
sd->hd->homunculus.vaporize = HOM_ST_REST; // Remove morph state.
homun->call(sd); // Respawn homunculus.
homun->mutate(sd->hd, homun_id);
@@ -11195,26 +11194,24 @@ BUILDIN(resetstatus)
/*==========================================
* script command resetskill
*------------------------------------------*/
-BUILDIN(resetskill)
-{
+BUILDIN(resetskill) {
TBL_PC *sd;
sd=script->rid2sd(st);
if( sd == NULL )
return false;
- pc->resetskill(sd,1);
+ pc->resetskill(sd, PCRESETSKILL_RESYNC);
return true;
}
/*==========================================
* Counts total amount of skill points.
*------------------------------------------*/
-BUILDIN(skillpointcount)
-{
+BUILDIN(skillpointcount) {
TBL_PC *sd;
sd=script->rid2sd(st);
if( sd == NULL )
return false;
- script_pushint(st,sd->status.skill_point + pc->resetskill(sd,2));
+ script_pushint(st,sd->status.skill_point + pc->resetskill(sd, PCRESETSKILL_RECOUNT));
return true;
}
@@ -11256,10 +11253,10 @@ static TBL_PC *prepareChangeSex(struct script_state* st)
if (sd == NULL)
return NULL;
- pc->resetskill(sd, 4);
+ pc->resetskill(sd, PCRESETSKILL_CHSEX);
// to avoid any problem with equipment and invalid sex, equipment is unequiped.
for (i=0; i<EQI_MAX; i++)
- if (sd->equip_index[i] >= 0) pc->unequipitem(sd, sd->equip_index[i], 3);
+ if (sd->equip_index[i] >= 0) pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
return sd;
}
@@ -12312,7 +12309,7 @@ BUILDIN(successremovecards)
for (j = sd->inventory_data[i]->slot; j < MAX_SLOTS; j++)
item_tmp.card[j]=sd->status.inventory[i].card[j];
- pc->delitem(sd,i,1,0,3,LOG_TYPE_SCRIPT);
+ pc->delitem(sd, i, 1, 0, DELITEM_MATERIALCHANGE, LOG_TYPE_SCRIPT);
if ((flag=pc->additem(sd,&item_tmp,1,LOG_TYPE_SCRIPT))) {
//chk if can be spawn in inventory otherwise put on floor
clif->additem(sd,0,0,flag);
@@ -12374,7 +12371,7 @@ BUILDIN(failedremovecards)
if (cardflag == 1) {
if (typefail == 0 || typefail == 2) {
// destroy the item
- pc->delitem(sd,i,1,0,2,LOG_TYPE_SCRIPT);
+ pc->delitem(sd, i, 1, 0, DELITEM_FAILREFINE, LOG_TYPE_SCRIPT);
} else if (typefail == 1) {
// destroy the card
int flag, j;
@@ -12392,7 +12389,7 @@ BUILDIN(failedremovecards)
for (j = sd->inventory_data[i]->slot; j < MAX_SLOTS; j++)
item_tmp.card[j]=sd->status.inventory[i].card[j];
- pc->delitem(sd,i,1,0,2,LOG_TYPE_SCRIPT);
+ pc->delitem(sd, i, 1, 0, DELITEM_FAILREFINE, LOG_TYPE_SCRIPT);
if((flag=pc->additem(sd,&item_tmp,1,LOG_TYPE_SCRIPT))) {
clif->additem(sd,0,0,flag);
@@ -13086,7 +13083,7 @@ BUILDIN(clearitem)
if(sd==NULL) return true;
for (i=0; i<MAX_INVENTORY; i++) {
if (sd->status.inventory[i].amount) {
- pc->delitem(sd, i, sd->status.inventory[i].amount, 0, 0, LOG_TYPE_SCRIPT);
+ pc->delitem(sd, i, sd->status.inventory[i].amount, 0, DELITEM_NORMAL, LOG_TYPE_SCRIPT);
}
}
return true;
@@ -13515,7 +13512,7 @@ BUILDIN(nude)
if( sd->equip_index[ i ] >= 0 ) {
if( !calcflag )
calcflag = 1;
- pc->unequipitem( sd , sd->equip_index[ i ] , 2);
+ pc->unequipitem(sd, sd->equip_index[i], PCUNEQUIPITEM_FORCE);
}
}
@@ -13862,7 +13859,7 @@ BUILDIN(npcstop) {
if( nd ) {
unit->bl2ud2(&nd->bl); // ensure nd->ud is safe to edit
- unit->stop_walking(&nd->bl,1|4);
+ unit->stop_walking(&nd->bl, STOPWALKING_FLAG_FIXPOS|STOPWALKING_FLAG_NEXTCELL);
}
return true;
@@ -14487,7 +14484,7 @@ BUILDIN(unequip)
if (sd != NULL && num >= 1 && num <= ARRAYLENGTH(script->equip)) {
int i = pc->checkequip(sd,script->equip[num-1]);
if (i >= 0)
- pc->unequipitem(sd,i,1|2);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
}
return true;
}
@@ -15493,6 +15490,14 @@ BUILDIN(compare)
return true;
}
+BUILDIN(strcmp)
+{
+ const char *str1 = script_getstr(st,2);
+ const char *str2 = script_getstr(st,3);
+ script_pushint(st,strcmp(str1, str2));
+ return true;
+}
+
// List of mathematics commands --->
BUILDIN(log10)
@@ -16469,7 +16474,7 @@ BUILDIN(unitstop) {
if( bl != NULL ) {
unit->bl2ud2(bl); // ensure ((TBL_NPC*)bl)->ud is safe to edit
unit->stop_attack(bl);
- unit->stop_walking(bl,4);
+ unit->stop_walking(bl, STOPWALKING_FLAG_NEXTCELL);
if( bl->type == BL_MOB )
((TBL_MOB*)bl)->target_id = 0;
}
@@ -17395,7 +17400,7 @@ BUILDIN(bg_monster_set_team) {
md->bg_id = bg_id;
mob_stop_attack(md);
- mob_stop_walking(md, 0);
+ mob_stop_walking(md, STOPWALKING_FLAG_NONE);
md->target_id = md->attacked_id = 0;
clif->charnameack(0, &md->bl);
@@ -20079,6 +20084,7 @@ void script_parse_builtin(void) {
BUILDIN_DEF(countstr,"ss?"),
BUILDIN_DEF(setnpcdisplay,"sv??"),
BUILDIN_DEF(compare,"ss"), // Lordalfa - To bring strstr to scripting Engine.
+ BUILDIN_DEF(strcmp,"ss"),
BUILDIN_DEF(getiteminfo,"ii"), //[Lupus] returns Items Buy / sell Price, etc info
BUILDIN_DEF(setiteminfo,"iii"), //[Lupus] set Items Buy / sell Price, etc info
BUILDIN_DEF(getequipcardid,"ii"), //[Lupus] returns CARD ID or other info from CARD slot N of equipped item
diff --git a/src/map/skill.c b/src/map/skill.c
index 58dbe2472..b39ea380f 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -99,7 +99,7 @@ int skill_get_index( uint16 skill_id ) {
skill_id = MC_SKILLRANGEMIN + skill_id - MC_SKILLBASE;
else if( skill_id >= HM_SKILLBASE )
skill_id = HM_SKILLRANGEMIN + skill_id - HM_SKILLBASE;
- //[Ind/Hercules] GO GO GO LESS! - http://hercules.ws/board/topic/512-skill-id-processing-overhaul/
+ //[Ind/Hercules] GO GO GO LESS! - http://herc.ws/board/topic/512-skill-id-processing-overhaul/
else if( skill_id > 1019 && skill_id < 8001 ) {
if( skill_id < 2058 ) // 1020 - 2000 are empty
skill_id = 1020 + skill_id - 2001;
@@ -1367,7 +1367,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
break;
}
- if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai) {
+ if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai != AI_NONE) {
//Pass heritage to Master for status causing effects. [Skotlex]
sd = map->id2sd(md->master_id);
src = sd?&sd->bl:src;
@@ -2013,7 +2013,7 @@ int skill_break_equip (struct block_list *bl, unsigned short where, int rate, in
}
if (flag) {
sd->status.inventory[j].attribute = 1;
- pc->unequipitem(sd, j, 3);
+ pc->unequipitem(sd, j, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
}
}
clif->equiplist(sd);
@@ -2232,7 +2232,8 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
if( dmg.flag&BF_MAGIC
&& (skill_id != NPC_EARTHQUAKE || (battle_config.eq_single_target_reflectable && (flag & 0xFFF) == 1)) ) { /* Need more info cause NPC_EARTHQUAKE is ground type */
// Earthquake on multiple targets is not counted as a target skill. [Inkfish]
- if( (dmg.damage || dmg.damage2) && (type = skill->magic_reflect(src, bl, src==dsrc)) ) {
+ int reflecttype;
+ if( (dmg.damage || dmg.damage2) && (reflecttype = skill->magic_reflect(src, bl, src==dsrc)) ) {
//Magic reflection, switch caster/target
struct block_list *tbl = bl;
rmdamage = true;
@@ -2249,17 +2250,17 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
/* bugreport:7859 magical reflected zeroes blow count */
dmg.blewcount = 0;
//Spirit of Wizard blocks Kaite's reflection
- if (type == 2 && sc && sc->data[SC_SOULLINK] && sc->data[SC_SOULLINK]->val2 == SL_WIZARD) {
+ if (reflecttype == 2 && sc && sc->data[SC_SOULLINK] && sc->data[SC_SOULLINK]->val2 == SL_WIZARD) {
//Consume one Fragment per hit of the casted skill? [Skotlex]
- type = tsd ? pc->search_inventory(tsd, ITEMID_FRAGMENT_OF_CRYSTAL) : 0;
- if (type != INDEX_NOT_FOUND) {
- if ( tsd ) pc->delitem(tsd, type, 1, 0, 1, LOG_TYPE_CONSUME);
+ int consumeitem = tsd ? pc->search_inventory(tsd, ITEMID_FRAGMENT_OF_CRYSTAL) : 0;
+ if (consumeitem != INDEX_NOT_FOUND) {
+ if ( tsd ) pc->delitem(tsd, consumeitem, 1, 0, DELITEM_SKILLUSE, LOG_TYPE_CONSUME);
dmg.damage = dmg.damage2 = 0;
dmg.dmg_lv = ATK_MISS;
sc->data[SC_SOULLINK]->val3 = skill_id;
sc->data[SC_SOULLINK]->val4 = dsrc->id;
}
- } else if( type != 2 ) /* Kaite bypasses */
+ } else if( reflecttype != 2 ) /* Kaite bypasses */
additional_effects = false;
/**
@@ -2272,7 +2273,7 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
#else
// issue:6415 in pre-renewal Kaite reflected the entire damage received
// regardless of caster's equipment (Aegis 11.1)
- if( dmg.dmg_lv != ATK_MISS && type == 1 ) //Wiz SL canceled and consumed fragment
+ if( dmg.dmg_lv != ATK_MISS && reflecttype == 1 ) //Wiz SL canceled and consumed fragment
#endif
{
short s_ele = skill->get_ele(skill_id, skill_lv);
@@ -2321,12 +2322,12 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
struct block_list *nbl;
nbl = battle->get_enemy_area(bl,bl->x,bl->y,2,BL_CHAR,bl->id);
if (nbl) { // Only one target is chosen.
- clif->skill_damage(bl, nbl, tick, status_get_amotion(src), 0, status_fix_damage(bl,nbl,damage * skill_lv / 10,0), 1, OB_OBOROGENSOU_TRANSITION_ATK, -1, 6);
+ clif->skill_damage(bl, nbl, tick, status_get_amotion(src), 0, status_fix_damage(bl,nbl,damage * skill_lv / 10,0), 1, OB_OBOROGENSOU_TRANSITION_ATK, -1, BDT_SKILL);
}
}
//Skill hit type
- type=(skill_id==0)?5:skill->get_hit(skill_id);
+ type=(skill_id==0)?BDT_SPLASH:skill->get_hit(skill_id);
if(damage < dmg.div_
//Only skills that knockback even when they miss. [Skotlex]
@@ -2335,7 +2336,7 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
if(skill_id == CR_GRANDCROSS||skill_id == NPC_GRANDDARKNESS) {
if(battle_config.gx_disptype) dsrc = src;
- if(src == bl) type = 4;
+ if(src == bl) type = BDT_ENDURE;
else flag|=SD_ANIMATION;
}
if(skill_id == NJ_TATAMIGAESHI) {
@@ -2441,7 +2442,7 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
//Display damage.
switch( skill_id ) {
case PA_GOSPEL: //Should look like Holy Cross [Skotlex]
- dmg.dmotion = clif->skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, 5);
+ dmg.dmotion = clif->skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, CR_HOLYCROSS, -1, BDT_SPLASH);
break;
//Skills that need be passed as a normal attack for the client to display correctly.
case HVAN_EXPLOSION:
@@ -2459,13 +2460,13 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
case AS_SPLASHER:
if( flag&SD_ANIMATION ) // the surrounding targets
- dmg.dmotion = clif->skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, 5); // needs -1 as skill level
+ dmg.dmotion = clif->skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, BDT_SPLASH); // needs -1 as skill level
else // the central target doesn't display an animation
- dmg.dmotion = clif->skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, 5); // needs -2(!) as skill level
+ dmg.dmotion = clif->skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, BDT_SPLASH); // needs -2(!) as skill level
break;
case WL_HELLINFERNO:
case SR_EARTHSHAKER:
- dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,-2,6);
+ dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,-2,BDT_SKILL);
break;
case KO_MUCHANAGE:
if( dmg.dmg_lv == ATK_FLEE )
@@ -2473,17 +2474,17 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
case WL_SOULEXPANSION:
case WL_COMET:
case NJ_HUUMA:
- dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,skill_lv,8);
+ dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,skill_lv,BDT_MULTIHIT);
break;
case WL_CHAINLIGHTNING_ATK:
- dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,WL_CHAINLIGHTNING,-2,6);
+ dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,WL_CHAINLIGHTNING,-2,BDT_SKILL);
break;
case LG_OVERBRAND_BRANDISH:
case LG_OVERBRAND:
/* Fall through */
dmg.amotion = status_get_amotion(src) * 2;
case LG_OVERBRAND_PLUSATK:
- dmg.dmotion = clif->skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,5);
+ dmg.dmotion = clif->skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,BDT_SPLASH);
break;
case EL_FIRE_BOMB:
case EL_FIRE_BOMB_ATK:
@@ -2506,29 +2507,29 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
case GN_CRAZYWEED_ATK:
case KO_BAKURETSU:
case NC_MAGMA_ERUPTION:
- dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,5);
+ dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,BDT_SPLASH);
break;
case GN_SLINGITEM_RANGEMELEEATK:
- dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,GN_SLINGITEM,-2,6);
+ dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,GN_SLINGITEM,-2,BDT_SKILL);
break;
case SC_FEINTBOMB:
- dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,skill_lv,5);
+ dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,skill_id,skill_lv,BDT_SPLASH);
break;
case EL_STONE_RAIN:
- dmg.dmotion = clif->skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?8:5);
+ dmg.dmotion = clif->skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?BDT_MULTIHIT:BDT_SPLASH);
break;
case WM_SEVERE_RAINSTORM_MELEE:
- dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,6);
+ dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,BDT_SPLASH);
break;
case WM_REVERBERATION_MELEE:
case WM_REVERBERATION_MAGIC:
- dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_REVERBERATION,-2,6);
+ dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_REVERBERATION,-2,BDT_SKILL);
break;
case WL_TETRAVORTEX_FIRE:
case WL_TETRAVORTEX_WATER:
case WL_TETRAVORTEX_WIND:
case WL_TETRAVORTEX_GROUND:
- dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_, WL_TETRAVORTEX,-1,5);
+ dmg.dmotion = clif->skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_, WL_TETRAVORTEX,-1,BDT_SPLASH);
break;
case HT_CLAYMORETRAP:
case HT_BLASTMINE:
@@ -2537,17 +2538,17 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
case RA_CLUSTERBOMB:
case RA_FIRINGTRAP:
case RA_ICEBOUNDTRAP:
- dmg.dmotion = clif->skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, 5);
+ dmg.dmotion = clif->skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, BDT_SPLASH);
if( dsrc != src ) // avoid damage display redundancy
break;
case HT_LANDMINE:
dmg.dmotion = clif->skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, type);
break;
case HW_GRAVITATION:
- dmg.dmotion = clif->damage(bl, bl, 0, 0, damage, 1, 4, 0);
+ dmg.dmotion = clif->damage(bl, bl, 0, 0, damage, 1, BDT_ENDURE, 0);
break;
case WZ_SIGHTBLASTER:
- dmg.dmotion = clif->skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, 5);
+ dmg.dmotion = clif->skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, BDT_SPLASH);
break;
case AB_DUPLELIGHT_MELEE:
case AB_DUPLELIGHT_MAGIC:
@@ -2629,6 +2630,7 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
tsd->status.skill[cidx].flag = SKILL_FLAG_PLAGIARIZED;
clif->addskill(tsd,copy_skill);
} else {
+ int plagiarismlvl;
lv = skill_lv;
if ( tsd->cloneskill_id ) {
idx = skill->get_index(tsd->cloneskill_id);
@@ -2640,8 +2642,8 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
}
}
- if ((type = pc->checkskill(tsd,RG_PLAGIARISM)) < lv)
- lv = type;
+ if ((plagiarismlvl = pc->checkskill(tsd,RG_PLAGIARISM)) < lv)
+ lv = plagiarismlvl;
tsd->cloneskill_id = copy_skill;
pc_setglobalreg(tsd, script->add_str("CLONE_SKILL"), copy_skill);
@@ -2757,12 +2759,12 @@ int skill_attack(int attack_type, struct block_list* src, struct block_list *dsr
) && check_distance_bl(bl, d_bl, sce->val3) )
{
if(!rmdamage){
- clif->damage(d_bl,d_bl, 0, 0, damage, 0, 0, 0);
+ clif->damage(d_bl,d_bl, 0, 0, damage, 0, BDT_NORMAL, 0);
status_fix_damage(NULL,d_bl, damage, 0);
} else{ //Reflected magics are done directly on the target not on paladin
//This check is only for magical skill.
//For BF_WEAPON skills types track var rdamage and function battle_calc_return_damage
- clif->damage(bl,bl, 0, 0, damage, 0, 0, 0);
+ clif->damage(bl,bl, 0, 0, damage, 0, BDT_NORMAL, 0);
status_fix_damage(bl,bl, damage, 0);
}
}
@@ -2856,11 +2858,11 @@ void skill_attack_combo2_unknown(int *attack_type, struct block_list* src, struc
void skill_attack_display_unknown(int *attack_type, struct block_list* src, struct block_list *dsrc, struct block_list *bl, uint16 *skill_id, uint16 *skill_lv, int64 *tick, int *flag, int *type, struct Damage *dmg, int64 *damage) {
if (*flag & SD_ANIMATION && dmg->div_ < 2) //Disabling skill animation doesn't works on multi-hit.
- *type = 5;
+ *type = BDT_SPLASH;
if (bl->type == BL_SKILL ) {
TBL_SKILL *su = (TBL_SKILL*)bl;
if (su->group && skill->get_inf2(su->group->skill_id) & INF2_TRAP) // show damage on trap targets
- clif->skill_damage(src, bl, *tick, dmg->amotion, dmg->dmotion, *damage, dmg->div_, *skill_id, (*flag & SD_LEVEL) ? -1 : *skill_lv, 5);
+ clif->skill_damage(src, bl, *tick, dmg->amotion, dmg->dmotion, *damage, dmg->div_, *skill_id, (*flag & SD_LEVEL) ? -1 : *skill_lv, BDT_SPLASH);
}
dmg->dmotion = clif->skill_damage(dsrc, bl, *tick, dmg->amotion, dmg->dmotion, *damage, dmg->div_, *skill_id, (*flag & SD_LEVEL) ? -1 : *skill_lv, *type);
}
@@ -2909,7 +2911,7 @@ int skill_area_sub(struct block_list *bl, va_list ap) {
if(battle->check_target(src,bl,flag) > 0) {
// several splash skills need this initial dummy packet to display correctly
if (flag&SD_PREAMBLE && skill->area_temp[2] == 0)
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
if (flag&(SD_SPLASH|SD_PREAMBLE))
skill->area_temp[2]++;
@@ -3154,7 +3156,7 @@ int skill_check_condition_mercenary(struct block_list *bl, int skill_id, int lv,
// Consume items
for (i = 0; i < ARRAYLENGTH(itemid); i++) {
if (index[i] != INDEX_NOT_FOUND)
- pc->delitem(sd, index[i], amount[i], 0, 1, LOG_TYPE_CONSUME);
+ pc->delitem(sd, index[i], amount[i], 0, DELITEM_SKILLUSE, LOG_TYPE_CONSUME);
}
if( type&2 )
@@ -3334,7 +3336,7 @@ int skill_timerskill(int tid, int64 tick, int id, intptr_t data) {
break;
case SC_ESCAPE:
if( skl->type < 4+skl->skill_lv ){
- clif->skill_damage(src,src,tick,0,0,-30000,1,skl->skill_id,skl->skill_lv,5);
+ clif->skill_damage(src,src,tick,0,0,-30000,1,skl->skill_id,skl->skill_lv,BDT_SPLASH);
skill->blown(src,src,1,unit->getdir(src),0);
skill->addtimerskill(src,tick+80,src->id,0,0,skl->skill_id,skl->skill_lv,skl->type+1,0);
}
@@ -3833,9 +3835,16 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
if( dir > 2 && dir < 6 ) y = -i;
else if( dir == 7 || dir < 2 ) y = i;
else y = 0;
- if( (mbl == src || (!map_flag_gvg2(src->m) && !map->list[src->m].flag.battleground) ) // only NJ_ISSEN don't have slide effect in GVG
- && unit->movepos(src, mbl->x+x, mbl->y+y, 1, 1)
- ) {
+ if ((mbl == src || (!map_flag_gvg2(src->m) && !map->list[src->m].flag.battleground))) { // only NJ_ISSEN don't have slide effect in GVG
+ if (!(unit->movepos(src, mbl->x+x, mbl->y+y, 1, 1))) {
+ // The cell is not reachable (wall, object, ...), move next to the target
+ if (x > 0) x = -1;
+ else if (x < 0) x = 1;
+ if (y > 0) y = -1;
+ else if (y < 0) y = 1;
+
+ unit->movepos(src, bl->x+x, bl->y+y, 1, 1);
+ }
clif->slide(src, src->x, src->y);
clif->fixpos(src);
clif->spiritball(src);
@@ -3933,7 +3942,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
/* Fall through */
case LG_MOONSLASHER:
case MH_XENO_SLASHER:
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
break;
default:
break;
@@ -4088,7 +4097,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
break;
case CH_PALMSTRIKE: // Palm Strike takes effect 1sec after casting. [Skotlex]
//clif->skill_nodamage(src,bl,skill_id,skill_lv,0); //Can't make this one display the correct attack animation delay :/
- clif->damage(src,bl,status_get_amotion(src),0,-1,1,4,0); //Display an absorbed damage attack.
+ clif->damage(src,bl,status_get_amotion(src),0,-1,1,BDT_ENDURE,0); //Display an absorbed damage attack.
skill->addtimerskill(src, tick + (1000+status_get_amotion(src)), bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag);
break;
@@ -4542,7 +4551,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER); // Need confirm it.
} else {
map->foreachinrange(skill->area_sub, bl, skill->get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill->castend_damage_id);
- clif->skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
if( sd ) pc->overheat(sd,1);
}
break;
@@ -4561,7 +4570,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
skill->area_temp[5] = y;
map->foreachinrange(skill->area_sub, bl, skill->get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill->castend_damage_id);
skill->addtimerskill(src,tick + 800,src->id,x,y,skill_id,skill_lv,0,flag); // To teleport Self
- clif->skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,6);
+ clif->skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,BDT_SKILL);
}
break;
case LG_PINPOINTATTACK:
@@ -4619,7 +4628,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
} else{
map->foreachinrange(skill->area_sub, bl, skill->get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill->castend_damage_id);
- clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
}
break;
@@ -4686,7 +4695,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
else {
int i = skill->get_splash(skill_id,skill_lv);
clif->skill_nodamage(src,battle->get_master(src),skill_id,skill_lv,1);
- clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
if( rnd()%100 < 30 )
map->foreachinrange(skill->area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill->castend_damage_id);
else
@@ -4696,7 +4705,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
case EL_ROCK_CRUSHER:
clif->skill_nodamage(src,battle->get_master(src),skill_id,skill_lv,1);
- clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
if( rnd()%100 < 50 )
skill->attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);
else
@@ -4709,7 +4718,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
else {
int i = skill->get_splash(skill_id,skill_lv);
clif->skill_nodamage(src,battle->get_master(src),skill_id,skill_lv,1);
- clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
if( rnd()%100 < 30 )
map->foreachinrange(skill->area_sub,bl,i,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill->castend_damage_id);
else
@@ -4722,7 +4731,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
case EL_WIND_SLASH:
case EL_STONE_HAMMER:
clif->skill_nodamage(src,battle->get_master(src),skill_id,skill_lv,1);
- clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
skill->attack(skill->get_type(skill_id),src,src,bl,skill_id,skill_lv,tick,flag);
break;
@@ -4735,7 +4744,7 @@ int skill_castend_damage_id(struct block_list* src, struct block_list *bl, uint1
type2 = type-1;
clif->skill_nodamage(src,battle->get_master(src),skill_id,skill_lv,1);
- clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
if( (esc && esc->data[type2]) || (tsc && tsc->data[type]) ) {
elemental->clean_single_effect(ele, skill_id);
}
@@ -5038,7 +5047,7 @@ int skill_castend_id(int tid, int64 tick, int id, intptr_t data) {
}
if (ud->walktimer != INVALID_TIMER && ud->skill_id != TK_RUN && ud->skill_id != RA_WUGDASH)
- unit->stop_walking(src,1);
+ unit->stop_walking(src, STOPWALKING_FLAG_FIXPOS);
if( !sd || sd->skillitem != ud->skill_id || skill->get_delay(ud->skill_id,ud->skill_lv) )
ud->canact_tick = tick + skill->delay_fix(src, ud->skill_id, ud->skill_lv); // Tests show wings don't overwrite the delay but skill scrolls do. [Inkfish]
@@ -6098,7 +6107,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
}
i = 0;
- count = (sd)? min(skill_lv,5) : 1; // Mercenary only can Devote owner
+ count = (sd)? min(skill_lv,MAX_PC_DEVOTION) : 1; // Mercenary only can Devote owner
if( sd )
{ // Player Devoting Player
ARR_FIND(0, count, i, sd->devotion[i] == bl->id );
@@ -6126,22 +6135,17 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
case MO_CALLSPIRITS:
if(sd) {
- int limit = skill_lv;
- if( sd->sc.data[SC_RAISINGDRAGON] )
- limit += sd->sc.data[SC_RAISINGDRAGON]->val1;
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
- pc->addspiritball(sd,skill->get_time(skill_id,skill_lv),limit);
+ pc->addspiritball(sd, skill->get_time(skill_id, skill_lv), pc->getmaxspiritball(sd, 0));
}
break;
case CH_SOULCOLLECT:
if(sd) {
- int limit = 5, i;
- if( sd->sc.data[SC_RAISINGDRAGON] )
- limit += sd->sc.data[SC_RAISINGDRAGON]->val1;
+ int i, limit = pc->getmaxspiritball(sd, 5);
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
- for (i = 0; i < limit; i++)
- pc->addspiritball(sd,skill->get_time(skill_id,skill_lv),limit);
+ for ( i = 0; i < limit; i++ )
+ pc->addspiritball(sd, skill->get_time(skill_id, skill_lv), limit);
}
break;
@@ -6233,7 +6237,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
count = map->foreachinrange(skill->area_sub, bl, skill->get_splash(skill_id, skill_lv), splash_target(src),
src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill->castend_damage_id);
if( !count && ( skill_id == NC_AXETORNADO || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) )
- clif->skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
}
break;
@@ -6285,7 +6289,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
{
//Self Destruction hits everyone in range (allies+enemies)
//Except for Summoned Marine spheres on non-versus maps, where it's just enemy.
- int targetmask = ((!md || md->special_state.ai == 2) && !map_flag_vs(src->m))?
+ int targetmask = ((!md || md->special_state.ai == AI_SPHERE) && !map_flag_vs(src->m))?
BCT_ENEMY:BCT_ALL;
clif->skill_nodamage(src, src, skill_id, -1, 1);
map->delblock(src); //Required to prevent chain-self-destructions hitting back.
@@ -7710,7 +7714,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
case 3: // 1000 damage, random armor destroyed
{
status_fix_damage(src, bl, 1000, 0);
- clif->damage(src,bl,0,0,1000,0,0,0);
+ clif->damage(src,bl,0,0,1000,0,BDT_NORMAL,0);
if( !status->isdead(bl) ) {
int where[] = { EQP_ARMOR, EQP_SHIELD, EQP_HELM, EQP_SHOES, EQP_GARMENT };
skill->break_equip(bl, where[rnd()%5], 10000, BCT_ENEMY);
@@ -7747,14 +7751,14 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
break;
case 10: // 6666 damage, atk matk halved, cursed
status_fix_damage(src, bl, 6666, 0);
- clif->damage(src,bl,0,0,6666,0,0,0);
+ clif->damage(src,bl,0,0,6666,0,BDT_NORMAL,0);
sc_start(src,bl,SC_INCATKRATE,100,-50,skill->get_time2(skill_id,skill_lv));
sc_start(src,bl,SC_INCMATKRATE,100,-50,skill->get_time2(skill_id,skill_lv));
sc_start(src,bl,SC_CURSE,skill_lv,100,skill->get_time2(skill_id,skill_lv));
break;
case 11: // 4444 damage
status_fix_damage(src, bl, 4444, 0);
- clif->damage(src,bl,0,0,4444,0,0,0);
+ clif->damage(src,bl,0,0,4444,0,BDT_NORMAL,0);
break;
case 12: // stun
sc_start(src,bl,SC_STUN,100,skill_lv,5000);
@@ -8132,7 +8136,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
case LG_EARTHDRIVE:
{
int splash;
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
splash = skill->get_splash(skill_id,skill_lv);
if( skill_id == LG_EARTHDRIVE ) {
int dummy = 1;
@@ -8313,7 +8317,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
case GC_PHANTOMMENACE:
{
int r;
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
r = skill->get_splash(skill_id, skill_lv);
map->foreachinrange(skill->area_sub,src,skill->get_splash(skill_id,skill_lv),BL_CHAR,
@@ -8609,7 +8613,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
* Ranger
**/
case RA_FEARBREEZE:
- clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
clif->skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv, skill->get_time(skill_id, skill_lv)));
break;
@@ -8650,7 +8654,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
case RA_SENSITIVEKEEN:
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
- clif->skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
map->foreachinrange(skill->area_sub,src,skill->get_splash(skill_id,skill_lv),BL_CHAR|BL_SKILL,src,skill_id,skill_lv,tick,flag|BCT_ENEMY,skill->castend_damage_id);
break;
/**
@@ -8677,7 +8681,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
break;
case NC_ANALYZE:
- clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
clif->skill_nodamage(src, bl, skill_id, skill_lv,
sc_start(src,bl,type, 30 + 12 * skill_lv,skill_lv,skill->get_time(skill_id,skill_lv)));
if( sd ) pc->overheat(sd,1);
@@ -8689,7 +8693,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
if( (failure = sc_start2(src,bl,type,100,skill_lv,src->id,skill->get_time(skill_id,skill_lv))) )
{
map->foreachinrange(skill->area_sub,src,skill->get_splash(skill_id,skill_lv),splash_target(src),src,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_SPLASH|1,skill->castend_damage_id);;
- clif->skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,6);
+ clif->skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,BDT_SKILL);
if (sd) pc->overheat(sd,1);
}
clif->skill_nodamage(src,src,skill_id,skill_lv,failure);
@@ -8809,7 +8813,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
break;
case LG_TRAMPLE:
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
map->foreachinrange(skill->destroy_trap,bl,skill->get_splash(skill_id,skill_lv),BL_SKILL,tick);
break;
@@ -8847,7 +8851,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
switch( opt ) {
case 1:
sc_start(src,bl,SC_SHIELDSPELL_DEF,100,opt,INVALID_TIMER); //Splash AoE ATK
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
map->foreachinrange(skill->area_sub,src,splashrange,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill->castend_damage_id);
status_change_end(bl,SC_SHIELDSPELL_DEF,INVALID_TIMER);
break;
@@ -8874,13 +8878,13 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
switch( opt ) {
case 1:
sc_start(src,bl,SC_SHIELDSPELL_MDEF,100,opt,INVALID_TIMER); //Splash AoE MATK
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
map->foreachinrange(skill->area_sub,src,splashrange,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill->castend_damage_id);
status_change_end(bl,SC_SHIELDSPELL_MDEF,INVALID_TIMER);
break;
case 2:
sc_start(src,bl,SC_SHIELDSPELL_MDEF,100,opt,sd->bonus.shieldmdef * 2000); //Splash AoE Lex Divina
- clif->skill_damage(src,bl,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,6);
+ clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
map->foreachinrange(skill->area_sub,src,splashrange,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill->castend_nodamage_id);
break;
case 3:
@@ -8993,7 +8997,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
}
} else {
int count = 0;
- clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
count = map->forcountinrange(skill->area_sub, src, skill->get_splash(skill_id,skill_lv), (sd)?sd->spiritball_old:15, // Assume 15 spiritballs in non-characters
BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill->castend_nodamage_id);
if( sd ) pc->delspiritball(sd, count, 0);
@@ -9003,13 +9007,14 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
break;
case SR_RAISINGDRAGON:
- if( sd ) {
- short max = 5 + skill_lv;
- int i;
+ if ( sd ) {
+ int i, max;
sc_start(src, bl, SC_EXPLOSIONSPIRITS, 100, skill_lv, skill->get_time(skill_id, skill_lv));
- for( i = 0; i < max; i++ ) // Don't call more than max available spheres.
- pc->addspiritball(sd, skill->get_time(skill_id, skill_lv), max);
- clif->skill_nodamage(src, bl, skill_id, skill_lv, sc_start(src, bl, type, 100, skill_lv,skill->get_time(skill_id, skill_lv)));
+ clif->skill_nodamage(src, bl, skill_id, skill_lv,
+ sc_start(src, bl, type, 100, skill_lv, skill->get_time(skill_id, skill_lv)));
+ max = pc->getmaxspiritball(sd, 0);
+ for ( i = 0; i < max; i++ )
+ pc->addspiritball(sd, skill->get_time(MO_CALLSPIRITS, skill_lv), max);
}
break;
@@ -9027,7 +9032,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
}
clif->skill_nodamage(src, bl, skill_id, skill_lv, sp ? 1:0);
} else {
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
map->foreachinrange(skill->area_sub, bl, skill->get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|BCT_SELF|SD_SPLASH|1, skill->castend_nodamage_id);
}
break;
@@ -9035,12 +9040,12 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
case SR_POWERVELOCITY:
if( !dstsd )
break;
- if( sd && dstsd->spiritball <= 5 ) {
- int i;
- for(i = 0; i <= 5; i++) {
- pc->addspiritball(dstsd, skill->get_time(MO_CALLSPIRITS, pc->checkskill(sd,MO_CALLSPIRITS)), i);
- pc->delspiritball(sd, sd->spiritball, 0);
+ if ( sd && (dstsd->class_&MAPID_BASEMASK) != MAPID_GUNSLINGER ) {
+ int i, max = pc->getmaxspiritball(dstsd, 5);
+ for ( i = 0; i < max; i++ ) {
+ pc->addspiritball(dstsd, skill->get_time(MO_CALLSPIRITS, 1), max);
}
+ pc->delspiritball(sd, sd->spiritball, 0);
}
clif->skill_nodamage(src, bl, skill_id, skill_lv, 1);
break;
@@ -9196,7 +9201,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
madnesscheck = map->foreachinrange(skill->area_sub, src, skill->get_splash(skill_id,skill_lv),BL_PC, src, skill_id, skill_lv, tick, flag|BCT_ENEMY, skill->area_sub_count);
sc_start(src, bl, type, 100, skill_lv,skill->get_time(skill_id, skill_lv));
if ( madnesscheck >= 8 )//The god of madness deals 9999 fixed unreduceable damage when 8 or more enemy players are affected.
- status_fix_damage(src, bl, 9999, clif->damage(src, bl, 0, 0, 9999, 0, 0, 0));
+ status_fix_damage(src, bl, 9999, clif->damage(src, bl, 0, 0, 9999, 0, BDT_NORMAL, 0));
//skill->attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag);//To renable when I can confirm it deals damage like this. Data shows its dealt as reflected damage which I don't have it coded like that yet. [Rytech]
} else if( sd ) {
int rate = sstatus->int_ / 6 + (sd? sd->status.job_level:0) / 5 + skill_lv * 4;
@@ -9332,7 +9337,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
break;
}
clif->skill_nodamage(src,bl,skill_id,skill_lv,1);
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, 0, 1, skill_id, -2, 6);
+ clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, 0, 1, skill_id, -2, BDT_SKILL);
break;
case GM_SANDMAN:
@@ -9557,7 +9562,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
elemental->clean_single_effect(ele, skill_id);
} else {
clif->skill_nodamage(src,src,skill_id,skill_lv,1);
- clif->skill_damage(src, ( skill_id == EL_GUST || skill_id == EL_BLAST || skill_id == EL_WILD_STORM )?src:bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, ( skill_id == EL_GUST || skill_id == EL_BLAST || skill_id == EL_WILD_STORM )?src:bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
if( skill_id == EL_WIND_STEP ) // There aren't teleport, just push the master away.
skill->blown(src,bl,(rnd()%skill->get_blewcount(skill_id,skill_lv))+1,rnd()%8,0);
sc_start(src, src,type2,100,skill_lv,skill->get_time(skill_id,skill_lv));
@@ -9572,7 +9577,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
case EL_ZEPHYR:
case EL_POWER_OF_GAIA:
clif->skill_nodamage(src,src,skill_id,skill_lv,1);
- clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
skill->unitsetting(src,skill_id,skill_lv,bl->x,bl->y,0);
break;
@@ -9588,7 +9593,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
elemental->clean_single_effect(ele, skill_id);
} else {
// This not heals at the end.
- clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
sc_start(src, src,type2,100,skill_lv,skill->get_time(skill_id,skill_lv));
sc_start(src, bl,type,100,src->id,skill->get_time(skill_id,skill_lv));
}
@@ -9665,8 +9670,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
clif->skill_nodamage(src, src, skill_id, skill_lv, 1);
clif->slide(src, bl->x, bl->y) ;
sc_start(src, src, SC_CONFUSION, 25, skill_lv, skill->get_time(skill_id, skill_lv));
- if ( !is_boss(bl) && unit->stop_walking(&sd->bl, 1) && unit->movepos(bl, x, y, 0, 0) )
- {
+ if ( !is_boss(bl) && unit->stop_walking(&sd->bl, STOPWALKING_FLAG_FIXPOS) && unit->movepos(bl, x, y, 0, 0) ) {
if( dstsd && pc_issit(dstsd) )
pc->setstand(dstsd);
clif->slide(bl, x, y) ;
@@ -9689,7 +9693,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
case KG_KAGEMUSYA:
clif->skill_nodamage(src,bl,skill_id,skill_lv,
sc_start(src, bl,type,100,skill_lv,skill->get_time(skill_id,skill_lv)));
- clif->skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
break;
case KG_KAGEHUMI:
@@ -9708,7 +9712,7 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin
status_change_end(bl, SC_HARMONIZE, INVALID_TIMER);
}
if( skill->area_temp[2] == 1 ){
- clif->skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
sc_start(src, src, SC_STOP, 100, skill_lv, skill->get_time(skill_id, skill_lv));
}
} else {
@@ -9962,7 +9966,7 @@ int skill_castend_pos(int tid, int64 tick, int id, intptr_t data)
src->type, src->id, ud->skill_id, ud->skill_lv, ud->skillx, ud->skilly);
if (ud->walktimer != INVALID_TIMER)
- unit->stop_walking(src,1);
+ unit->stop_walking(src, STOPWALKING_FLAG_FIXPOS);
if( !sd || sd->skillitem != ud->skill_id || skill->get_delay(ud->skill_id,ud->skill_lv) )
ud->canact_tick = tick + skill->delay_fix(src, ud->skill_id, ud->skill_lv);
@@ -10658,7 +10662,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
break;
case RK_WINDCUTTER:
- clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
/* Fall through */
case NC_COLDSLOWER:
case RK_DRAGONBREATH:
@@ -10698,7 +10702,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
clif->skill_fail(sd,skill_id,USESKILL_FAIL_GC_POISONINGWEAPON,0);
return 0;
}
- clif->skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,6);
+ clif->skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,BDT_SKILL);
skill->unitsetting(src, skill_id, skill_lv, x, y, flag);
//status_change_end(src,SC_POISONINGWEAPON,INVALID_TIMER); // 08/31/2011 - When using poison smoke, you no longer lose the poisoning weapon effect.
break;
@@ -10735,7 +10739,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
case RA_DETONATOR:
r = skill->get_splash(skill_id, skill_lv);
map->foreachinarea(skill->detonator, src->m, x-r, y-r, x+r, y+r, BL_SKILL, src);
- clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
break;
/**
* Mechanic
@@ -11071,6 +11075,7 @@ struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_
* According to data provided in RE, SW life is equal to 3 times caster's health
**/
val2 = status_get_max_hp(src) * 3;
+ val3 = skill_lv+1;
#else
val2 = skill_lv+1;
#endif
@@ -11386,7 +11391,7 @@ struct skill_unit_group* skill_unitsetting(struct block_list *src, uint16 skill_
}
break;
case NPC_EARTHQUAKE:
- clif->skill_damage(src, src, timer->gettick(), status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
+ clif->skill_damage(src, src, timer->gettick(), status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, BDT_SKILL);
break;
default:
skill->unitsetting1_unknown(src, &skill_id, &skill_lv, &x, &y, &flag, &val1, &val2, &val3);
@@ -11782,7 +11787,7 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6
struct skill_unit_group *sg;
struct block_list *ss;
TBL_PC* tsd;
- struct status_data *tstatus;
+ struct status_data *tstatus, *bst;
struct status_change *tsc, *ssc;
struct skill_unit_group_tickset *ts;
enum sc_type type;
@@ -11806,6 +11811,7 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6
return 0;
tstatus = status->get_status_data(bl);
+ bst = status->get_base_status(bl);
type = status->skill2sc(sg->skill_id);
skill_id = sg->skill_id;
@@ -12454,7 +12460,7 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6
if (tsc && (tsc->data[SC_HALLUCINATIONWALK] || tsc->data[SC_VACUUM_EXTREME])) {
return 0;
} else {
- sg->limit -= 100 * tstatus->str/20;
+ sg->limit -= 1000 * bst->str/20;
sc_start(ss, bl, SC_VACUUM_EXTREME, 100, sg->skill_lv, sg->limit);
if ( !map_flag_gvg(bl->m) && !map->list[bl->m].flag.battleground && !is_boss(bl) ) {
@@ -12921,7 +12927,8 @@ int skill_check_condition_mob_master_sub (struct block_list *bl, va_list ap) {
mob_class=va_arg(ap,int);
skill_id=va_arg(ap,int);
c=va_arg(ap,int *);
- if( md->master_id != src_id || md->special_state.ai != (unsigned)(skill_id == AM_SPHEREMINE?2:skill_id == KO_ZANZOU?4:skill_id == MH_SUMMON_LEGION?1:3) )
+ if( md->master_id != src_id
+ || md->special_state.ai != (skill_id == AM_SPHEREMINE?AI_SPHERE:skill_id == KO_ZANZOU?AI_ZANZOU:skill_id == MH_SUMMON_LEGION?AI_ATTACK:AI_FLORA) )
return 0; //Non alchemist summoned mobs have nothing to do here.
if(md->class_==mob_class)
(*c)++;
@@ -13035,8 +13042,8 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
sd->itemid = sd->itemindex = -1;
if( skill_id == WZ_EARTHSPIKE && sc && sc->data[SC_EARTHSCROLL] && rnd()%100 > sc->data[SC_EARTHSCROLL]->val2 ) // [marquis007]
; //Do not consume item.
- else if( sd->status.inventory[i].expire_time == 0 )
- pc->delitem(sd,i,1,0,0,LOG_TYPE_CONSUME); // Rental usable items are not consumed until expiration
+ else if( sd->status.inventory[i].expire_time == 0 ) // Rental usable items are not consumed until expiration
+ pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME);
}
return 1;
}
@@ -13641,7 +13648,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
MOBID_EMPERIUM, MOBID_GUARIDAN_STONE1, MOBID_GUARIDAN_STONE2)) {
char output[128];
sprintf(output, "You're too close to a stone or emperium to do this skill"); /* TODO official response? or message.conf it */
- clif->colormes(sd->fd, COLOR_RED, output);
+ clif->messagecolor_self(sd->fd, COLOR_RED, output);
return 0;
}
}
@@ -14075,7 +14082,7 @@ int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id,
skill->get_desc(skill_id),
require.ammo_qty,
itemdb_jname(sd->status.inventory[i].nameid));
- clif->colormes(sd->fd,COLOR_RED,e_msg);
+ clif->messagecolor_self(sd->fd, COLOR_RED, e_msg);
return 0;
}
if (!(require.ammo&1<<sd->inventory_data[i]->look)) { //Ammo type check. Send the "wrong weapon type" message
@@ -14211,7 +14218,7 @@ int skill_consume_requirement( struct map_session_data *sd, uint16 skill_id, uin
}
if ((n = pc->search_inventory(sd,req.itemid[i])) != INDEX_NOT_FOUND)
- pc->delitem(sd,n,req.amount[i],0,1,LOG_TYPE_CONSUME);
+ pc->delitem(sd, n, req.amount[i], 0, DELITEM_SKILLUSE, LOG_TYPE_CONSUME);
}
}
@@ -15078,7 +15085,7 @@ void skill_repairweapon (struct map_session_data *sd, int idx) {
clif->equiplist(target_sd);
- pc->delitem(sd,pc->search_inventory(sd,material),1,0,0,LOG_TYPE_CONSUME);
+ pc->delitem(sd, pc->search_inventory(sd, material), 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME); // FIXME: is this the correct reason flag?
clif->item_repaireffect(sd,idx,0);
@@ -15147,7 +15154,7 @@ void skill_weaponrefine (struct map_session_data *sd, int idx)
else
per += 5 * ((signed int)sd->status.job_level - 50);
- pc->delitem(sd, i, 1, 0, 0, LOG_TYPE_OTHER);
+ pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_OTHER); // FIXME: is this the correct reason flag?
if (per > rnd() % 1000) {
int ep = 0;
logs->pick_pc(sd, LOG_TYPE_OTHER, -1, item, ditem);
@@ -15155,9 +15162,9 @@ void skill_weaponrefine (struct map_session_data *sd, int idx)
logs->pick_pc(sd, LOG_TYPE_OTHER, 1, item, ditem);
if(item->equip) {
ep = item->equip;
- pc->unequipitem(sd,idx,3);
+ pc->unequipitem(sd, idx, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
}
- clif->delitem(sd,idx,1,0);
+ clif->delitem(sd, idx, 1, DELITEM_NORMAL);
clif->upgrademessage(sd->fd, 0,item->nameid);
clif->inventorylist(sd);
clif->refine(sd->fd,0,idx,item->refine);
@@ -15183,9 +15190,9 @@ void skill_weaponrefine (struct map_session_data *sd, int idx)
} else {
item->refine = 0;
if(item->equip)
- pc->unequipitem(sd,idx,3);
+ pc->unequipitem(sd, idx, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
clif->refine(sd->fd,1,idx,item->refine);
- pc->delitem(sd,idx,1,0,0, LOG_TYPE_OTHER);
+ pc->delitem(sd, idx, 1, 0, DELITEM_NORMAL, LOG_TYPE_OTHER);
clif->misceffect(&sd->bl,2);
clif->emotion(&sd->bl, E_OMG);
}
@@ -15725,7 +15732,7 @@ int skill_trap_splash(struct block_list *bl, va_list ap) {
skill->blown(src,bl,skill->get_blewcount(sg->skill_id,sg->skill_lv),-1,0);
break;
case UNT_ELECTRICSHOCKER:
- clif->skill_damage(src,bl,tick,0,0,-30000,1,sg->skill_id,sg->skill_lv,5);
+ clif->skill_damage(src,bl,tick,0,0,-30000,1,sg->skill_id,sg->skill_lv,BDT_SPLASH);
break;
case UNT_MAGENTATRAP:
case UNT_COBALTTRAP:
@@ -15912,7 +15919,7 @@ bool skill_check_shadowform(struct block_list *bl, int64 damage, int hit)
return false;
}
- status->damage(bl, src, damage, 0, clif->damage(src, src, 500, 500, damage, hit, (hit > 1 ? 8 : 0), 0), 0);
+ status->damage(bl, src, damage, 0, clif->damage(src, src, 500, 500, damage, hit, (hit > 1 ? BDT_MULTIHIT : BDT_NORMAL), 0), 0);
/* because damage can cancel it */
if( sc->data[SC__SHADOWFORM] && (--sc->data[SC__SHADOWFORM]->val3) <= 0 ) {
@@ -15945,7 +15952,8 @@ struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx, int
su->group=group;
su->alive=1;
su->val1=val1;
- su->val2=val2;
+ su->val2 = val2;
+ su->prev = 0;
idb_put(skill->unit_db, su->bl.id, su);
map->addiddb(&su->bl);
@@ -16539,7 +16547,7 @@ int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) {
dissonance = skill->dance_switch(su, 0);
- if( su->range >= 0 && group->interval != -1 ) {
+ if( su->range >= 0 && group->interval != -1 && su->bl.id != su->prev) {
if( battle_config.skill_wall_check )
map->foreachinshootrange(skill->unit_timer_sub_onplace, bl, su->range, group->bl_flag, bl,tick);
else
@@ -16555,6 +16563,8 @@ int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) {
group->bl_flag= BL_NUL;
}
}
+ if ( group->limit == group->interval )
+ su->prev = su->bl.id;
}
if( dissonance ) skill->dance_switch(su, 1);
@@ -16886,12 +16896,12 @@ int skill_produce_mix(struct map_session_data *sd, uint16 skill_id, int nameid,
if (j == INDEX_NOT_FOUND)
continue;
if( slot[i]==ITEMID_STAR_CRUMB ) {
- pc->delitem(sd,j,1,1,0,LOG_TYPE_PRODUCE);
+ pc->delitem(sd, j, 1, 1, DELITEM_NORMAL, LOG_TYPE_PRODUCE); // FIXME: is this the correct reason flag?
sc++;
}
if( slot[i] >= ITEMID_FLAME_HEART && slot[i] <= ITEMID_GREAT_NATURE && ele == 0 ) {
static const int ele_table[4]={3,1,4,2};
- pc->delitem(sd,j,1,1,0,LOG_TYPE_PRODUCE);
+ pc->delitem(sd, j, 1, 1, DELITEM_NORMAL, LOG_TYPE_PRODUCE); // FIXME: is this the correct reason flag?
ele=ele_table[slot[i]-994];
}
}
@@ -16937,7 +16947,7 @@ int skill_produce_mix(struct map_session_data *sd, uint16 skill_id, int nameid,
if (j != INDEX_NOT_FOUND) {
y = sd->status.inventory[j].amount;
if(y>x)y=x;
- pc->delitem(sd,j,y,0,0,LOG_TYPE_PRODUCE);
+ pc->delitem(sd, j, y, 0, DELITEM_NORMAL, LOG_TYPE_PRODUCE); // FIXME: is this the correct reason flag?
} else
ShowError("skill_produce_mix: material item error\n");
@@ -17472,7 +17482,7 @@ int skill_arrow_create (struct map_session_data *sd, int nameid)
if(index < 0 || (j = pc->search_inventory(sd,nameid)) == INDEX_NOT_FOUND)
return 1;
- pc->delitem(sd,j,1,0,0,LOG_TYPE_PRODUCE);
+ pc->delitem(sd, j, 1, 0, DELITEM_NORMAL, LOG_TYPE_PRODUCE); // FIXME: is this the correct reason flag?
for(i=0;i<MAX_ARROW_RESOURCE;i++) {
memset(&tmp_item,0,sizeof(tmp_item));
tmp_item.identify = 1;
@@ -17498,7 +17508,7 @@ int skill_poisoningweapon( struct map_session_data *sd, int nameid) {
sc_type type;
int chance, i;
nullpo_ret(sd);
- if( nameid <= 0 || (i = pc->search_inventory(sd,nameid)) == INDEX_NOT_FOUND || pc->delitem(sd,i,1,0,0,LOG_TYPE_CONSUME) ) {
+ if (nameid <= 0 || (i = pc->search_inventory(sd,nameid)) == INDEX_NOT_FOUND || pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME)) {
clif->skill_fail(sd,GC_POISONINGWEAPON,USESKILL_FAIL_LEVEL,0);
return 0;
}
@@ -17555,15 +17565,16 @@ int skill_magicdecoy(struct map_session_data *sd, int nameid) {
nullpo_ret(sd);
skill_id = sd->menuskill_val;
- if (nameid <= 0 || !itemdb_is_element(nameid) || (i = pc->search_inventory(sd,nameid)) == INDEX_NOT_FOUND
- || !skill_id || pc->delitem(sd,i,1,0,0,LOG_TYPE_CONSUME)
+ if (nameid <= 0 || !itemdb_is_element(nameid) || !skill_id
+ || (i = pc->search_inventory(sd, nameid)) == INDEX_NOT_FOUND
+ || pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME) != 0
) {
clif->skill_fail(sd,NC_MAGICDECOY,USESKILL_FAIL_LEVEL,0);
return 0;
}
// Spawn Position
- pc->delitem(sd,i,1,0,0,LOG_TYPE_CONSUME);
+ pc->delitem(sd, i, 1, 0, DELITEM_NORMAL, LOG_TYPE_CONSUME); // FIXME: is this intended to be there twice?
x = sd->sc.comet_x;
y = sd->sc.comet_y;
sd->sc.comet_x = sd->sc.comet_y = 0;
@@ -17699,7 +17710,7 @@ int skill_elementalanalysis(struct map_session_data* sd, int n, uint16 skill_lv,
return 1;
}
- if( pc->delitem(sd,idx,del_amount,0,1,LOG_TYPE_CONSUME) ) {
+ if( pc->delitem(sd, idx, del_amount, 0, DELITEM_SKILLUSE, LOG_TYPE_CONSUME) ) {
clif->skill_fail(sd,SO_EL_ANALYSIS,USESKILL_FAIL_LEVEL,0);
return 1;
}
diff --git a/src/map/skill.h b/src/map/skill.h
index c5341e9bd..bbf5b5458 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -1732,6 +1732,7 @@ struct skill_unit {
int limit;
int val1,val2;
short alive,range;
+ int prev;
};
struct skill_unit_group_tickset {
diff --git a/src/map/status.c b/src/map/status.c
index b0ae7d261..fd75ef81c 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -1194,7 +1194,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp,
if(d_bl &&((d_bl->type == BL_MER && ((TBL_MER *)d_bl)->master && ((TBL_MER *)d_bl)->master->bl.id == target->id)
|| (d_bl->type == BL_PC && ((TBL_PC *)d_bl)->devotion[sce->val2] == target->id)) && check_distance_bl(target, d_bl, sce->val3)) {
- clif->damage(d_bl, d_bl, 0, 0, hp, 0, 0, 0);
+ clif->damage(d_bl, d_bl, 0, 0, hp, 0, BDT_NORMAL, 0);
status_fix_damage(NULL, d_bl, hp, 0);
return 0;
}
@@ -1261,7 +1261,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp,
}
if( src && target->type == BL_PC && (((TBL_PC*)target)->disguise) > 0 ) {// stop walking when attacked in disguise to prevent walk-delay bug
- unit->stop_walking( target, 1 );
+ unit->stop_walking(target, STOPWALKING_FLAG_FIXPOS);
}
if (st->hp || (flag&8)) {
@@ -1344,7 +1344,7 @@ int status_damage(struct block_list *src,struct block_list *target,int64 in_hp,
unit->remove_map(target,CLR_DEAD,ALC_MARK);
else { //Some death states that would normally be handled by unit_remove_map
unit->stop_attack(target);
- unit->stop_walking(target,1);
+ unit->stop_walking(target, STOPWALKING_FLAG_FIXPOS);
unit->skillcastcancel(target,0);
clif->clearunit_area(target,CLR_DEAD);
skill->unit_move(target,timer->gettick(),4);
@@ -1656,10 +1656,15 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin
return 0;
if (sc->data[SC_DC_WINKCHARM] && target && !flag) { //Prevents skill usage
- if( unit->bl2ud(src) && (unit->bl2ud(src))->walktimer == INVALID_TIMER )
- unit->walktobl(src, map->id2bl(sc->data[SC_DC_WINKCHARM]->val2), 3, 1);
- clif->emotion(src, E_LV);
- return 0;
+ struct block_list *winkcharm_target = map->id2bl(sc->data[SC_DC_WINKCHARM]->val2);
+ if (winkcharm_target != NULL) {
+ if (unit->bl2ud(src) && (unit->bl2ud(src))->walktimer == INVALID_TIMER)
+ unit->walktobl(src, map->id2bl(sc->data[SC_DC_WINKCHARM]->val2), 3, 1);
+ clif->emotion(src, E_LV);
+ return 0;
+ } else {
+ status_change_end(src, SC_DC_WINKCHARM, INVALID_TIMER);
+ }
}
if (sc->data[SC_BLADESTOP]) {
@@ -1874,7 +1879,7 @@ int status_calc_mob_(struct mob_data* md, enum e_status_calc_opt opt) {
if (battle_config.slaves_inherit_speed && md->master_id)
flag|=8;
- if (md->master_id && md->special_state.ai>1)
+ if (md->master_id && md->special_state.ai > AI_ATTACK)
flag|=16;
if (!flag)
@@ -1910,8 +1915,8 @@ int status_calc_mob_(struct mob_data* md, enum e_status_calc_opt opt) {
//Max HP setting from Summon Flora/marine Sphere
struct unit_data *ud = unit->bl2ud(mbl);
//Remove special AI when this is used by regular mobs.
- if (mbl->type == BL_MOB && !((TBL_MOB*)mbl)->special_state.ai)
- md->special_state.ai = 0;
+ if (mbl->type == BL_MOB && ((TBL_MOB*)mbl)->special_state.ai == AI_NONE)
+ md->special_state.ai = AI_NONE;
if (ud) {
// different levels of HP according to skill level
if (ud->skill_id == AM_SPHEREMINE) {
@@ -2217,7 +2222,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) {
}
bstatus->aspd_rate = 1000;
bstatus->ele_lv = 1;
- bstatus->race = RC_DEMIHUMAN;
+ bstatus->race = RC_PLAYER;
// Autobonus
pc->delautobonus(sd,sd->autobonus,ARRAYLENGTH(sd->autobonus),true);
@@ -3027,7 +3032,7 @@ int status_calc_npc_(struct npc_data *nd, enum e_status_calc_opt opt) {
nstatus->def_ele = ELE_NEUTRAL;
nstatus->ele_lv = 1;
- nstatus->race = RC_DEMIHUMAN;
+ nstatus->race = RC_PLAYER;
nstatus->size = nd->size;
nstatus->rhw.range = 1 + nstatus->size;
nstatus->mode = (MD_CANMOVE|MD_CANATTACK);
@@ -3557,7 +3562,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag) {
if (!(st->mode&MD_CANATTACK))
unit->stop_attack(bl);
if (!(st->mode&MD_CANMOVE))
- unit->stop_walking(bl,1);
+ unit->stop_walking(bl, STOPWALKING_FLAG_FIXPOS);
}
// No status changes alter these yet.
@@ -5960,7 +5965,7 @@ int status_get_party_id(struct block_list *bl) {
struct mob_data *md=(TBL_MOB*)bl;
if( md->master_id > 0 ) {
struct map_session_data *msd;
- if (md->special_state.ai && (msd = map->id2sd(md->master_id)) != NULL)
+ if (md->special_state.ai != AI_NONE && (msd = map->id2sd(md->master_id)) != NULL)
return msd->status.party_id;
return -md->master_id;
}
@@ -6003,7 +6008,7 @@ int status_get_guild_id(struct block_list *bl) {
// Guardian guild data may not been available yet, castle data is always set
return (md->guardian_data->g)?md->guardian_data->g->guild_id:md->guardian_data->castle->guild_id;
}
- if( md->special_state.ai && (msd = map->id2sd(md->master_id)) != NULL )
+ if (md->special_state.ai != AI_NONE && (msd = map->id2sd(md->master_id)) != NULL)
return msd->status.guild_id; //Alchemist's mobs [Skotlex]
break;
}
@@ -6045,7 +6050,7 @@ int status_get_emblem_id(struct block_list *bl) {
struct mob_data *md = (struct mob_data *)bl;
if (md->guardian_data) //Guardian's guild [Skotlex]
return (md->guardian_data->g) ? md->guardian_data->g->emblem_id:0;
- if (md->special_state.ai && (msd = map->id2sd(md->master_id)) != NULL)
+ if (md->special_state.ai != AI_NONE && (msd = map->id2sd(md->master_id)) != NULL)
return msd->guild_emblem_id; //Alchemist's mobs [Skotlex]
}
break;
@@ -6517,9 +6522,6 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
case SC_COLD:
tick_def2 = bst->vit*100 + status->get_lv(bl)*20;
break;
- case SC_VACUUM_EXTREME:
- tick_def2 = bst->str*50;
- break;
case SC_MANDRAGORA:
sc_def = (st->vit + st->luk)*20;
break;
@@ -6974,7 +6976,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
i = sd->equip_index[EQI_HAND_R];
if (i>=0 && sd->inventory_data[i] && sd->inventory_data[i]->type == IT_WEAPON) {
opt_flag|=2;
- pc->unequipitem(sd,i,3);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
}
if (!opt_flag) return 0;
}
@@ -6990,7 +6992,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
i = sd->equip_index[EQI_HAND_L];
if ( i < 0 || !sd->inventory_data[i] || sd->inventory_data[i]->type != IT_ARMOR )
return 0;
- pc->unequipitem(sd,i,3);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
}
if (tick == 1) return 1; //Minimal duration: Only strip without causing the SC
break;
@@ -7002,7 +7004,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
i = sd->equip_index[EQI_ARMOR];
if ( i < 0 || !sd->inventory_data[i] )
return 0;
- pc->unequipitem(sd,i,3);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
}
if (tick == 1) return 1; //Minimal duration: Only strip without causing the SC
break;
@@ -7014,7 +7016,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
i = sd->equip_index[EQI_HEAD_TOP];
if ( i < 0 || !sd->inventory_data[i] )
return 0;
- pc->unequipitem(sd,i,3);
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
}
if (tick == 1) return 1; //Minimal duration: Only strip without causing the SC
break;
@@ -7084,12 +7086,12 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
if( !(sd->bonus.unstripable_equip&EQP_ACC_L) ) {
i = sd->equip_index[EQI_ACC_L];
if( i >= 0 && sd->inventory_data[i] && sd->inventory_data[i]->type == IT_ARMOR )
- pc->unequipitem(sd,i,3); //L-Accessory
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE); //L-Accessory
}
if( !(sd->bonus.unstripable_equip&EQP_ACC_R) ) {
i = sd->equip_index[EQI_ACC_R];
if( i >= 0 && sd->inventory_data[i] && sd->inventory_data[i]->type == IT_ARMOR )
- pc->unequipitem(sd,i,3); //R-Accessory
+ pc->unequipitem(sd, i, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE); //R-Accessory
}
if( i < 0 )
return 0;
@@ -7539,7 +7541,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
struct map_session_data *tsd;
if( sd ) {
int i;
- for( i = 0; i < 5; i++ ) {
+ for( i = 0; i < MAX_PC_DEVOTION; i++ ) {
if( sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) )
status->change_start(bl, &tsd->bl, type, 10000, val1, val2, val3, val4, tick, SCFLAG_ALL);
}
@@ -7638,7 +7640,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
struct map_session_data *tsd;
if( sd ) {
int i;
- for( i = 0; i < 5; i++ ) {
+ for( i = 0; i < MAX_PC_DEVOTION; i++ ) {
if( sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) )
status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL);
}
@@ -7896,7 +7898,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
if( bl->type&(BL_PC|BL_MER) ) {
if( sd ) {
- for( i = 0; i < 5; i++ ) {
+ for( i = 0; i < MAX_PC_DEVOTION; i++ ) {
if( sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) )
status->change_start(bl, &tsd->bl, type, 10000, val1, val2, 0, 0, tick, SCFLAG_ALL);
}
@@ -7916,7 +7918,7 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
if (sd) {
struct map_session_data *tsd;
int i;
- for (i = 0; i < 5; i++) {
+ for (i = 0; i < MAX_PC_DEVOTION; i++) {
//See if there are devoted characters, and pass the status to them. [Skotlex]
if (sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])))
status->change_start(bl, &tsd->bl,type,10000,val1,5+val1*5,val3,val4,tick,SCFLAG_NOAVOID);
@@ -8809,6 +8811,9 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
else
val2 = val2 / 4 * val1; // STAT DEF increase: [(Caster VIT / 4) x Skill Level]
break;
+ case SC_GENTLETOUCH_ENERGYGAIN:
+ val2 = 10 + 5 * val1;
+ break;
case SC_PYROTECHNIC_OPTION:
val2 = 60;
break;
@@ -9257,11 +9262,11 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t
case SC_NEEDLE_OF_PARALYZE:
case SC_DEATHBOUND:
case SC_NETHERWORLD:
- unit->stop_walking(bl,1);
+ unit->stop_walking(bl, STOPWALKING_FLAG_FIXPOS);
break;
case SC_ANKLESNARE:
if( battle_config.skill_trap_type || !map_flag_gvg(bl->m) )
- unit->stop_walking(bl,1);
+ unit->stop_walking(bl, STOPWALKING_FLAG_FIXPOS);
break;
case SC_HIDING:
case SC_CLOAKING:
@@ -9783,7 +9788,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
begin_spurt = false;
ud->state.running = 0;
if (ud->walktimer != INVALID_TIMER)
- unit->stop_walking(bl,1);
+ unit->stop_walking(bl, STOPWALKING_FLAG_FIXPOS);
}
if (begin_spurt && sce->val1 >= 7
&& DIFF_TICK(timer->gettick(), starttick) <= 1000
@@ -9806,7 +9811,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
if( bl->type == BL_PC ) {
// Clear Status from others
int i;
- for( i = 0; i < 5; i++ ) {
+ for( i = 0; i < MAX_PC_DEVOTION; i++ ) {
if( sd->devotion[i] && (tsd = map->id2sd(sd->devotion[i])) && tsd->sc.data[type] )
status_change_end(&tsd->bl, type, INVALID_TIMER);
}
@@ -10078,7 +10083,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
struct block_list* src = map->id2bl(sce->val2);
if( tid == -1 || !src)
break; // Terminated by Damage
- status_fix_damage(src,bl,400*sce->val1,clif->damage(bl,bl,0,0,400*sce->val1,0,0,0));
+ status_fix_damage(src,bl,400*sce->val1,clif->damage(bl,bl,0,0,400*sce->val1,0,BDT_NORMAL,0));
}
break;
case SC_WUGDASH:
@@ -10087,7 +10092,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
if (ud) {
ud->state.running = 0;
if (ud->walktimer != -1)
- unit->stop_walking(bl,1);
+ unit->stop_walking(bl, STOPWALKING_FLAG_FIXPOS);
}
}
break;
@@ -10130,15 +10135,11 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
map->foreachinrange(status->change_timer_sub, bl, battle_config.area_size,BL_CHAR, bl, sce, SC_CURSEDCIRCLE_TARGET, timer->gettick());
break;
case SC_RAISINGDRAGON:
- if( sd && sce->val2 && !pc_isdead(sd) ) {
+ if ( sd && sce->val2 && !pc_isdead(sd) ) {
int i;
- i = min(sd->spiritball,5);
- pc->delspiritball(sd, sd->spiritball, 0);
+ if ( (i = (sd->spiritball - 5)) > 0 )
+ pc->delspiritball(sd, i, 0);
status_change_end(bl, SC_EXPLOSIONSPIRITS, INVALID_TIMER);
- while( i > 0 ) {
- pc->addspiritball(sd, skill->get_time(MO_CALLSPIRITS, pc->checkskill(sd,MO_CALLSPIRITS)), 5);
- --i;
- }
}
break;
case SC_CURSEDCIRCLE_TARGET:
@@ -10577,7 +10578,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) {
case SC_STONE:
if(sc->opt1 == OPT1_STONEWAIT && sce->val3) {
sce->val4 = 0;
- unit->stop_walking(bl,1);
+ unit->stop_walking(bl, STOPWALKING_FLAG_FIXPOS);
unit->stop_attack(bl);
sc->opt1 = OPT1_STONE;
clif->changeoption(bl);
@@ -10624,14 +10625,16 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) {
case SC_KNOWLEDGE:
if (!sd) break;
- if (bl->m == sd->feel_map[0].m
- || bl->m == sd->feel_map[1].m
- || bl->m == sd->feel_map[2].m
- ) {
- //Timeout will be handled by pc->setpos
- sce->timer = INVALID_TIMER;
- return 0;
+ {
+ int i;
+ for (i = 0; i < MAX_PC_FEELHATE; i++) {
+ if (bl->m == sd->feel_map[i].m) {
+ //Timeout will be handled by pc->setpos
+ sce->timer = INVALID_TIMER;
+ return 0;
+ }
}
+ }
break;
case SC_BLOODING:
@@ -10818,7 +10821,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) {
case SC_PYREXIA:
if( --(sce->val4) > 0 ) {
map->freeblock_lock();
- clif->damage(bl,bl,status_get_amotion(bl),status_get_dmotion(bl)+500,100,0,0,0);
+ clif->damage(bl,bl,status_get_amotion(bl),status_get_dmotion(bl)+500,100,0,BDT_NORMAL,0);
status_fix_damage(NULL,bl,100,0);
if( sc->data[type] ) {
sc_timer_next(3000+tick,status->change_timer,bl->id,data);
@@ -10834,7 +10837,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) {
damage += st->vit * (sce->val1 - 3);
unit->skillcastcancel(bl,2);
map->freeblock_lock();
- status->damage(bl, bl, damage, 0, clif->damage(bl,bl,status_get_amotion(bl),status_get_dmotion(bl)+500,damage,1,0,0), 1);
+ status->damage(bl, bl, damage, 0, clif->damage(bl,bl,status_get_amotion(bl),status_get_dmotion(bl)+500,damage,1,BDT_NORMAL,0), 1);
if( sc->data[type] ) {
sc_timer_next(1000 + tick, status->change_timer, bl->id, data );
}
@@ -10896,7 +10899,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) {
if( --(sce->val4) > 0 ) {
//Damage is every 10 seconds including 3%sp drain.
map->freeblock_lock();
- clif->damage(bl,bl,status_get_amotion(bl),1,1,0,0,0);
+ clif->damage(bl,bl,status_get_amotion(bl),1,1,0,BDT_NORMAL,0);
status->damage(NULL, bl, 1, st->max_sp * 3 / 100, 0, 0); //cancel dmg only if cancelable
if( sc->data[type] ) {
sc_timer_next(10000 + tick, status->change_timer, bl->id, data );
@@ -10953,7 +10956,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) {
int damage = 1000 + 3 * status_get_max_hp(bl) / 100; // Deals fixed (1000 + 3%*MaxHP)
map->freeblock_lock();
- clif->damage(bl,bl,0,0,damage,1,9,0); //damage is like endure effect with no walk delay
+ clif->damage(bl,bl,0,0,damage,1,BDT_MULTIENDURE,0); //damage is like endure effect with no walk delay
status->damage(src, bl, damage, 0, 0, 1);
if( sc->data[type]){ // Target still lives. [LimitLine]
@@ -11055,7 +11058,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) {
break;
map->freeblock_lock();
damage = sce->val3;
- status->damage(src, bl, damage, 0, clif->damage(bl,bl,st->amotion,st->dmotion+200,damage,1,0,0), 1);
+ status->damage(src, bl, damage, 0, clif->damage(bl,bl,st->amotion,st->dmotion+200,damage,1,BDT_NORMAL,0), 1);
unit->skillcastcancel(bl,1);
if ( sc->data[type] ) {
sc_timer_next(1000 + tick, status->change_timer, bl->id, data);
@@ -11163,7 +11166,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) {
int damage = st->max_hp / 100; // Suggestion 1% each second
if( damage >= st->hp ) damage = st->hp - 1; // Do not kill, just keep you with 1 hp minimum
map->freeblock_lock();
- status_fix_damage(NULL,bl,damage,clif->damage(bl,bl,0,0,damage,0,0,0));
+ status_fix_damage(NULL,bl,damage,clif->damage(bl,bl,0,0,damage,0,BDT_NORMAL,0));
if( sc->data[type] ) {
sc_timer_next(1000 + tick, status->change_timer, bl->id, data);
}
@@ -11261,7 +11264,7 @@ int status_change_timer(int tid, int64 tick, int id, intptr_t data) {
if( --(sce->val4) > 0 ) {
status->charge(bl,0,sce->val2); // Reduce 8 every 10 seconds.
if( sd && !pc_issit(sd) ) { // Force to sit every 10 seconds.
- pc_stop_walking(sd,1|4);
+ pc_stop_walking(sd, STOPWALKING_FLAG_FIXPOS|STOPWALKING_FLAG_NEXTCELL);
pc_stop_attack(sd);
pc_setsit(sd);
clif->sitting(bl);
diff --git a/src/map/status.h b/src/map/status.h
index b370a9c88..af11683a0 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -1655,49 +1655,6 @@ enum {
OPT3_CONTRACT = 0x00020000,
};
-enum {
- OPTION_NOTHING = 0x00000000,
- OPTION_SIGHT = 0x00000001,
- OPTION_HIDE = 0x00000002,
- OPTION_CLOAK = 0x00000004,
- OPTION_FALCON = 0x00000010,
- OPTION_RIDING = 0x00000020,
- OPTION_INVISIBLE = 0x00000040,
- OPTION_ORCISH = 0x00000800,
- OPTION_WEDDING = 0x00001000,
- OPTION_RUWACH = 0x00002000,
- OPTION_CHASEWALK = 0x00004000,
- OPTION_FLYING = 0x00008000, //Note that clientside Flying and Xmas are 0x8000 for clients prior to 2007.
- OPTION_XMAS = 0x00010000,
- OPTION_TRANSFORM = 0x00020000,
- OPTION_SUMMER = 0x00040000,
- OPTION_DRAGON1 = 0x00080000,
- OPTION_WUG = 0x00100000,
- OPTION_WUGRIDER = 0x00200000,
- OPTION_MADOGEAR = 0x00400000,
- OPTION_DRAGON2 = 0x00800000,
- OPTION_DRAGON3 = 0x01000000,
- OPTION_DRAGON4 = 0x02000000,
- OPTION_DRAGON5 = 0x04000000,
- OPTION_HANBOK = 0x08000000,
- OPTION_OKTOBERFEST = 0x10000000,
-
-#ifndef NEW_CARTS
- OPTION_CART1 = 0x00000008,
- OPTION_CART2 = 0x00000080,
- OPTION_CART3 = 0x00000100,
- OPTION_CART4 = 0x00000200,
- OPTION_CART5 = 0x00000400,
-
- /* compound constant for older carts */
- OPTION_CART = OPTION_CART1|OPTION_CART2|OPTION_CART3|OPTION_CART4|OPTION_CART5,
-#endif
-
- // compound constants
- OPTION_DRAGON = OPTION_DRAGON1|OPTION_DRAGON2|OPTION_DRAGON3|OPTION_DRAGON4|OPTION_DRAGON5,
- OPTION_COSTUME = OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER|OPTION_HANBOK|OPTION_OKTOBERFEST,
-};
-
//Defines for the manner system [Skotlex]
enum manner_flags
{
diff --git a/src/map/storage.c b/src/map/storage.c
index 79a5ad52d..2706b3683 100644
--- a/src/map/storage.c
+++ b/src/map/storage.c
@@ -83,7 +83,7 @@ int storage_storageopen(struct map_session_data *sd)
{
nullpo_ret(sd);
- if(sd->state.storage_flag)
+ if (sd->state.storage_flag != STORAGE_FLAG_CLOSED)
return 1; //Already open?
if( !pc_can_give_items(sd) ) {
@@ -92,7 +92,7 @@ int storage_storageopen(struct map_session_data *sd)
return 1;
}
- sd->state.storage_flag = 1;
+ sd->state.storage_flag = STORAGE_FLAG_NORMAL;
storage->sortitem(sd->status.storage.items, ARRAYLENGTH(sd->status.storage.items));
clif->storagelist(sd, sd->status.storage.items, ARRAYLENGTH(sd->status.storage.items));
clif->updatestorageamount(sd, sd->status.storage.storage_amount, MAX_STORAGE);
@@ -190,9 +190,11 @@ int storage_delitem(struct map_session_data* sd, int n, int amount)
{
memset(&sd->status.storage.items[n],0,sizeof(sd->status.storage.items[0]));
sd->status.storage.storage_amount--;
- if( sd->state.storage_flag == 1 ) clif->updatestorageamount(sd, sd->status.storage.storage_amount, MAX_STORAGE);
+ if( sd->state.storage_flag == STORAGE_FLAG_NORMAL )
+ clif->updatestorageamount(sd, sd->status.storage.storage_amount, MAX_STORAGE);
}
- if( sd->state.storage_flag == 1 ) clif->storageitemremoved(sd,n,amount);
+ if( sd->state.storage_flag == STORAGE_FLAG_NORMAL )
+ clif->storageitemremoved(sd,n,amount);
return 0;
}
@@ -219,9 +221,9 @@ int storage_storageadd(struct map_session_data* sd, int index, int amount) {
return 0;
if( storage->additem(sd,&sd->status.inventory[index],amount) == 0 )
- pc->delitem(sd,index,amount,0,4,LOG_TYPE_STORAGE);
+ pc->delitem(sd, index, amount, 0, DELITEM_TOSTORAGE, LOG_TYPE_STORAGE);
else
- clif->dropitem(sd, index,0);
+ clif->dropitem(sd, index, 0);
return 1;
}
@@ -325,7 +327,7 @@ void storage_storageclose(struct map_session_data* sd) {
if( map->save_settings&4 )
chrif->save(sd,0); //Invokes the storage saving as well.
- sd->state.storage_flag = 0;
+ sd->state.storage_flag = STORAGE_FLAG_CLOSED;
}
/*==========================================
@@ -337,7 +339,7 @@ void storage_storage_quit(struct map_session_data* sd, int flag) {
if (map->save_settings&4)
chrif->save(sd, flag); //Invokes the storage saving as well.
- sd->state.storage_flag = 0;
+ sd->state.storage_flag = STORAGE_FLAG_CLOSED;
}
/**
@@ -380,7 +382,7 @@ int storage_guild_storageopen(struct map_session_data* sd)
if(sd->status.guild_id <= 0)
return 2;
- if(sd->state.storage_flag)
+ if (sd->state.storage_flag != STORAGE_FLAG_CLOSED)
return 1; //Can't open both storages at a time.
if( !pc_can_give_items(sd) ) { //check is this GM level can open guild storage and store items [Lupus]
@@ -399,7 +401,7 @@ int storage_guild_storageopen(struct map_session_data* sd)
return 1;
gstor->storage_status = 1;
- sd->state.storage_flag = 2;
+ sd->state.storage_flag = STORAGE_FLAG_GUILD;
storage->sortitem(gstor->items, ARRAYLENGTH(gstor->items));
clif->storagelist(sd, gstor->items, ARRAYLENGTH(gstor->items));
clif->updatestorageamount(sd, gstor->storage_amount, MAX_GUILD_STORAGE);
@@ -525,10 +527,10 @@ int storage_guild_storageadd(struct map_session_data* sd, int index, int amount)
return 0;
}
- if(gstorage->additem(sd,stor,&sd->status.inventory[index],amount)==0)
- pc->delitem(sd,index,amount,0,4,LOG_TYPE_GSTORAGE);
+ if( gstorage->additem(sd,stor,&sd->status.inventory[index],amount) == 0 )
+ pc->delitem(sd, index, amount, 0, DELITEM_TOSTORAGE, LOG_TYPE_GSTORAGE);
else
- clif->dropitem(sd, index,0);
+ clif->dropitem(sd, index, 0);
return 1;
}
@@ -694,7 +696,7 @@ int storage_guild_storageclose(struct map_session_data* sd) {
gstorage->save(sd->status.account_id, sd->status.guild_id,0);
stor->storage_status=0;
}
- sd->state.storage_flag = 0;
+ sd->state.storage_flag = STORAGE_FLAG_CLOSED;
return 0;
}
@@ -707,7 +709,7 @@ int storage_guild_storage_quit(struct map_session_data* sd, int flag) {
if(flag) {
//Only during a guild break flag is 1 (don't save storage)
- sd->state.storage_flag = 0;
+ sd->state.storage_flag = STORAGE_FLAG_CLOSED;
stor->storage_status = 0;
clif->storageclose(sd);
if (map->save_settings&4)
@@ -721,7 +723,7 @@ int storage_guild_storage_quit(struct map_session_data* sd, int flag) {
else
gstorage->save(sd->status.account_id,sd->status.guild_id,1);
}
- sd->state.storage_flag = 0;
+ sd->state.storage_flag = STORAGE_FLAG_CLOSED;
stor->storage_status = 0;
return 0;
diff --git a/src/map/storage.h b/src/map/storage.h
index 6393e124a..6a9e7a2ac 100644
--- a/src/map/storage.h
+++ b/src/map/storage.h
@@ -12,6 +12,15 @@ struct guild_storage;
struct item;
struct map_session_data;
+/**
+ * Acceptable values for map_session_data.state.storage_flag
+ */
+enum storage_flag {
+ STORAGE_FLAG_CLOSED = 0, // Closed
+ STORAGE_FLAG_NORMAL = 1, // Normal Storage open
+ STORAGE_FLAG_GUILD = 2, // Guild Storage open
+};
+
struct storage_interface {
/* */
void (*reconnect) (void);
diff --git a/src/map/trade.c b/src/map/trade.c
index 7417f05af..a17938779 100644
--- a/src/map/trade.c
+++ b/src/map/trade.c
@@ -145,8 +145,8 @@ void trade_tradeack(struct map_session_data *sd, int type) {
}
//Check if you can start trade.
- if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag
- || tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag
+ if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.storage_flag != STORAGE_FLAG_CLOSED
+ || tsd->npc_id || tsd->state.vending || tsd->state.buyingstore || tsd->state.storage_flag != STORAGE_FLAG_CLOSED
) {
//Fail
clif->tradestart(sd, 2);
@@ -208,13 +208,13 @@ int impossible_trade_check(struct map_session_data *sd)
intif->wis_message_to_gm(map->wisp_server_name, PC_PERM_RECEIVE_HACK_INFO, message_to_gm);
// if we block people
if (battle_config.ban_hack_trade < 0) {
- chrif->char_ask_name(-1, sd->status.name, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block
+ chrif->char_ask_name(-1, sd->status.name, CHAR_ASK_NAME_BLOCK, 0, 0, 0, 0, 0, 0);
set_eof(sd->fd); // forced to disconnect because of the hack
// message about the ban
safestrncpy(message_to_gm, msg_txt(540), sizeof(message_to_gm)); // This player has been definitively blocked.
// if we ban people
} else if (battle_config.ban_hack_trade > 0) {
- chrif->char_ask_name(-1, sd->status.name, 2, 0, 0, 0, 0, battle_config.ban_hack_trade, 0); // type: 2 - ban (year, month, day, hour, minute, second)
+ chrif->char_ask_name(-1, sd->status.name, CHAR_ASK_NAME_BAN, 0, 0, 0, 0, battle_config.ban_hack_trade, 0); // type: 2 - ban (year, month, day, hour, minute, second)
set_eof(sd->fd); // forced to disconnect because of the hack
// message about the ban
sprintf(message_to_gm, msg_txt(507), battle_config.ban_hack_trade); // This player has been banned for %d minute(s).
@@ -561,7 +561,7 @@ void trade_tradecommit(struct map_session_data *sd) {
flag = pc->additem(tsd, &sd->status.inventory[n], sd->deal.item[trade_i].amount,LOG_TYPE_TRADE);
if (flag == 0)
- pc->delitem(sd, n, sd->deal.item[trade_i].amount, 1, 6, LOG_TYPE_TRADE);
+ pc->delitem(sd, n, sd->deal.item[trade_i].amount, 1, DELITEM_SOLD, LOG_TYPE_TRADE);
else
clif->additem(sd, n, sd->deal.item[trade_i].amount, 0);
sd->deal.item[trade_i].index = 0;
@@ -573,7 +573,7 @@ void trade_tradecommit(struct map_session_data *sd) {
flag = pc->additem(sd, &tsd->status.inventory[n], tsd->deal.item[trade_i].amount,LOG_TYPE_TRADE);
if (flag == 0)
- pc->delitem(tsd, n, tsd->deal.item[trade_i].amount, 1, 6, LOG_TYPE_TRADE);
+ pc->delitem(tsd, n, tsd->deal.item[trade_i].amount, 1, DELITEM_SOLD, LOG_TYPE_TRADE);
else
clif->additem(tsd, n, tsd->deal.item[trade_i].amount, 0);
tsd->deal.item[trade_i].index = 0;
diff --git a/src/map/unit.c b/src/map/unit.c
index 6a30c7e79..5ead7527e 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -737,7 +737,7 @@ int unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool
if( ud == NULL) return 0;
- unit->stop_walking(bl,1);
+ unit->stop_walking(bl, STOPWALKING_FLAG_FIXPOS);
unit->stop_attack(bl);
if( checkpath && (map->getcell(bl->m,dst_x,dst_y,CELL_CHKNOPASS) || !path->search(NULL,bl->m,bl->x,bl->y,dst_x,dst_y,easy,CELL_CHKNOREACH)) )
@@ -834,7 +834,7 @@ int unit_blown(struct block_list* bl, int dx, int dy, int count, int flag)
ny = result&0xffff;
if(!su) {
- unit->stop_walking(bl, 0);
+ unit->stop_walking(bl, STOPWALKING_FLAG_NONE);
}
if( sd ) {
@@ -952,14 +952,10 @@ int unit_warp(struct block_list *bl,short m,short x,short y,clr_type type)
/*==========================================
* Caused the target object to stop moving.
- * Flag values:
- * &0x1: Issue a fixpos packet afterwards
- * &0x2: Force the unit to move one cell if it hasn't yet
- * &0x4: 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)
+ * Flag values: @see unit_stopwalking_flag.
+ * Upper bytes may be used for other purposes depending on the unit type.
*------------------------------------------*/
-int unit_stop_walking(struct block_list *bl,int type)
-{
+int unit_stop_walking(struct block_list *bl, int flag) {
struct unit_data *ud;
const struct TimerData* td;
int64 tick;
@@ -976,22 +972,22 @@ int unit_stop_walking(struct block_list *bl,int type)
ud->walktimer = INVALID_TIMER;
ud->state.change_walk_target = 0;
tick = timer->gettick();
- if( (type&0x02 && !ud->walkpath.path_pos) //Force moving at least one cell.
- || (type&0x04 && td && DIFF_TICK(td->tick, tick) <= td->data/2) //Enough time has passed to cover half-cell
+ if( (flag&STOPWALKING_FLAG_ONESTEP && !ud->walkpath.path_pos) //Force moving at least one cell.
+ || (flag&STOPWALKING_FLAG_NEXTCELL && td && DIFF_TICK(td->tick, tick) <= td->data/2) //Enough time has passed to cover half-cell
) {
ud->walkpath.path_len = ud->walkpath.path_pos+1;
unit->walktoxy_timer(INVALID_TIMER, tick, bl->id, ud->walkpath.path_pos);
}
- if(type&0x01)
+ if(flag&STOPWALKING_FLAG_FIXPOS)
clif->fixpos(bl);
ud->walkpath.path_len = 0;
ud->walkpath.path_pos = 0;
ud->to_x = bl->x;
ud->to_y = bl->y;
- if(bl->type == BL_PET && type&~0xff)
- ud->canmove_tick = timer->gettick() + (type>>8);
+ if(bl->type == BL_PET && flag&~STOPWALKING_FLAG_MASK)
+ ud->canmove_tick = timer->gettick() + (flag>>8);
//Read, the check in unit_set_walkdelay means dmg during running won't fall through to this place in code [Kevin]
if (ud->state.running) {
@@ -1169,17 +1165,14 @@ int unit_set_walkdelay(struct block_list *bl, int64 tick, int delay, int type) {
//Stop walking, if chasing, readjust timers.
if (delay == 1) {
//Minimal delay (walk-delay) disabled. Just stop walking.
- unit->stop_walking(bl,4);
+ unit->stop_walking(bl, STOPWALKING_FLAG_NEXTCELL);
} else {
//Resume running after can move again [Kevin]
- if(ud->state.running)
- {
+ if (ud->state.running) {
timer->add(ud->canmove_tick, unit->resume_running, bl->id, (intptr_t)ud);
- }
- else
- {
- unit->stop_walking(bl,4);
- if(ud->target)
+ } else {
+ unit->stop_walking(bl, STOPWALKING_FLAG_NEXTCELL);
+ if (ud->target)
timer->add(ud->canmove_tick+1, unit->walktobl_sub, bl->id, ud->target);
}
}
@@ -1376,7 +1369,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
case NPC_SUMMONSLAVE:
case NPC_SUMMONMONSTER:
case AL_TELEPORT:
- if( ((TBL_MOB*)src)->master_id && ((TBL_MOB*)src)->special_state.ai )
+ if (((TBL_MOB*)src)->master_id && ((TBL_MOB*)src)->special_state.ai != AI_NONE)
return 0;
}
@@ -1547,8 +1540,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
}
}
- if(!ud->state.running) //need TK_RUN or WUGDASH handler to be done before that, see bugreport:6026
- unit->stop_walking(src,1);// even though this is not how official works but this will do the trick. bugreport:6829
+ if (!ud->state.running) //need TK_RUN or WUGDASH handler to be done before that, see bugreport:6026
+ unit->stop_walking(src, STOPWALKING_FLAG_FIXPOS);// even though this is not how official works but this will do the trick. bugreport:6829
// in official this is triggered even if no cast time.
clif->skillcasting(src, src->id, target_id, 0,0, skill_id, skill->get_ele(skill_id, skill_lv), casttime);
@@ -1745,7 +1738,7 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
}
}
- unit->stop_walking(src,1);
+ unit->stop_walking(src, STOPWALKING_FLAG_FIXPOS);
// in official this is triggered even if no cast time.
clif->skillcasting(src, src->id, 0, skill_x, skill_y, skill_id, skill->get_ele(skill_id, skill_lv), casttime);
if( casttime > 0 ) {
@@ -2134,7 +2127,7 @@ int unit_attack_timer_sub(struct block_list* src, int tid, int64 tick) {
ud->dir = map->calc_dir(src, target->x,target->y );
}
if(ud->walktimer != INVALID_TIMER)
- unit->stop_walking(src,1);
+ unit->stop_walking(src, STOPWALKING_FLAG_FIXPOS);
if(md) {
//First attack is always a normal attack
if(md->state.skillstate == MSS_ANGRY || md->state.skillstate == MSS_BERSERK) {
@@ -2329,7 +2322,7 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i
map->freeblock_lock();
if (ud->walktimer != INVALID_TIMER)
- unit->stop_walking(bl,0);
+ unit->stop_walking(bl, STOPWALKING_FLAG_NONE);
if (ud->skilltimer != INVALID_TIMER)
unit->skillcastcancel(bl,0);
@@ -2398,18 +2391,18 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i
}
//Leave/reject all invitations.
if(sd->chatID)
- chat->leave(sd,0);
+ chat->leave(sd, false);
if(sd->trade_partner)
trade->cancel(sd);
buyingstore->close(sd);
searchstore->close(sd);
if( sd->menuskill_id != AL_TELEPORT ) { // issue: 8027
- if(sd->state.storage_flag == 1)
+ if(sd->state.storage_flag == STORAGE_FLAG_NORMAL)
storage->pc_quit(sd,0);
- else if (sd->state.storage_flag == 2)
+ else if (sd->state.storage_flag == STORAGE_FLAG_GUILD)
gstorage->pc_quit(sd,0);
- sd->state.storage_flag = 0; //Force close it when being warped.
+ sd->state.storage_flag = STORAGE_FLAG_CLOSED; //Force close it when being warped.
}
if(sd->party_invite>0)
party->reply_invite(sd,sd->party_invite,0);
diff --git a/src/map/unit.h b/src/map/unit.h
index 881fa16f4..d434d52e4 100644
--- a/src/map/unit.h
+++ b/src/map/unit.h
@@ -13,6 +13,19 @@
struct map_session_data;
struct block_list;
+/**
+ * Bitmask values usable as a flag in unit_stopwalking
+ */
+enum unit_stopwalking_flag {
+ STOPWALKING_FLAG_NONE = 0x00,
+ STOPWALKING_FLAG_FIXPOS = 0x01, ///< Issue a fixpos packet afterwards
+ STOPWALKING_FLAG_ONESTEP = 0x02, ///< Force the unit to move one cell if it hasn't yet
+ STOPWALKING_FLAG_NEXTCELL = 0x04, ///< 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)
+ STOPWALKING_FLAG_MASK = 0xff, ///< Mask all of the above
+ // Note: Upper bytes are reserved for duration.
+};
+
struct unit_data {
struct block_list *bl;
struct walkpath_data walkpath;
diff --git a/src/map/vending.c b/src/map/vending.c
index 8ae3f36a4..b32c3e43e 100644
--- a/src/map/vending.c
+++ b/src/map/vending.c
@@ -38,7 +38,7 @@ void vending_closevending(struct map_session_data* sd) {
nullpo_retv(sd);
if( sd->state.vending ) {
- sd->state.vending = false;
+ sd->state.vending = 0;
clif->closevendingboard(&sd->bl, 0);
idb_remove(vending->db, sd->status.char_id);
}
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index c7f63c708..09f33bff6 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -933,6 +933,8 @@ struct {
struct HPMHookPoint *HP_clif_broadcast_post;
struct HPMHookPoint *HP_clif_broadcast2_pre;
struct HPMHookPoint *HP_clif_broadcast2_post;
+ struct HPMHookPoint *HP_clif_messagecolor_self_pre;
+ struct HPMHookPoint *HP_clif_messagecolor_self_post;
struct HPMHookPoint *HP_clif_messagecolor_pre;
struct HPMHookPoint *HP_clif_messagecolor_post;
struct HPMHookPoint *HP_clif_disp_overhead_pre;
@@ -947,8 +949,6 @@ struct {
struct HPMHookPoint *HP_clif_message_post;
struct HPMHookPoint *HP_clif_messageln_pre;
struct HPMHookPoint *HP_clif_messageln_post;
- struct HPMHookPoint *HP_clif_colormes_pre;
- struct HPMHookPoint *HP_clif_colormes_post;
struct HPMHookPoint *HP_clif_process_message_pre;
struct HPMHookPoint *HP_clif_process_message_post;
struct HPMHookPoint *HP_clif_wisexin_pre;
@@ -3861,6 +3861,8 @@ struct {
struct HPMHookPoint *HP_pc_addspiritball_post;
struct HPMHookPoint *HP_pc_delspiritball_pre;
struct HPMHookPoint *HP_pc_delspiritball_post;
+ struct HPMHookPoint *HP_pc_getmaxspiritball_pre;
+ struct HPMHookPoint *HP_pc_getmaxspiritball_post;
struct HPMHookPoint *HP_pc_addfame_pre;
struct HPMHookPoint *HP_pc_addfame_post;
struct HPMHookPoint *HP_pc_famerank_pre;
@@ -6138,6 +6140,8 @@ struct {
int HP_clif_broadcast_post;
int HP_clif_broadcast2_pre;
int HP_clif_broadcast2_post;
+ int HP_clif_messagecolor_self_pre;
+ int HP_clif_messagecolor_self_post;
int HP_clif_messagecolor_pre;
int HP_clif_messagecolor_post;
int HP_clif_disp_overhead_pre;
@@ -6152,8 +6156,6 @@ struct {
int HP_clif_message_post;
int HP_clif_messageln_pre;
int HP_clif_messageln_post;
- int HP_clif_colormes_pre;
- int HP_clif_colormes_post;
int HP_clif_process_message_pre;
int HP_clif_process_message_post;
int HP_clif_wisexin_pre;
@@ -9066,6 +9068,8 @@ struct {
int HP_pc_addspiritball_post;
int HP_pc_delspiritball_pre;
int HP_pc_delspiritball_post;
+ int HP_pc_getmaxspiritball_pre;
+ int HP_pc_getmaxspiritball_post;
int HP_pc_addfame_pre;
int HP_pc_addfame_post;
int HP_pc_famerank_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index 9f9f4ba07..8c1456412 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -477,6 +477,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->disp_message, HP_clif_disp_message) },
{ HP_POP(clif->broadcast, HP_clif_broadcast) },
{ HP_POP(clif->broadcast2, HP_clif_broadcast2) },
+ { HP_POP(clif->messagecolor_self, HP_clif_messagecolor_self) },
{ HP_POP(clif->messagecolor, HP_clif_messagecolor) },
{ HP_POP(clif->disp_overhead, HP_clif_disp_overhead) },
{ HP_POP(clif->msgtable, HP_clif_msgtable) },
@@ -484,7 +485,6 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->msgtable_skill, HP_clif_msgtable_skill) },
{ HP_POP(clif->message, HP_clif_message) },
{ HP_POP(clif->messageln, HP_clif_messageln) },
- { HP_POP(clif->colormes, HP_clif_colormes) },
{ HP_POP(clif->process_message, HP_clif_process_message) },
{ HP_POP(clif->wisexin, HP_clif_wisexin) },
{ HP_POP(clif->wisall, HP_clif_wisall) },
@@ -1962,6 +1962,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(pc->delinvincibletimer, HP_pc_delinvincibletimer) },
{ HP_POP(pc->addspiritball, HP_pc_addspiritball) },
{ HP_POP(pc->delspiritball, HP_pc_delspiritball) },
+ { HP_POP(pc->getmaxspiritball, HP_pc_getmaxspiritball) },
{ HP_POP(pc->addfame, HP_pc_addfame) },
{ HP_POP(pc->famerank, HP_pc_famerank) },
{ HP_POP(pc->set_hate_mob, HP_pc_set_hate_mob) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index 58b9e1b4a..c623747aa 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -12381,10 +12381,36 @@ void HP_clif_broadcast2(struct block_list *bl, const char *mes, size_t len, unsi
}
return;
}
-void HP_clif_messagecolor(struct block_list *bl, unsigned int color, const char *msg) {
+void HP_clif_messagecolor_self(int fd, uint32 color, const char *msg) {
+ int hIndex = 0;
+ if( HPMHooks.count.HP_clif_messagecolor_self_pre ) {
+ void (*preHookFunc) (int *fd, uint32 *color, const char *msg);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_messagecolor_self_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_clif_messagecolor_self_pre[hIndex].func;
+ preHookFunc(&fd, &color, msg);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.messagecolor_self(fd, color, msg);
+ }
+ if( HPMHooks.count.HP_clif_messagecolor_self_post ) {
+ void (*postHookFunc) (int *fd, uint32 *color, const char *msg);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_messagecolor_self_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_clif_messagecolor_self_post[hIndex].func;
+ postHookFunc(&fd, &color, msg);
+ }
+ }
+ return;
+}
+void HP_clif_messagecolor(struct block_list *bl, uint32 color, const char *msg) {
int hIndex = 0;
if( HPMHooks.count.HP_clif_messagecolor_pre ) {
- void (*preHookFunc) (struct block_list *bl, unsigned int *color, const char *msg);
+ void (*preHookFunc) (struct block_list *bl, uint32 *color, const char *msg);
*HPMforce_return = false;
for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_messagecolor_pre; hIndex++ ) {
preHookFunc = HPMHooks.list.HP_clif_messagecolor_pre[hIndex].func;
@@ -12399,7 +12425,7 @@ void HP_clif_messagecolor(struct block_list *bl, unsigned int color, const char
HPMHooks.source.clif.messagecolor(bl, color, msg);
}
if( HPMHooks.count.HP_clif_messagecolor_post ) {
- void (*postHookFunc) (struct block_list *bl, unsigned int *color, const char *msg);
+ void (*postHookFunc) (struct block_list *bl, uint32 *color, const char *msg);
for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_messagecolor_post; hIndex++ ) {
postHookFunc = HPMHooks.list.HP_clif_messagecolor_post[hIndex].func;
postHookFunc(bl, &color, msg);
@@ -12563,33 +12589,6 @@ void HP_clif_messageln(const int fd, const char *mes) {
}
return;
}
-int HP_clif_colormes(int fd, enum clif_colors color, const char *msg) {
- int hIndex = 0;
- int retVal___ = 0;
- if( HPMHooks.count.HP_clif_colormes_pre ) {
- int (*preHookFunc) (int *fd, enum clif_colors *color, const char *msg);
- *HPMforce_return = false;
- for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_colormes_pre; hIndex++ ) {
- preHookFunc = HPMHooks.list.HP_clif_colormes_pre[hIndex].func;
- retVal___ = preHookFunc(&fd, &color, msg);
- }
- if( *HPMforce_return ) {
- *HPMforce_return = false;
- return retVal___;
- }
- }
- {
- retVal___ = HPMHooks.source.clif.colormes(fd, color, msg);
- }
- if( HPMHooks.count.HP_clif_colormes_post ) {
- int (*postHookFunc) (int retVal___, int *fd, enum clif_colors *color, const char *msg);
- for(hIndex = 0; hIndex < HPMHooks.count.HP_clif_colormes_post; hIndex++ ) {
- postHookFunc = HPMHooks.list.HP_clif_colormes_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, &fd, &color, msg);
- }
- }
- return retVal___;
-}
bool HP_clif_process_message(struct map_session_data *sd, int format, char **name_, size_t *namelen_, char **message_, size_t *messagelen_) {
int hIndex = 0;
bool retVal___ = false;
@@ -51662,6 +51661,33 @@ int HP_pc_delspiritball(struct map_session_data *sd, int count, int type) {
}
return retVal___;
}
+int HP_pc_getmaxspiritball(struct map_session_data *sd, int min) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if( HPMHooks.count.HP_pc_getmaxspiritball_pre ) {
+ int (*preHookFunc) (struct map_session_data *sd, int *min);
+ *HPMforce_return = false;
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_getmaxspiritball_pre; hIndex++ ) {
+ preHookFunc = HPMHooks.list.HP_pc_getmaxspiritball_pre[hIndex].func;
+ retVal___ = preHookFunc(sd, &min);
+ }
+ if( *HPMforce_return ) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.pc.getmaxspiritball(sd, min);
+ }
+ if( HPMHooks.count.HP_pc_getmaxspiritball_post ) {
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd, int *min);
+ for(hIndex = 0; hIndex < HPMHooks.count.HP_pc_getmaxspiritball_post; hIndex++ ) {
+ postHookFunc = HPMHooks.list.HP_pc_getmaxspiritball_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, sd, &min);
+ }
+ }
+ return retVal___;
+}
void HP_pc_addfame(struct map_session_data *sd, int count) {
int hIndex = 0;
if( HPMHooks.count.HP_pc_addfame_pre ) {
diff --git a/src/plugins/dbghelpplug.c b/src/plugins/dbghelpplug.c
index bf43c0b23..ac72b8eb2 100644
--- a/src/plugins/dbghelpplug.c
+++ b/src/plugins/dbghelpplug.c
@@ -217,8 +217,8 @@ typedef struct _InternalData {
// Extended information printed in the console
#define DBG_EXTENDED_INFORMATION \
- "Please report the crash in the bug tracker:\n" \
- "http://hercules.ws/board/tracker/\n"
+ "Please report the crash in our Issues tracker:\n" \
+ "https://github.com/HerculesWS/Hercules/issues\n"
// Print object children?
// WARNING: This will generate huge dump files!
diff --git a/src/plugins/sample.c b/src/plugins/sample.c
index 03d32b1f3..82cb198bd 100644
--- a/src/plugins/sample.c
+++ b/src/plugins/sample.c
@@ -107,7 +107,7 @@ int my_pc_dropitem_post(int retVal, struct map_session_data *sd,int *n,int *amou
if( my_pc_dropitem_storage ) {/* signs whether pre-hook did this */
char output[99];
safesnprintf(output,99,"[ Warning ] you can only drop 1 item at a time, capped from %d to 1",my_pc_dropitem_storage);
- clif->colormes(sd->fd,COLOR_RED,output);
+ clif->messagecolor_self(sd->fd, COLOR_RED, output);
}
return 1;
}
diff --git a/sysinfogen.sh b/sysinfogen.sh
index 89857249f..7fb1da1ac 100755
--- a/sysinfogen.sh
+++ b/sysinfogen.sh
@@ -2,7 +2,7 @@
# Copyright (c) Hercules Dev Team, licensed under GNU GPL.
# See the LICENSE file
-# Base Author: Haru @ http://hercules.ws
+# Base Author: Haru @ http://herc.ws
do_fail() {
echo 'Error writing output file'
diff --git a/tools/Script-Checker.applescript b/tools/Script-Checker.applescript
index db1983f4b..eb4e7629a 100644
--- a/tools/Script-Checker.applescript
+++ b/tools/Script-Checker.applescript
@@ -1,7 +1,7 @@
(*
Copyright (c) Hercules Dev Team, licensed under GNU GPL.
See the LICENSE file
- Base Author: Haru @ http://hercules.ws
+ Base Author: Haru @ http://herc.ws
*)
(*
diff --git a/tools/itemdbconverter.pl b/tools/itemdbconverter.pl
index 13805c09e..9486308a6 100755
--- a/tools/itemdbconverter.pl
+++ b/tools/itemdbconverter.pl
@@ -2,7 +2,7 @@
#
# Copyright (c) Hercules Dev Team, licensed under GNU GPL.
# See the LICENSE file
-# Base Author: Haru @ http://hercules.ws
+# Base Author: Haru @ http://herc.ws
#
# This script converts an item_db(2).txt to the new item_db(2).conf format.
# usage example: perl tools/itemdbconverter.pl < db/item_db2.txt > db/item_db2.conf
diff --git a/tools/questdbconverter.pl b/tools/questdbconverter.pl
index 00431fb79..49e7b76bf 100755
--- a/tools/questdbconverter.pl
+++ b/tools/questdbconverter.pl
@@ -2,7 +2,7 @@
#
# Copyright (c) Hercules Dev Team, licensed under GNU GPL.
# See the LICENSE file
-# Base Author: Dastgir @ http://hercules.ws
+# Base Author: Dastgir @ http://herc.ws
#
# This Script converts quest_db.txt to quest_db.conf format.
# usage example: perl tools/questdbconverter.pl < db/quest_db.txt > db/quest_db.conf