summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml16
-rw-r--r--conf/messages.conf3
-rwxr-xr-xconfigure2
-rw-r--r--db/castle_db.conf382
-rw-r--r--db/item_db2.conf2
-rw-r--r--db/pre-re/item_chain.conf6
-rw-r--r--db/pre-re/item_combo_db.conf1280
-rw-r--r--db/pre-re/item_combo_db.txt165
-rw-r--r--db/pre-re/item_db.conf57
-rw-r--r--db/re/item_chain.conf6
-rw-r--r--db/re/item_combo_db.conf3224
-rw-r--r--db/re/item_combo_db.txt439
-rw-r--r--db/re/item_db.conf57
-rw-r--r--doc/atcommands.txt6
-rw-r--r--doc/constants.md6
-rw-r--r--doc/script_commands.txt10
-rw-r--r--npc/battleground/kvm/kvm_item_pay.txt10
-rw-r--r--npc/custom/battleground/bg_kvm01.txt4
-rw-r--r--npc/custom/battleground/bg_kvm02.txt4
-rw-r--r--npc/custom/battleground/bg_kvm03.txt4
-rw-r--r--sql-files/item_db.sql18
-rw-r--r--sql-files/item_db_re.sql18
-rw-r--r--sql-files/main.sql1
-rw-r--r--sql-files/upgrades/2019-08-08--19-43.sql95
-rw-r--r--sql-files/upgrades/index.txt1
-rw-r--r--src/common/HPMDataCheck.h3
-rw-r--r--src/common/mmo.h8
-rw-r--r--src/common/packets/packets2019_len_main.h52
-rw-r--r--src/common/packets/packets2019_len_re.h52
-rw-r--r--src/common/packets/packets2019_len_zero.h57
-rw-r--r--src/map/atcommand.c63
-rw-r--r--src/map/battle.h4
-rw-r--r--src/map/clif.c207
-rw-r--r--src/map/clif.h19
-rw-r--r--src/map/guild.c54
-rw-r--r--src/map/guild.h1
-rw-r--r--src/map/homunculus.c51
-rw-r--r--src/map/homunculus.h7
-rw-r--r--src/map/itemdb.c229
-rw-r--r--src/map/itemdb.h8
-rw-r--r--src/map/map.c48
-rw-r--r--src/map/map.h2
-rw-r--r--src/map/mapdefines.h10
-rw-r--r--src/map/messages_main.h88
-rw-r--r--src/map/messages_re.h88
-rw-r--r--src/map/messages_zero.h102
-rw-r--r--src/map/mob.c8
-rw-r--r--src/map/npc.c13
-rw-r--r--src/map/packets.h5
-rw-r--r--src/map/packets_keys_main.h7
-rw-r--r--src/map/packets_keys_zero.h7
-rw-r--r--src/map/packets_shuffle_main.h39
-rw-r--r--src/map/packets_shuffle_re.h39
-rw-r--r--src/map/packets_shuffle_zero.h35
-rw-r--r--src/map/packets_struct.h77
-rw-r--r--src/map/pc.c136
-rw-r--r--src/map/pc.h2
-rw-r--r--src/map/script.c69
-rw-r--r--src/map/script.h12
-rw-r--r--src/map/skill.c2
-rw-r--r--src/map/status.c2
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc52
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc56
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc14
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc372
-rw-r--r--tools/itemcombodbconverter.py112
-rw-r--r--tools/utils/common.py6
67 files changed, 6848 insertions, 1186 deletions
diff --git a/.travis.yml b/.travis.yml
index a02f65eeb..43c8e4997 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -39,7 +39,7 @@ matrix:
- compiler: false
include:
- compiler: gcc
- env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug CC=gcc-6 --disable-manager --enable-Werror --enable-packetver=20190821 --enable-packetver-re --enable-buildbot" HPM="1"
+ env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug CC=gcc-6 --disable-manager --enable-Werror --enable-packetver=20190918 --enable-packetver-re --enable-buildbot" HPM="1"
addons:
apt:
sources:
@@ -52,7 +52,7 @@ matrix:
- libxml-sax-perl
- libxml-parser-perl
- compiler: clang
- env: CONFIGURE_FLAGS="--enable-debug CC=clang-5.0 --enable-Werror --enable-packetver=20190821 --enable-packetver-re --enable-buildbot"
+ env: CONFIGURE_FLAGS="--enable-debug CC=clang-5.0 --enable-Werror --enable-packetver=20190918 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
@@ -72,7 +72,7 @@ matrix:
- gdb
- clang-5.0
- compiler: clang
- env: CONFIGURE_FLAGS="--enable-debug CC=clang-4.0 --enable-Werror --enable-packetver=20190821 --enable-packetver-re --enable-buildbot"
+ env: CONFIGURE_FLAGS="--enable-debug CC=clang-4.0 --enable-Werror --enable-packetver=20190918 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
@@ -106,11 +106,11 @@ matrix:
- compiler: clang
env: CONFIGURE_FLAGS="--enable-debug --disable-renewal --enable-Werror --enable-buildbot"
- compiler: gcc
- env: CONFIGURE_FLAGS="--enable-debug --enable-Werror --enable-packetver=20190821 --enable-packetver-re --enable-buildbot"
+ env: CONFIGURE_FLAGS="--enable-debug --enable-Werror --enable-packetver=20190918 --enable-packetver-re --enable-buildbot"
- compiler: gcc
env: CONFIGURE_FLAGS="--enable-debug --disable-renewal --enable-Werror --enable-buildbot"
- compiler: gcc
- env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-5 --disable-manager --enable-Werror --enable-packetver=20190821 --enable-packetver-re --enable-buildbot"
+ env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-5 --disable-manager --enable-Werror --enable-packetver=20190918 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
@@ -128,7 +128,7 @@ matrix:
- gdb
- gcc-5
- compiler: gcc
- env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-6 --disable-manager --enable-Werror --enable-packetver=20190821 --enable-packetver-re --enable-buildbot"
+ env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-6 --disable-manager --enable-Werror --enable-packetver=20190918 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
@@ -146,7 +146,7 @@ matrix:
- gdb
- gcc-6
- compiler: gcc
- env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug CC=gcc-7 --disable-manager --enable-Werror --enable-packetver=20190821 --enable-packetver-re --enable-buildbot"
+ env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug CC=gcc-7 --disable-manager --enable-Werror --enable-packetver=20190918 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
@@ -164,7 +164,7 @@ matrix:
- gdb
- gcc-7
- compiler: gcc
- env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-8 --disable-manager --enable-Werror --enable-packetver=20190821 --enable-packetver-re --enable-buildbot"
+ env: LDFLAGS="-fuse-ld=gold" CONFIGURE_FLAGS="--enable-debug --enable-sanitize=full CC=gcc-8 --disable-manager --enable-Werror --enable-packetver=20190918 --enable-packetver-re --enable-buildbot"
addons:
apt:
sources:
diff --git a/conf/messages.conf b/conf/messages.conf
index bff4829c8..f616335fa 100644
--- a/conf/messages.conf
+++ b/conf/messages.conf
@@ -442,8 +442,9 @@
432: change the sex of
433: This character has been banned until
434: Char-server has been asked to %s the character '%.*s'.
-//435-449 FREE
+//435-448 FREE
// Homunculus messages
+449: Homunculus Experience Gained Base:%u (%.2f%%)
450: You already have a homunculus
// Return pet to egg message
diff --git a/configure b/configure
index 8ac5f1d4f..65e716b09 100755
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
#! /bin/sh
-# From configure.ac cdc66ce0e.
+# From configure.ac 20c3ecff9.
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69.
#
diff --git a/db/castle_db.conf b/db/castle_db.conf
index 907754954..c50d04c48 100644
--- a/db/castle_db.conf
+++ b/db/castle_db.conf
@@ -39,231 +39,433 @@ castle_db: (
CastleName: (string) Name of the castle (used by scripts and guardian name tags)
OnGuildBreakEventName: (string) NPC unique name to invoke ::OnGuildBreak on, when a occupied
castle is abandoned during guild break.
+ // ================ Optional fields ===============================
+ SiegeType: (string, default to SIEGE_TYPE_FE) define siege type
+ EnableClientWarp: (bool, default to false) enable or disable client teleport features
+ ClientWarp: {
+ Position: (int, int) x, y position of warp request
+ ZenyCost: (int) The zeny cost of warp
+ ZenyCostSiegeTime: (int) The zeny cost of warp durring woe
+ }
},
**************************************************************************/
//================
+// Prontera
+//================
+{
+ CastleID: 1
+ MapName: "prtg_cas01"
+ CastleName: "Kriemhild" // kRO : Creamhilt
+ OnGuildBreakEventName: "Agit#prtg_cas01"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (107, 180)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
+},
+{
+ CastleID: 2
+ MapName: "prtg_cas02"
+ CastleName: "Swanhild" // kRO : Sbanhealt
+ OnGuildBreakEventName: "Agit#prtg_cas02"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (94, 56)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
+},
+{
+ CastleID: 3
+ MapName: "prtg_cas03"
+ CastleName: "Fadhgridh" // kRO : Lazrigees
+ OnGuildBreakEventName: "Agit#prtg_cas03"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (46, 97)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
+},
+{
+ CastleID: 4
+ MapName: "prtg_cas04"
+ CastleName: "Skoegul" // kRO : Squagul
+ OnGuildBreakEventName: "Agit#prtg_cas04"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (260, 262)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
+},
+{
+ CastleID: 5
+ MapName: "prtg_cas05"
+ CastleName: "Gondul" // kRO : Guindull
+ OnGuildBreakEventName: "Agit#prtg_cas05"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (26, 38)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
+},
+//================
// Al De Baran
//================
{
- CastleID: 0
+ CastleID: 6
MapName: "aldeg_cas01"
CastleName: "Neuschwanstein" // kRO : Noisyubantian
OnGuildBreakEventName: "Agit#aldeg_cas01"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (212, 175)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 1
+ CastleID: 7
MapName: "aldeg_cas02"
CastleName: "Hohenschwangau" // kRO : Hohensyubangawoo
OnGuildBreakEventName: "Agit#aldeg_cas02"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (82, 71)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 2
+ CastleID: 8
MapName: "aldeg_cas03"
CastleName: "Nuernberg" // kRO : Nyirenverk
OnGuildBreakEventName: "Agit#aldeg_cas03"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (109, 112)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 3
+ CastleID: 9
MapName: "aldeg_cas04"
CastleName: "Wuerzburg" // kRO : Byirtsburi
OnGuildBreakEventName: "Agit#aldeg_cas04"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (60, 116)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 4
+ CastleID: 10
MapName: "aldeg_cas05"
CastleName: "Rothenburg" // kRO : Rotenburk
OnGuildBreakEventName: "Agit#aldeg_cas05"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (61, 185)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
//================
// Geffen
//================
{
- CastleID: 5
+ CastleID: 11
MapName: "gefg_cas01"
CastleName: "Repherion" // kRO : Reprion
OnGuildBreakEventName: "Agit#gefg_cas01"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (40, 43)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 6
+ CastleID: 12
MapName: "gefg_cas02"
CastleName: "Eeyolbriggar" // kRO : Yolbriger
OnGuildBreakEventName: "Agit#gefg_cas02"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (22, 66)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 7
+ CastleID: 13
MapName: "gefg_cas03"
CastleName: "Yesnelph" // kRO : Isinlife
OnGuildBreakEventName: "Agit#gefg_cas03"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (112, 23)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 8
+ CastleID: 14
MapName: "gefg_cas04"
CastleName: "Bergel" // kRO : Berigel
OnGuildBreakEventName: "Agit#gefg_cas04"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (58, 46)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 9
+ CastleID: 15
MapName: "gefg_cas05"
CastleName: "Mersetzdeitz" // kRO : Melsedetsu
OnGuildBreakEventName: "Agit#gefg_cas05"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (66, 48)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
//================
// Payon
//================
{
- CastleID: 10
+ CastleID: 16
MapName: "payg_cas01"
CastleName: "Bright Arbor" // kRO : Mingting
OnGuildBreakEventName: "Agit#payg_cas01"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (115, 57)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 11
+ CastleID: 17
MapName: "payg_cas02"
CastleName: "Scarlet Palace" // kRO : Tiantan
OnGuildBreakEventName: "Agit#payg_cas02"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (26, 265)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 12
+ CastleID: 18
MapName: "payg_cas03"
CastleName: "Holy Shadow" // kRO : Fuying
OnGuildBreakEventName: "Agit#payg_cas03"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (43, 264)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 13
+ CastleID: 19
MapName: "payg_cas04"
CastleName: "Sacred Altar" // kRO : Honglou
OnGuildBreakEventName: "Agit#payg_cas04"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (36, 272)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 14
+ CastleID: 20
MapName: "payg_cas05"
CastleName: "Bamboo Grove Hill" // kRO : Zhulinxian
OnGuildBreakEventName: "Agit#payg_cas05"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (274, 246)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
//================
-// Prontera
+// Rachel
//================
{
- CastleID: 15
- MapName: "prtg_cas01"
- CastleName: "Kriemhild" // kRO : Creamhilt
- OnGuildBreakEventName: "Agit#prtg_cas01"
-},
-{
- CastleID: 16
- MapName: "prtg_cas02"
- CastleName: "Swanhild" // kRO : Sbanhealt
- OnGuildBreakEventName: "Agit#prtg_cas02"
-},
-{
- CastleID: 17
- MapName: "prtg_cas03"
- CastleName: "Fadhgridh" // kRO : Lazrigees
- OnGuildBreakEventName: "Agit#prtg_cas03"
-},
-{
- CastleID: 18
- MapName: "prtg_cas04"
- CastleName: "Skoegul" // kRO : Squagul
- OnGuildBreakEventName: "Agit#prtg_cas04"
-},
-{
- CastleID: 19
- MapName: "prtg_cas05"
- CastleName: "Gondul" // kRO : Guindull
- OnGuildBreakEventName: "Agit#prtg_cas05"
+ CastleID: 21
+ MapName: "arug_cas01"
+ CastleName: "Mardol" // kRO : Mardol
+ OnGuildBreakEventName: "Manager#arug_cas01"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (77, 371)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
-//================
-// Novice Guilds
-//================
{
- CastleID: 20
- MapName: "nguild_alde"
- CastleName: "Earth"
- OnGuildBreakEventName: "Agit_N01"
+ CastleID: 22
+ MapName: "arug_cas02"
+ CastleName: "Cyr" // kRO : Cyr
+ OnGuildBreakEventName: "Manager#arug_cas02"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (301, 332)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 21
- MapName: "nguild_gef"
- CastleName: "Air"
- OnGuildBreakEventName: "Agit_N02"
+ CastleID: 23
+ MapName: "arug_cas03"
+ CastleName: "Horn" // kRO : Horn
+ OnGuildBreakEventName: "Manager#arug_cas03"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (322, 91)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 22
- MapName: "nguild_pay"
- CastleName: "Water"
- OnGuildBreakEventName: "Agit_N03"
+ CastleID: 24
+ MapName: "arug_cas04"
+ CastleName: "Gefn" // kRO : Gefn
+ OnGuildBreakEventName: "Manager#arug_cas04"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (322, 91)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 23
- MapName: "nguild_prt"
- CastleName: "Fire"
- OnGuildBreakEventName: "Agit_N04"
+ CastleID: 25
+ MapName: "arug_cas05"
+ CastleName: "Bandis" // kRO : Bandis
+ OnGuildBreakEventName: "Manager#arug_cas05"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (322, 91)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
//================
// Yuno
//================
{
- CastleID: 24
+ CastleID: 26
MapName: "schg_cas01"
CastleName: "Himinn" // kRO : Himinn
OnGuildBreakEventName: "Manager#schg_cas01"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (233, 300)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 25
+ CastleID: 27
MapName: "schg_cas02"
CastleName: "Andlangr" // kRO : Andlangr
OnGuildBreakEventName: "Manager#schg_cas02"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (101, 372)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 26
+ CastleID: 28
MapName: "schg_cas03"
CastleName: "Viblainn" // kRO : Viblainn
OnGuildBreakEventName: "Manager#schg_cas03"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (81, 94)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 27
+ CastleID: 29
MapName: "schg_cas04"
CastleName: "Hljod" // kRO : Hljod
OnGuildBreakEventName: "Manager#schg_cas04"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (233, 300)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
{
- CastleID: 28
+ CastleID: 30
MapName: "schg_cas05"
CastleName: "Skidbladnir" // kRO : Skidbladnir
OnGuildBreakEventName: "Manager#schg_cas05"
+ SiegeType: "SIEGE_TYPE_SE"
+ EnableClientWarp: true
+ ClientWarp: {
+ Position: (233, 300)
+ ZenyCost: 100
+ ZenyCostSiegeTime: 100000
+ }
},
//================
-// Rachel
+// Novice Guilds
//================
{
- CastleID: 29
- MapName: "arug_cas01"
- CastleName: "Mardol" // kRO : Mardol
- OnGuildBreakEventName: "Manager#arug_cas01"
-},
-{
- CastleID: 30
- MapName: "arug_cas02"
- CastleName: "Cyr" // kRO : Cyr
- OnGuildBreakEventName: "Manager#arug_cas02"
-},
-{
CastleID: 31
- MapName: "arug_cas03"
- CastleName: "Horn" // kRO : Horn
- OnGuildBreakEventName: "Manager#arug_cas03"
+ MapName: "nguild_prt"
+ CastleName: "Fire"
+ OnGuildBreakEventName: "Agit_N04"
+ SiegeType: "SIEGE_TYPE_TE"
},
{
CastleID: 32
- MapName: "arug_cas04"
- CastleName: "Gefn" // kRO : Gefn
- OnGuildBreakEventName: "Manager#arug_cas04"
+ MapName: "nguild_alde"
+ CastleName: "Earth"
+ OnGuildBreakEventName: "Agit_N01"
+ SiegeType: "SIEGE_TYPE_TE"
},
{
CastleID: 33
- MapName: "arug_cas05"
- CastleName: "Bandis" // kRO : Bandis
- OnGuildBreakEventName: "Manager#arug_cas05"
+ MapName: "nguild_gef"
+ CastleName: "Air"
+ OnGuildBreakEventName: "Agit_N02"
+ SiegeType: "SIEGE_TYPE_TE"
+},
+{
+ CastleID: 34
+ MapName: "nguild_pay"
+ CastleName: "Water"
+ OnGuildBreakEventName: "Agit_N03"
+ SiegeType: "SIEGE_TYPE_TE"
},
)
diff --git a/db/item_db2.conf b/db/item_db2.conf
index 8a2d8e429..ed673c5ea 100644
--- a/db/item_db2.conf
+++ b/db/item_db2.conf
@@ -117,6 +117,8 @@ item_db: (
">
OnEquipScript: <" OnEquip Script (can also be multi-line) ">
OnUnequipScript: <" OnUnequip Script (can also be multi-line) ">
+ OnRentalStartScript: <" On item renting script, gets called after item is created in inventory (can also be multi-line) ">
+ OnRentalEndScript: <" On item rent end/expire script, gets called after item is removed from inventory (can also be multi-line) ">
// ================ Optional fields (item_db2 only) ===============
Inherit: true/false (boolean, if true, inherit the values
that weren't specified, from item_db.conf,
diff --git a/db/pre-re/item_chain.conf b/db/pre-re/item_chain.conf
index a2e4efff4..cdc92d92c 100644
--- a/db/pre-re/item_chain.conf
+++ b/db/pre-re/item_chain.conf
@@ -59,6 +59,12 @@ ITMCHAIN_ORE: {
Emperium: 5
}
+ITMCHAIN_SIEGFRIED: {
+ Token_Of_Siegfried: 1
+ F_Token_Of_Siegfried: 1
+ E_Token_Of_Siegfried: 1
+}
+
ITMCHAIN_GEM: {
Dark_Red_Jewel: 80
Violet_Jewel: 30
diff --git a/db/pre-re/item_combo_db.conf b/db/pre-re/item_combo_db.conf
new file mode 100644
index 000000000..e2ed5d486
--- /dev/null
+++ b/db/pre-re/item_combo_db.conf
@@ -0,0 +1,1280 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//================= Description ===========================================
+// Configurations file for status effects
+//=========================================================================
+
+combo_db: (
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ===============================
+ Items: ["item_list"] (string, array) list of items
+ Script: <"
+ Script
+ (it can be multi-line)
+ ">
+}
+**************************************************************************/
+{
+ Items: ["Dragon_Slayer", "Dragon_Breath"]
+ Script: <"
+ bonus2 bAddRace, RC_Dragon, 5;
+ ">
+},
+{
+ Items: ["Long_Horn", "Valkyrjas_Shield"]
+ Script: <"
+ bonus3 bAutoSpellWhenHit, "HP_ASSUMPTIO", 2, 5;
+ ">
+},
+{
+ Items: ["Long_Horn", "Tournament_Shield"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 4;
+ bonus bDef, 2;
+ ">
+},
+{
+ Items: ["Battle_Hook", "Tournament_Shield"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 4;
+ bonus bDef, 2;
+ ">
+},
+{
+ Items: ["Hunting_Spear", "Tournament_Shield"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 4;
+ bonus bDef, 2;
+ ">
+},
+{
+ Items: ["Long_Horn_M", "Valkyrjas_Shield"]
+ Script: <"
+ bonus3 bAutoSpellWhenHit, "HP_ASSUMPTIO", 2, 5;
+ ">
+},
+{
+ Items: ["Staff_Of_Soul", "Spiritual_Ring"]
+ Script: <"
+ bonus bMatkRate, 6;
+ bonus bDex, 2;
+ bonus bCastrate, -getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Staff_Of_Soul", "Spiritual_Ring_C"]
+ Script: <"
+ bonus bMatkRate, 6;
+ bonus bDex, 2;
+ bonus bCastrate, -getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Wizardy_Staff", "Spiritual_Ring"]
+ Script: <"
+ bonus bMatkRate, 6;
+ bonus bDex, 2;
+ bonus bCastrate, -getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Wizardy_Staff", "Spiritual_Ring_C"]
+ Script: <"
+ bonus bMatkRate, 6;
+ bonus bDex, 2;
+ bonus bCastrate, -getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Gae_Bolg", "Dragon_Breath"]
+ Script: <"
+ bonus2 bAddRace, RC_Dragon, 5;
+ ">
+},
+{
+ Items: ["Spectral_Spear", "Red_Silk_Seal"]
+ Script: <"
+ bonus2 bResEff, Eff_Confusion, 9500;
+ ">
+},
+{
+ Items: ["Spectral_Spear_", "Red_Silk_Seal"]
+ Script: <"
+ bonus2 bResEff, Eff_Confusion, 9500;
+ ">
+},
+{
+ Items: ["Hollgrehenn_Hammer", "B_Harword_Card"]
+ Script: <"
+ bonus bBreakArmorRate, 900;
+ bonus bBreakWeaponRate, 900;
+ ">
+},
+{
+ Items: ["Principles_Of_Magic", "Librarian_Glove", "Pocket_Watch_"]
+ Script: <"
+ bonus bInt, 5;
+ bonus bMaxHP, 700;
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Ancient_Magic", "Mage_Coat"]
+ Script: <"
+ bonus bMdef, 8;
+ bonus bMaxSPrate, 10;
+ bonus bInt, 4;
+ ">
+},
+{
+ Items: ["Ancient_Magic", "Mage_Coat_"]
+ Script: <"
+ bonus bMdef, 8;
+ bonus bMaxSPrate, 10;
+ bonus bInt, 4;
+ ">
+},
+{
+ Items: ["Ancient_Magic", "Librarian_Glove", "Pocket_Watch_"]
+ Script: <"
+ bonus bInt, 5;
+ bonus bMaxHP, 700;
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Bone_Wand", "Skull_Cap"]
+ Script: <"
+ bonus bMatk, 10 * getequiprefinerycnt(EQI_HAND_R);
+ bonus bCastrate, -10;
+ ">
+},
+{
+ Items: ["Staff_Of_Wing", "Wing_Of_Eagle"]
+ Script: <"
+ bonus bSpeedRate, 25;
+ ">
+},
+{
+ Items: ["Survival_Rod_", "Clack_Of_Servival"]
+ Script: <"
+ bonus bMaxHP, 300;
+ bonus bMatkRate, getequiprefinerycnt(EQI_HAND_R) - 5;
+ bonus2 bSubEle, Ele_Neutral, getequiprefinerycnt(EQI_HAND_R) * 3;
+ ">
+},
+{
+ Items: ["Survival_Rod_", "Cloak_Of_Survival_C"]
+ Script: <"
+ bonus bMatkRate, 5;
+ bonus2 bSubEle, Ele_Neutral, 25;
+ ">
+},
+{
+ Items: ["Survival_Rod2_", "Clack_Of_Servival"]
+ Script: <"
+ bonus bMaxHP, 300;
+ bonus bMatkRate, getequiprefinerycnt(EQI_HAND_R) - 5;
+ bonus2 bSubEle, Ele_Neutral, getequiprefinerycnt(EQI_HAND_R) * 3;
+ ">
+},
+{
+ Items: ["Survival_Rod2_", "Cloak_Of_Survival_C"]
+ Script: <"
+ bonus bMatkRate, 5;
+ bonus2 bSubEle, Ele_Neutral, 25;
+ ">
+},
+{
+ Items: ["Walking_Stick", "Magician_Hat"]
+ Script: <"
+ bonus bDex, 2;
+ bonus bInt, 2;
+ bonus bSPrecovRate, 5;
+ bonus bMatkRate, getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Holy_Stick", "Exorcism_Bible"]
+ Script: <"
+ bonus2 bSkillAtk, "PR_MAGNUS", 20;
+ bonus3 bAutoSpellWhenHit, "PR_TURNUNDEAD", 1, 20;
+ ">
+},
+{
+ Items: ["Thorn_Staff", "Skull_Cap"]
+ Script: <"
+ bonus bMatk, 10 * getequiprefinerycnt(EQI_HAND_R);
+ bonus bCastrate, -10;
+ ">
+},
+{
+ Items: ["Luna_Bow", "Lunatic_Brooch"]
+ Script: <"
+ bonus bDex, 1;
+ bonus bMaxSP, 50;
+ bonus bSPrecovRate, 10;
+ ">
+},
+{
+ Items: ["Burning_Bow", "Fire_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 25;
+ ">
+},
+{
+ Items: ["Frozen_Bow", "Crystal_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 25;
+ ">
+},
+{
+ Items: ["Earth_Bow", "Stone_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 25;
+ bonus2 bAddEff, Eff_Stone, 1000;
+ ">
+},
+{
+ Items: ["Gust_Bow", "Arrow_Of_Wind"]
+ Script: <"
+ bonus bLongAtkRate, 25;
+ bonus3 bAutoSpell, "NJ_HUUJIN", 5, 100;
+ if (readparam(bInt) > 39)
+ bonus3 bAutoSpell, "NJ_HUUJIN", 5, 200;
+ ">
+},
+{
+ Items: ["Orc_Archer_Bow", "Steel_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 50;
+ ">
+},
+{
+ Items: ["Cursed_Lyre", "Cursed_Star"]
+ Script: <"
+ bonus bAtk, 25;
+ bonus3 bAddEff, Eff_Curse, 200, ATF_WEAPON | ATF_LONG | ATF_TARGET;
+ ">
+},
+{
+ Items: ["Divine_Cross", "Spiritual_Ring"]
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bDex, 2;
+ bonus2 bSubRace, RC_Demon, 10;
+ bonus2 bSubRace, RC_Undead, 10;
+ ">
+},
+{
+ Items: ["Divine_Cross", "Spiritual_Ring_C"]
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bDex, 2;
+ bonus2 bSubRace, RC_Demon, 10;
+ bonus2 bSubRace, RC_Undead, 10;
+ ">
+},
+{
+ Items: ["Memorize_Book", "Pocket_Watch_", "One_Eyed_Glass"]
+ Script: <"
+ bonus bHPrecovRate, 15;
+ bonus bSPrecovRate, 15;
+ bonus bMatkRate, 7;
+ ">
+},
+{
+ Items: ["Stone_Buckler", "Odins_Blessing", "Magni_Cap"]
+ Script: <"
+ bonus bStr, 2;
+ bonus bDef, 5;
+ bonus bMdef, 5;
+ if (BaseClass == Job_Swordman)
+ bonus bDef, 6;
+ ">
+},
+{
+ Items: ["Valkyrjas_Shield", "Odins_Blessing", "Fricca_Circlet"]
+ Script: <"
+ bonus bDef, 2 - getequiprefinerycnt(EQI_HAND_L) - getequiprefinerycnt(EQI_HEAD_TOP);
+ bonus bMdef, 5 + getequiprefinerycnt(EQI_HAND_L) + getequiprefinerycnt(EQI_HEAD_TOP);
+ ">
+},
+{
+ Items: ["Angels_Safeguard", "Angels_Protection", "Angels_Arrival", "Angels_Warmth", "Kiss_Of_Angel"]
+ Script: <"
+ bonus bMaxHP, 900;
+ bonus bMaxSP, 100;
+ bonus3 bAutoSpellWhenHit, "HP_ASSUMPTIO", 1, 30;
+ ">
+},
+{
+ Items: ["Memorize_Book_", "Pocket_Watch_", "One_Eyed_Glass"]
+ Script: <"
+ bonus bHPrecovRate, 15;
+ bonus bSPrecovRate, 15;
+ bonus bMatkRate, 7;
+ ">
+},
+{
+ Items: ["Orleans_Server", "Orleans_Glove"]
+ Script: <"
+ bonus bCastrate, -10;
+ ">
+},
+{
+ Items: ["Thorny_Buckler", "Bison_Horn"]
+ Script: <"
+ bonus bAspdRate, 10;
+ bonus bShortWeaponDamageReturn, 5;
+ ">
+},
+{
+ Items: ["Shadow_Guard", "Shadow_Walk"]
+ Script: <"
+ bonus2 bAddEff, Eff_Blind, 500;
+ autobonus "{ bonus bFlee,20; }", 200, 10000, BF_WEAPON, "{ specialeffect(EF_INCAGILITY, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Valkyrjas_Shield_C", "Odins_Blessing", "Fricca_Circlet"]
+ Script: <"
+ bonus bDef, 2 - getrefine() - getequiprefinerycnt(EQI_HEAD_TOP);
+ bonus bMdef, 5 + getrefine() + getequiprefinerycnt(EQI_HEAD_TOP);
+ ">
+},
+{
+ Items: ["Mr_Smile", "Wit_Pumpkin_Hat"]
+ Script: <"
+ bonus2 bAddMonsterDropItem, 12192, 1;
+ ">
+},
+{
+ Items: ["Phantom_Of_Opera", "Wit_Pumpkin_Hat"]
+ Script: <"
+ bonus bFlee, 10;
+ bonus2 bAddEff, Eff_Stun, 1000;
+ ">
+},
+{
+ Items: ["Elven_Ears", "Skull_Cap"]
+ Script: <"
+ bonus bUseSPrate, -3;
+ ">
+},
+{
+ Items: ["Padded_Armor", "Hyper_Changer"]
+ Script: <"
+ bonus bDef, 5;
+ bonus bMaxHP, 150;
+ ">
+},
+{
+ Items: ["Padded_Armor_", "Hyper_Changer"]
+ Script: <"
+ bonus bDef, 5;
+ bonus bMaxHP, 150;
+ ">
+},
+{
+ Items: ["Ninja_Suit", "Shinobis_Sash"]
+ Script: <"
+ bonus bUseSPrate, -20;
+ bonus bMaxHP, 300;
+ ">
+},
+{
+ Items: ["G_Strings", "Undershirt"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["G_Strings", "Undershirt_"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Odins_Blessing", "Fricco_Shoes", "Falcon_Robe"]
+ Script: <"
+ bonus bAgi, 3;
+ bonus bMaxHPrate, 5;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["Odins_Blessing", "Vidars_Boots", "Valis_Manteau"]
+ Script: <"
+ bonus bVit, 5;
+ bonus bHPrecovRate, 10;
+ bonus bSPrecovRate, 10;
+ ">
+},
+{
+ Items: ["Odins_Blessing", "Ulle_Cap"]
+ Script: <"
+ if (readparam(bDex) > 69)
+ bonus bUseSPrate, -10;
+ ">
+},
+{
+ Items: ["Odins_Blessing", "Ulle_Cap_I"]
+ Script: <"
+ if (readparam(bDex) > 69)
+ bonus bUseSPrate, -10;
+ ">
+},
+{
+ Items: ["Goibnes_Armor", "Goibnes_Combat_Boots", "Goibnes_Shoulder_Arms", "Goibnes_Helmet"]
+ Script: <"
+ bonus bVit, 5;
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ bonus bDef, 5;
+ bonus bMdef, 15;
+ bonus2 bSubEle, Ele_Water, 10;
+ bonus2 bSubEle, Ele_Earth, 10;
+ bonus2 bSubEle, Ele_Fire, 10;
+ bonus2 bSubEle, Ele_Wind, 10;
+ ">
+},
+{
+ Items: ["Valkyrie_Armor", "Valkyrie_Shoes", "Valkyrie_Manteau", "Valkyrie_Helm"]
+ Script: <"
+ bonus bAllStats, 1;
+ ">
+},
+{
+ Items: ["Dress_Of_Angel", "Angeling_Hairpin"]
+ Script: <"
+ bonus bLuk, 6;
+ bonus bFlee, 5;
+ bonus bInt, 2;
+ ">
+},
+{
+ Items: ["Ninja_Suit_", "Shinobis_Sash"]
+ Script: <"
+ bonus bUseSPrate, -20;
+ bonus bMaxHP, 300;
+ ">
+},
+{
+ Items: ["G_Strings_", "Undershirt"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["G_Strings_", "Undershirt_"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Diabolus_Robe", "Diabolus_Ring"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 3;
+ bonus bMatkRate, 3;
+ ">
+},
+{
+ Items: ["Diabolus_Armor", "Diabolus_Ring"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 3;
+ bonus bMatkRate, 3;
+ ">
+},
+{
+ Items: ["Assaulter_Plate", "Battle_Greave", "Commander_Manteau"]
+ Script: <"
+ 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, "{ specialeffect(EF_HEAL, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Elite_Engineer_Armor", "Battle_Greave", "Commander_Manteau"]
+ Script: <"
+ 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;
+ ">
+},
+{
+ Items: ["Assassin_Robe", "Battle_Greave", "Commander_Manteau"]
+ Script: <"
+ 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, "{ specialeffect(EF_HEAL, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Warlock_Battle_Robe", "Combat_Boots", "Commander_Manteau_"]
+ Script: <"
+ 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, "{ specialeffect(EF_ENERGYCOAT, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Medic_Robe", "Combat_Boots", "Commander_Manteau_"]
+ Script: <"
+ 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, "{ specialeffect(EF_ENERGYCOAT, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Elite_Archer_Suit", "Combat_Boots", "Commander_Manteau_"]
+ Script: <"
+ bonus2 bSubRace, RC_NonDemiPlayer, -300;
+ bonus bDex, 3;
+ bonus bMaxHPrate, 12;
+ bonus bLongAtkDef, 10;
+ bonus bDelayrate, -25;
+ ">
+},
+{
+ Items: ["Elite_Shooter_Suit", "Battle_Boots", "Sheriff_Manteau"]
+ Script: <"
+ bonus2 bSubRace, RC_NonDemiPlayer, -300;
+ bonus bDex, 3;
+ bonus bMaxHPrate, 12;
+ bonus bLongAtkDef, 10;
+ bonus bDelayrate, -25;
+ ">
+},
+{
+ Items: ["Sprint_Mail", "Sprint_Shoes", "Sprint_Ring"]
+ Script: <"
+ bonus bMaxHPrate, 7;
+ bonus bMaxSPrate, 7;
+ bonus bCastrate, -3;
+ bonus bDelayrate, -15;
+ ">
+},
+{
+ Items: ["Improved_Tights", "Linen_Glove"]
+ Script: <"
+ bonus bFlee2, 5;
+ ">
+},
+{
+ Items: ["Krieger_Suit1", "Krieger_Shoes1", "Krieger_Muffler1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 5;
+ bonus2 bResEff, Eff_Freeze, 10000;
+ bonus2 bSkillHeal2, "AM_POTIONPITCHER", 3;
+ bonus2 bSkillHeal2, "AL_HEAL", 3;
+ bonus2 bSkillHeal2, "PR_SANCTUARY", 3;
+ ">
+},
+{
+ Items: ["Dragon_Vest", "Dragon_Manteau"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 15;
+ ">
+},
+{
+ Items: ["Cuffs", "Bloody_Iron_Ball"]
+ Script: <"
+ bonus bBaseAtk, 50;
+ bonus2 bAddDefClass, 1196, 20;
+ bonus2 bAddDefClass, 1197, 20;
+ ">
+},
+{
+ Items: ["Tidal_Shoes", "Wool_Scarf"]
+ Script: <"
+ bonus bHPrecovRate, 5;
+ bonus bMaxHPrate, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots", "Rider_Insignia"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots", "Rider_Insignia_"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots", "Rider_Insignia_M"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Diabolus_Boots", "Diabolus_Manteau"]
+ Script: <"
+ bonus bMaxHPrate, 6;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots_", "Rider_Insignia"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots_", "Rider_Insignia_"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots_", "Rider_Insignia_M"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Beach_Sandal", "Beach_Manteau"]
+ Script: <"
+ bonus bFlee, 5;
+ ">
+},
+{
+ Items: ["Morpheuss_Shawl", "Morpheuss_Ring", "Morpheuss_Armlet", "Morpheuss_Hood"]
+ Script: <"
+ bonus bInt, 5;
+ bonus bMdef, 11;
+ bonus bMaxSPrate, 20;
+ bonus bNoCastCancel, 0;
+ bonus bCastrate, 25;
+ ">
+},
+{
+ Items: ["Morriganes_Manteau", "Morriganes_Belt", "Morriganes_Pendant", "Morriganes_Helm"]
+ Script: <"
+ bonus bStr, 2;
+ bonus bLuk, 9;
+ bonus bCritical, 13;
+ bonus bBaseAtk, 18;
+ bonus bFlee2, 13;
+ ">
+},
+{
+ Items: ["Dragon_Breath", "Dragon_Killer"]
+ Script: <"
+ bonus2 bAddRace, RC_Dragon, 5;
+ ">
+},
+{
+ Items: ["Clip", "Spiritual_Ring"]
+ Script: <"
+ bonus2 bSkillAtk, "AL_HEAL", 50;
+ bonus2 bSkillAtk, "PR_MAGNUS", 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Clip", "Spiritual_Ring_C"]
+ Script: <"
+ bonus2 bSkillAtk, "AL_HEAL", 50;
+ bonus2 bSkillAtk, "PR_MAGNUS", 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Clip", "Spiritual_Ring_M"]
+ Script: <"
+ bonus2 bSkillAtk, "AL_HEAL", 50;
+ bonus2 bSkillAtk, "PR_MAGNUS", 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary", "Spiritual_Ring"]
+ Script: <"
+ bonus2 bSkillAtk, "AL_HEAL", 50;
+ bonus2 bSkillAtk, "PR_MAGNUS", 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary", "Spiritual_Ring_C"]
+ Script: <"
+ bonus2 bSkillAtk, "AL_HEAL", 50;
+ bonus2 bSkillAtk, "PR_MAGNUS", 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary", "Spiritual_Ring_M"]
+ Script: <"
+ bonus2 bSkillAtk, "AL_HEAL", 50;
+ bonus2 bSkillAtk, "PR_MAGNUS", 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Ring_Of_Rogue", "Cold_Heart"]
+ Script: <"
+ bonus2 bAddSize, Size_Medium, 8;
+ bonus bAspdRate, getequiprefinerycnt(EQI_HAND_R) / 2;
+ ">
+},
+{
+ Items: ["Ring_Of_Rogue", "Black_Cat"]
+ Script: <"
+ bonus2 bAddSize, Size_Large, 8;
+ bonus bHit, getequiprefinerycnt(EQI_HAND_R) / 2;
+ bonus bCastrate, -getequiprefinerycnt(EQI_HAND_R) / 2;
+ ">
+},
+{
+ Items: ["Rosary_", "Spiritual_Ring"]
+ Script: <"
+ bonus2 bSkillAtk, "AL_HEAL", 50;
+ bonus2 bSkillAtk, "PR_MAGNUS", 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary_", "Spiritual_Ring_C"]
+ Script: <"
+ bonus2 bSkillAtk, "AL_HEAL", 50;
+ bonus2 bSkillAtk, "PR_MAGNUS", 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary_", "Spiritual_Ring_M"]
+ Script: <"
+ bonus2 bSkillAtk, "AL_HEAL", 50;
+ bonus2 bSkillAtk, "PR_MAGNUS", 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Ring_Of_Flame_Lord", "Ring_Of_Resonance"]
+ Script: <"
+ bonus4 bAutoSpell, "MO_EXTREMITYFIST", 1, 3, 1;
+ bonus3 bAutoSpell, "PR_LEXAETERNA", 1, 20;
+ bonus3 bAutoSpell, "AS_SONICBLOW", 5, 50;
+ bonus3 bAutoSpell, "MO_INVESTIGATE", 5, 20;
+ bonus3 bAutoSpell, "ASC_METEORASSAULT", 2, 50;
+ ">
+},
+{
+ Items: ["Medal_Swordman", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Thief", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Acolyte", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Mage", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Archer", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Merchant", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Icarus_Wing", "Bowman_Scarf"]
+ Script: <"
+ bonus bUseSPrate, -25;
+ ">
+},
+{
+ Items: ["Medal_Gunner", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Shaman_Ring", "Shaman_Earing", "Shamans_Hair_Ornament"]
+ Script: <"
+ bonus bMaxHP, 300;
+ bonus bMatkRate, 5;
+ bonus2 bSubEle, Ele_Neutral, 5;
+ ">
+},
+{
+ Items: ["Dark_Knight_Belt", "Dark_Knight_Glove", "Dark_Knight_Mask"]
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bInt, 5;
+ bonus2 bSubRace, RC_Angel, 10;
+ ">
+},
+{
+ Items: ["Dark_Knight_Belt", "Dark_Knight_Glove", "Dark_Knight_MaskB"]
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bInt, 5;
+ bonus2 bSubRace, RC_Angel, 10;
+ ">
+},
+{
+ Items: ["Poring_Card", "Mastering_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Lunatic_Card", "Eclipse_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Chonchon_Card", "Dragon_Fly_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Roda_Frog_Card", "Toad_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Rocker_Card", "Vocal_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Skeleton_Card", "Skel_Prisoner_Card"]
+ Script: <"
+ bonus2 bAddEffWhenHit, Eff_Sleep, 600;
+ ">
+},
+{
+ Items: ["Tarou_Card", "Cramp_Card"]
+ Script: <"
+ bonus bStr, 3;
+ ">
+},
+{
+ Items: ["Wolf_Card", "Vagabond_Wolf_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Pecopeco_Card", "Grand_Peco_Card"]
+ Script: <"
+ bonus bDef, 3;
+ bonus bVit, 3;
+ ">
+},
+{
+ Items: ["Muka_Card", "Raggler_Card", "Baby_Leopard_Card", "Zipper_Bear_Card", "Mole_Card"]
+ Script: <"
+ bonus bStr, 4;
+ bonus bMaxHPrate, 7;
+ bonus bMaxSPrate, 7;
+ bonus2 bSkillAtk, "MC_MAMMONITE", 20;
+ bonus bSPDrainValue, 1;
+ if (BaseJob == Job_Alchemist) {
+ bonus3 bAutoSpell, "BS_ADRENALINE", 1, 10;
+ bonus2 bAddMonsterDropItem, 7139, 3;
+ bonus2 bAddMonsterDropItem, 905, 10;
+ }
+ ">
+},
+{
+ Items: ["Stainer_Card", "Wander_Man_Card", "Shinobi_Card", "Wild_Rose_Card", "Whikebain_Card"]
+ Script: <"
+ bonus bStr, 6;
+ bonus bAgi, 4;
+ bonus2 bSkillAtk, "RG_BACKSTAP", 10;
+ if (getskilllv("RG_STRIPARMOR") == 5)
+ bonus3 bAutoSpell, "RG_STRIPARMOR", 5, 50;
+ if (BaseJob == Job_Rogue) {
+ bonus bUseSPrate, -20;
+ bonus3 bAutoSpell, "RG_INTIMIDATE", 1, -20;
+ }
+ ">
+},
+{
+ Items: ["BigFoot_Card", "Grizzly_Card"]
+ Script: <"
+ bonus2 bAddEffWhenHit, Eff_Blind, 600;
+ ">
+},
+{
+ Items: ["Munak_Card", "Bon_Gun_Card", "Hyegun_Card"]
+ Script: <"
+ bonus bAllStats, 1;
+ ">
+},
+{
+ Items: ["Mummy_Card", "Ancient_Mummy_Card"]
+ Script: <"
+ bonus bPerfectHitAddRate, 20;
+ ">
+},
+{
+ Items: ["Nightmare_Card", "Nightmare_Terror_Card"]
+ Script: <"
+ bonus2 bAddEffWhenHit, Eff_Curse, 600;
+ ">
+},
+{
+ Items: ["Crab_Card", "Aster_Card", "Shellfish_Card"]
+ Script: <"
+ bonus3 bAddMonsterDropItem, 544, RC_Fish, 3000;
+ bonus2 bAddEle, Ele_Water, 30;
+ ">
+},
+{
+ Items: ["Dark_Lord_Card", "Dark_Illusion_Card"]
+ Script: <"
+ bonus bMaxHPrate, 20;
+ bonus bMaxSPrate, 20;
+ bonus bCastrate, -10;
+ ">
+},
+{
+ Items: ["The_Paper_Card", "Wander_Man_Card", "Shinobi_Card", "Wild_Rose_Card", "Dancing_Dragon_Card"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bStr, 5;
+ bonus bAspdRate, 5;
+ bonus bSpeedRate, 25;
+ bonus2 bSPDrainValue, 1, 0;
+ if (BaseClass == Job_Thief)
+ bonus bNoGemStone, 0;
+ ">
+},
+{
+ Items: ["Dragon_Tail_Card", "Merman_Card", "Anolian_Card", "Alligator_Card", "Cruiser_Card"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bDex, 3;
+ bonus bLongAtkRate, 20;
+ bonus bPerfectHitAddRate, 20;
+ if (BaseClass == Job_Archer) {
+ bonus2 bExpAddRace, RC_Brute, 5;
+ bonus2 bWeaponComaRace, RC_Brute, 100;
+ }
+ ">
+},
+{
+ Items: ["Dragon_Tail_Card", "Anolian_Card", "Alligator_Card", "Cruiser_Card", "Ferus__Card"]
+ Script: <"
+ bonus bDex, 5;
+ bonus2 bSkillAtk, "CG_ARROWVULCAN", 5;
+ bonus2 bSkillAtk, "DC_THROWARROW", 10;
+ bonus2 bSkillAtk, "BA_MUSICALSTRIKE", 10;
+ if (BaseJob == Job_Bard || BaseJob == Job_Dancer)
+ bonus3 bAutoSpellWhenHit, "CG_TAROTCARD", 2, 50;
+ ">
+},
+{
+ Items: ["Rideword_Card", "Live_Peach_Tree_Card", "Geographer_Card", "Cookie_Card", "Fur_Seal_Card"]
+ Script: <"
+ bonus bVit, 10;
+ bonus bCastrate, -10;
+ bonus bUseSPrate, -10;
+ if (BaseClass == Job_Acolyte) {
+ bonus2 bExpAddRace, RC_Undead, 5;
+ bonus2 bExpAddRace, RC_Demon, 5;
+ bonus2 bSubRace, RC_Undead, 30;
+ bonus2 bSubRace, RC_Demon, 30;
+ }
+ ">
+},
+{
+ Items: ["Rideword_Card", "Cookie_Card", "Fur_Seal_Card", "Waste_Stove_Card"]
+ Script: <"
+ bonus bStr, 3;
+ bonus bMaxSP, 80;
+ bonus bBaseAtk, 25;
+ bonus3 bAutoSpell, "AL_CRUCIS", 5, 10;
+ bonus2 bSkillAtk, "MO_EXTREMITYFIST", 10;
+ if (BaseJob == Job_Monk) {
+ bonus bUseSPrate, -10;
+ bonus bNoCastCancel, 0;
+ }
+ ">
+},
+{
+ Items: ["Raggler_Card", "Mystcase_Card", "Baby_Leopard_Card", "Zipper_Bear_Card", "Hylozoist_Card"]
+ Script: <"
+ bonus bLuk, 10;
+ bonus2 bSPDrainValue, 2, 0;
+ bonus2 bSkillAtk, 42, 20;
+ if (BaseClass == Job_Merchant) {
+ bonus2 bAddMonsterDropItem, 617, 5;
+ bonus bMagicDamageReturn, 20;
+ }
+ ">
+},
+{
+ Items: ["Loli_Ruri_Card", "Miyabi_Ningyo_Card", "Wicked_Nymph_Card", "Parasite_Card", "Harpy_Card", "Blood_Butterfly_Card"]
+ Script: <"
+ bonus bMaxHP, 500;
+ bonus bDef, 5;
+ bonus bMdef, 5;
+ bonus2 bSkillAtk, 14, 10;
+ bonus2 bSkillAtk, 19, 10;
+ bonus2 bSkillAtk, 20, 10;
+ if (BaseClass == Job_Mage) {
+ bonus bMatkRate, 3;
+ bonus bCastrate, -15;
+ }
+ ">
+},
+{
+ Items: ["Lude_Card", "Quve_Card"]
+ Script: <"
+ bonus bMaxHP, 300;
+ bonus bMaxSP, 60;
+ ">
+},
+{
+ Items: ["Miyabi_Ningyo_Card", "Wicked_Nymph_Card", "Harpy_Card", "Blood_Butterfly_Card", "Novus__Card"]
+ Script: <"
+ bonus bInt, 3;
+ bonus2 bSkillAtk, "WZ_HEAVENDRIVE", 10;
+ bonus2 bSkillAtk, "MG_THUNDERSTORM", 10;
+ if (BaseJob == Job_Sage) {
+ bonus bMagicDamageReturn, 20;
+ bonus2 bAddMonsterDropItem, 716, 100;
+ bonus2 bAddMonsterDropItem, 715, 100;
+ bonus bCastrate, -20;
+ }
+ ">
+},
+{
+ Items: ["Succubus_Card", "Incubus_Card"]
+ Script: <"
+ bonus bHPrecovRate, 30;
+ bonus bSPrecovRate, 30;
+ bonus bVit, 4;
+ bonus bInt, 4;
+ ">
+},
+{
+ Items: ["Solider_Card", "Assulter_Card", "Permeter_Card", "Freezer_Card", "Heater_Card"]
+ Script: <"
+ bonus bStr, 10;
+ bonus bMaxHPrate, 20;
+ bonus bHPrecovRate, 50;
+ bonus3 bAutoSpell, "BS_WEAPONPERFECT", 1, 3;
+ bonus2 bAddMonsterDropItem, 501, 500;
+ if (BaseClass == Job_Swordman) {
+ bonus2 bAddItemHealRate, Red_Potion, 50;
+ bonus2 bAddItemHealRate, Yellow_Potion, 50;
+ bonus2 bAddItemHealRate, Orange_Potion, 50;
+ bonus2 bAddItemHealRate, White_Potion, 50;
+ }
+ ">
+},
+{
+ Items: ["C_Tower_Manager_Card", "Alarm_Card", "Clock_Card", "Punk_Card"]
+ Script: <"
+ bonus bDef, 3;
+ bonus bMdef, 3;
+ ">
+},
+{
+ Items: ["Owl_Duke_Card", "Owl_Baron_Card"]
+ Script: <"
+ bonus3 bAutoSpell, "MG_LIGHTNINGBOLT", 5, 20;
+ ">
+},
+{
+ Items: ["Injustice_Card", "Zherlthsh_Card"]
+ Script: <"
+ bonus bBaseAtk, 20;
+ bonus bLuk, 3;
+ ">
+},
+{
+ Items: ["Permeter_Card", "Freezer_Card", "Heater_Card", "Archdam_Card"]
+ Script: <"
+ 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;
+ ">
+},
+{
+ Items: ["Garm_Baby_Card", "Garm_Card"]
+ Script: <"
+ bonus3 bAutoSpell, "MG_FROSTDIVER", 3, 250;
+ ">
+},
+{
+ Items: ["Zombie_Slaughter_Card", "Ragged_Zombie_Card"]
+ Script: <"
+ bonus2 bSPGainRace, RC_DemiPlayer, 2;
+ ">
+},
+{
+ Items: ["Blush", "Necktie"]
+ Script: <"
+ bonus bAspdRate, 3;
+ bonus bCastrate, 3;
+ ">
+},
+{
+ Items: ["Ear_Of_Devils_Wing", "Darkness_Helm_J"]
+ Script: <"
+ bonus bStr, 1;
+ bonus bAtkRate, 5;
+ ">
+},
+{
+ Items: ["Ear_Of_Angels_Wing", "Darkness_Helm_J"]
+ Script: <"
+ bonus bStr, 1;
+ bonus bAspdRate, 2;
+ ">
+},
+{
+ Items: ["Alarm_Mask", "Wit_Pumpkin_Hat"]
+ Script: <"
+ bonus2 bAddMonsterDropItem, 12192, 1;
+ bonus2 bAddMonsterDropItem, 538, 1;
+ bonus2 bAddItemHealRate, 12192, 100;
+ bonus2 bAddItemHealRate, 538, 100;
+ ">
+},
+{
+ Items: ["Hahoe_Mask", "Wit_Pumpkin_Hat"]
+ Script: <"
+ bonus bAspdRate, 5;
+ autobonus "{ bonus bAtk,50; }", 5, 10000, 0, "{ specialeffect(EF_POTION_BERSERK, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Pecopeco_Wing_Ears", "Darkness_Helm_J"]
+ Script: <"
+ bonus bAgi, 1;
+ bonus bFlee, 3;
+ ">
+},
+{
+ Items: ["Black_Glasses", "Darkness_Helm_J"]
+ Script: <"
+ bonus bInt, 1;
+ bonus bMatkRate, 2;
+ ">
+},
+{
+ Items: ["Pencil_In_Mouth", "Cap_Of_Concentration"]
+ Script: <"
+ bonus bDex, 2;
+ bonus bDef, 2;
+ ">
+},
+{
+ Items: ["Twilight_Desert", "Sandstorm"]
+ Script: <"
+ bonus bMaxSP, 20;
+ bonus bMaxHPrate, 5;
+ bonus bHit, 10;
+ bonus2 bAddSize, Size_Large, 30;
+ autobonus "{ bonus bAspdRate,100; }", 1, 7000, 0, "{ specialeffect(EF_POTION_BERSERK, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Elven_Ears_", "Skull_Cap"]
+ Script: <"
+ bonus bUseSPrate, -3;
+ ">
+},
+)
diff --git a/db/pre-re/item_combo_db.txt b/db/pre-re/item_combo_db.txt
deleted file mode 100644
index f3bf81e38..000000000
--- a/db/pre-re/item_combo_db.txt
+++ /dev/null
@@ -1,165 +0,0 @@
-// Item Combos Database
-//
-// Structure of Database:
-// ID:ID:ID:ID,{ Script }
-
-1166:2527,{ bonus2 bAddRace,RC_Dragon,5; }
-1420:2115,{ bonus3 bAutoSpellWhenHit,"HP_ASSUMPTIO",2,5; }
-1420:2133,{ bonus2 bAddRace, RC_All, 4; bonus bDef,2; }
-1421:2133,{ bonus2 bAddRace, RC_All, 4; bonus bDef,2; }
-1422:2133,{ bonus2 bAddRace, RC_All, 4; bonus bDef,2; }
-1428:2115,{ bonus3 bAutoSpellWhenHit,"HP_ASSUMPTIO",2,5; }
-1472:2677,{ bonus bMatkRate,6; bonus bDex,2; bonus bCastrate,-getequiprefinerycnt(EQI_HAND_R); }
-1472:2711,{ bonus bMatkRate,6; bonus bDex,2; bonus bCastrate,-getequiprefinerycnt(EQI_HAND_R); }
-1473:2677,{ bonus bMatkRate,6; bonus bDex,2; bonus bCastrate,-getequiprefinerycnt(EQI_HAND_R); }
-1473:2711,{ bonus bMatkRate,6; bonus bDex,2; bonus bCastrate,-getequiprefinerycnt(EQI_HAND_R); }
-1474:2527,{ bonus2 bAddRace,RC_Dragon,5; }
-1477:2700,{ bonus2 bResEff,Eff_Confusion,9500; }
-1479:2700,{ bonus2 bResEff,Eff_Confusion,9500; }
-1535:4361,{ bonus bBreakArmorRate,900; bonus bBreakWeaponRate,900; }
-1572:2716:2717,{ bonus bInt,5; bonus bMaxHP,700; bonus bAspdRate,5; }
-1573:2334,{ bonus bMdef,8; bonus bMaxSPrate,10; bonus bInt,4; }
-1573:2372,{ bonus bMdef,8; bonus bMaxSPrate,10; bonus bInt,4; }
-1573:2716:2717,{ bonus bInt,5; bonus bMaxHP,700; bonus bAspdRate,5; }
-1615:18539,{ bonus bMatk,10*getequiprefinerycnt(EQI_HAND_R); bonus bCastrate,-10; }
-1616:2515,{ bonus bSpeedRate,25; }
-1618:2509,{ bonus bMaxHP,300; bonus bMatkRate,getequiprefinerycnt(EQI_HAND_R)-5; bonus2 bSubEle,Ele_Neutral,getequiprefinerycnt(EQI_HAND_R)*3; }
-1618:2535,{ bonus bMatkRate,5; bonus2 bSubEle,Ele_Neutral,25; }
-1620:2509,{ bonus bMaxHP,300; bonus bMatkRate,getequiprefinerycnt(EQI_HAND_R)-5; bonus2 bSubEle,Ele_Neutral,getequiprefinerycnt(EQI_HAND_R)*3; }
-1620:2535,{ bonus bMatkRate,5; bonus2 bSubEle,Ele_Neutral,25; }
-1629:5045,{ bonus bDex,2; bonus bInt,2; bonus bSPrecovRate,5; bonus bMatkRate,getequiprefinerycnt(EQI_HAND_R); }
-1631:2129,{ bonus2 bSkillAtk,"PR_MAGNUS",20; bonus3 bAutoSpellWhenHit,"PR_TURNUNDEAD",1,20; }
-1636:18539,{ bonus bMatk,10*getequiprefinerycnt(EQI_HAND_R); bonus bCastrate,-10; }
-1723:2718,{ bonus bDex,1; bonus bMaxSP,50; bonus bSPrecovRate,10; }
-1730:1752,{ bonus bLongAtkRate,25; }
-1731:1754,{ bonus bLongAtkRate,25; }
-1732:1756,{ bonus bLongAtkRate,25; bonus2 bAddEff,Eff_Stone,1000; }
-1733:1755,{ bonus bLongAtkRate,25; bonus3 bAutoSpell,"NJ_HUUJIN",5,100; if(readparam(bInt)>39) bonus3 bAutoSpell,"NJ_HUUJIN",5,200; }
-1734:1753,{ bonus bLongAtkRate,50; }
-1741:2748,{ bonus bAtk,25; bonus3 bAddEff,Eff_Curse,200,ATF_WEAPON|ATF_LONG|ATF_TARGET; }
-2001:2677,{ bonus bMatkRate,10; bonus bDex,2; bonus2 bSubRace,RC_Demon,10; bonus2 bSubRace,RC_Undead,10; }
-2001:2711,{ bonus bMatkRate,10; bonus bDex,2; bonus2 bSubRace,RC_Demon,10; bonus2 bSubRace,RC_Undead,10; }
-2109:2717:2239,{ bonus bHPrecovRate,15; bonus bSPrecovRate,15; bonus bMatkRate,7; }
-2114:2353:5122,{ bonus bStr,2; bonus bDef,5; bonus bMdef,5; if(BaseClass==Job_Swordman) bonus bDef,6; }
-2115:2353:5124,{ bonus bDef,2-getequiprefinerycnt(EQI_HAND_L)-getequiprefinerycnt(EQI_HEAD_TOP); bonus bMdef,5+getequiprefinerycnt(EQI_HAND_L)+getequiprefinerycnt(EQI_HEAD_TOP); }
-2116:2355:2420:2521:5125,{ bonus bMaxHP,900; bonus bMaxSP,100; bonus3 bAutoSpellWhenHit,"HP_ASSUMPTIO",1,30; }
-2121:2717:2239,{ bonus bHPrecovRate,15; bonus bSPrecovRate,15; bonus bMatkRate,7; }
-2123:2701,{ bonus bCastrate,-10; }
-2124:2702,{ bonus bAspdRate,10; bonus bShortWeaponDamageReturn,5; }
-2135:2426,{ bonus2 bAddEff,Eff_Blind,500; autobonus "{ bonus bFlee,20; }",200,10000,BF_WEAPON,"{ specialeffect(EF_INCAGILITY, AREA, playerattached()); }"; }
-2137:2353:5124,{ bonus bDef,2-getrefine()-getequiprefinerycnt(EQI_HEAD_TOP); bonus bMdef,5+getrefine()+getequiprefinerycnt(EQI_HEAD_TOP); }
-2278:18656,{ bonus2 bAddMonsterDropItem,12192,1; }
-2281:18656,{ bonus bFlee,10; bonus2 bAddEff,Eff_Stun,1000; }
-2286:18539,{ bonus bUseSPrate,-3; }
-2312:2656,{ bonus bDef,5; bonus bMaxHP,150; }
-2313:2656,{ bonus bDef,5; bonus bMaxHP,150; }
-2337:2654,{ bonus bUseSPrate,-20; bonus bMaxHP,300; }
-2339:2522,{ bonus bAgi,5; bonus bFlee,10; }
-2339:2523,{ bonus bAgi,5; bonus bFlee,10; }
-2353:2417:2516,{ bonus bAgi,3; bonus bMaxHPrate,5; bonus bMaxSPrate,5; }
-2353:2418:2517,{ bonus bVit,5; bonus bHPrecovRate,10; bonus bSPrecovRate,10; }
-2353:5123,{ if(readparam(bDex)>69) bonus bUseSPrate,-10; }
-2353:5493,{ if(readparam(bDex)>69) bonus bUseSPrate,-10; }
-2354:2419:2520:5128,{ bonus bVit,5; bonus bMaxHPrate,15; bonus bMaxSPrate,5; bonus bDef,5; bonus bMdef,15; bonus2 bSubEle,Ele_Water,10; bonus2 bSubEle,Ele_Earth,10; bonus2 bSubEle,Ele_Fire,10; bonus2 bSubEle,Ele_Wind,10; }
-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_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_All, 3; bonus bMatkRate,3; }
-2375:2729,{ bonus2 bAddRace, RC_All, 3; bonus bMatkRate,3; }
-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,"{ specialeffect(EF_HEAL, AREA, playerattached()); }"; }
-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,"{ specialeffect(EF_HEAL, AREA, playerattached()); }"; }
-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,"{ specialeffect(EF_ENERGYCOAT, AREA, playerattached()); }"; }
-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,"{ specialeffect(EF_ENERGYCOAT, AREA, playerattached()); }"; }
-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_All, 5; bonus bMatkRate,5; bonus2 bResEff,Eff_Freeze,10000; bonus2 bSkillHeal2,"AM_POTIONPITCHER",3; bonus2 bSkillHeal2,"AL_HEAL",3; bonus2 bSkillHeal2,"PR_SANCTUARY",3; }
-2399:2553,{ bonus bAgi,5; bonus bFlee,15; }
-2408:2655,{ bonus bBaseAtk,50; bonus2 bAddDefClass,1196,20; bonus2 bAddDefClass,1197,20; }
-2424:2528,{ bonus bHPrecovRate,5; bonus bMaxHPrate,10; }
-2425:2529,{ bonus bFlee,10; }
-2425:2530,{ bonus bFlee,10; }
-2425:2551,{ bonus bFlee,10; }
-2433:2537,{ bonus bMaxHPrate,6; }
-2434:2529,{ bonus bFlee,10; }
-2434:2530,{ bonus bFlee,10; }
-2434:2551,{ bonus bFlee,10; }
-2441:2546,{ bonus bFlee,5; }
-2518:2648:2649:5126,{ bonus bInt,5; bonus bMdef,11; bonus bMaxSPrate,20; bonus bNoCastCancel,0; bonus bCastrate,25; }
-2519:2650:2651:5127,{ bonus bStr,2; bonus bLuk,9; bonus bCritical,13; bonus bBaseAtk,18; bonus bFlee2,13; }
-2527:13001,{ bonus2 bAddRace,RC_Dragon,5; }
-2607:2677,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; }
-2607:2711,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; }
-2607:2786,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; }
-2608:2677,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; }
-2608:2711,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; }
-2608:2786,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; }
-2620:2746,{ bonus2 bAddSize,Size_Medium,8; bonus bAspdRate,getequiprefinerycnt(EQI_HAND_R)/2; }
-2620:2747,{ bonus2 bAddSize,Size_Large,8; bonus bHit,getequiprefinerycnt(EQI_HAND_R)/2; bonus bCastrate,-getequiprefinerycnt(EQI_HAND_R)/2; }
-2626:2677,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; }
-2626:2711,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; }
-2626:2786,{ bonus2 bSkillAtk,"AL_HEAL",50; bonus2 bSkillAtk,"PR_MAGNUS",30; bonus bSPrecovRate,9; }
-2678:2679,{ bonus4 bAutoSpell,"MO_EXTREMITYFIST",1,3,1; bonus3 bAutoSpell,"PR_LEXAETERNA",1,20; bonus3 bAutoSpell,"AS_SONICBLOW",5,50; bonus3 bAutoSpell,"MO_INVESTIGATE",5,20; bonus3 bAutoSpell,"ASC_METEORASSAULT",2,50; }
-//2679:2792,{ bonus4 bAutoSpell,"MO_EXTREMITYFIST",1,3,1; bonus3 bAutoSpell,"PR_LEXAETERNA",1,20; bonus3 bAutoSpell,"AS_SONICBLOW",5,50; bonus3 bAutoSpell,"MO_INVESTIGATE",5,20; bonus3 bAutoSpell,"ASC_METEORASSAULT",2,50; }
-2720:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2721:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2722:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2723:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2724:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2725:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2726:2727,{ bonus bUseSPrate,-25; }
-2733:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2777:2778:5479,{ bonus bMaxHP,300; bonus bMatkRate,5; bonus2 bSubEle,Ele_Neutral,5; }
-2779:2780:5482,{ bonus bMatkRate,10; bonus bInt,5; bonus2 bSubRace,RC_Angel,10; }
-2779:2780:5577,{ bonus bMatkRate,10; bonus bInt,5; bonus2 bSubRace,RC_Angel,10; }
-4001:4197,{ bonus bFlee,18; }
-4006:4266,{ bonus bFlee,18; }
-4009:4179,{ bonus bFlee,18; }
-4014:4306,{ bonus bFlee,18; }
-4021:4211,{ bonus bFlee,18; }
-4025:4222,{ bonus2 bAddEffWhenHit,Eff_Sleep,600; }
-4028:4296,{ bonus bStr,3; }
-4029:4183,{ bonus bFlee,18; }
-4031:4161,{ bonus bDef,3; bonus bVit,3; }
-4036:4186:4233:4281:4343,{ bonus bStr,4; bonus bMaxHPrate,7; bonus bMaxSPrate,7; bonus2 bSkillAtk,"MC_MAMMONITE",20; bonus bSPDrainValue,1; if(BaseJob==Job_Alchemist) { bonus3 bAutoSpell,"BS_ADRENALINE",1,10; bonus2 bAddMonsterDropItem,7139,3; bonus2 bAddMonsterDropItem,905,10; } }
-4039:4210:4230:4257:4348,{ bonus bStr,6; bonus bAgi,4; bonus2 bSkillAtk,"RG_BACKSTAP",10; if(getskilllv("RG_STRIPARMOR")==5) bonus3 bAutoSpell,"RG_STRIPARMOR",5,50; if(BaseJob==Job_Rogue) { bonus bUseSPrate,-20; bonus3 bAutoSpell,"RG_INTIMIDATE",1,-20; } }
-4074:4162,{ bonus2 bAddEffWhenHit,Eff_Blind,600; }
-4090:4212:4328,{ bonus bAllStats,1; }
-4106:4248,{ bonus bPerfectHitAddRate,20; }
-4127:4166,{ bonus2 bAddEffWhenHit,Eff_Curse,600; }
-4153:4247:4273,{ bonus3 bAddMonsterDropItem,544,RC_Fish,3000; bonus2 bAddEle,Ele_Water,30; }
-4168:4169,{ bonus bMaxHPrate,20; bonus bMaxSPrate,20; bonus bCastrate,-10; }
-4172:4210:4230:4257:4272,{ bonus bAgi,5; bonus bStr,5; bonus bAspdRate,5; bonus bSpeedRate,25; bonus2 bSPDrainValue,1,0; if(BaseClass==Job_Thief) bonus bNoGemStone,0; }
-4178:4199:4234:4252:4297,{ bonus bAgi,5; bonus bDex,3; bonus bLongAtkRate,20; bonus bPerfectHitAddRate,20; if(BaseClass==Job_Archer) { bonus2 bExpAddRace,RC_Brute,5; bonus2 bWeaponComaRace,RC_Brute,100; } }
-4178:4234:4252:4297:4381,{ bonus bDex,5; bonus2 bSkillAtk,"CG_ARROWVULCAN",5; bonus2 bSkillAtk,"DC_THROWARROW",10; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",10; if(BaseJob==Job_Bard||BaseJob==Job_Dancer) bonus3 bAutoSpellWhenHit,"CG_TAROTCARD",2,50; }
-4185:4217:4280:4293:4312,{ bonus bVit,10; bonus bCastrate,-10; bonus bUseSPrate,-10; if(BaseClass==Job_Acolyte) { bonus2 bExpAddRace,RC_Undead,5; bonus2 bExpAddRace,RC_Demon,5; bonus2 bSubRace,RC_Undead,30; bonus2 bSubRace,RC_Demon,30; } }
-4185:4293:4312:4332,{ bonus bStr,3; bonus bMaxSP,80; bonus bBaseAtk,25; bonus3 bAutoSpell,"AL_CRUCIS",5,10; bonus2 bSkillAtk,"MO_EXTREMITYFIST",10; if(BaseJob==Job_Monk) { bonus bUseSPrate,-10; bonus bNoCastCancel,0; } }
-4186:4206:4233:4281:4321,{ bonus bLuk,10; bonus2 bSPDrainValue,2,0; bonus2 bSkillAtk,42,20; if(BaseClass==Job_Merchant) { bonus2 bAddMonsterDropItem,617,5; bonus bMagicDamageReturn,20; } }
-4191:4208:4258:4309:4325:4327,{ bonus bMaxHP,500; bonus bDef,5; bonus bMdef,5; bonus2 bSkillAtk,14,10; bonus2 bSkillAtk,19,10; bonus2 bSkillAtk,20,10; if(BaseClass==Job_Mage) { bonus bMatkRate,3; bonus bCastrate,-15; } }
-4193:4294,{ bonus bMaxHP,300; bonus bMaxSP,60; }
-4208:4258:4325:4327:4382,{ bonus bInt,3; bonus2 bSkillAtk,"WZ_HEAVENDRIVE",10; bonus2 bSkillAtk,"MG_THUNDERSTORM",10; if(BaseJob==Job_Sage) { bonus bMagicDamageReturn,20; bonus2 bAddMonsterDropItem,716,100; bonus2 bAddMonsterDropItem,715,100; bonus bCastrate,-20; } }
-4218:4269,{ bonus bHPrecovRate,30; bonus bSPrecovRate,30; bonus bVit,4; bonus bInt,4; }
-4220:4246:4311:4319:4331,{ bonus bStr,10; bonus bMaxHPrate,20; bonus bHPrecovRate,50; bonus3 bAutoSpell,"BS_WEAPONPERFECT",1,3; bonus2 bAddMonsterDropItem,501,500; if(BaseClass==Job_Swordman) { bonus2 bAddItemHealRate,Red_Potion,50; bonus2 bAddItemHealRate,Yellow_Potion,50; bonus2 bAddItemHealRate,Orange_Potion,50; bonus2 bAddItemHealRate,White_Potion,50; } }
-4229:4244:4299:4313,{ bonus bDef,3; bonus bMdef,3; }
-4237:4238,{ bonus3 bAutoSpell,"MG_LIGHTNINGBOLT",5,20; }
-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_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; }
-5086:18656,{ bonus2 bAddMonsterDropItem,12192,1; bonus2 bAddMonsterDropItem,538,1; bonus2 bAddItemHealRate,12192,100; bonus2 bAddItemHealRate,538,100; }
-5176:18656,{ bonus bAspdRate,5; autobonus "{ bonus bAtk,50; }",5,10000,0,"{ specialeffect(EF_POTION_BERSERK, AREA, playerattached()); }"; }
-//5184:5657,{ bonus bLongAtkRate,getrefine(); }
-5358:5653,{ bonus bAgi,1; bonus bFlee,3; }
-5401:5653,{ bonus bInt,1; bonus bMatkRate,2; }
-//5470:5653,{ bonus bDex,1; bonus bLongAtkRate,3; }
-5574:5073,{ bonus bDex, 2; bonus bDef, 2; }
-13034:13035,{ bonus bMaxSP,20; bonus bMaxHPrate,5; bonus bHit,10; bonus2 bAddSize,Size_Large,30; autobonus "{ bonus bAspdRate,100; }",1,7000,0,"{ specialeffect(EF_POTION_BERSERK, AREA, playerattached()); }"; }
-18507:18539,{ bonus bUseSPrate,-3; }
diff --git a/db/pre-re/item_db.conf b/db/pre-re/item_db.conf
index c860e0239..ba9de0dd4 100644
--- a/db/pre-re/item_db.conf
+++ b/db/pre-re/item_db.conf
@@ -121,6 +121,8 @@ item_db: (
">
OnEquipScript: <" OnEquip Script (can also be multi-line) ">
OnUnequipScript: <" OnUnequip Script (can also be multi-line) ">
+ OnRentalStartScript: <" On item renting script, gets called after item is created in inventory (can also be multi-line) ">
+ OnRentalEndScript: <" On item rent end/expire script, gets called after item is removed from inventory (can also be multi-line) ">
},
**************************************************************************/
@@ -69570,7 +69572,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 1; ">
+ Script: <" setfont(1); ">
+ OnRentalEndScript: <"
+ if (getfont() == 1)
+ setfont(0);
+ ">
},
{
Id: 12288
@@ -69587,7 +69593,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 2; ">
+ Script: <" setfont(2); ">
+ OnRentalEndScript: <"
+ if (getfont() == 2)
+ setfont(0);
+ ">
},
{
Id: 12289
@@ -69604,7 +69614,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 3; ">
+ Script: <" setfont(3); ">
+ OnRentalEndScript: <"
+ if (getfont() == 3)
+ setfont(0);
+ ">
},
{
Id: 12290
@@ -69856,7 +69870,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 4; ">
+ Script: <" setfont(4); ">
+ OnRentalEndScript: <"
+ if (getfont() == 4)
+ setfont(0);
+ ">
},
{
Id: 12305
@@ -69873,7 +69891,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 5; ">
+ Script: <" setfont(5); ">
+ OnRentalEndScript: <"
+ if (getfont() == 5)
+ setfont(0);
+ ">
},
{
Id: 12306
@@ -69890,7 +69912,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 6; ">
+ Script: <" setfont(6); ">
+ OnRentalEndScript: <"
+ if (getfont() == 6)
+ setfont(0);
+ ">
},
{
Id: 12307
@@ -69907,7 +69933,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 7; ">
+ Script: <" setfont(7); ">
+ OnRentalEndScript: <"
+ if (getfont() == 7)
+ setfont(0);
+ ">
},
{
Id: 12308
@@ -69924,7 +69954,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 8; ">
+ Script: <" setfont(8); ">
+ OnRentalEndScript: <"
+ if (getfont() == 8)
+ setfont(0);
+ ">
},
{
Id: 12309
@@ -69941,7 +69975,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 9; ">
+ Script: <" setfont(9); ">
+ OnRentalEndScript: <"
+ if (getfont() == 9)
+ setfont(0);
+ ">
},
{
Id: 12310
@@ -73051,6 +73089,7 @@ item_db: (
noauction: true
}
Script: <" setcashmount(); ">
+ OnRentalEndScript: <" sc_end(SC_ALL_RIDING); ">
},
{
Id: 12701
diff --git a/db/re/item_chain.conf b/db/re/item_chain.conf
index a2e4efff4..cdc92d92c 100644
--- a/db/re/item_chain.conf
+++ b/db/re/item_chain.conf
@@ -59,6 +59,12 @@ ITMCHAIN_ORE: {
Emperium: 5
}
+ITMCHAIN_SIEGFRIED: {
+ Token_Of_Siegfried: 1
+ F_Token_Of_Siegfried: 1
+ E_Token_Of_Siegfried: 1
+}
+
ITMCHAIN_GEM: {
Dark_Red_Jewel: 80
Violet_Jewel: 30
diff --git a/db/re/item_combo_db.conf b/db/re/item_combo_db.conf
new file mode 100644
index 000000000..66e553c32
--- /dev/null
+++ b/db/re/item_combo_db.conf
@@ -0,0 +1,3224 @@
+//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//================= Description ===========================================
+// Configurations file for status effects
+//=========================================================================
+
+combo_db: (
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ===============================
+ Items: ["item_list"] (string, array) list of items
+ Script: <"
+ Script
+ (it can be multi-line)
+ ">
+}
+**************************************************************************/
+{
+ Items: ["Dragon_Slayer", "Dragon_Breath"]
+ Script: <"
+ bonus2 bAddRace, RC_Dragon, 5;
+ ">
+},
+{
+ Items: ["Gladius", "Hoplite_Helmet"]
+ Script: <"
+ bonus bAtkRate, 3;
+ ">
+},
+{
+ Items: ["Gladius_", "Hoplite_Helmet"]
+ Script: <"
+ bonus bAtkRate, 3;
+ ">
+},
+{
+ Items: ["Gladius__", "Hoplite_Helmet"]
+ Script: <"
+ bonus bAtkRate, 3;
+ ">
+},
+{
+ Items: ["Krishna", "Assassin_Handcuffs"]
+ Script: <"
+ bonus bBaseAtk, 50;
+ bonus2 bSkillAtk, AS_SONICBLOW, 50;
+ bonus bFlee, -30;
+ ">
+},
+{
+ Items: ["Cakram", "Assassin_Handcuffs"]
+ Script: <"
+ bonus bCritAtkRate, 40;
+ bonus bCritical, 4;
+ bonus bMaxHPrate, -10;
+ ">
+},
+{
+ Items: ["Durga", "Whikebain_Suit"]
+ Script: <"
+ if (getequiprefinerycnt(EQI_HAND_R) > 6) {
+ autobonus2 "{ bonus bIgnoreDefRace,RC_NonBoss; }", 20, 3000, BF_WEAPON, "{}";
+ }
+ ">
+},
+{
+ Items: ["Shiver_Katar", "Mobster_Card"]
+ Script: <"
+ bonus bCritAtkRate, 5;
+ ">
+},
+{
+ Items: ["Shiver_Katar", "Sedora_Card"]
+ Script: <"
+ bonus bCritAtkRate, 5;
+ ">
+},
+{
+ Items: ["Giant_Axe", "Gigant_Helm"]
+ Script: <"
+ bonus2 bSkillAtk, WS_CARTTERMINATION, 15 + (getequiprefinerycnt(EQI_HAND_R) * 5);
+ ">
+},
+{
+ Items: ["Pike", "Hoplite_Helmet"]
+ Script: <"
+ bonus bAtkRate, 3;
+ ">
+},
+{
+ Items: ["Pike_", "Hoplite_Helmet"]
+ Script: <"
+ bonus bAtkRate, 3;
+ ">
+},
+{
+ Items: ["Pike__", "Hoplite_Helmet"]
+ Script: <"
+ bonus bAtkRate, 3;
+ ">
+},
+{
+ Items: ["Long_Horn", "Valkyrjas_Shield"]
+ Script: <"
+ bonus3 bAutoSpellWhenHit, HP_ASSUMPTIO, 2, 5;
+ ">
+},
+{
+ Items: ["Long_Horn", "Tournament_Shield"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 4;
+ bonus bDef, 2;
+ ">
+},
+{
+ Items: ["Battle_Hook", "Tournament_Shield"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 4;
+ bonus bDef, 2;
+ ">
+},
+{
+ Items: ["Hunting_Spear", "Tournament_Shield"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 4;
+ bonus bDef, 2;
+ ">
+},
+{
+ Items: ["Long_Horn_M", "Valkyrjas_Shield"]
+ Script: <"
+ bonus3 bAutoSpellWhenHit, HP_ASSUMPTIO, 2, 5;
+ ">
+},
+{
+ Items: ["Imperial_Spear", "Imperial_Guard"]
+ Script: <"
+ bonus2 bSkillAtk, CR_GRANDCROSS, 10;
+ bonus2 bSkillAtk, LG_RAYOFGENESIS, 10;
+ ">
+},
+{
+ Items: ["Imperial_Spear", "Imperial_Guard", "Imperial_Feather", "Imperial_Ring"]
+ Script: <"
+ bonus2 bSkillUseSP, CR_GRANDCROSS, 30;
+ bonus2 bSkillUseSP, LG_SHIELDPRESS, 5;
+ bonus2 bSkillUseSP, LG_BANISHINGPOINT, 15;
+ bonus2 bSkillUseSP, LG_CANNONSPEAR, 10;
+ ">
+},
+{
+ Items: ["Imperial_Spear", "Imperial_Ring"]
+ Script: <"
+ bonus2 bSkillAtk, LG_CANNONSPEAR, 7 * (getequiprefinerycnt(EQI_HAND_L) / 2);
+ ">
+},
+{
+ Items: ["Staff_Of_Soul", "Spiritual_Ring"]
+ Script: <"
+ bonus bMatkRate, 6;
+ bonus bDex, 2;
+ bonus bVariableCastrate, -getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Staff_Of_Soul", "Spiritual_Ring_C"]
+ Script: <"
+ bonus bMatkRate, 6;
+ bonus bDex, 2;
+ bonus bVariableCastrate, -getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Wizardy_Staff", "Spiritual_Ring"]
+ Script: <"
+ bonus bMatkRate, 6;
+ bonus bDex, 2;
+ bonus bVariableCastrate, -getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Wizardy_Staff", "Spiritual_Ring_C"]
+ Script: <"
+ bonus bMatkRate, 6;
+ bonus bDex, 2;
+ bonus bVariableCastrate, -getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Gae_Bolg", "Dragon_Breath"]
+ Script: <"
+ bonus2 bAddRace, RC_Dragon, 5;
+ ">
+},
+{
+ Items: ["Spectral_Spear", "Red_Silk_Seal"]
+ Script: <"
+ bonus2 bResEff, Eff_Confusion, 9500;
+ ">
+},
+{
+ Items: ["Spectral_Spear_", "Red_Silk_Seal"]
+ Script: <"
+ bonus2 bResEff, Eff_Confusion, 9500;
+ ">
+},
+{
+ Items: ["Encyclopedia", "Encyclopedia_Revision"]
+ Script: <"
+ bonus bAspdRate, getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Hollgrehenn_Hammer", "B_Harword_Card"]
+ Script: <"
+ bonus bBreakArmorRate, 900;
+ bonus bBreakWeaponRate, 900;
+ ">
+},
+{
+ Items: ["Principles_Of_Magic", "Librarian_Glove", "Pocket_Watch_"]
+ Script: <"
+ bonus bInt, 5;
+ bonus bMaxHP, 700;
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Ancient_Magic", "Mage_Coat"]
+ Script: <"
+ bonus bMdef, 8;
+ bonus bMaxSPrate, 10;
+ bonus bInt, 4;
+ ">
+},
+{
+ Items: ["Ancient_Magic", "Mage_Coat_"]
+ Script: <"
+ bonus bMdef, 8;
+ bonus bMaxSPrate, 10;
+ bonus bInt, 4;
+ ">
+},
+{
+ Items: ["Ancient_Magic", "Librarian_Glove", "Pocket_Watch_"]
+ Script: <"
+ bonus bInt, 5;
+ bonus bMaxHP, 700;
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Snake_Encyclopedia", "Snake_Card"]
+ Script: <"
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Snake_Encyclopedia", "Side_Winder_Card"]
+ Script: <"
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Snake_Encyclopedia", "Snake_Card", "Side_Winder_Card"]
+ Script: <"
+ bonus bAspd, 1;
+ ">
+},
+{
+ Items: ["Snake_Encyclopedia_", "Snake_Card"]
+ Script: <"
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Snake_Encyclopedia_", "Side_Winder_Card"]
+ Script: <"
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Snake_Encyclopedia_", "Snake_Card", "Side_Winder_Card"]
+ Script: <"
+ bonus bAspd, 1;
+ ">
+},
+{
+ Items: ["Bone_Wand", "Skull_Cap"]
+ Script: <"
+ bonus bMatk, 10 * getequiprefinerycnt(EQI_HAND_R);
+ bonus bVariableCastrate, -10;
+ ">
+},
+{
+ Items: ["Staff_Of_Wing", "Wing_Of_Eagle"]
+ Script: <"
+ bonus bSpeedRate, 25;
+ ">
+},
+{
+ Items: ["Survival_Rod_", "Clack_Of_Servival"]
+ Script: <"
+ bonus bMaxHP, 300;
+ bonus bMatkRate, getequiprefinerycnt(EQI_HAND_R) - 5;
+ if (getequiprefinerycnt(EQI_GARMENT) > 10) {
+ bonus2 bSubEle, Ele_Neutral, 30;
+ } else {
+ bonus2 bSubEle, Ele_Neutral, getequiprefinerycnt(EQI_GARMENT) * 3;
+ }
+ ">
+},
+{
+ Items: ["Survival_Rod_", "Cloak_Of_Survival_C"]
+ Script: <"
+ bonus bMatkRate, 5;
+ bonus2 bSubEle, Ele_Neutral, 25;
+ ">
+},
+{
+ Items: ["Survival_Rod_", "Survive_Circlet"]
+ Script: <"
+ bonus bMatk, getequiprefinerycnt(EQI_HAND_R) * 10;
+ if (getequiprefinerycnt(EQI_HAND_R) >= 10)
+ autobonus "{ bonus bVariableCastrate,-50; }", 50, 5000, BF_MAGIC, "{ specialeffect(EF_SUFFRAGIUM, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Survival_Rod2_", "Clack_Of_Servival"]
+ Script: <"
+ bonus bMaxHP, 300;
+ bonus bMatkRate, getequiprefinerycnt(EQI_HAND_R) - 5;
+ if (getequiprefinerycnt(EQI_GARMENT) > 10) {
+ bonus2 bSubEle, Ele_Neutral, 30;
+ } else {
+ bonus2 bSubEle, Ele_Neutral, getequiprefinerycnt(EQI_GARMENT) * 3;
+ }
+ ">
+},
+{
+ Items: ["Survival_Rod2_", "Cloak_Of_Survival_C"]
+ Script: <"
+ bonus bMatkRate, 5;
+ bonus2 bSubEle, Ele_Neutral, 25;
+ ">
+},
+{
+ Items: ["Healing_Staff", "All_Love_Guard"]
+ Script: <"
+ bonus bHealPower, getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Walking_Stick", "Magician_Hat"]
+ Script: <"
+ bonus bDex, 2;
+ bonus bInt, 2;
+ bonus bSPrecovRate, 5;
+ bonus bMatkRate, getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Holy_Stick", "Exorcism_Bible"]
+ Script: <"
+ bonus2 bSkillAtk, PR_MAGNUS, 20;
+ bonus3 bAutoSpellWhenHit, PR_TURNUNDEAD, 1, 20;
+ ">
+},
+{
+ Items: ["Holy_Stick", "All_Love_Guard"]
+ Script: <"
+ bonus bHealPower, getequiprefinerycnt(EQI_HAND_R) * 3;
+ ">
+},
+{
+ Items: ["Thorn_Staff", "Skull_Cap"]
+ Script: <"
+ bonus bMatk, 10 * getequiprefinerycnt(EQI_HAND_R);
+ bonus bVariableCastrate, -10;
+ ">
+},
+{
+ Items: ["Thorn_Staff", "Thornwood_Band"]
+ Script: <"
+ bonus bMatk, getequiprefinerycnt(EQI_HAND_R) * 10;
+ ">
+},
+{
+ Items: ["Rafini_Staff", "Lapine_Shield"]
+ Script: <"
+ if (getequiprefinerycnt(EQI_HAND_L) > 8) {
+ bonus bMatk, getequiprefinerycnt(EQI_HAND_R) * 15;
+ }
+ if (getequiprefinerycnt(EQI_HAND_R) > 9) {
+ bonus bMatk, 50;
+ bonus bVariableCastrate, -10;
+ }
+ ">
+},
+{
+ Items: ["Wand_Of_Affection", "Shoes_Of_Affection", "Shawl_Of_Affection", "Robe_Of_Affection"]
+ Script: <"
+ bonus bHealPower, 25;
+ ">
+},
+{
+ Items: ["Wand_Of_Affection2", "Shoes_Of_Affection", "Shawl_Of_Affection", "Robe_Of_Affection"]
+ Script: <"
+ bonus bHealPower, 45;
+ bonus3 bAutoSpellWhenHit, AB_SILENTIUM, 1, 10;
+ ">
+},
+{
+ Items: ["Bone_Wand_", "Skull_Cap"]
+ Script: <"
+ bonus bMatk, 10 * getequiprefinerycnt(EQI_HAND_R);
+ bonus bVariableCastrate, -10;
+ ">
+},
+{
+ Items: ["Hunter_Bow", "Hunting_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 50;
+ ">
+},
+{
+ Items: ["Luna_Bow", "Lunatic_Brooch"]
+ Script: <"
+ bonus bDex, 1;
+ bonus bMaxSP, 50;
+ bonus bSPrecovRate, 10;
+ ">
+},
+{
+ Items: ["Hunter_Bow_", "Hunting_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 50;
+ ">
+},
+{
+ Items: ["Burning_Bow", "Fire_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 25;
+ ">
+},
+{
+ Items: ["Frozen_Bow", "Crystal_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 25;
+ ">
+},
+{
+ Items: ["Earth_Bow", "Stone_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 25;
+ bonus2 bAddEff, Eff_Stone, 1000;
+ ">
+},
+{
+ Items: ["Gust_Bow", "Arrow_Of_Wind"]
+ Script: <"
+ bonus bLongAtkRate, 25;
+ bonus3 bAutoSpell, NJ_HUUJIN, 5, 100;
+ if (readparam(bInt) > 39)
+ bonus3 bAutoSpell, NJ_HUUJIN, 5, 200;
+ ">
+},
+{
+ Items: ["Orc_Archer_Bow", "Steel_Arrow"]
+ Script: <"
+ bonus bLongAtkRate, 50;
+ ">
+},
+{
+ Items: ["Cursed_Lyre", "Cursed_Star"]
+ Script: <"
+ bonus bAtk, 25;
+ bonus3 bAddEff, Eff_Curse, 200, ATF_WEAPON | ATF_LONG | ATF_TARGET;
+ ">
+},
+{
+ Items: ["Elven_Bow", "Arrow_Of_Elf"]
+ Script: <"
+ bonus bLongAtkRate, 50;
+ ">
+},
+{
+ Items: ["Incisive_Arrow", "Little_Fhat"]
+ Script: <"
+ bonus bCritAtkRate, 5;
+ ">
+},
+{
+ Items: ["Siege_Arrow_S", "Velum_CrossBow"]
+ Script: <"
+ bonus bLongAtkRate, 70;
+ ">
+},
+{
+ Items: ["Siege_Arrow_A", "Velum_CrossBow"]
+ Script: <"
+ bonus bLongAtkRate, 40;
+ ">
+},
+{
+ Items: ["Ukulele_Of_Newoz", "Winged_Ring_Of_Newoz"]
+ Script: <"
+ bonus2 bSkillAtk, CG_ARROWVULCAN, 200;
+ bonus2 bSkillUseSP, CG_ARROWVULCAN, 20;
+ ">
+},
+{
+ Items: ["Floral_Mic_Of_Igu", "Floral_Bracelet_Of_Igu"]
+ Script: <"
+ bonus2 bSkillAtk, CG_ARROWVULCAN, 200;
+ ">
+},
+{
+ Items: ["Divine_Cross", "Spiritual_Ring"]
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bDex, 2;
+ bonus2 bSubRace, RC_Demon, 10;
+ bonus2 bSubRace, RC_Undead, 10;
+ ">
+},
+{
+ Items: ["Divine_Cross", "Spiritual_Ring_C"]
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bDex, 2;
+ bonus2 bSubRace, RC_Demon, 10;
+ bonus2 bSubRace, RC_Undead, 10;
+ ">
+},
+{
+ Items: ["Golden_Rod_Staff", "Golden_Rod_Shoes", "Golden_Rod_Orb", "Golden_Rod_Robe"]
+ Script: <"
+ bonus2 bMagicAtkEle, Ele_Wind, 40;
+ bonus2 bMagicAtkEle, Ele_Earth, -30;
+ bonus2 bSubEle, Ele_Earth, -50;
+ ">
+},
+{
+ Items: ["Aqua_Staff", "Aqua_Shoes", "Aqua_Orb", "Aqua_Robe"]
+ Script: <"
+ bonus2 bMagicAtkEle, Ele_Water, 40;
+ bonus2 bMagicAtkEle, Ele_Wind, -30;
+ bonus2 bSubEle, Ele_Wind, -50;
+ ">
+},
+{
+ Items: ["Crimson_Staff", "Crimson_Shoes", "Crimson_Orb", "Crimson_Robe"]
+ Script: <"
+ bonus2 bMagicAtkEle, Ele_Fire, 40;
+ bonus2 bMagicAtkEle, Ele_Water, -30;
+ bonus2 bSubEle, Ele_Water, -50;
+ ">
+},
+{
+ Items: ["Forest_Staff", "Forest_Shoes", "Forest_Orb", "Forest_Robe"]
+ Script: <"
+ bonus2 bMagicAtkEle, Ele_Earth, 40;
+ bonus2 bMagicAtkEle, Ele_Fire, -30;
+ bonus2 bSubEle, Ele_Fire, -50;
+ ">
+},
+{
+ Items: ["Golden_Rod_Staff2", "Golden_Rod_Shoes", "Golden_Rod_Orb", "Golden_Rod_Robe"]
+ Script: <"
+ bonus2 bMagicAtkEle, Ele_Wind, 60;
+ bonus2 bMagicAtkEle, Ele_Earth, -60;
+ bonus2 bSubEle, Ele_Earth, -50;
+ ">
+},
+{
+ Items: ["Aqua_Staff2", "Aqua_Shoes", "Aqua_Orb", "Aqua_Robe"]
+ Script: <"
+ bonus2 bMagicAtkEle, Ele_Water, 60;
+ bonus2 bMagicAtkEle, Ele_Wind, -60;
+ bonus2 bSubEle, Ele_Wind, -50;
+ ">
+},
+{
+ Items: ["Crimson_Staff2", "Crimson_Shoes", "Crimson_Orb", "Crimson_Robe"]
+ Script: <"
+ bonus2 bMagicAtkEle, Ele_Fire, 60;
+ bonus2 bMagicAtkEle, Ele_Water, -60;
+ bonus2 bSubEle, Ele_Water, -50;
+ ">
+},
+{
+ Items: ["Forest_Staff2", "Forest_Shoes", "Forest_Orb", "Forest_Robe"]
+ Script: <"
+ bonus2 bMagicAtkEle, Ele_Earth, 60;
+ bonus2 bMagicAtkEle, Ele_Fire, -60;
+ bonus2 bSubEle, Ele_Fire, -50;
+ ">
+},
+{
+ Items: ["Memorize_Book", "Pocket_Watch_", "One_Eyed_Glass"]
+ Script: <"
+ bonus bHPrecovRate, 15;
+ bonus bSPrecovRate, 15;
+ bonus bMatkRate, 7;
+ ">
+},
+{
+ Items: ["Stone_Buckler", "Odins_Blessing", "Magni_Cap"]
+ Script: <"
+ bonus bStr, 2;
+ bonus bDef, 5;
+ bonus bMdef, 5;
+ if (BaseClass == Job_Swordman) bonus bDef, 6;
+ ">
+},
+{
+ Items: ["Valkyrjas_Shield", "Odins_Blessing", "Fricca_Circlet"]
+ Script: <"
+ bonus bDef, 2 - getequiprefinerycnt(EQI_HAND_L, EQI_HEAD_TOP);
+ bonus bMdef, 5 + getequiprefinerycnt(EQI_HAND_L, EQI_HEAD_TOP);
+ ">
+},
+{
+ Items: ["Angels_Safeguard", "Angels_Protection", "Angels_Arrival", "Angels_Warmth", "Kiss_Of_Angel"]
+ Script: <"
+ bonus bMaxHP, 900;
+ bonus bMaxSP, 100;
+ bonus3 bAutoSpellWhenHit, HP_ASSUMPTIO, 1, 30;
+ ">
+},
+{
+ Items: ["Memorize_Book_", "Pocket_Watch_", "One_Eyed_Glass"]
+ Script: <"
+ bonus bHPrecovRate, 15;
+ bonus bSPrecovRate, 15;
+ bonus bMatkRate, 7;
+ ">
+},
+{
+ Items: ["Orleans_Server", "Orleans_Glove"]
+ Script: <"
+ bonus bVariableCastrate, -10;
+ ">
+},
+{
+ Items: ["Orleans_Server", "Orleans_Necklace"]
+ Script: <"
+ bonus bMatk, getrefine() * 2;
+ ">
+},
+{
+ Items: ["Thorny_Buckler", "Bison_Horn"]
+ Script: <"
+ bonus bAspdRate, 10;
+ bonus bShortWeaponDamageReturn, 5;
+ ">
+},
+{
+ Items: ["Strong_Shield", "Hoplite_Helmet"]
+ Script: <"
+ bonus bDef, 2;
+ ">
+},
+{
+ Items: ["Shadow_Guard", "Shadow_Walk"]
+ Script: <"
+ bonus2 bAddEff, Eff_Blind, 500;
+ autobonus "{ bonus bFlee,20; }", 200, 10000, BF_WEAPON, "{ specialeffect(EF_INCAGILITY, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Valkyrjas_Shield_C", "Odins_Blessing", "Fricca_Circlet"]
+ Script: <"
+ bonus bDef, 2 - getequiprefinerycnt(EQI_HAND_L, EQI_HEAD_TOP);
+ bonus bMdef, 5 + getequiprefinerycnt(EQI_HAND_L, EQI_HEAD_TOP);
+ ">
+},
+{
+ Items: ["Imperial_Guard", "Imperial_Ring"]
+ Script: <"
+ if (getequiprefinerycnt(EQI_HAND_L) > 5) {
+ bonus2 bSkillAtk, LG_SHIELDPRESS, (getequiprefinerycnt(EQI_HAND_L) * 8) - 40;
+ }
+ ">
+},
+{
+ Items: ["Insecticide", "Super_Ora_Ora"]
+ Script: <"
+ bonus2 bAddRaceTolerance, RC_Insect, 10;
+ if (getequiprefinerycnt(EQI_HAND_L) > 7) {
+ bonus2 bMagicAddRace, RC_Insect, 4;
+ bonus2 bAddRaceTolerance, RC_Insect, 20;
+ }
+ ">
+},
+{
+ Items: ["Giant_Shield", "Gigant_Helm"]
+ Script: <"
+ bonus2 bSkillAtk, WS_CARTTERMINATION, 15 + (getequiprefinerycnt(EQI_HAND_R) * 5);
+ ">
+},
+{
+ Items: ["Kalasak", "Bangungot_Boots", "Buwaya_Cloth", "Bakonawa_Armor"]
+ Script: <"
+ bonus bMaxHPrate, 20;
+ bonus bMaxSPrate, 10;
+ ">
+},
+{
+ Items: ["Fox_Armguard", "Special_Ninja_Suit"]
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Items: ["Fox_Armguard", "Special_Ninja_Suit_"]
+ Script: <"
+ bonus bAgi, 2;
+ ">
+},
+{
+ Items: ["Crescent_Armguard", "Tenebris_Latitantes"]
+ Script: <"
+ bonus bFlee, 10;
+ bonus bFlee2, 10;
+ ">
+},
+{
+ Items: ["Impr_Angels_Safeguard", "Im_Angels_Protection", "Improved_Kiss_Of_Angel", "Impr_Angels_Warmth", "Impr_Angels_Arrival"]
+ Script: <"
+ bonus(bMaxHP, 900);
+ bonus(bMaxSP, 100);
+ bonus3(bAutoSpellWhenHit, HP_ASSUMPTIO, 1, 30);
+ ">
+},
+{
+ Items: ["Lapine_Shield", "KarduiEar"]
+ Script: <"
+ if (!isequipped(Fallen_Bishop_Card)) {
+ if (getequiprefinerycnt(EQI_HAND_L) > 6) {
+ bonus2 bSkillCooldown, WL_COMET, -20000;
+ }
+ if (getequiprefinerycnt(EQI_HAND_L) > 9) {
+ bonus2 bSkillCooldown, WL_COMET, -20000;
+ }
+ }
+ ">
+},
+{
+ Items: ["Angelic_Chain", "Bell_Pigeon"]
+ Script: <"
+ bonus2 bExpAddRace, RC_All, 5;
+ ">
+},
+{
+ Items: ["Centimental_Flower", "Persika"]
+ Script: <"
+ bonus bMaxSP, 30;
+ bonus bInt, 1;
+ ">
+},
+{
+ Items: ["Centimental_Flower", "Ancient_Elven_Ear"]
+ Script: <"
+ bonus bMatkRate, 1;
+ ">
+},
+{
+ Items: ["Centimental_Flower", "Black_Cat_Hat"]
+ Script: <"
+ bonus bAllStats, 1;
+ ">
+},
+{
+ Items: ["Centimental_Leaf", "Persika"]
+ Script: <"
+ bonus bLuk, 1;
+ bonus bFlee, 2;
+ ">
+},
+{
+ Items: ["Centimental_Leaf", "Ancient_Elven_Ear"]
+ Script: <"
+ bonus bAtkRate, 1;
+ ">
+},
+{
+ Items: ["Centimental_Leaf", "Black_Cat_Hat"]
+ Script: <"
+ bonus bAllStats, 1;
+ ">
+},
+{
+ Items: ["Mr_Smile", "Gloomy_Pumpkin_Hat"]
+ Script: <"
+ bonus2 bAddMonsterDropItem, 12192, 20;
+ ">
+},
+{
+ Items: ["Phantom_Of_Opera", "Gloomy_Pumpkin_Hat"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Impr_Angels_Safeguard", "Im_Angels_Protection"]
+ Script: <"
+ bonus bAllStats, 2;
+ ">
+},
+{
+ Items: ["Elven_Ears", "Skull_Cap"]
+ Script: <"
+ bonus bUseSPrate, -3;
+ ">
+},
+{
+ Items: ["Padded_Armor", "Hyper_Changer"]
+ Script: <"
+ bonus bDef, 5;
+ bonus bMaxHP, 150;
+ ">
+},
+{
+ Items: ["Padded_Armor_", "Hyper_Changer"]
+ Script: <"
+ bonus bDef, 5;
+ bonus bMaxHP, 150;
+ ">
+},
+{
+ Items: ["Ninja_Suit", "Shinobis_Sash"]
+ Script: <"
+ bonus bUseSPrate, -20;
+ bonus bMaxHP, 300;
+ ">
+},
+{
+ Items: ["G_Strings", "Undershirt"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["G_Strings", "Undershirt_"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Odins_Blessing", "Fricco_Shoes", "Falcon_Robe"]
+ Script: <"
+ bonus bAgi, 3;
+ bonus bMaxHPrate, 5;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["Odins_Blessing", "Vidars_Boots", "Valis_Manteau"]
+ Script: <"
+ bonus bVit, 5;
+ bonus bHPrecovRate, 10;
+ bonus bSPrecovRate, 10;
+ ">
+},
+{
+ Items: ["Odins_Blessing", "Ulle_Cap"]
+ Script: <"
+ if (readparam(bDex) > 69)
+ bonus bUseSPrate, -10;
+ ">
+},
+{
+ Items: ["Odins_Blessing", "Ulle_Cap_I"]
+ Script: <"
+ if (readparam(bDex) > 69)
+ bonus bUseSPrate, -10;
+ ">
+},
+{
+ Items: ["Odins_Blessing", "Priest_Sword"]
+ Script: <"
+ bonus bMaxSP, 50;
+ bonus2 bSkillAtk, KN_BOWLINGBASH, 5;
+ ">
+},
+{
+ Items: ["Goibnes_Armor", "Goibnes_Combat_Boots", "Goibnes_Shoulder_Arms", "Goibnes_Helmet"]
+ Script: <"
+ bonus bVit, 5;
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ bonus bDef, 5;
+ bonus bMdef, 15;
+ bonus2 bSubEle, Ele_Water, 10;
+ bonus2 bSubEle, Ele_Earth, 10;
+ bonus2 bSubEle, Ele_Fire, 10;
+ bonus2 bSubEle, Ele_Wind, 10;
+ ">
+},
+{
+ Items: ["Goibnes_Armor", "Goibnes_Combat_Boots_", "Goibnes_Shoulder_Arms_", "Goibnes_Helmet_"]
+ Script: <"
+ bonus bVit, 5;
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ bonus bDef, 5;
+ bonus bMdef, 15;
+ bonus2 bSubEle, Ele_Water, 10;
+ bonus2 bSubEle, Ele_Earth, 10;
+ bonus2 bSubEle, Ele_Fire, 10;
+ bonus2 bSubEle, Ele_Wind, 10;
+ ">
+},
+{
+ Items: ["Valkyrie_Armor", "Valkyrie_Shoes", "Valkyrie_Manteau", "Valkyrie_Helm"]
+ Script: <"
+ bonus bAllStats, 1;
+ ">
+},
+{
+ Items: ["Dress_Of_Angel", "Angeling_Hairpin"]
+ Script: <"
+ bonus bLuk, 6;
+ bonus bFlee, 5;
+ bonus bInt, 2;
+ ">
+},
+{
+ Items: ["Ninja_Suit_", "Shinobis_Sash"]
+ Script: <"
+ bonus bUseSPrate, -20;
+ bonus bMaxHP, 300;
+ ">
+},
+{
+ Items: ["Orleans_Gown", "Orleans_Necklace"]
+ Script: <"
+ bonus bVariableCastrate, 15;
+ ">
+},
+{
+ Items: ["Freyja_Overcoat", "Freyja_Boots", "Freyja_Cape", "Freyja_Crown"]
+ Script: <"
+ bonus2 bSubRace, RC_DemiPlayer, 10;
+ bonus bMaxHPrate, 20;
+ bonus2 bResEff, Eff_Freeze, 10000;
+ skill WZ_FIREPILLAR, 10;
+ ">
+},
+{
+ Items: ["G_Strings_", "Undershirt"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["G_Strings_", "Undershirt_"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Diabolus_Robe", "Diabolus_Ring"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 3;
+ bonus bMatkRate, 3;
+ ">
+},
+{
+ Items: ["Diabolus_Armor", "Diabolus_Ring"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 3;
+ bonus bMatkRate, 3;
+ ">
+},
+{
+ Items: ["Assaulter_Plate", "Battle_Greave", "Commander_Manteau"]
+ Script: <"
+ 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, "{ specialeffect(EF_HEAL, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Elite_Engineer_Armor", "Battle_Greave", "Commander_Manteau"]
+ Script: <"
+ 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;
+ ">
+},
+{
+ Items: ["Assassin_Robe", "Battle_Greave", "Commander_Manteau"]
+ Script: <"
+ 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, "{ specialeffect(EF_HEAL, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Warlock_Battle_Robe", "Combat_Boots", "Commander_Manteau_"]
+ Script: <"
+ 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, "{ specialeffect(EF_ENERGYCOAT, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Medic_Robe", "Combat_Boots", "Commander_Manteau_"]
+ Script: <"
+ bonus2 bSubRace, RC_NonDemiPlayer, -300;
+ bonus bInt, 3;
+ bonus bMaxHPrate, 12;
+ bonus2 bVariableCastrate, AL_HOLYLIGHT, -50;
+ bonus bHealPower, 6;
+ autobonus2 "{ bonus bDefEle,Ele_Ghost; }", 30, 10000, BF_WEAPON, "{ specialeffect(EF_ENERGYCOAT, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Elite_Archer_Suit", "Combat_Boots", "Commander_Manteau_"]
+ Script: <"
+ bonus2 bSubRace, RC_NonDemiPlayer, -300;
+ bonus bDex, 3;
+ bonus bMaxHPrate, 12;
+ bonus bLongAtkDef, 10;
+ bonus bDelayrate, -25;
+ ">
+},
+{
+ Items: ["Elite_Shooter_Suit", "Battle_Boots", "Sheriff_Manteau"]
+ Script: <"
+ bonus2 bSubRace, RC_NonDemiPlayer, -300;
+ bonus bDex, 3;
+ bonus bMaxHPrate, 12;
+ bonus bLongAtkDef, 10;
+ bonus bDelayrate, -25;
+ ">
+},
+{
+ Items: ["Sprint_Mail", "Sprint_Shoes", "Sprint_Ring"]
+ Script: <"
+ bonus bMaxHPrate, 7;
+ bonus bMaxSPrate, 7;
+ bonus bVariableCastrate, -3;
+ bonus bDelayrate, -15;
+ ">
+},
+{
+ Items: ["Improved_Tights", "Linen_Glove"]
+ Script: <"
+ bonus bFlee2, 5;
+ ">
+},
+{
+ Items: ["Krieger_Suit1", "Krieger_Shoes1", "Krieger_Muffler1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 5;
+ bonus2 bResEff, Eff_Freeze, 10000;
+ bonus2 bSkillHeal2, AM_POTIONPITCHER, 3;
+ bonus2 bSkillHeal2, AL_HEAL, 3;
+ bonus2 bSkillHeal2, PR_SANCTUARY, 3;
+ ">
+},
+{
+ Items: ["Dragon_Vest", "Dragon_Manteau"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bFlee, 15;
+ ">
+},
+{
+ Items: ["Cuffs", "Bloody_Iron_Ball"]
+ Script: <"
+ bonus bBaseAtk, 50;
+ bonus2 bAddDefClass, 1196, 20;
+ bonus2 bAddDefClass, 1197, 20;
+ ">
+},
+{
+ Items: ["Tidal_Shoes", "Wool_Scarf"]
+ Script: <"
+ bonus bHPrecovRate, 5;
+ bonus bMaxHPrate, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots", "Rider_Insignia"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots", "Rider_Insignia_"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots", "Rider_Insignia_M"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Diabolus_Boots", "Diabolus_Manteau"]
+ Script: <"
+ bonus bMaxHPrate, 6;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots_", "Rider_Insignia"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots_", "Rider_Insignia_"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Black_Leather_Boots_", "Rider_Insignia_M"]
+ Script: <"
+ bonus bFlee, 10;
+ ">
+},
+{
+ Items: ["Beach_Sandal", "Beach_Manteau"]
+ Script: <"
+ bonus bFlee, 5;
+ ">
+},
+{
+ Items: ["Shoes_Of_Judgement", "Shawl_Of_Judgement", "Robe_Of_Judgement", "Mace_Of_Judgement"]
+ Script: <"
+ bonus2 bAddRace, RC_Undead, 15;
+ bonus2 bMagicAddRace, RC_Undead, 15;
+ bonus2 bSkillAtk, AB_ADORAMUS, 100;
+ ">
+},
+{
+ Items: ["Shoes_Of_Judgement", "Shawl_Of_Judgement", "Robe_Of_Judgement", "Mace_Of_Judgement2"]
+ Script: <"
+ bonus2 bAddRace, RC_Undead, 30;
+ bonus2 bMagicAddRace, RC_Undead, 30;
+ bonus2 bSkillAtk, AB_ADORAMUS, 200;
+ bonus bVariableCastrate, -50;
+ ">
+},
+{
+ Items: ["Ur_Greave", "Ur_Manteau", "Ur_Seal", "Ur_Plate"]
+ Script: <"
+ bonus bMaxHPrate, 14;
+ bonus2 bSkillAtk, RK_HUNDREDSPEAR, 50;
+ skill CR_AUTOGUARD, 1;
+ bonus bUseSPrate, 10;
+ bonus2 bSubEle, Ele_Neutral, 10;
+ ">
+},
+{
+ Items: ["Peuz_Greave", "Peuz_Manteau", "Peuz_Seal", "Peuz_Plate"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 10;
+ bonus2 bSkillAtk, RK_SONICWAVE, 100;
+ bonus2 bSkillAtk, RK_WINDCUTTER, 100;
+ bonus3 bAutoSpell, RK_STORMBLAST, 1, 20;
+ autobonus3 "{ bonus bAspd,2; }", 1000, 10000, LK_CONCENTRATION, "{ specialeffect(EF_ENHANCE, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Sabah_Shoes", "Sabah_Hood", "Sabah_Ring", "Sabah_Cloth"]
+ Script: <"
+ bonus bCritical, 15;
+ bonus bFlee, 10;
+ bonus bCritAtkRate, 40;
+ bonus2 bSkillAtk, GC_CROSSIMPACT, 20;
+ bonus bUseSPrate, 10;
+ ">
+},
+{
+ Items: ["Nab_Shoes", "Nab_Hood", "Nab_Ring", "Nab_Cloth"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 10;
+ bonus bMatkRate, 10;
+ if (readparam(bStr) > 119) {
+ bonus bBaseAtk, 30;
+ }
+ bonus3 bAutoSpell, ASC_BREAKER, getskilllv(ASC_BREAKER), 10;
+ bonus bCritical, -20;
+ ">
+},
+{
+ Items: ["White_Wing_Boots", "White_Wing_Manteau", "White_Wing_Brooch", "White_Wing_Suits"]
+ Script: <"
+ bonus bAspd, 2;
+ bonus bLongAtkRate, 30;
+ bonus3 bAutoSpell, AC_DOUBLE, 3, 10;
+ bonus2 bSkillAtk, RA_ARROWSTORM, 50;
+ ">
+},
+{
+ Items: ["Black_Wing_Boots", "Black_Wing_Manteau", "Black_wing_Brooch", "Black_Wing_Suits"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus2 bSkillAtk, RA_CLUSTERBOMB, 20;
+ bonus bFlee2, 20;
+ bonus bLongAtkRate, -30;
+ bonus bAspd, -7;
+ ">
+},
+{
+ Items: ["Siege_Greave", "Siege_Manteau", "Siege_Plate"]
+ Script: <"
+ bonus bVit, 5;
+ bonus2 bSubRace, RC_DemiPlayer, 15;
+ ">
+},
+{
+ Items: ["Siege_Boots", "Siege_Manteau", "Siege_Suits"]
+ Script: <"
+ bonus bDex, 5;
+ bonus2 bSubRace, RC_DemiPlayer, 15;
+ ">
+},
+{
+ Items: ["Siege_Shoes", "Siege_Muffler", "Siege_Robe"]
+ Script: <"
+ bonus bInt, 5;
+ bonus bMdef, 10;
+ bonus2 bSubRace, RC_DemiPlayer, 15;
+ ">
+},
+{
+ Items: ["Morpheuss_Shawl", "Morpheuss_Ring", "Morpheuss_Armlet", "Morpheuss_Hood"]
+ Script: <"
+ bonus bInt, 5;
+ bonus bMdef, 11;
+ bonus bMaxSPrate, 20;
+ bonus bNoCastCancel, 0;
+ bonus bVariableCastrate, 25;
+ ">
+},
+{
+ Items: ["Morriganes_Manteau", "Morriganes_Belt", "Morriganes_Pendant", "Morriganes_Helm"]
+ Script: <"
+ bonus bStr, 2;
+ bonus bLuk, 9;
+ bonus bCritical, 13;
+ bonus bBaseAtk, 18;
+ bonus bFlee2, 13;
+ ">
+},
+{
+ Items: ["Morriganes_Manteau", "Morriganes_Belt_", "Morriganes_Pendant_", "Morriganes_Helm_"]
+ Script: <"
+ bonus bStr, 2;
+ bonus bLuk, 9;
+ bonus bCritical, 13;
+ bonus bBaseAtk, 18;
+ bonus bFlee2, 13;
+ ">
+},
+{
+ Items: ["Dragon_Breath", "Dragon_Killer"]
+ Script: <"
+ bonus2 bAddRace, RC_Dragon, 5;
+ ">
+},
+{
+ Items: ["Scarlet_Poncho", "Critical_Ring"]
+ Script: <"
+ bonus bCritAtkRate, 5;
+ bonus bCritical, 10;
+ if (getequiprefinerycnt(EQI_GARMENT) >= 5) {
+ bonus bCritAtkRate, 3;
+ }
+ if (getequiprefinerycnt(EQI_GARMENT) >= 7) {
+ bonus bCritAtkRate, 4;
+ }
+ ">
+},
+{
+ Items: ["Scarlet_Poncho", "Rose_Cascade"]
+ Script: <"
+ bonus bUseSPrate, -5;
+ ">
+},
+{
+ Items: ["Clip", "Spiritual_Ring"]
+ Script: <"
+ bonus2 bSkillAtk, AL_HEAL, 50;
+ bonus2 bSkillAtk, PR_MAGNUS, 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Clip", "Spiritual_Ring_C"]
+ Script: <"
+ bonus2 bSkillAtk, AL_HEAL, 50;
+ bonus2 bSkillAtk, PR_MAGNUS, 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Clip", "Spiritual_Ring_M"]
+ Script: <"
+ bonus2 bSkillAtk, AL_HEAL, 50;
+ bonus2 bSkillAtk, PR_MAGNUS, 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary", "Spiritual_Ring"]
+ Script: <"
+ bonus2 bSkillAtk, AL_HEAL, 50;
+ bonus2 bSkillAtk, PR_MAGNUS, 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary", "Spiritual_Ring_C"]
+ Script: <"
+ bonus2 bSkillAtk, AL_HEAL, 50;
+ bonus2 bSkillAtk, PR_MAGNUS, 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary", "Spiritual_Ring_M"]
+ Script: <"
+ bonus2 bSkillAtk, AL_HEAL, 50;
+ bonus2 bSkillAtk, PR_MAGNUS, 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Safety_Ring", "Angel_Earing"]
+ Script: <"
+ bonus bMdef, 7;
+ bonus bDef, 7;
+ ">
+},
+{
+ Items: ["Critical_Ring", "Angel_Earing"]
+ Script: <"
+ bonus bCritical, 7;
+ ">
+},
+{
+ Items: ["Ring_Of_Rogue", "Cold_Heart"]
+ Script: <"
+ bonus2 bAddSize, Size_Medium, 8;
+ bonus bAspdRate, 3;
+ ">
+},
+{
+ Items: ["Ring_Of_Rogue", "Black_Cat"]
+ Script: <"
+ bonus2 bAddSize, Size_Large, 8;
+ bonus bHit, 3;
+ bonus bVariableCastrate, -3;
+ ">
+},
+{
+ Items: ["Rosary_", "Spiritual_Ring"]
+ Script: <"
+ bonus2 bSkillAtk, AL_HEAL, 50;
+ bonus2 bSkillAtk, PR_MAGNUS, 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary_", "Spiritual_Ring_C"]
+ Script: <"
+ bonus2 bSkillAtk, AL_HEAL, 50;
+ bonus2 bSkillAtk, PR_MAGNUS, 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Rosary_", "Spiritual_Ring_M"]
+ Script: <"
+ bonus2 bSkillAtk, AL_HEAL, 50;
+ bonus2 bSkillAtk, PR_MAGNUS, 30;
+ bonus bSPrecovRate, 9;
+ ">
+},
+{
+ Items: ["Ring_Of_Flame_Lord", "Ring_Of_Resonance"]
+ Script: <"
+ bonus4 bAutoSpell, MO_EXTREMITYFIST, 1, 3, 1;
+ bonus3 bAutoSpell, PR_LEXAETERNA, 1, 20;
+ bonus3 bAutoSpell, AS_SONICBLOW, 5, 50;
+ bonus3 bAutoSpell, MO_INVESTIGATE, 5, 20;
+ bonus3 bAutoSpell, ASC_METEORASSAULT, 2, 50;
+ ">
+},
+{
+ Items: ["Ring_Of_Resonance", "Ring_Of_Flame_Lord_I"]
+ Script: <"
+ bonus4 bAutoSpell, MO_EXTREMITYFIST, 1, 3, 1;
+ bonus3 bAutoSpell, PR_LEXAETERNA, 1, 20;
+ bonus3 bAutoSpell, AS_SONICBLOW, 5, 50;
+ bonus3 bAutoSpell, MO_INVESTIGATE, 5, 20;
+ bonus3 bAutoSpell, ASC_METEORASSAULT, 2, 50;
+ ">
+},
+{
+ Items: ["Orleans_Glove", "Orleans_Necklace"]
+ Script: <"
+ bonus bMatk, 20;
+ ">
+},
+{
+ Items: ["Medal_Swordman", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Thief", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Acolyte", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Mage", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Archer", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Medal_Merchant", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Icarus_Wing", "Bowman_Scarf"]
+ Script: <"
+ bonus bUseSPrate, -25;
+ ">
+},
+{
+ Items: ["Medal_Gunner", "Krieger_Ring1"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 5;
+ bonus bMatkRate, 3;
+ bonus bHealPower, 5;
+ ">
+},
+{
+ Items: ["Black_Cat", "Black_Wing"]
+ Script: <"
+ bonus bHit, 5;
+ bonus bMatk, 5;
+ bonus2 bSkillUseSP, SC_ENERVATION, 20;
+ bonus2 bSkillUseSP, SC_GROOMY, 20;
+ ">
+},
+{
+ Items: ["Shaman_Ring", "Shaman_Earing", "Shamans_Hair_Ornament"]
+ Script: <"
+ bonus bMaxHP, 300;
+ bonus bMatkRate, 5;
+ bonus2 bSubEle, Ele_Neutral, 5;
+ ">
+},
+{
+ Items: ["Dark_Knight_Belt", "Dark_Knight_Glove", "Dark_Knight_Mask"]
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bInt, 5;
+ bonus2 bSubRace, RC_Angel, 10;
+ ">
+},
+{
+ Items: ["Dark_Knight_Belt", "Dark_Knight_Glove", "Dark_Knight_MaskB"]
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bInt, 5;
+ bonus2 bSubRace, RC_Angel, 10;
+ ">
+},
+{
+ Items: ["Rune_Ring", "Rune_Suit", "Mana_Manteau", "Mana_Boots"]
+ Script: <"
+ bonus2 bExpAddRace, RC_All, 10;
+ ">
+},
+{
+ Items: ["Body_Power_Up_Ring", "Anti_Magic_Suit"]
+ Script: <"
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Body_Power_Up_Ring", "Geffen_Mage_Robe"]
+ Script: <"
+ bonus bDelayrate, -5;
+ bonus2 bAddRaceTolerance, RC_DemiPlayer, 5;
+ ">
+},
+{
+ Items: ["Ring_Of_Spell_Explosion", "Anti_Magic_Suit"]
+ Script: <"
+ bonus bDelayrate, -5;
+ bonus2 bAddRaceTolerance, RC_DemiPlayer, 5;
+ ">
+},
+{
+ Items: ["Ring_Of_Spell_Explosion", "Geffen_Mage_Robe"]
+ Script: <"
+ bonus bVariableCastrate, -5;
+ ">
+},
+{
+ Items: ["RWC_Gold_Brooch", "RWC_Silver_Brooch"]
+ Script: <"
+ bonus bMatkRate, 10;
+ bonus bAtkRate, 10;
+ ">
+},
+{
+ Items: ["Poring_Card", "Mastering_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Lunatic_Card", "Eclipse_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Chonchon_Card", "Dragon_Fly_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Roda_Frog_Card", "Toad_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Condor_Card", "FlyingGalapago"]
+ Script: <"
+ bonus2 bSubEle, Ele_All, 5;
+ ">
+},
+{
+ Items: ["Rocker_Card", "Vocal_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Skeleton_Card", "Skel_Prisoner_Card"]
+ Script: <"
+ bonus2 bAddEffWhenHit, Eff_Sleep, 600;
+ ">
+},
+{
+ Items: ["Tarou_Card", "Cramp_Card"]
+ Script: <"
+ bonus bStr, 3;
+ ">
+},
+{
+ Items: ["Wolf_Card", "Vagabond_Wolf_Card"]
+ Script: <"
+ bonus bFlee, 18;
+ ">
+},
+{
+ Items: ["Pecopeco_Card", "Grand_Peco_Card"]
+ Script: <"
+ bonus bDef, 3;
+ bonus bVit, 3;
+ ">
+},
+{
+ Items: ["Muka_Card", "Raggler_Card", "Baby_Leopard_Card", "Zipper_Bear_Card", "Mole_Card"]
+ Script: <"
+ bonus bStr, 4;
+ bonus bMaxHPrate, 7;
+ bonus bMaxSPrate, 7;
+ bonus2 bSkillAtk, MC_MAMMONITE, 20;
+ bonus bSPDrainValue, 1;
+ if (BaseJob == Job_Alchemist) {
+ bonus3 bAutoSpell, BS_ADRENALINE, 1, 10;
+ bonus2 bAddMonsterDropItem, 7139, 3;
+ bonus2 bAddMonsterDropItem, 905, 10;
+ }
+ ">
+},
+{
+ Items: ["Stainer_Card", "Wander_Man_Card", "Shinobi_Card", "Wild_Rose_Card", "Whikebain_Card"]
+ Script: <"
+ bonus bStr, 6;
+ bonus bAgi, 4;
+ bonus2 bSkillAtk, RG_BACKSTAP, 10;
+ if (getskilllv(RG_STRIPARMOR) == 5)
+ bonus3 bAutoSpell, RG_STRIPARMOR, 5, 50;
+ if (BaseJob == Job_Rogue) {
+ bonus bUseSPrate, -20;
+ bonus3 bAutoSpell, RG_INTIMIDATE, 1, -20;
+ }
+ ">
+},
+{
+ Items: ["Golem_Card", "Companion_Cavalry_Sword"]
+ Script: <"
+ bonus2 bSubSize, Size_Large, 15;
+ bonus2 bSubSize, Size_Small, 15;
+ ">
+},
+{
+ Items: ["BigFoot_Card", "Grizzly_Card"]
+ Script: <"
+ bonus2 bAddEffWhenHit, Eff_Blind, 600;
+ ">
+},
+{
+ Items: ["Munak_Card", "Bon_Gun_Card", "Hyegun_Card"]
+ Script: <"
+ bonus bAllStats, 1;
+ ">
+},
+{
+ Items: ["Mummy_Card", "Ancient_Mummy_Card"]
+ Script: <"
+ bonus bPerfectHitAddRate, 20;
+ ">
+},
+{
+ Items: ["Nightmare_Card", "Nightmare_Terror_Card"]
+ Script: <"
+ bonus2 bAddEffWhenHit, Eff_Curse, 600;
+ ">
+},
+{
+ Items: ["Knight_Of_Abyss_Card", "Lord_of_Death"]
+ Script: <"
+ bonus2 bAddRace, RC_Boss, 5;
+ if (getequiprefinerycnt(EQI_HEAD_TOP) >= 11)
+ bonus2 bSubRace, RC_NonBoss, 5;
+ ">
+},
+{
+ Items: ["Galapago_Card", "FlyingGalapago"]
+ Script: <"
+ bonus2 bAddItemHealRate, Apple_Juice, 1000;
+ bonus2 bAddItemHealRate, Banana_Juice, 1000;
+ bonus2 bAddItemHealRate, Carrot_Juice, 1000;
+ ">
+},
+{
+ Items: ["Crab_Card", "Aster_Card", "Shellfish_Card"]
+ Script: <"
+ bonus3 bAddMonsterDropItem, 544, RC_Fish, 3000;
+ bonus2 bAddEle, Ele_Water, 30;
+ ">
+},
+{
+ Items: ["Grand_Peco_Card", "Heaven_Cage"]
+ Script: <"
+ bonus4 bAutoSpell, PR_GLORIA, 5, 10, 0;
+ ">
+},
+{
+ Items: ["Gryphon_Card", "FlyingGalapago"]
+ Script: <"
+ bonus bAspdRate, 3;
+ bonus bAspd, 1;
+ bonus bAtkRate, -5;
+ if (getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_SUBTYPE) == W_BOW) {
+ if (getequiprefinerycnt(EQI_HAND_R) > 8)
+ bonus bAspd, 1;
+ }
+ ">
+},
+{
+ Items: ["Dark_Lord_Card", "Dark_Illusion_Card"]
+ Script: <"
+ bonus bMaxHPrate, 20;
+ bonus bMaxSPrate, 20;
+ bonus bVariableCastrate, -10;
+ ">
+},
+{
+ Items: ["The_Paper_Card", "Wander_Man_Card", "Shinobi_Card", "Wild_Rose_Card", "Dancing_Dragon_Card"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bStr, 5;
+ bonus bAspdRate, 5;
+ bonus bSpeedRate, 25;
+ bonus2 bSPDrainValue, 1, 0;
+ if (BaseClass == Job_Thief)
+ bonus bNoGemStone, 0;
+ ">
+},
+{
+ Items: ["Dragon_Tail_Card", "Merman_Card", "Anolian_Card", "Alligator_Card", "Cruiser_Card"]
+ Script: <"
+ bonus bAgi, 5;
+ bonus bDex, 3;
+ bonus bLongAtkRate, 20;
+ bonus bPerfectHitAddRate, 20;
+ if (BaseClass == Job_Archer) {
+ bonus2 bExpAddRace, RC_Brute, 5;
+ bonus2 bWeaponComaRace, RC_Brute, 100;
+ }
+ ">
+},
+{
+ Items: ["Dragon_Tail_Card", "Anolian_Card", "Alligator_Card", "Cruiser_Card", "Ferus__Card"]
+ Script: <"
+ bonus bDex, 5;
+ bonus2 bSkillAtk, CG_ARROWVULCAN, 5;
+ bonus2 bSkillAtk, DC_THROWARROW, 10;
+ bonus2 bSkillAtk, BA_MUSICALSTRIKE, 10;
+ if (BaseJob == Job_Bard || BaseJob == Job_Dancer)
+ bonus3 bAutoSpellWhenHit, CG_TAROTCARD, 2, 50;
+ ">
+},
+{
+ Items: ["Rideword_Card", "Live_Peach_Tree_Card", "Geographer_Card", "Cookie_Card", "Fur_Seal_Card"]
+ Script: <"
+ bonus bVit, 10;
+ bonus bVariableCastrate, -10;
+ bonus bUseSPrate, -10;
+ if (BaseClass == Job_Acolyte) {
+ bonus2 bExpAddRace, RC_Undead, 5;
+ bonus2 bExpAddRace, RC_Demon, 5;
+ bonus2 bSubRace, RC_Undead, 30;
+ bonus2 bSubRace, RC_Demon, 30;
+ }
+ ">
+},
+{
+ Items: ["Rideword_Card", "Cookie_Card", "Fur_Seal_Card", "Waste_Stove_Card"]
+ Script: <"
+ bonus bStr, 3;
+ bonus bMaxSP, 80;
+ bonus bBaseAtk, 25;
+ bonus3 bAutoSpell, AL_CRUCIS, 5, 10;
+ bonus2 bSkillAtk, MO_EXTREMITYFIST, 10;
+ if (BaseJob == Job_Monk) {
+ bonus bUseSPrate, -10;
+ bonus bNoCastCancel, 0;
+ }
+ ">
+},
+{
+ Items: ["Raggler_Card", "Mystcase_Card", "Baby_Leopard_Card", "Zipper_Bear_Card", "Hylozoist_Card"]
+ Script: <"
+ bonus bLuk, 10;
+ bonus2 bSPDrainValue, 2, 0;
+ bonus2 bSkillAtk, 42, 20;
+ if (BaseClass == Job_Merchant) {
+ bonus2 bAddMonsterDropItem, 617, 5;
+ bonus bMagicDamageReturn, 20;
+ }
+ ">
+},
+{
+ Items: ["Loli_Ruri_Card", "Miyabi_Ningyo_Card", "Wicked_Nymph_Card", "Parasite_Card", "Harpy_Card", "Blood_Butterfly_Card"]
+ Script: <"
+ bonus bMaxHP, 500;
+ bonus bDef, 5;
+ bonus bMdef, 5;
+ bonus2 bSkillAtk, 14, 10;
+ bonus2 bSkillAtk, 19, 10;
+ bonus2 bSkillAtk, 20, 10;
+ if (BaseClass == Job_Mage) {
+ bonus bMatkRate, 3;
+ bonus bVariableCastrate, -15;
+ }
+ ">
+},
+{
+ Items: ["Lude_Card", "Quve_Card"]
+ Script: <"
+ bonus bMaxHP, 300;
+ bonus bMaxSP, 60;
+ ">
+},
+{
+ Items: ["Miyabi_Ningyo_Card", "Wicked_Nymph_Card", "Harpy_Card", "Blood_Butterfly_Card", "Novus__Card"]
+ Script: <"
+ bonus bInt, 3;
+ bonus2 bSkillAtk, WZ_HEAVENDRIVE, 10;
+ bonus2 bSkillAtk, MG_THUNDERSTORM, 10;
+ if (BaseJob == Job_Sage) {
+ bonus bMagicDamageReturn, 20;
+ bonus2 bAddMonsterDropItem, 716, 100;
+ bonus2 bAddMonsterDropItem, 715, 100;
+ bonus bVariableCastrate, -20;
+ }
+ ">
+},
+{
+ Items: ["Succubus_Card", "Incubus_Card"]
+ Script: <"
+ bonus bHPrecovRate, 30;
+ bonus bSPrecovRate, 30;
+ bonus bVit, 4;
+ bonus bInt, 4;
+ ">
+},
+{
+ Items: ["Solider_Card", "Assulter_Card", "Permeter_Card", "Freezer_Card", "Heater_Card"]
+ Script: <"
+ bonus bStr, 10;
+ bonus bMaxHPrate, 20;
+ bonus bHPrecovRate, 50;
+ bonus3 bAutoSpell, BS_WEAPONPERFECT, 1, 3;
+ bonus2 bAddMonsterDropItem, 501, 500;
+ if (BaseClass == Job_Swordman) {
+ bonus2 bAddItemHealRate, Red_Potion, 50;
+ bonus2 bAddItemHealRate, Yellow_Potion, 50;
+ bonus2 bAddItemHealRate, Orange_Potion, 50;
+ bonus2 bAddItemHealRate, White_Potion, 50;
+ }
+ ">
+},
+{
+ Items: ["C_Tower_Manager_Card", "Alarm_Card", "Clock_Card", "Punk_Card"]
+ Script: <"
+ bonus bDef, 3;
+ bonus bMdef, 3;
+ ">
+},
+{
+ Items: ["Owl_Duke_Card", "Owl_Baron_Card"]
+ Script: <"
+ bonus3 bAutoSpell, MG_LIGHTNINGBOLT, 5, 20;
+ ">
+},
+{
+ Items: ["Injustice_Card", "Zherlthsh_Card"]
+ Script: <"
+ bonus bBaseAtk, 20;
+ bonus bLuk, 3;
+ ">
+},
+{
+ Items: ["Permeter_Card", "Freezer_Card", "Heater_Card", "Archdam_Card"]
+ Script: <"
+ bonus bInt, 1;
+ bonus bStr, 1;
+ bonus bDef, 2;
+ bonus bSPrecovRate, 10;
+ bonus2 bSkillAtk, PA_SHIELDCHAIN, 10;
+ bonus2 bSkillAtk, PA_SACRIFICE, 10;
+ bonus bVariableCastrate, -10;
+ if (BaseJob == Job_Crusader)
+ bonus bDefEle, Ele_Holy;
+ ">
+},
+{
+ Items: ["Garm_Baby_Card", "Garm_Card"]
+ Script: <"
+ bonus3 bAutoSpell, MG_FROSTDIVER, 3, 250;
+ ">
+},
+{
+ Items: ["Pitman_Card", "Mashirubeken"]
+ Script: <"
+ bonus3 bAutoSpell, WZ_EARTHSPIKE, 5, 20 + (getequiprefinerycnt(EQI_HAND_R));
+ ">
+},
+{
+ Items: ["Hill_Wind_Card", "Mashirubeken"]
+ Script: <"
+ bonus3 bAutoSpell, MG_LIGHTNINGBOLT, 5, 20 + (getequiprefinerycnt(EQI_HAND_R));
+ ">
+},
+{
+ Items: ["Rawrel_Card", "Mashirubeken"]
+ Script: <"
+ bonus3 bAutoSpell, MG_COLDBOLT, 5, 20 + (getequiprefinerycnt(EQI_HAND_R));
+ ">
+},
+{
+ Items: ["Ferus_Card", "Mashirubeken"]
+ Script: <"
+ bonus3 bAutoSpell, MG_FIREBOLT, 5, 20 + (getequiprefinerycnt(EQI_HAND_R));
+ ">
+},
+{
+ Items: ["Deathword_Card", "Mashirubeken"]
+ Script: <"
+ bonus3 bAutoSpell, MG_SOULSTRIKE, 5, 20 + (getequiprefinerycnt(EQI_HAND_R));
+ ">
+},
+{
+ Items: ["Zombie_Slaughter_Card", "Ragged_Zombie_Card"]
+ Script: <"
+ bonus2 bSPGainRace, RC_DemiPlayer, 2;
+ ">
+},
+{
+ Items: ["Tendrilion_Card", "KarduiEar"]
+ Script: <"
+ if (getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_SUBTYPE) == W_2HSPEAR
+ || getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_SUBTYPE) == W_2HSTAFF
+ || getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_SUBTYPE) == W_STAFF) {
+ bonus2 bMagicAddRace, RC_DemiPlayer, getequipid(EQI_HAND_R) * 2;
+ bonus2 bMagicAddRace, RC_Player, getequipid(EQI_HAND_R) * 2;
+ }
+ ">
+},
+{
+ Items: ["Scaraba_Card", "Gold_Scaraba_Card"]
+ Script: <"
+ bonus3 bAutoSpell, NPC_DRAGONFEAR, 2, 100 + (getrefine() * 10);
+ ">
+},
+{
+ Items: ["Q_Scaraba_Card", "Queen_Scaraba_Crown"]
+ Script: <"
+ bonus2 bAddRace2, 7, 30;
+ ">
+},
+{
+ Items: ["Gold_Q_Scaraba_Card", "Queen_Scaraba_Crown"]
+ Script: <"
+ bonus2 bSubRace, RC_Insect, 10;
+ bonus2 bResEff, Eff_Confusion, 10000;
+ ">
+},
+{
+ Items: ["Cendrawasih_Card", "FlyingGalapago"]
+ Script: <"
+ bonus bInt, 1;
+ bonus bCritAtkRate, 5;
+ if (BaseClass == Job_Archer) {
+ bonus bCritAtkRate, 10;
+ }
+ ">
+},
+{
+ Items: ["UndeadKnightF_Card", "Crimson_Stole"]
+ Script: <"
+ bonus bMaxSPrate, 44;
+ bonus bSPGainValue, -(20 + (getequiprefinerycnt(EQI_GARMENT) / 2));
+ ">
+},
+{
+ Items: ["White_Knightage_Card", "Khali_Knightage_Card"]
+ Script: <"
+ bonus2 bAddSize, Size_Medium, 15;
+ bonus2 bAddSize, Size_Large, 15;
+ bonus2 bSubSize, Size_Medium, 5;
+ bonus2 bSubSize, Size_Large, 5;
+ ">
+},
+{
+ Items: ["P_Amdarais_Card", "Bijou_Card"]
+ Script: <"
+ bonus2 bResEff, Eff_Burning, 10000;
+ ">
+},
+{
+ Items: ["Min_Toad_Card", "Min_Chimera_Card"]
+ Script: <"
+ bonus bAtkRate, 10;
+ bonus bMatkRate, 10;
+ ">
+},
+{
+ Items: ["Min_Vagabond_Wolf_Card", "Min_Chimera_Card"]
+ Script: <"
+ bonus bAtkRate, 10;
+ bonus bMatkRate, 10;
+ ">
+},
+{
+ Items: ["Min_Vocal_Card", "Min_Chimera_Card"]
+ Script: <"
+ bonus bAtkRate, 10;
+ bonus bMatkRate, 10;
+ ">
+},
+{
+ Items: ["Min_Eclipse_Card", "Min_Chimera_Card"]
+ Script: <"
+ bonus bAtkRate, 10;
+ bonus bMatkRate, 10;
+ ">
+},
+{
+ Items: ["N_Arclouse_Card", "N_Mimic_Card"]
+ Script: <"
+ bonus2 bSubRace, RC_Brute, 5;
+ bonus2 bSubRace, RC_Undead, 5;
+ bonus2 bIgnoreMdefRate, 50, RC_Brute;
+ bonus2 bIgnoreMdefRate, 50, RC_Undead;
+ ">
+},
+{
+ Items: ["N_Arclouse_Card", "N_Minorous_Card"]
+ Script: <"
+ bonus2 bSubRace, RC_Brute, 5;
+ bonus2 bSubRace, RC_Undead, 5;
+ bonus2 bIgnoreDefRate, 50, RC_Brute;
+ bonus2 bIgnoreDefRate, 50, RC_Undead;
+ ">
+},
+{
+ Items: ["Loard_Circlet", "Gossip_Raven"]
+ Script: <"
+ bonus2 bExpAddRace, RC_All, 5;
+ ">
+},
+{
+ Items: ["Bankruptcy_Of_Heart", "Mask_Of_Bankrupt"]
+ Script: <"
+ bonus bMaxHP, 100;
+ bonus2 bSubEle, Ele_Neutral, getequiprefinerycnt(EQI_HEAD_TOP);
+ ">
+},
+{
+ Items: ["Blush", "Necktie"]
+ Script: <"
+ bonus bAspdRate, 3;
+ bonus bVariableCastrate, 3;
+ ">
+},
+{
+ Items: ["Blush", "Tare_Pope"]
+ Script: <"
+ bonus bSPrecovRate, 3;
+ ">
+},
+{
+ Items: ["Blush", "Tare_Pope_"]
+ Script: <"
+ bonus bHealPower, 10;
+ ">
+},
+{
+ Items: ["Ear_Of_Devils_Wing", "Darkness_Helm_J"]
+ Script: <"
+ bonus bStr, 1;
+ bonus bAtkRate, 5;
+ ">
+},
+{
+ Items: ["Ear_Of_Angels_Wing", "Darkness_Helm_J"]
+ Script: <"
+ bonus bStr, 1;
+ bonus bAspdRate, 2;
+ ">
+},
+{
+ Items: ["Alarm_Mask", "Gloomy_Pumpkin_Hat"]
+ Script: <"
+ bonus2 bAddItemHealRate, 12192, 200;
+ ">
+},
+{
+ Items: ["Feather_Beret", "Protect_Feathers"]
+ Script: <"
+ bonus bAspdRate, 5;
+ if (getequiprefinerycnt(EQI_HEAD_TOP) > 6)
+ bonus bAspdRate, 5;
+ if (getequiprefinerycnt(EQI_HEAD_TOP) > 8)
+ bonus bMaxHPrate, 5;
+ ">
+},
+{
+ Items: ["Hahoe_Mask", "Gloomy_Pumpkin_Hat"]
+ Script: <"
+ bonus bAspdRate, 5;
+ ">
+},
+{
+ Items: ["Captain_Hat", "Antique_Pipe_J"]
+ Script: <"
+ bonus bLongAtkRate, getequiprefinerycnt(EQI_HEAD_TOP);
+ ">
+},
+{
+ Items: ["Pecopeco_Wing_Ears", "Darkness_Helm_J"]
+ Script: <"
+ bonus bAgi, 1;
+ bonus bFlee, 3;
+ ">
+},
+{
+ Items: ["Pencil_In_Mouth", "Cap_Of_Concentration"]
+ Script: <"
+ bonus bDex, 2;
+ bonus bDef, 2;
+ ">
+},
+{
+ Items: ["Black_Glasses", "Darkness_Helm_J"]
+ Script: <"
+ bonus bInt, 1;
+ bonus bMatkRate, 2;
+ ">
+},
+{
+ Items: ["Eyes_Of_Darkness", "Darkness_Helm_J"]
+ Script: <"
+ bonus bDex, 1;
+ bonus bLongAtkRate, 3;
+ ">
+},
+{
+ Items: ["Red_Wing_Hat", "Priest_Sword"]
+ Script: <"
+ bonus2 bAddRace, RC_DemiPlayer, 10;
+ bonus bHit, 10;
+ ">
+},
+{
+ Items: ["Angel_Earing", "Bless_Of_Moon"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 3;
+ ">
+},
+{
+ Items: ["Heaven_Cage", "Ixion_Wing"]
+ Script: <"
+ if (Class == Job_Ranger || Class == Job_Ranger_T)
+ skill HT_BLITZBEAT, 5 * getequiprefinerycnt(EQI_HAND_R);
+ ">
+},
+{
+ Items: ["Scalpel", "Green_Operation_Coat"]
+ Script: <"
+ bonus3 bAddMonsterDropItem, 929, RC_Brute, 100 + (getequiprefinerycnt(EQI_HAND_R) * 10);
+ bonus3 bAddMonsterDropItem, 929, RC_DemiPlayer, 100 + (getequiprefinerycnt(EQI_HAND_R) * 10);
+ bonus3 bAddMonsterDropItem, 970, RC_Brute, 20 + (getequiprefinerycnt(EQI_HAND_R) * 2);
+ bonus3 bAddMonsterDropItem, 970, RC_DemiPlayer, 20 + (getequiprefinerycnt(EQI_HAND_R) * 2);
+ ">
+},
+{
+ Items: ["Twilight_Desert", "Sandstorm"]
+ Script: <"
+ bonus bMaxSP, 20;
+ bonus bMaxHPrate, 5;
+ bonus bHit, 10;
+ bonus2 bAddSize, Size_Large, 30;
+ autobonus "{ bonus bAspdRate,100; }", 1, 7000, BF_WEAPON, "{ specialeffect(EF_POTION_BERSERK, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Sandstorm", "Twilight_Desert_"]
+ Script: <"
+ bonus bMaxSP, 20;
+ bonus bMaxHPrate, 5;
+ bonus bHit, 10;
+ bonus2 bAddSize, Size_Large, 30;
+ autobonus "{ bonus bAspdRate,100; }", 1, 7000, BF_WEAPON, "{ specialeffect(EF_POTION_BERSERK, AREA, playerattached()); }";
+ ">
+},
+{
+ Items: ["Boitata_Armor", "Boitata_Hat"]
+ Script: <"
+ bonus2 bAddEle, Ele_Earth, 10;
+ bonus bDefEle, Ele_Fire;
+ ">
+},
+{
+ Items: ["Egir_Armor", "Aegir_Helm"]
+ Script: <"
+ bonus2 bAddRaceTolerance, RC_Fish, 10 + getequiprefinerycnt(EQI_ARMOR);
+ ">
+},
+{
+ Items: ["Im_Angels_Protection", "Impr_Angels_Warmth"]
+ Script: <"
+ bonus(bAgi, 5);
+ bonus(bFlee, 10);
+ ">
+},
+{
+ Items: ["Female_Poring_Egg", "Excellion_Wing"]
+ Script: <"
+ bonus bDelayrate, -10;
+ bonus bFlee2, 6;
+ if (BaseLevel > 130) {
+ bonus bDelayrate, -10;
+ }
+ ">
+},
+{
+ Items: ["Elven_Ears_", "Skull_Cap"]
+ Script: <"
+ bonus bUseSPrate, -3;
+ ">
+},
+{
+ Items: ["Blush_", "Tare_Pope"]
+ Script: <"
+ bonus bSPrecovRate, 3;
+ ">
+},
+{
+ Items: ["Blush_", "Tare_Pope_"]
+ Script: <"
+ bonus bHealPower, 10;
+ ">
+},
+{
+ Items: ["Imperial_Feather", "Imperial_Ring"]
+ Script: <"
+ bonus2 bSkillVariableCast, CR_GRANDCROSS, -2000;
+ bonus2 bSkillUseSP, LG_RAYOFGENESIS, 10;
+ bonus2 bSkillAtk, CR_GRANDCROSS, BaseLevel;
+ bonus2 bSkillAtk, LG_RAYOFGENESIS, BaseLevel / 30;
+ ">
+},
+{
+ Items: ["Imperial_Feather", "Imperial_Guard", "Imperial_Spear"]
+ Script: <"
+ bonus2 bSkillAtk, LG_CANNONSPEAR, 20;
+ bonus2 bSkillAtk, LG_BANISHINGPOINT, 20;
+ bonus2 bSkillAtk, LG_SHIELDPRESS, 20;
+ ">
+},
+{
+ Items: ["Armor_Of_Gray", "Gray_Helmet", "Cloak_Of_Gray", "Boots_Of_Gray"]
+ Script: <"
+ bonus2 bSubEle, Ele_Neutral, 15;
+ bonus3 bAutoSpellWhenHit, WL_DRAINLIFE, 3, 100;
+ ">
+},
+{
+ Items: ["Gray_Robe", "Gray_Helmet", "Cloak_Of_Gray", "Boots_Of_Gray"]
+ Script: <"
+ bonus2 bSubEle, Ele_Neutral, 15;
+ bonus bMaxHPrate, 25;
+ bonus bMaxSPrate, 25;
+ bonus bMatkRate, 10;
+ ">
+},
+{
+ Items: ["Felock_Armor", "Felock_Cape", "Felock_Boots"]
+ Script: <"
+ bonus bMaxHP, 25;
+ bonus bMaxSP, 25;
+ bonus bSpeedRate, 25;
+ if (getequiprefinerycnt(EQI_GARMENT, EQI_SHOES, EQI_ARMOR) >= 30) {
+ bonus bMaxHP, 5;
+ bonus bMaxSP, 5;
+ }
+ ">
+},
+{
+ Items: ["Blood_Angel_Hair_Band", "Blood_Angel_Wing_Ear"]
+ Script: <"
+ bonus2 bAddRace, RC_Angel, 3;
+ ">
+},
+{
+ Items: ["Egir_Helm", "Egir_Armor", "Egir_Shoes", "Egir_Manteau"]
+ Script: <"
+ bonus bAllStats, 1;
+ bonus2 bSubEle, Ele_Water, 50;
+ ">
+},
+{
+ Items: ["Improved_Kiss_Of_Angel", "Impr_Angels_Warmth"]
+ Script: <"
+ bonus(bBaseAtk, 10);
+ ">
+},
+{
+ Items: ["Improved_Kiss_Of_Angel", "Impr_Angels_Arrival"]
+ Script: <"
+ bonus(bMatk, 20);
+ ">
+},
+{
+ Items: ["Mask_Of_Bankrupt", "Bankruptcy_Of_Heart_"]
+ Script: <"
+ bonus bMaxHP, 100;
+ bonus2 bSubEle, Ele_Neutral, getequiprefinerycnt(EQI_HEAD_TOP);
+ ">
+},
+{
+ Items: ["One_Eyed_Glass_", "Memorize_Book", "Pocket_Watch__"]
+ Script: <"
+ bonus bHPrecovRate, 15;
+ bonus bSPrecovRate, 15;
+ bonus bMatkRate, 7;
+ ">
+},
+{
+ Items: ["Riot_Chip", "Broken_Chip_1", "Broken_Chip_2"]
+ Script: <"
+ bonus bSpeedRate, 10;
+ bonus bBaseAtk, 50;
+ bonus bMatk, 50;
+ if (getequiprefinerycnt(EQI_HEAD_TOP) >= 9) {
+ bonus bMaxHPrate, 10;
+ bonus bMaxSPrate, 50;
+ }
+ ">
+},
+{
+ Items: ["Aegir_Helm", "Aegir_Armor"]
+ Script: <"
+ bonus2 bAddRaceTolerance, RC_Fish, 10 + getequiprefinerycnt(EQI_ARMOR);
+ ">
+},
+{
+ Items: ["Aegir_Helm", "Aegir_Cloak"]
+ Script: <"
+ .@r = getequiprefinerycnt(EQI_GARMENT);
+ bonus2 bSPGainRace, RC_Fish, 10;
+ bonus3 bAddMonsterDropItem, Shusi, RC_Fish, (5 + .@r);
+ bonus3 bAddMonsterDropItem, Fish_Slice, RC_Fish, (5 + .@r);
+ bonus2 bAddItemHealRate, Shusi, 5;
+ bonus2 bAddItemHealRate, Fish_Slice, 5;
+ bonus bHPrecovRate, (5 + .@r);
+ ">
+},
+{
+ Items: ["Aegir_Helm", "Aegir_Shoes"]
+ Script: <"
+ bonus2 bCriticalAddRace, RC_Fish, 10 + getequiprefinerycnt(EQI_SHOES);
+ ">
+},
+{
+ Items: ["Aegir_Helm", "Aegir_Armor", "Aegir_Shoes", "Aegir_Cloak"]
+ Script: <"
+ bonus bMaxHP, 1000;
+ bonus bMaxSP, 100;
+ bonus2 bExpAddRace, RC_Fish, 20;
+ bonus2 bAddRace, RC_Fish, 50;
+ bonus2 bMagicAddRace, RC_Fish, 50;
+ bonus2 bSubEle, Ele_Water, 50;
+ ">
+},
+{
+ Items: ["C_Amistr_Cap", "C_Amistr_Bag"]
+ Script: <"
+ bonus2 bAddRaceTolerance, RC_Player, 4;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Str_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Int_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Agi_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Vit_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Dex_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Luk_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Str_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Vit_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Dex_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Int_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Agi_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin", "Temporal_Luk_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Str_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Int_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Agi_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Vit_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Dex_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Luk_Boots"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Str_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Vit_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Dex_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Int_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Agi_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["FaceWorm_Skin_", "Temporal_Luk_Boots_"]
+ Script: <"
+ bonus bMaxHPrate, 15;
+ bonus bMaxSPrate, 5;
+ ">
+},
+{
+ Items: ["Supplement_Part_Con", "Tornado_Axe"]
+ Script: <"
+ bonus2 bAddRace, RC_All, 25;
+ ">
+},
+{
+ Items: ["Assassin_Shoes", "Desperation_of_Assassin"]
+ Script: <"
+ bonus2 bAddRace, RC_DemiPlayer, getequiprefinerycnt(EQI_SHOES);
+ bonus2 bAddRace, RC_Player, getequiprefinerycnt(EQI_SHOES);
+ ">
+},
+{
+ Items: ["Broken_Chip_1", "Broken_Chip_2"]
+ Script: <"
+ bonus bInt, 8;
+ bonus bStr, 8;
+ ">
+},
+{
+ Items: ["S_Promotion_Weapon", "S_Promotion_Armor", "S_Promotion_Shoes", "S_Promotion_Shield", "S_Promotion_Earring", "S_Promotion_Pendant"]
+ Script: <"
+ bonus bAllStats, 9;
+ ">
+},
+{
+ Items: ["S_Physical_Earring", "S_Physical_Weapon", "S_Physical_Pendant"]
+ Script: <"
+ if (getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L, EQI_SHADOW_WEAPON) >= 23) {
+ bonus bAtkRate, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Magical_Earring", "S_Magical_Weapon", "S_Magical_Pendant"]
+ Script: <"
+ if (getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L, EQI_SHADOW_WEAPON) >= 23) {
+ bonus bMatkRate, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Champion_Shoes", "S_Hard_Armor"]
+ Script: <"
+ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES);
+ bonus bMaxHP, .@r;
+ bonus bMaxSP, .@r;
+ if (.@r >= 15) {
+ bonus bMaxHPrate, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Athena_Shield", "S_Immune_Armor"]
+ Script: <"
+ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_SHIELD);
+ bonus bDef, .@r;
+ if (.@r >= 15) {
+ bonus2 bSubEle, 0, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Ancient_Armor", "S_Kingbird_Weapon"]
+ Script: <"
+ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON);
+ bonus bBaseAtk, .@r;
+ if (.@r >= 15) {
+ bonus bLongAtkRate, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Critical_Armor", "S_Cri_Hit_Weapon"]
+ Script: <"
+ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON);
+ bonus bCritical, .@r;
+ bonus bBaseAtk, .@r;
+ if (.@r >= 15) {
+ bonus bCritAtkRate, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Lucky_Weapon", "S_Lucky_Armor"]
+ Script: <"
+ bonus bLuk, 1;
+ ">
+},
+{
+ Items: ["S_Power_Earring", "S_Power_Pendant"]
+ Script: <"
+ bonus bStr, 1;
+ ">
+},
+{
+ Items: ["S_Int_Pendant", "S_Int_Earring"]
+ Script: <"
+ bonus bInt, 1;
+ ">
+},
+{
+ Items: ["S_Dexterous_Armor", "S_Dexterous_Weapon"]
+ Script: <"
+ bonus bDex, 1;
+ ">
+},
+{
+ Items: ["S_Vital_Shoes", "S_Vital_Shield"]
+ Script: <"
+ bonus bVit, 1;
+ ">
+},
+{
+ Items: ["S_Athletic_Shield", "S_Athletic_Shoes"]
+ Script: <"
+ bonus bAgi, 1;
+ ">
+},
+{
+ Items: ["S_Resist_Spell_Pendant", "S_Athena_Earring"]
+ Script: <"
+ bonus2 bSubEle, Ele_Neutral, 1;
+ if (getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 15) {
+ bonus2 bSubEle, Ele_Neutral, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Cranial_Shield", "S_Bloody_Shoes"]
+ Script: <"
+ bonus2 bExpAddRace, RC_DemiPlayer, 3;
+ ">
+},
+{
+ Items: ["S_Safeguard_Shield", "S_Liberation_Shoes"]
+ Script: <"
+ bonus2 bAddRace, RC_Boss, 5;
+ bonus2 bMagicAddRace, RC_Boss, 5;
+ ">
+},
+{
+ Items: ["S_Brutal_Shield", "S_Clamorous_Shoes"]
+ Script: <"
+ bonus2 bExpAddRace, RC_Brute, 3;
+ ">
+},
+{
+ Items: ["S_Gargantua_Shield", "S_Insecticide_Shoes"]
+ Script: <"
+ bonus2 bExpAddRace, RC_Insect, 3;
+ ">
+},
+{
+ Items: ["S_Homers_Shield", "S_Fisher_Shoes"]
+ Script: <"
+ bonus2 bExpAddRace, RC_Fish, 3;
+ ">
+},
+{
+ Items: ["S_Dragoon_Shield", "S_Dragoon_Shoes"]
+ Script: <"
+ bonus2 bExpAddRace, RC_Dragon, 3;
+ ">
+},
+{
+ Items: ["S_Satanic_Shield", "S_Seraphim_Shoes"]
+ Script: <"
+ bonus2 bExpAddRace, RC_Angel, 3;
+ ">
+},
+{
+ Items: ["S_Flameguard_Shield", "S_Beholder_Shoes"]
+ Script: <"
+ bonus2 bExpAddRace, RC_Formless, 3;
+ ">
+},
+{
+ Items: ["S_Requiem_Shield", "S_Divine_Shoes"]
+ Script: <"
+ bonus2 bExpAddRace, RC_Undead, 3;
+ ">
+},
+{
+ Items: ["S_Cadi_Shield", "S_Chemical_Shoes"]
+ Script: <"
+ bonus2 bExpAddRace, RC_Plant, 3;
+ ">
+},
+{
+ Items: ["S_Big_Armor", "S_Big_Weapon"]
+ Script: <"
+ bonus bMaxHPrate, 1;
+ bonus bMaxSPrate, 1;
+ ">
+},
+{
+ Items: ["S_Medium_Armor", "S_Medium_Weapon"]
+ Script: <"
+ bonus bMaxHPrate, 1;
+ bonus bMaxSPrate, 1;
+ ">
+},
+{
+ Items: ["S_Small_Armor", "S_Small_Weapon"]
+ Script: <"
+ bonus bMaxHPrate, 1;
+ bonus bMaxSPrate, 1;
+ ">
+},
+{
+ Items: ["S_Spiritual_Weapon", "S_Spiritual_Earring", "S_Spiritual_Pendent"]
+ Script: <"
+ bonus3 bSPDrainRate, 10, 1 + (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) / 10), 0;
+ ">
+},
+{
+ Items: ["S_Malicious_Armor", "S_Malicious_Shoes", "S_Malicious_Shield"]
+ Script: <"
+ bonus3 bHPDrainRateRace, 11, 40, 2 + (getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_SHIELD, EQI_SHADOW_SHOES) / 5);
+ ">
+},
+{
+ Items: ["S_Gemstone_Armor", "S_Gemstone_Shoes", "S_Gemstone_Shield", "S_Gemstone_Weapon", "S_Gemstone_Earring", "S_Gemstone_Pendent"]
+ Script: <"
+ bonus bAllStats, 1;
+ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON, EQI_SHADOW_SHIELD, EQI_SHADOW_SHOES, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L);
+ if (.@r >= 45) {
+ bonus bNoGemStone, 1;
+ }
+ bonus bUseSPrate, 100 - .@r;
+ ">
+},
+{
+ Items: ["S_Stability_Shield", "S_Plasterers_Armor", "S_Plasterers_Shoes"]
+ Script: <"
+ bonus bDef, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 20)
+ bonus2 bResEff, Eff_Stone, 100;
+ ">
+},
+{
+ Items: ["S_Stability_Shield", "S_Insomniac_Armor", "S_Insomniac_Shoes"]
+ Script: <"
+ bonus bDef, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 20)
+ bonus2 bResEff, Eff_Sleep, 100;
+ ">
+},
+{
+ Items: ["S_Stability_Shield", "S_Peerless_Armor", "S_Peerless_Shoes"]
+ Script: <"
+ bonus bDef, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 20)
+ bonus2 bResEff, Eff_Silence, 100;
+ ">
+},
+{
+ Items: ["S_Stability_Shield", "S_Adurate_Armor", "S_Adurate_Shoes"]
+ Script: <"
+ bonus bDef, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 20)
+ bonus2 bResEff, Eff_Blind, 100;
+ ">
+},
+{
+ Items: ["S_Stability_Shield", "Unfreez_Weapon_S", "Unfreeze_Earing_S", "Unfreeze_Pendent_S"]
+ Script: <"
+ bonus bDef, 4;
+ if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_L, EQI_SHADOW_ACC_R) >= 30)
+ bonus2 bResEff, Eff_Freeze, 100;
+ ">
+},
+{
+ Items: ["S_Stability_Shield", "Vitality_Earing_S", "Vitality_Pendant_S"]
+ Script: <"
+ bonus bDef, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ACC_L, EQI_SHADOW_ACC_R) >= 20)
+ bonus2 bResEff, Eff_Bleeding, 100;
+ ">
+},
+{
+ Items: ["S_Stability_Shield", "S_Neutral_Weapon", "S_Neutral_Earring", "S_Neutral_Pendent"]
+ Script: <"
+ bonus bDef, 4;
+ if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_L, EQI_SHADOW_ACC_R) >= 30)
+ bonus2 bResEff, Eff_Stun, 100;
+ ">
+},
+{
+ Items: ["S_Stability_Shield", "S_Curse_Lift_Earring", "S_Curse_Lift_Pendent"]
+ Script: <"
+ bonus bDef, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ACC_L, EQI_SHADOW_ACC_R) >= 20)
+ bonus2 bResEff, Eff_Curse, 100;
+ ">
+},
+{
+ Items: ["S_Caster_earring", "S_Caster_Weapon", "S_Caster_Pendant"]
+ Script: <"
+ bonus bNoCastCancel, 1;
+ bonus bVariableCastrate, 40 - (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L));
+ ">
+},
+{
+ Items: ["S_Spell_Flow_Shoes", "S_Spell_Flow_Armor", "S_Spell_Flow_Shield"]
+ Script: <"
+ bonus bNoCastCancel, 1;
+ bonus bUseSPrate, 40 - getequiprefinerycnt(EQI_SHADOW_SHIELD) - getequiprefinerycnt(EQI_SHADOW_ARMOR) - getequiprefinerycnt(EQI_SHADOW_SHOES);
+ ">
+},
+{
+ Items: ["S_Infinity_Earring", "S_Infinity_Pendant"]
+ Script: <"
+ bonus bAtkRate, 1;
+ if (getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 15)
+ bonus bNoSizeFix, 1;
+ ">
+},
+{
+ Items: ["S_Solid_Weapon", "S_Solid_Earring"]
+ Script: <"
+ bonus bAtk, getequiprefinerycnt(EQI_SHADOW_WEAPON);
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R) >= 15)
+ bonus bUnbreakableWeapon, 1;
+ ">
+},
+{
+ Items: ["S_Immortal_Armor", "S_Immortal_Pendant"]
+ Script: <"
+ bonus bDef, getequiprefinerycnt(EQI_SHADOW_ARMOR);
+ if (getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_ACC_L) >= 15)
+ bonus bUnbreakableArmor, 1;
+ ">
+},
+{
+ Items: ["S_Executioner_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_DemiPlayer;
+ ">
+},
+{
+ Items: ["S_Exorcist_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_Demon;
+ ">
+},
+{
+ Items: ["S_Hunting_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_Brute;
+ ">
+},
+{
+ Items: ["S_Insect_Net_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_Insect;
+ ">
+},
+{
+ Items: ["S_Fishing_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_Fish;
+ ">
+},
+{
+ Items: ["S_Dragon_Killer_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_Dragon;
+ ">
+},
+{
+ Items: ["S_Corrupt_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_Angel;
+ ">
+},
+{
+ Items: ["S_Vibration_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_Formless;
+ ">
+},
+{
+ Items: ["S_Holy_Water_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_Undead;
+ ">
+},
+{
+ Items: ["S_Scissors_Weapon", "S_Penetration_Earring", "S_Penetration_Pendent"]
+ Script: <"
+ bonus bBaseAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreDefRace, RC_Plant;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Executioner_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_DemiPlayer;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Exorcist_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_Demon;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Hunting_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_Brute;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Insect_Net_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_Insect;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Fishing_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_Fish;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Dragon_K_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_Dragon;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Corrupt_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_Angel;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Vibration_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_Formless;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Holy_Water_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_Undead;
+ ">
+},
+{
+ Items: ["S_Tempest_Earring", "S_Tempest_Pendent", "S_M_Scissors_Weapon"]
+ Script: <"
+ bonus bMatk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 25)
+ bonus bIgnoreMdefRace, RC_Plant;
+ ">
+},
+{
+ Items: ["S_Bearers_Armor", "S_Bearers_Shoes", "S_Bearers_Shield", "S_Bearers_Weapon", "S_Bearers_Earring", "S_Bearers_Pendent"]
+ Script: <"
+ .@refine = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON, EQI_SHADOW_SHIELD, EQI_SHADOW_SHOES, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L);
+ bonus bAllStats, 1;
+ if (.@refine >= 45) {
+ bonus bMaxHPrate, (.@refine - 60);
+ sc_start4 SC_ENDURE, 1, 10, 0, 0, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Hasty_Shoes", "S_Hasty_Armor"]
+ Script: <"
+ bonus bFlee, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_ARMOR) >= 15)
+ bonus bSpeedAddRate, 3;
+ ">
+},
+{
+ Items: ["S_Expert_Shoes", "S_Expert_Shield"]
+ Script: <"
+ bonus2 bExpAddRace, RC_All, ((getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD)) >= 15 ? 10 : 1);
+ ">
+},
+{
+ Items: ["S_Beginner_Shoes", "S_Beginner_Shield"]
+ Script: <"
+ bonus2 bExpAddRace, RC_All, ((getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD)) >= 15 ? 20 : 10);
+ ">
+},
+{
+ Items: ["S_Rookie_Shoes", "S_Rookie_Shield"]
+ Script: <"
+ bonus2 bExpAddRace, RC_All, ((getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD)) >= 15 ? 10 : 5);
+ ">
+},
+{
+ Items: ["S_Advanced_Shoes", "S_Advanced_Shield"]
+ Script: <"
+ bonus2 bExpAddRace, RC_All, ((getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD)) >= 15 ? 4 : 2);
+ ">
+},
+{
+ Items: ["S_Blitz_Earring", "S_Blitz_Pendent"]
+ Script: <"
+ if (getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 15)
+ bonus bAspd, 1;
+ ">
+},
+{
+ Items: ["S_Force_Weapon", "S_Force_Earring", "S_Force_Pendant"]
+ Script: <"
+ .@refine = getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L);
+ if (.@refine >= 25) {
+ bonus bAtkRate, 2;
+ } else if (.@refine >= 20) {
+ bonus bAtkRate, 1;
+ }
+ bonus bAtk2, 10;
+ ">
+},
+{
+ Items: ["S_Spirit_Weapon", "S_Spirit_Earring", "S_Spirit_Pendant"]
+ Script: <"
+ .@refine = getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L);
+ if (.@refine >= 25) {
+ bonus bMatkRate, 2;
+ } else if (.@refine >= 20) {
+ bonus bMatkRate, 1;
+ }
+ bonus bMatk, 10;
+ ">
+},
+{
+ Items: ["S_Blitz_Shoes", "S_Blitz_Shield"]
+ Script: <"
+ bonus bFlee, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD) >= 15) {
+ bonus bAspd, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Titan_Earring", "S_Titan_Pendant"]
+ Script: <"
+ bonus bAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 15) {
+ bonus2 bAddSize, Size_Large, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Boned_Earring", "S_Boned_Pendant"]
+ Script: <"
+ bonus bAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 15) {
+ bonus2 bAddSize, Size_Medium, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Gigantic_Earring", "S_Gigantic_Pendant"]
+ Script: <"
+ bonus bAtk, 5;
+ if (getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 15) {
+ bonus2 bAddSize, Size_Small, 1;
+ }
+ ">
+},
+{
+ Items: ["S_Caster_Shoes", "S_Caster_Shield", "S_Caster_Armor"]
+ Script: <"
+ bonus bUseSPrate, -1;
+ .@refine = getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES);
+ bonus bVariableCastrate, (.@refine) / 5;
+ if (.@refine >= 25) {
+ bonus bUseSPrate, -1;
+ }
+ ">
+},
+{
+ Items: ["S_Reload_Shoes", "S_Reload_Shield", "S_Reload_Armor"]
+ Script: <"
+ bonus bDelayrate, -1;
+ if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 25)
+ bonus bDelayrate, -5;
+ ">
+},
+{
+ Items: ["Geffenia_Book_Water", "Lacryma_Stick"]
+ Script: <"
+ .@r = (getequiprefinerycnt(EQI_HAND_L) * 4);
+ bonus2 bVariableCastrate, "WZ_STORMGUST", -.@r;
+ bonus2 bVariableCastrate, "WL_FROSTMISTY", -.@r;
+ bonus2 bVariableCastrate, "WL_JACKFROST", -.@r;
+ ">
+},
+)
diff --git a/db/re/item_combo_db.txt b/db/re/item_combo_db.txt
deleted file mode 100644
index 06730216c..000000000
--- a/db/re/item_combo_db.txt
+++ /dev/null
@@ -1,439 +0,0 @@
-// Item Combos Database
-//
-// Structure of Database:
-// ID:ID:ID:ID,{ Script }
-
-1166:2527,{ bonus2 bAddRace,RC_Dragon,5; }
-1219:5782,{ bonus bAtkRate,3; }
-1220:5782,{ bonus bAtkRate,3; }
-1221:5782,{ bonus bAtkRate,3; }
-1284:2892,{ bonus bBaseAtk,50; bonus2 bSkillAtk,AS_SONICBLOW,50; bonus bFlee,-30; }
-1285:2892,{ bonus bCritAtkRate,40; bonus bCritical,4; bonus bMaxHPrate,-10; }
-1287:15123,{ if(getequiprefinerycnt(EQI_HAND_R)>6) { autobonus2 "{ bonus bIgnoreDefRace,RC_NonBoss; }",20,3000,BF_WEAPON,"{}"; } }
-1298:4317,{ bonus bCritAtkRate,5; }
-1298:4521,{ bonus bCritAtkRate,5; }
-1387:19021,{ bonus2 bSkillAtk,WS_CARTTERMINATION,15+(getequiprefinerycnt(EQI_HAND_R)*5); }
-1407:5782,{ bonus bAtkRate,3; }
-1408:5782,{ bonus bAtkRate,3; }
-1409:5782,{ bonus bAtkRate,3; }
-1420:2115,{ bonus3 bAutoSpellWhenHit,HP_ASSUMPTIO,2,5; }
-1420:2133,{ bonus2 bAddRace, RC_All, 4; bonus bDef,2; }
-1421:2133,{ bonus2 bAddRace, RC_All, 4; bonus bDef,2; }
-1422:2133,{ bonus2 bAddRace, RC_All, 4; bonus bDef,2; }
-1428:2115,{ bonus3 bAutoSpellWhenHit,HP_ASSUMPTIO,2,5; }
-1433:2153,{ bonus2 bSkillAtk,CR_GRANDCROSS,10; bonus2 bSkillAtk,LG_RAYOFGENESIS,10; }
-1433:2153:18823:28372,{ bonus2 bSkillUseSP,CR_GRANDCROSS,30; bonus2 bSkillUseSP,LG_SHIELDPRESS,5; bonus2 bSkillUseSP,LG_BANISHINGPOINT,15; bonus2 bSkillUseSP,LG_CANNONSPEAR,10; }
-1433:28372,{ bonus2 bSkillAtk,LG_CANNONSPEAR,7*(getequiprefinerycnt(EQI_HAND_L)/2); }
-1472:2677,{ bonus bMatkRate,6; bonus bDex,2; bonus bVariableCastrate,-getequiprefinerycnt(EQI_HAND_R); }
-1472:2711,{ bonus bMatkRate,6; bonus bDex,2; bonus bVariableCastrate,-getequiprefinerycnt(EQI_HAND_R); }
-1473:2677,{ bonus bMatkRate,6; bonus bDex,2; bonus bVariableCastrate,-getequiprefinerycnt(EQI_HAND_R); }
-1473:2711,{ bonus bMatkRate,6; bonus bDex,2; bonus bVariableCastrate,-getequiprefinerycnt(EQI_HAND_R); }
-1474:2527,{ bonus2 bAddRace,RC_Dragon,5; }
-1477:2700,{ bonus2 bResEff,Eff_Confusion,9500; }
-1479:2700,{ bonus2 bResEff,Eff_Confusion,9500; }
-1564:2186,{ bonus bAspdRate,getequiprefinerycnt(EQI_HAND_R); }
-1535:4361,{ bonus bBreakArmorRate,900; bonus bBreakWeaponRate,900; }
-1572:2716:2717,{ bonus bInt,5; bonus bMaxHP,700; bonus bAspdRate,5; }
-1573:2334,{ bonus bMdef,8; bonus bMaxSPrate,10; bonus bInt,4; }
-1573:2372,{ bonus bMdef,8; bonus bMaxSPrate,10; bonus bInt,4; }
-1573:2716:2717,{ bonus bInt,5; bonus bMaxHP,700; bonus bAspdRate,5; }
-1590:4037,{ bonus bAspdRate,5; }
-1590:4117,{ bonus bAspdRate,5; }
-1590:4037:4117,{ bonus bAspd,1; }
-1598:4037,{ bonus bAspdRate,5; }
-1598:4117,{ bonus bAspdRate,5; }
-1598:4037:4117,{ bonus bAspd,1; }
-1615:18539,{ bonus bMatk,10*getequiprefinerycnt(EQI_HAND_R); bonus bVariableCastrate,-10; }
-1616:2515,{ bonus bSpeedRate,25; }
-1618:2509,{ bonus bMaxHP,300; bonus bMatkRate,getequiprefinerycnt(EQI_HAND_R)-5; if(getequiprefinerycnt(EQI_GARMENT) > 10) { bonus2 bSubEle,Ele_Neutral,30; } else { bonus2 bSubEle,Ele_Neutral,getequiprefinerycnt(EQI_GARMENT)*3; } }
-1618:2535,{ bonus bMatkRate,5; bonus2 bSubEle,Ele_Neutral,25; }
-1618:19020,{ bonus bMatk,getequiprefinerycnt(EQI_HAND_R)*10; if (getequiprefinerycnt(EQI_HAND_R)>=10) autobonus "{ bonus bVariableCastrate,-50; }",50,5000,BF_MAGIC,"{ specialeffect(EF_SUFFRAGIUM, AREA, playerattached()); }"; }
-1620:2509,{ bonus bMaxHP,300; bonus bMatkRate,getequiprefinerycnt(EQI_HAND_R)-5; if(getequiprefinerycnt(EQI_GARMENT) > 10) { bonus2 bSubEle,Ele_Neutral,30; } else { bonus2 bSubEle,Ele_Neutral,getequiprefinerycnt(EQI_GARMENT)*3; } }
-1620:2535,{ bonus bMatkRate,5; bonus2 bSubEle,Ele_Neutral,25; }
-1625:18542,{ bonus bHealPower,getequiprefinerycnt(EQI_HAND_R); }
-1629:5045,{ bonus bDex,2; bonus bInt,2; bonus bSPrecovRate,5; bonus bMatkRate,getequiprefinerycnt(EQI_HAND_R); }
-1631:2129,{ bonus2 bSkillAtk,PR_MAGNUS,20; bonus3 bAutoSpellWhenHit,PR_TURNUNDEAD,1,20; }
-1631:18542,{ bonus bHealPower,getequiprefinerycnt(EQI_HAND_R)*3; }
-1636:18539,{ bonus bMatk,10*getequiprefinerycnt(EQI_HAND_R); bonus bVariableCastrate,-10; }
-1636:18804,{ bonus bMatk,getequiprefinerycnt(EQI_HAND_R)*10; }
-1649:2198,{ if(getequiprefinerycnt(EQI_HAND_L)>8) { bonus bMatk,getequiprefinerycnt(EQI_HAND_R)*15; } if(getequiprefinerycnt(EQI_HAND_R)>9) { bonus bMatk,50; bonus bVariableCastrate,-10; } }
-1657:2471:2569:15029,{ bonus bHealPower,25; }
-1660:2471:2569:15029,{ bonus bHealPower,45; bonus3 bAutoSpellWhenHit,AB_SILENTIUM,1,10; }
-1662:18539,{ bonus bMatk,10*getequiprefinerycnt(EQI_HAND_R); bonus bVariableCastrate,-10; }
-1718:1774,{ bonus bLongAtkRate,50; }
-1723:2718,{ bonus bDex,1; bonus bMaxSP,50; bonus bSPrecovRate,10; }
-1726:1774,{ bonus bLongAtkRate,50; }
-1730:1752,{ bonus bLongAtkRate,25; }
-1731:1754,{ bonus bLongAtkRate,25; }
-1732:1756,{ bonus bLongAtkRate,25; bonus2 bAddEff,Eff_Stone,1000; }
-1733:1755,{ bonus bLongAtkRate,25; bonus3 bAutoSpell,NJ_HUUJIN,5,100; if(readparam(bInt)>39) bonus3 bAutoSpell,NJ_HUUJIN,5,200; }
-1734:1753,{ bonus bLongAtkRate,50; }
-1741:2748,{ bonus bAtk,25; bonus3 bAddEff,Eff_Curse,200,ATF_WEAPON|ATF_LONG|ATF_TARGET; }
-1746:1773,{ bonus bLongAtkRate,50; }
-1764:18541,{ bonus bCritAtkRate,5; }
-1775:18114,{ bonus bLongAtkRate,70; }
-1776:18114,{ bonus bLongAtkRate,40; }
-1935:2988,{ bonus2 bSkillAtk,CG_ARROWVULCAN,200; bonus2 bSkillUseSP,CG_ARROWVULCAN,20; }
-1990:2989,{ bonus2 bSkillAtk,CG_ARROWVULCAN,200; }
-2001:2677,{ bonus bMatkRate,10; bonus bDex,2; bonus2 bSubRace,RC_Demon,10; bonus2 bSubRace,RC_Undead,10; }
-2001:2711,{ bonus bMatkRate,10; bonus bDex,2; bonus2 bSubRace,RC_Demon,10; bonus2 bSubRace,RC_Undead,10; }
-2007:2467:2859:15025,{ bonus2 bMagicAtkEle,Ele_Wind,40; bonus2 bMagicAtkEle,Ele_Earth,-30; bonus2 bSubEle,Ele_Earth,-50; }
-2008:2468:2860:15026,{ bonus2 bMagicAtkEle,Ele_Water,40; bonus2 bMagicAtkEle,Ele_Wind,-30; bonus2 bSubEle,Ele_Wind,-50; }
-2009:2469:2861:15027,{ bonus2 bMagicAtkEle,Ele_Fire,40; bonus2 bMagicAtkEle,Ele_Water,-30; bonus2 bSubEle,Ele_Water,-50; }
-2010:2470:2862:15028,{ bonus2 bMagicAtkEle,Ele_Earth,40; bonus2 bMagicAtkEle,Ele_Fire,-30; bonus2 bSubEle,Ele_Fire,-50; }
-2011:2467:2859:15025,{ bonus2 bMagicAtkEle,Ele_Wind,60; bonus2 bMagicAtkEle,Ele_Earth,-60; bonus2 bSubEle,Ele_Earth,-50; }
-2012:2468:2860:15026,{ bonus2 bMagicAtkEle,Ele_Water,60; bonus2 bMagicAtkEle,Ele_Wind,-60; bonus2 bSubEle,Ele_Wind,-50; }
-2013:2469:2861:15027,{ bonus2 bMagicAtkEle,Ele_Fire,60; bonus2 bMagicAtkEle,Ele_Water,-60; bonus2 bSubEle,Ele_Water,-50; }
-2014:2470:2862:15028,{ bonus2 bMagicAtkEle,Ele_Earth,60; bonus2 bMagicAtkEle,Ele_Fire,-60; bonus2 bSubEle,Ele_Fire,-50; }
-2109:2717:2239,{ bonus bHPrecovRate,15; bonus bSPrecovRate,15; bonus bMatkRate,7; }
-2114:2353:5122,{ bonus bStr,2; bonus bDef,5; bonus bMdef,5; if(BaseClass==Job_Swordman) bonus bDef,6; }
-2115:2353:5124,{ bonus bDef,2-getequiprefinerycnt(EQI_HAND_L, EQI_HEAD_TOP); bonus bMdef,5+getequiprefinerycnt(EQI_HAND_L, EQI_HEAD_TOP); }
-2116:2355:2420:2521:5125,{ bonus bMaxHP,900; bonus bMaxSP,100; bonus3 bAutoSpellWhenHit,HP_ASSUMPTIO,1,30; }
-2121:2717:2239,{ bonus bHPrecovRate,15; bonus bSPrecovRate,15; bonus bMatkRate,7; }
-2123:2701,{ bonus bVariableCastrate,-10; }
-2123:2881,{ bonus bMatk,getrefine()*2; }
-2124:2702,{ bonus bAspdRate,10; bonus bShortWeaponDamageReturn,5; }
-2125:5782,{ bonus bDef,2; }
-2135:2426,{ bonus2 bAddEff,Eff_Blind,500; autobonus "{ bonus bFlee,20; }",200,10000,BF_WEAPON,"{ specialeffect(EF_INCAGILITY, AREA, playerattached()); }"; }
-2137:2353:5124,{ bonus bDef,2-getequiprefinerycnt(EQI_HAND_L, EQI_HEAD_TOP); bonus bMdef,5+getequiprefinerycnt(EQI_HAND_L, EQI_HEAD_TOP); }
-2153:28372,{ if(getequiprefinerycnt(EQI_HAND_L)>5) { bonus2 bSkillAtk,LG_SHIELDPRESS,(getequiprefinerycnt(EQI_HAND_L)*8)-40; } }
-2157:2905,{ bonus2 bAddRaceTolerance,RC_Insect,10; if (getequiprefinerycnt(EQI_HAND_L)>7) { bonus2 bMagicAddRace,RC_Insect,4; bonus2 bAddRaceTolerance,RC_Insect,20; } }
-2160:19021,{ bonus2 bSkillAtk,WS_CARTTERMINATION,15+(getequiprefinerycnt(EQI_HAND_R)*5); }
-2169:2491:2590:15051,{ bonus bMaxHPrate,20; bonus bMaxSPrate,10; }
-2171:15053,{ bonus bAgi,2; }
-2171:15056,{ bonus bAgi,2; }
-2173:15055,{ bonus bFlee,10; bonus bFlee2,10; }
-2183:15068:18776:20710:22015,{ bonus(bMaxHP, 900); bonus(bMaxSP, 100); bonus3(bAutoSpellWhenHit, HP_ASSUMPTIO, 1, 30); }
-2198:5966,{ if (isequipped(4441)) {} else { if(getequiprefinerycnt(EQI_HAND_L)>6) { bonus2 bSkillCooldown,WL_COMET,-20000; } if(getequiprefinerycnt(EQI_HAND_L)>9) { bonus2 bSkillCooldown,WL_COMET,-20000; } } }
-2254:18912,{ bonus2 bExpAddRace, RC_All, 5; }
-2269:5781,{ bonus bMaxSP,30; bonus bInt,1; }
-2269:5786,{ bonus bMatkRate,1; }
-2269:5891,{ bonus bAllStats,1; }
-2270:5781,{ bonus bLuk,1; bonus bFlee,2; }
-2270:5786,{ bonus bAtkRate,1; }
-2270:5891,{ bonus bAllStats,1; }
-2278:18527,{ bonus2 bAddMonsterDropItem,12192,20; }
-2281:18527,{ bonus bFlee,10; }
-2183:15068,{ bonus bAllStats,2; }
-2286:18539,{ bonus bUseSPrate,-3; }
-2312:2656,{ bonus bDef,5; bonus bMaxHP,150; }
-2313:2656,{ bonus bDef,5; bonus bMaxHP,150; }
-2337:2654,{ bonus bUseSPrate,-20; bonus bMaxHP,300; }
-2339:2522,{ bonus bAgi,5; bonus bFlee,10; }
-2339:2523,{ bonus bAgi,5; bonus bFlee,10; }
-2353:2417:2516,{ bonus bAgi,3; bonus bMaxHPrate,5; bonus bMaxSPrate,5; }
-2353:2418:2517,{ bonus bVit,5; bonus bHPrecovRate,10; bonus bSPrecovRate,10; }
-2353:5123,{ if(readparam(bDex)>69) bonus bUseSPrate,-10; }
-2353:5493,{ if(readparam(bDex)>69) bonus bUseSPrate,-10; }
-2353:13428,{ bonus bMaxSP,50; bonus2 bSkillAtk,KN_BOWLINGBASH,5; }
-2354:2419:2520:5128,{ bonus bVit,5; bonus bMaxHPrate,15; bonus bMaxSPrate,5; bonus bDef,5; bonus bMdef,15; bonus2 bSubEle,Ele_Water,10; bonus2 bSubEle,Ele_Earth,10; bonus2 bSubEle,Ele_Fire,10; bonus2 bSubEle,Ele_Wind,10; }
-2354:2493:2599:19043,{ bonus bVit,5; bonus bMaxHPrate,15; bonus bMaxSPrate,5; bonus bDef,5; bonus bMdef,15; bonus2 bSubEle,Ele_Water,10; bonus2 bSubEle,Ele_Earth,10; bonus2 bSubEle,Ele_Fire,10; bonus2 bSubEle,Ele_Wind,10; }
-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; }
-2365:2881,{ bonus bVariableCastrate,15; }
-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_All, 3; bonus bMatkRate,3; }
-2375:2729,{ bonus2 bAddRace, RC_All, 3; bonus bMatkRate,3; }
-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,"{ specialeffect(EF_HEAL, AREA, playerattached()); }"; }
-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,"{ specialeffect(EF_HEAL, AREA, playerattached()); }"; }
-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,"{ specialeffect(EF_ENERGYCOAT, AREA, playerattached()); }"; }
-2380:2436:2539,{ bonus2 bSubRace,RC_NonDemiPlayer,-300; bonus bInt,3; bonus bMaxHPrate,12; bonus2 bVariableCastrate,AL_HOLYLIGHT,-50; bonus bHealPower,6; autobonus2 "{ bonus bDefEle,Ele_Ghost; }",30,10000,BF_WEAPON,"{ specialeffect(EF_ENERGYCOAT, AREA, playerattached()); }"; }
-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 bVariableCastrate,-3; bonus bDelayrate,-15; }
-2390:2749,{ bonus bFlee2,5; }
-2394:2444:2549,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,5; bonus2 bResEff,Eff_Freeze,10000; bonus2 bSkillHeal2,AM_POTIONPITCHER,3; bonus2 bSkillHeal2,AL_HEAL,3; bonus2 bSkillHeal2,PR_SANCTUARY,3; }
-2399:2553,{ bonus bAgi,5; bonus bFlee,15; }
-2408:2655,{ bonus bBaseAtk,50; bonus2 bAddDefClass,1196,20; bonus2 bAddDefClass,1197,20; }
-2424:2528,{ bonus bHPrecovRate,5; bonus bMaxHPrate,10; }
-2425:2529,{ bonus bFlee,10; }
-2425:2530,{ bonus bFlee,10; }
-2425:2551,{ bonus bFlee,10; }
-2433:2537,{ bonus bMaxHPrate,6; }
-2434:2529,{ bonus bFlee,10; }
-2434:2530,{ bonus bFlee,10; }
-2434:2551,{ bonus bFlee,10; }
-2441:2546,{ bonus bFlee,5; }
-2472:2570:15030:16013,{ bonus2 bAddRace,RC_Undead,15; bonus2 bMagicAddRace,RC_Undead,15; bonus2 bSkillAtk,AB_ADORAMUS,100; }
-2472:2570:15030:16018,{ bonus2 bAddRace,RC_Undead,30; bonus2 bMagicAddRace,RC_Undead,30; bonus2 bSkillAtk,AB_ADORAMUS,200; bonus bVariableCastrate,-50; }
-2475:2574:2883:15036,{ bonus bMaxHPrate,14; bonus2 bSkillAtk,RK_HUNDREDSPEAR,50; skill CR_AUTOGUARD,1; bonus bUseSPrate,10; bonus2 bSubEle,Ele_Neutral,10; }
-2476:2575:2884:15037,{ bonus2 bAddRace, RC_All, 10; bonus2 bSkillAtk,RK_SONICWAVE,100; bonus2 bSkillAtk,RK_WINDCUTTER,100; bonus3 bAutoSpell,RK_STORMBLAST,1,20; autobonus3 "{ bonus bAspd,2; }",1000,10000,LK_CONCENTRATION,"{ specialeffect(EF_ENHANCE, AREA, playerattached()); }"; }
-2477:2577:2886:15038,{ bonus bCritical,15; bonus bFlee,10; bonus bCritAtkRate,40; bonus2 bSkillAtk,GC_CROSSIMPACT,20; bonus bUseSPrate,10; }
-2478:2578:2887:15039,{ bonus2 bAddRace, RC_All, 10; bonus bMatkRate,10; if(readparam(bStr)>119) { bonus bBaseAtk,30; } bonus3 bAutoSpell,ASC_BREAKER,getskilllv(ASC_BREAKER),10; bonus bCritical,-20; }
-2479:2580:2890:15042,{ bonus bAspd,2; bonus bLongAtkRate,30; bonus3 bAutoSpell,AC_DOUBLE,3,10; bonus2 bSkillAtk,RA_ARROWSTORM,50; }
-2480:2581:2891:15043,{ bonus bMaxHPrate,15; bonus2 bSkillAtk,RA_CLUSTERBOMB,20; bonus bFlee2,20; bonus bLongAtkRate,-30; bonus bAspd,-7; }
-2483:2586:15046,{ bonus bVit,5; bonus2 bSubRace,RC_DemiPlayer,15; }
-2484:2586:15047,{ bonus bDex,5; bonus2 bSubRace,RC_DemiPlayer,15; }
-2485:2587:15048,{ bonus bInt,5; bonus bMdef,10; bonus2 bSubRace,RC_DemiPlayer,15; }
-2518:2648:2649:5126,{ bonus bInt,5; bonus bMdef,11; bonus bMaxSPrate,20; bonus bNoCastCancel,0; bonus bVariableCastrate,25; }
-2519:2650:2651:5127,{ bonus bStr,2; bonus bLuk,9; bonus bCritical,13; bonus bBaseAtk,18; bonus bFlee2,13; }
-2519:2900:2901:19044,{ bonus bStr,2; bonus bLuk,9; bonus bCritical,13; bonus bBaseAtk,18; bonus bFlee2,13; }
-2527:13001,{ bonus2 bAddRace,RC_Dragon,5; }
-2597:2616,{ bonus bCritAtkRate,5; bonus bCritical,10; if (getequiprefinerycnt(EQI_GARMENT)>=5) { bonus bCritAtkRate,3; } if (getequiprefinerycnt(EQI_GARMENT)>=7) { bonus bCritAtkRate,4;} }
-2597:18803,{ bonus bUseSPrate,-5; }
-2607:2677,{ bonus2 bSkillAtk,AL_HEAL,50; bonus2 bSkillAtk,PR_MAGNUS,30; bonus bSPrecovRate,9; }
-2607:2711,{ bonus2 bSkillAtk,AL_HEAL,50; bonus2 bSkillAtk,PR_MAGNUS,30; bonus bSPrecovRate,9; }
-2607:2786,{ bonus2 bSkillAtk,AL_HEAL,50; bonus2 bSkillAtk,PR_MAGNUS,30; bonus bSPrecovRate,9; }
-2608:2677,{ bonus2 bSkillAtk,AL_HEAL,50; bonus2 bSkillAtk,PR_MAGNUS,30; bonus bSPrecovRate,9; }
-2608:2711,{ bonus2 bSkillAtk,AL_HEAL,50; bonus2 bSkillAtk,PR_MAGNUS,30; bonus bSPrecovRate,9; }
-2608:2786,{ bonus2 bSkillAtk,AL_HEAL,50; bonus2 bSkillAtk,PR_MAGNUS,30; bonus bSPrecovRate,9; }
-2615:5890,{ bonus bMdef,7; bonus bDef,7; }
-2616:5890,{ bonus bCritical,7; }
-2620:2746,{ bonus2 bAddSize,Size_Medium,8; bonus bAspdRate,3; }
-2620:2747,{ bonus2 bAddSize,Size_Large,8; bonus bHit,3; bonus bVariableCastrate,-3; }
-2626:2677,{ bonus2 bSkillAtk,AL_HEAL,50; bonus2 bSkillAtk,PR_MAGNUS,30; bonus bSPrecovRate,9; }
-2626:2711,{ bonus2 bSkillAtk,AL_HEAL,50; bonus2 bSkillAtk,PR_MAGNUS,30; bonus bSPrecovRate,9; }
-2626:2786,{ bonus2 bSkillAtk,AL_HEAL,50; bonus2 bSkillAtk,PR_MAGNUS,30; bonus bSPrecovRate,9; }
-2678:2679,{ bonus4 bAutoSpell,MO_EXTREMITYFIST,1,3,1; bonus3 bAutoSpell,PR_LEXAETERNA,1,20; bonus3 bAutoSpell,AS_SONICBLOW,5,50; bonus3 bAutoSpell,MO_INVESTIGATE,5,20; bonus3 bAutoSpell,ASC_METEORASSAULT,2,50; }
-2679:2792,{ bonus4 bAutoSpell,MO_EXTREMITYFIST,1,3,1; bonus3 bAutoSpell,PR_LEXAETERNA,1,20; bonus3 bAutoSpell,AS_SONICBLOW,5,50; bonus3 bAutoSpell,MO_INVESTIGATE,5,20; bonus3 bAutoSpell,ASC_METEORASSAULT,2,50; }
-2701:2881,{ bonus bMatk,20; }
-2720:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2721:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2722:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2723:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2724:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2725:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2726:2727,{ bonus bUseSPrate,-25; }
-2733:2772,{ bonus2 bAddRace, RC_All, 5; bonus bMatkRate,3; bonus bHealPower,5; }
-2747:13061,{ bonus bHit,5; bonus bMatk,5; bonus2 bSkillUseSP,SC_ENERVATION,20; bonus2 bSkillUseSP,SC_GROOMY,20;}
-2777:2778:5479,{ bonus bMaxHP,300; bonus bMatkRate,5; bonus2 bSubEle,Ele_Neutral,5; }
-2779:2780:5482,{ bonus bMatkRate,10; bonus bInt,5; bonus2 bSubRace,RC_Angel,10; }
-2779:2780:5577,{ bonus bMatkRate,10; bonus bInt,5; bonus2 bSubRace,RC_Angel,10; }
-2950:15067:20709:22012,{ bonus2 bExpAddRace,RC_All,10; }
-2963:15073,{ bonus bAspdRate,5; }
-2963:15074,{ bonus bDelayrate,-5; bonus2 bAddRaceTolerance,RC_DemiPlayer,5; }
-2964:15073,{ bonus bDelayrate,-5; bonus2 bAddRaceTolerance,RC_DemiPlayer,5; }
-2964:15074,{ bonus bVariableCastrate,-5; }
-2997:2999,{ bonus bMatkRate,10; bonus bAtkRate,10; }
-4001:4197,{ bonus bFlee,18; }
-4006:4266,{ bonus bFlee,18; }
-4009:4179,{ bonus bFlee,18; }
-4014:4306,{ bonus bFlee,18; }
-4015:5967,{ bonus2 bSubEle,Ele_All,5; }
-4021:4211,{ bonus bFlee,18; }
-4025:4222,{ bonus2 bAddEffWhenHit,Eff_Sleep,600; }
-4028:4296,{ bonus bStr,3; }
-4029:4183,{ bonus bFlee,18; }
-4031:4161,{ bonus bDef,3; bonus bVit,3; }
-4036:4186:4233:4281:4343,{ bonus bStr,4; bonus bMaxHPrate,7; bonus bMaxSPrate,7; bonus2 bSkillAtk,MC_MAMMONITE,20; bonus bSPDrainValue,1; if(BaseJob==Job_Alchemist) { bonus3 bAutoSpell,BS_ADRENALINE,1,10; bonus2 bAddMonsterDropItem,7139,3; bonus2 bAddMonsterDropItem,905,10; } }
-4039:4210:4230:4257:4348,{ bonus bStr,6; bonus bAgi,4; bonus2 bSkillAtk,RG_BACKSTAP,10; if(getskilllv(RG_STRIPARMOR)==5) bonus3 bAutoSpell,RG_STRIPARMOR,5,50; if(BaseJob==Job_Rogue) { bonus bUseSPrate,-20; bonus3 bAutoSpell,RG_INTIMIDATE,1,-20; } }
-4072:21013,{ bonus2 bSubSize,Size_Large,15; bonus2 bSubSize,Size_Small,15; }
-4074:4162,{ bonus2 bAddEffWhenHit,Eff_Blind,600; }
-4090:4212:4328,{ bonus bAllStats,1; }
-4106:4248,{ bonus bPerfectHitAddRate,20; }
-4127:4166,{ bonus2 bAddEffWhenHit,Eff_Curse,600; }
-4140:18574,{ bonus2 bAddRace,RC_Boss,5; if (getequiprefinerycnt(EQI_HEAD_TOP)>=11) bonus2 bSubRace,RC_NonBoss,5; }
-4152:5967,{ bonus2 bAddItemHealRate,Apple_Juice,1000; bonus2 bAddItemHealRate,Banana_Juice,1000; bonus2 bAddItemHealRate,Carrot_Juice,1000; }
-4153:4247:4273,{ bonus3 bAddMonsterDropItem,544,RC_Fish,3000; bonus2 bAddEle,Ele_Water,30; }
-4161:5932,{ bonus4 bAutoSpell,PR_GLORIA,5,10,0; }
-4163:5967,{ bonus bAspdRate,3; bonus bAspd,1; bonus bAtkRate,-5; if(getiteminfo(getequipid(EQI_HAND_R),11)==11) { if(getequiprefinerycnt(EQI_HAND_R)>8) bonus bAspd,1; } }
-4168:4169,{ bonus bMaxHPrate,20; bonus bMaxSPrate,20; bonus bVariableCastrate,-10; }
-4172:4210:4230:4257:4272,{ bonus bAgi,5; bonus bStr,5; bonus bAspdRate,5; bonus bSpeedRate,25; bonus2 bSPDrainValue,1,0; if(BaseClass==Job_Thief) bonus bNoGemStone,0; }
-4178:4199:4234:4252:4297,{ bonus bAgi,5; bonus bDex,3; bonus bLongAtkRate,20; bonus bPerfectHitAddRate,20; if(BaseClass==Job_Archer) { bonus2 bExpAddRace,RC_Brute,5; bonus2 bWeaponComaRace,RC_Brute,100; } }
-4178:4234:4252:4297:4381,{ bonus bDex,5; bonus2 bSkillAtk,CG_ARROWVULCAN,5; bonus2 bSkillAtk,DC_THROWARROW,10; bonus2 bSkillAtk,BA_MUSICALSTRIKE,10; if(BaseJob==Job_Bard||BaseJob==Job_Dancer) bonus3 bAutoSpellWhenHit,CG_TAROTCARD,2,50; }
-4185:4217:4280:4293:4312,{ bonus bVit,10; bonus bVariableCastrate,-10; bonus bUseSPrate,-10; if(BaseClass==Job_Acolyte) { bonus2 bExpAddRace,RC_Undead,5; bonus2 bExpAddRace,RC_Demon,5; bonus2 bSubRace,RC_Undead,30; bonus2 bSubRace,RC_Demon,30; } }
-4185:4293:4312:4332,{ bonus bStr,3; bonus bMaxSP,80; bonus bBaseAtk,25; bonus3 bAutoSpell,AL_CRUCIS,5,10; bonus2 bSkillAtk,MO_EXTREMITYFIST,10; if(BaseJob==Job_Monk) { bonus bUseSPrate,-10; bonus bNoCastCancel,0; } }
-4186:4206:4233:4281:4321,{ bonus bLuk,10; bonus2 bSPDrainValue,2,0; bonus2 bSkillAtk,42,20; if(BaseClass==Job_Merchant) { bonus2 bAddMonsterDropItem,617,5; bonus bMagicDamageReturn,20; } }
-4191:4208:4258:4309:4325:4327,{ bonus bMaxHP,500; bonus bDef,5; bonus bMdef,5; bonus2 bSkillAtk,14,10; bonus2 bSkillAtk,19,10; bonus2 bSkillAtk,20,10; if(BaseClass==Job_Mage) { bonus bMatkRate,3; bonus bVariableCastrate,-15; } }
-4193:4294,{ bonus bMaxHP,300; bonus bMaxSP,60; }
-4208:4258:4325:4327:4382,{ bonus bInt,3; bonus2 bSkillAtk,WZ_HEAVENDRIVE,10; bonus2 bSkillAtk,MG_THUNDERSTORM,10; if(BaseJob==Job_Sage) { bonus bMagicDamageReturn,20; bonus2 bAddMonsterDropItem,716,100; bonus2 bAddMonsterDropItem,715,100; bonus bVariableCastrate,-20; } }
-4218:4269,{ bonus bHPrecovRate,30; bonus bSPrecovRate,30; bonus bVit,4; bonus bInt,4; }
-4220:4246:4311:4319:4331,{ bonus bStr,10; bonus bMaxHPrate,20; bonus bHPrecovRate,50; bonus3 bAutoSpell,BS_WEAPONPERFECT,1,3; bonus2 bAddMonsterDropItem,501,500; if(BaseClass==Job_Swordman) { bonus2 bAddItemHealRate,Red_Potion,50; bonus2 bAddItemHealRate,Yellow_Potion,50; bonus2 bAddItemHealRate,Orange_Potion,50; bonus2 bAddItemHealRate,White_Potion,50; } }
-4229:4244:4299:4313,{ bonus bDef,3; bonus bMdef,3; }
-4237:4238,{ bonus3 bAutoSpell,MG_LIGHTNINGBOLT,5,20; }
-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 bVariableCastrate,-10; if(BaseJob==Job_Crusader) bonus bDefEle,Ele_Holy; }
-4323:4324,{ bonus3 bAutoSpell,MG_FROSTDIVER,3,250; }
-4335:21012,{ bonus3 bAutoSpell,WZ_EARTHSPIKE,5,20+(getequiprefinerycnt(EQI_HAND_R)); }
-4345:21012,{ bonus3 bAutoSpell,MG_LIGHTNINGBOLT,5,20+(getequiprefinerycnt(EQI_HAND_R)); }
-4350:21012,{ bonus3 bAutoSpell,MG_COLDBOLT,5,20+(getequiprefinerycnt(EQI_HAND_R)); }
-4380:21012,{ bonus3 bAutoSpell,MG_FIREBOLT,5,20+(getequiprefinerycnt(EQI_HAND_R)); }
-4388:21012,{ bonus3 bAutoSpell,MG_SOULSTRIKE,5,20+(getequiprefinerycnt(EQI_HAND_R)); }
-4435:4436,{ bonus2 bSPGainRace,RC_DemiPlayer,2; }
-4463:5966,{ if(getiteminfo(getequipid(EQI_HAND_R),11)==5||getiteminfo(getequipid(EQI_HAND_R),11)==23||getiteminfo(getequipid(EQI_HAND_R),11)==10) { bonus2 bMagicAddRace,RC_DemiPlayer,getequipid(EQI_HAND_R)*2; bonus2 bMagicAddRace,RC_Player,getequipid(EQI_HAND_R)*2; } }
-4505:4508,{ bonus3 bAutoSpell,NPC_DRAGONFEAR,2,100+(getrefine()*10); }
-4507:19023,{ bonus2 bAddRace2,7,30; }
-4509:19023,{ bonus2 bSubRace,RC_Insect,10; bonus2 bResEff,Eff_Confusion,10000; }
-4517:5967,{ bonus bInt,1; bonus bCritAtkRate,5; if(BaseClass==Job_Archer) { bonus bCritAtkRate,10; } }
-4606:20778,{ bonus bMaxSPrate,44; bonus bSPGainValue,-(20+(getequiprefinerycnt(EQI_GARMENT)/2)); }
-4608:4609,{ bonus2 bAddSize,Size_Medium,15; bonus2 bAddSize,Size_Large,15; bonus2 bSubSize,Size_Medium,5; bonus2 bSubSize,Size_Large,5; }
-4635:4636,{ bonus2 bResEff,Eff_Burning,10000; }
-4642:4646,{ bonus bAtkRate,10; bonus bMatkRate,10; }
-4643:4646,{ bonus bAtkRate,10; bonus bMatkRate,10; }
-4644:4646,{ bonus bAtkRate,10; bonus bMatkRate,10; }
-4645:4646,{ bonus bAtkRate,10; bonus bMatkRate,10; }
-4653:4654,{ bonus2 bSubRace,RC_Brute,5; bonus2 bSubRace,RC_Undead,5; bonus2 bIgnoreMdefRate,50,RC_Brute; bonus2 bIgnoreMdefRate,50,RC_Undead; }
-4653:4655,{ bonus2 bSubRace,RC_Brute,5; bonus2 bSubRace,RC_Undead,5; bonus2 bIgnoreDefRate,50,RC_Brute; bonus2 bIgnoreDefRate,50,RC_Undead; }
-//4656:4657,{ bonus2 bSubEle,Ele_Neutral,5; /* Increase the probability of causing Sleep to all targets on 11x11 cells. */ }
-5007:18913,{ bonus2 bExpAddRace, RC_All, 5; }
-5021:18824,{ bonus bMaxHP,100; bonus2 bSubEle,Ele_Neutral,getequiprefinerycnt(EQI_HEAD_TOP); }
-5040:5442,{ bonus bAspdRate,3; bonus bVariableCastrate,3; }
-5040:18672,{ bonus bSPrecovRate,3; }
-5040:18673,{ bonus bHealPower,10; }
-5068:5653,{ bonus bStr,1; bonus bAtkRate,5; }
-5074:5653,{ bonus bStr,1; bonus bAspdRate,2; }
-5086:18527,{ bonus2 bAddItemHealRate,12192,200; }
-5170:19024,{ bonus bAspdRate,5; if(getequiprefinerycnt(EQI_HEAD_TOP)>6) bonus bAspdRate,5; if(getequiprefinerycnt(EQI_HEAD_TOP)>8) bonus bMaxHPrate,5; }
-5176:18527,{ bonus bAspdRate,5; }
-5184:5657,{ bonus bLongAtkRate,getequiprefinerycnt(EQI_HEAD_TOP); }
-//5206:5768,{ bonus bDex,1; if(getequiprefinerycnt(EQI_HEAD_TOP) > 4) bonus bDelayrate,4-getequiprefinerycnt(EQI_HEAD_TOP); }
-5358:5653,{ bonus bAgi,1; bonus bFlee,3; }
-//5359:5657,{ bonus bLongAtkRate,getequiprefinerycnt(EQI_HEAD_TOP); }
-5574:5073,{ bonus bDex, 2; bonus bDef, 2; }
-5401:5653,{ bonus bInt,1; bonus bMatkRate,2; }
-5470:5653,{ bonus bDex,1; bonus bLongAtkRate,3; }
-5690:13428,{ bonus2 bAddRace,RC_DemiPlayer,10; bonus bHit,10; }
-5890:28306,{ bonus2 bAddRace, RC_All, 3; }
-5932:1737,{ if (Class == Job_Ranger || Class == Job_Ranger_T) skill HT_BLITZBEAT,5*getequiprefinerycnt(EQI_HAND_R); }
-//5967:28321,{ skill HT_BLITZBEAT,-200; }
-13027:15044,{ bonus3 bAddMonsterDropItem,929,RC_Brute,100+(getequiprefinerycnt(EQI_HAND_R)*10); bonus3 bAddMonsterDropItem,929,RC_DemiPlayer,100+(getequiprefinerycnt(EQI_HAND_R)*10); bonus3 bAddMonsterDropItem,970,RC_Brute,20+(getequiprefinerycnt(EQI_HAND_R)*2); bonus3 bAddMonsterDropItem,970,RC_DemiPlayer,20+(getequiprefinerycnt(EQI_HAND_R)*2); }
-13034:13035,{ bonus bMaxSP,20; bonus bMaxHPrate,5; bonus bHit,10; bonus2 bAddSize,Size_Large,30; autobonus "{ bonus bAspdRate,100; }",1,7000,BF_WEAPON,"{ specialeffect(EF_POTION_BERSERK, AREA, playerattached()); }"; }
-13035:28704,{ bonus bMaxSP,20; bonus bMaxHPrate,5; bonus bHit,10; bonus2 bAddSize,Size_Large,30; autobonus "{ bonus bAspdRate,100; }",1,7000,BF_WEAPON,"{ specialeffect(EF_POTION_BERSERK, AREA, playerattached()); }"; }
-15041:18659,{ bonus2 bAddEle,Ele_Earth,10; bonus bDefEle,Ele_Fire; }
-15061:19026,{ bonus2 bAddRaceTolerance,RC_Fish,10+getequiprefinerycnt(EQI_ARMOR); }
-15068:20710,{ bonus(bAgi, 5); bonus(bFlee, 10); }
-15128:20773,{ bonus bDelayrate,-10; bonus bFlee2,6; if(BaseLevel>130) { bonus bDelayrate,-10;} }
-18507:18539,{ bonus bUseSPrate,-3; }
-18607:18672,{ bonus bSPrecovRate,3; }
-18607:18673,{ bonus bHealPower,10; }
-18823:28372,{ bonus2 bSkillVariableCast,CR_GRANDCROSS,-2000; bonus2 bSkillUseSP,LG_RAYOFGENESIS,10; bonus2 bSkillAtk,CR_GRANDCROSS,BaseLevel; bonus2 bSkillAtk,LG_RAYOFGENESIS,BaseLevel/30; }
-18823:2153:1433,{ bonus2 bSkillAtk,LG_CANNONSPEAR,20; bonus2 bSkillAtk,LG_BANISHINGPOINT,20; bonus2 bSkillAtk,LG_SHIELDPRESS,20; }
-15090:18820:20721:22033,{ bonus2 bSubEle,Ele_Neutral,15; bonus3 bAutoSpellWhenHit,WL_DRAINLIFE,3,100; }
-15091:18820:20721:22033,{ bonus2 bSubEle,Ele_Neutral,15; bonus bMaxHPrate,25; bonus bMaxSPrate,25; bonus bMatkRate,10; }
-15117:20744:22047,{ bonus bMaxHP,25; bonus bMaxSP,25; bonus bSpeedRate,25; if (getequiprefinerycnt(EQI_GARMENT, EQI_SHOES, EQI_ARMOR) >= 30) { bonus bMaxHP,5; bonus bMaxSP,5; } }
-18510:18511,{ bonus2 bAddRace,RC_Angel,3; }
-18728:15061:2495:20700,{ bonus bAllStats, 1; bonus2 bSubEle, Ele_Water, 50; }
-18776:20710,{ bonus(bBaseAtk, 10); }
-18776:22015,{ bonus(bMatk, 20); }
-18824:18825,{ bonus bMaxHP,100; bonus2 bSubEle,Ele_Neutral,getequiprefinerycnt(EQI_HEAD_TOP); }
-18874:2109:2971,{ bonus bHPrecovRate,15; bonus bSPrecovRate,15; bonus bMatkRate,7; }
-18997:28326:28327,{ bonus bSpeedRate,10; bonus bBaseAtk,50; bonus bMatk,50; if(getequiprefinerycnt(EQI_HEAD_TOP)>=9){ bonus bMaxHPrate,10; bonus bMaxSPrate,50; } }
-19026:15138,{ bonus2 bAddRaceTolerance, RC_Fish, 10 + getequiprefinerycnt(EQI_ARMOR); }
-19026:20756,{ .@r = getequiprefinerycnt(EQI_GARMENT); bonus2 bSPGainRace, RC_Fish, 10; bonus3 bAddMonsterDropItem, Shusi, RC_Fish, (5 + .@r); bonus3 bAddMonsterDropItem, Fish_Slice, RC_Fish, (5 + .@r); bonus2 bAddItemHealRate, Shusi, 5; bonus2 bAddItemHealRate, Fish_Slice, 5; bonus bHPrecovRate, (5 + .@r); }
-19026:22059,{ bonus2 bCriticalAddRace, RC_Fish, 10 + getequiprefinerycnt(EQI_SHOES); }
-19026:15138:22059:20756,{ bonus bMaxHP, 1000; bonus bMaxSP, 100; bonus2 bExpAddRace, RC_Fish, 20; bonus2 bAddRace, RC_Fish, 50; bonus2 bMagicAddRace, RC_Fish, 50; bonus2 bSubEle, Ele_Water, 50; }
-19827:20763,{ bonus2 bAddRaceTolerance,RC_Player,4; }
-20717:22000,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22001,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22002,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22003,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22004,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22005,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22006,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22007,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22008,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22009,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22010,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20717:22011,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22000,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22001,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22002,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22003,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22004,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22005,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22006,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22007,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22008,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22009,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22010,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20718:22011,{ bonus bMaxHPrate,15; bonus bMaxSPrate,5; }
-20732:28101,{ bonus2 bAddRace, RC_All, 25; }
-22016:28320,{ bonus2 bAddRace,RC_DemiPlayer,getequiprefinerycnt(EQI_SHOES); bonus2 bAddRace,RC_Player,getequiprefinerycnt(EQI_SHOES); }
-28326:28327,{ bonus bInt,8; bonus bStr,8; }
-
-// Shadow Equipment
-24012:24013:24014:24015:24016:24017,{ bonus bAllStats,9; }
-24018:24019:24020,{ if(getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L, EQI_SHADOW_WEAPON) >= 23) { bonus bAtkRate,1; } }
-24021:24022:24023,{ if(getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L, EQI_SHADOW_WEAPON) >= 23) { bonus bMatkRate,1; } }
-24025:24028,{ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES); bonus bMaxHP,.@r; bonus bMaxSP,.@r; if(.@r >= 15) { bonus bMaxHPrate,1; } }
-24026:24027,{ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_SHIELD); bonus bDef,.@r; if(.@r >= 15) { bonus2 bSubEle,0,1; } }
-24029:24031,{ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON); bonus bBaseAtk,.@r; if(.@r >= 15) { bonus bLongAtkRate,1; } }
-24030:24032,{ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON); bonus bCritical,.@r; bonus bBaseAtk,.@r; if(.@r >= 15) { bonus bCritAtkRate,1; } }
-24034:24040,{ bonus bLuk,1; }
-24035:24041,{ bonus bStr,1; }
-24036:24042,{ bonus bInt,1; }
-24037:24043,{ bonus bDex,1; }
-24038:24044,{ bonus bVit,1; }
-24039:24045,{ bonus bAgi,1; }
-24046:24051,{ bonus2 bSubEle,Ele_Neutral,1; if(getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 15) { bonus2 bSubEle,Ele_Neutral,1; } }
-24052:24062,{ bonus2 bExpAddRace,RC_DemiPlayer,3; }
-24053:24063,{ bonus2 bAddRace,RC_Boss,5; bonus2 bMagicAddRace,RC_Boss,5; }
-24054:24065,{ bonus2 bExpAddRace,RC_Brute,3; }
-24055:24066,{ bonus2 bExpAddRace,RC_Insect,3; }
-24056:24067,{ bonus2 bExpAddRace,RC_Fish,3; }
-24057:24071,{ bonus2 bExpAddRace,RC_Dragon,3; }
-24058:24068,{ bonus2 bExpAddRace,RC_Angel,3; }
-24059:24069,{ bonus2 bExpAddRace,RC_Formless,3; }
-24060:24070,{ bonus2 bExpAddRace,RC_Undead,3; }
-24061:24064,{ bonus2 bExpAddRace,RC_Plant,3; }
-24072:24075,{ bonus bMaxHPrate,1; bonus bMaxSPrate,1; }
-24073:24076,{ bonus bMaxHPrate,1; bonus bMaxSPrate,1; }
-24074:24077,{ bonus bMaxHPrate,1; bonus bMaxSPrate,1; }
-24078:24079:24080,{ bonus3 bSPDrainRate,10,1+(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)/10),0; }
-24081:24082:24083,{ bonus3 bHPDrainRateRace,11,40,2+(getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_SHIELD, EQI_SHADOW_SHOES)/5); }
-24084:24085:24086:24087:24088:24089,{ bonus bAllStats,1; .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON, EQI_SHADOW_SHIELD, EQI_SHADOW_SHOES, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L); if (.@r >= 45) { bonus bNoGemStone,1; } bonus bUseSPrate,100-.@r; }
-24090:24091:24092,{ bonus bDef,5; if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 20) bonus2 bResEff,Eff_Stone,100; }
-24090:24093:24094,{ bonus bDef,5; if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 20) bonus2 bResEff,Eff_Sleep,100; }
-24090:24095:24096,{ bonus bDef,5; if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 20) bonus2 bResEff,Eff_Silence,100; }
-24090:24097:24098,{ bonus bDef,5; if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 20) bonus2 bResEff,Eff_Blind,100; }
-24090:24099:24100:24101,{ bonus bDef,4; if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_L, EQI_SHADOW_ACC_R) >= 30) bonus2 bResEff,Eff_Freeze,100; }
-24090:24102:24103,{ bonus bDef,5; if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ACC_L, EQI_SHADOW_ACC_R) >= 20) bonus2 bResEff,Eff_Bleeding,100; }
-24090:24104:24105:24106,{ bonus bDef,4; if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_L, EQI_SHADOW_ACC_R) >= 30) bonus2 bResEff,Eff_Stun,100; }
-24090:24107:24108,{ bonus bDef,5; if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ACC_L, EQI_SHADOW_ACC_R) >= 20) bonus2 bResEff,Eff_Curse,100; }
-24109:24110:24048,{ bonus bNoCastCancel,1; bonus bVariableCastrate,40-(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)); }
-24111:24112:24113,{ bonus bNoCastCancel,1; bonus bUseSPrate,40-getequiprefinerycnt(EQI_SHADOW_SHIELD)-getequiprefinerycnt(EQI_SHADOW_ARMOR)-getequiprefinerycnt(EQI_SHADOW_SHOES); }
-24150:24151,{ bonus bAtkRate,1; if (getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >= 15) bonus bNoSizeFix,1; }
-24152:24153,{ bonus bAtk,getequiprefinerycnt(EQI_SHADOW_WEAPON); if (getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R) >= 15) bonus bUnbreakableWeapon,1; }
-24154:24155,{ bonus bDef,getequiprefinerycnt(EQI_SHADOW_ARMOR); if (getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_ACC_L) >= 15) bonus bUnbreakableArmor,1; }
-24156:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_DemiPlayer; }
-24157:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_Demon; }
-24158:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_Brute; }
-24159:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_Insect; }
-24160:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_Fish; }
-24161:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_Dragon; }
-24162:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_Angel; }
-24163:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_Formless; }
-24164:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_Undead; }
-24165:24166:24167,{ bonus bBaseAtk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreDefRace,RC_Plant; }
-24168:24169:24170,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_DemiPlayer; }
-24168:24169:24171,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_Demon; }
-24168:24169:24172,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_Brute; }
-24168:24169:24173,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_Insect; }
-24168:24169:24174,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_Fish; }
-24168:24169:24175,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_Dragon; }
-24168:24169:24176,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_Angel; }
-24168:24169:24177,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_Formless; }
-24168:24169:24178,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_Undead; }
-24168:24169:24179,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMdefRace,RC_Plant; }
-24180:24181:24182:24183:24184:24185,{ .@refine = getequiprefinerycnt(EQI_SHADOW_ARMOR, EQI_SHADOW_WEAPON, EQI_SHADOW_SHIELD, EQI_SHADOW_SHOES, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L); bonus bAllStats,1; if(.@refine>=45) { bonus bMaxHPrate,(.@refine-60); sc_start4 SC_ENDURE,1,10,0,0,1;} }
-// 24186:24198,{ /* Reduces physical and magical damage received from Neutral property monsters by 2% */ }
-// 24187:24199,{ /* Reduces physical and magical damage received from Shadow property monsters by 2% */ }
-// 24188:24200,{ /* Reduces physical and magical damage received from Water property monsters by 2% */ }
-// 24189:24201,{ /* Reduces physical and magical damage received from Earth property monsters by 2% */ }
-// 24190:24202,{ /* Reduces physical and magical damage received from Fire property monsters by 2% */ }
-// 24191:24203,{ /* Reduces physical and magical damage received from Wind property monsters by 2% */; }
-// 24192:24204,{ /* Reduces physical and magical damage received from Poison property monsters by 2% */ }
-// 24193:24205,{ /* Reduces physical and magical damage received from Holy property monsters by 2% */ }
-// 24194:24206,{ /* Reduces physical and magical damage received from Ghost property monsters by 2% */ }
-// 24195:24207,{ /* Reduces physical and magical damage received from Undead property monsters by 2% */ }
-24196:24197,{ bonus bFlee,5; if(getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_ARMOR)>=15) bonus bSpeedAddRate,3; }
-24208:24209,{ bonus2 bExpAddRace, RC_All, ((getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD))>=15?10:1); }
-24210:24211,{ bonus2 bExpAddRace, RC_All, ((getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD))>=15?20:10); }
-24212:24213,{ bonus2 bExpAddRace, RC_All, ((getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD))>=15?10:5); }
-24214:24215,{ bonus2 bExpAddRace, RC_All, ((getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD))>=15?4:2); }
-24217:24218,{ if(getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L)>=15) bonus bAspd,1; }
-//24223:Enhanced Force Shadow Earring:Enhanced Force Shadow Pendant,{ .@refine = getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L); if(.@refine)>=25 {bonus bAtkRate,2;} else if(.@refine)>=20 {bonus bAtkRate,1;} bonus bAtkRate,1; }
-24224:24225:24226,{ .@refine = getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L); if(.@refine)>=25 { bonus bAtkRate,2; } else if(.@refine)>=20 { bonus bAtkRate,1; } bonus bAtk2,10; }
-//24227:Enhanced Soul Earring:Enhanced Soul Pendant,{ .@refine = getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L); if(.@refine)>=25 {bonus bMatkRate,2;} else if(.@refine)>=20 {bonus bMatkRate,1;} bonus bMatkRate,1; }
-24228:24229:24230,{ .@refine = getequiprefinerycnt(EQI_SHADOW_WEAPON, EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L); if(.@refine)>=25 { bonus bMatkRate,2; } else if(.@refine)>=20 { bonus bMatkRate,1; } bonus bMatk,10; }
-24231:24232,{ bonus bFlee,5; if(getequiprefinerycnt(EQI_SHADOW_SHOES, EQI_SHADOW_SHIELD) >=15) { bonus bAspd,1; } }
-24234:24235,{ bonus bAtk,5; if(getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >=15) { bonus2 bAddSize,Size_Large,1; } }
-24236:24237,{ bonus bAtk,5; if(getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >=15) { bonus2 bAddSize,Size_Medium,1; } }
-24238:24239,{ bonus bAtk,5; if(getequiprefinerycnt(EQI_SHADOW_ACC_R, EQI_SHADOW_ACC_L) >=15) { bonus2 bAddSize,Size_Small,1; } }
-24240:24241:24242,{ bonus bUseSPrate,-1; .@refine = getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES); bonus bVariableCastrate,(.@refine)/5; if(.@refine)>=25 { bonus bUseSPrate,-1; } }
-24243:24244:24245,{ bonus bDelayrate,-1; if (getequiprefinerycnt(EQI_SHADOW_SHIELD, EQI_SHADOW_ARMOR, EQI_SHADOW_SHOES) >= 25) bonus bDelayrate,-5; }
-2161:1646,{ .@r = (getequiprefinerycnt(EQI_HAND_L)*4); bonus2 bVariableCastrate,"WZ_STORMGUST",-.@r; bonus2 bVariableCastrate,"WL_FROSTMISTY",-.@r; bonus2 bVariableCastrate,"WL_JACKFROST",-.@r; }
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index 794746784..f9997cb53 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -121,6 +121,8 @@ item_db: (
">
OnEquipScript: <" OnEquip Script (can also be multi-line) ">
OnUnequipScript: <" OnUnequip Script (can also be multi-line) ">
+ OnRentalStartScript: <" On item renting script, gets called after item is created in inventory (can also be multi-line) ">
+ OnRentalEndScript: <" On item rent end/expire script, gets called after item is removed from inventory (can also be multi-line) ">
},
**************************************************************************/
@@ -89226,7 +89228,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 1; ">
+ Script: <" setfont(1); ">
+ OnRentalEndScript: <"
+ if (getfont() == 1)
+ setfont(0);
+ ">
},
{
Id: 12288
@@ -89243,7 +89249,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 2; ">
+ Script: <" setfont(2); ">
+ OnRentalEndScript: <"
+ if (getfont() == 2)
+ setfont(0);
+ ">
},
{
Id: 12289
@@ -89260,7 +89270,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 3; ">
+ Script: <" setfont(3); ">
+ OnRentalEndScript: <"
+ if (getfont() == 3)
+ setfont(0);
+ ">
},
{
Id: 12290
@@ -89512,7 +89526,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 4; ">
+ Script: <" setfont(4); ">
+ OnRentalEndScript: <"
+ if (getfont() == 4)
+ setfont(0);
+ ">
},
{
Id: 12305
@@ -89529,7 +89547,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 5; ">
+ Script: <" setfont(5); ">
+ OnRentalEndScript: <"
+ if (getfont() == 5)
+ setfont(0);
+ ">
},
{
Id: 12306
@@ -89546,7 +89568,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 6; ">
+ Script: <" setfont(6); ">
+ OnRentalEndScript: <"
+ if (getfont() == 6)
+ setfont(0);
+ ">
},
{
Id: 12307
@@ -89563,7 +89589,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 7; ">
+ Script: <" setfont(7); ">
+ OnRentalEndScript: <"
+ if (getfont() == 7)
+ setfont(0);
+ ">
},
{
Id: 12308
@@ -89580,7 +89610,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 8; ">
+ Script: <" setfont(8); ">
+ OnRentalEndScript: <"
+ if (getfont() == 8)
+ setfont(0);
+ ">
},
{
Id: 12309
@@ -89597,7 +89631,11 @@ item_db: (
nomail: true
noauction: true
}
- Script: <" setfont 9; ">
+ Script: <" setfont(9); ">
+ OnRentalEndScript: <"
+ if (getfont() == 9)
+ setfont(0);
+ ">
},
{
Id: 12310
@@ -93349,6 +93387,7 @@ item_db: (
noauction: true
}
Script: <" setcashmount(); ">
+ OnRentalEndScript: <" sc_end(SC_ALL_RIDING); ">
},
{
Id: 12623
diff --git a/doc/atcommands.txt b/doc/atcommands.txt
index 139295973..0b4dce579 100644
--- a/doc/atcommands.txt
+++ b/doc/atcommands.txt
@@ -1059,6 +1059,12 @@ Changes the gender attached to the player's account.
---------------------------------------
+@changecharsex
+
+Changes the gender attached to the player's character.
+
+---------------------------------------
+
@marry <player 1> <player 2>
@divorce <player>
diff --git a/doc/constants.md b/doc/constants.md
index 4bb663365..d57dadcc6 100644
--- a/doc/constants.md
+++ b/doc/constants.md
@@ -4552,6 +4552,12 @@
- `GUILD_ONLINE_VENDOR`: 1
- `GUILD_ONLINE_NO_VENDOR`: 2
+### Siege Types
+
+- `SIEGE_TYPE_FE`: 0
+- `SIEGE_TYPE_SE`: 1
+- `SIEGE_TYPE_TE`: 2
+
### Renewal
- `RENEWAL`: 1
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index d14393a8a..e6bd32ca6 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -2208,11 +2208,11 @@ Multiple statements can be grouped with { }, curly braces, just like with
the 'if' statement.
Example 1:
- while (switch(select("Yes", "No") == 2))
+ while (select("Yes", "No") == 2)
mes("You picked no.");
Example 2: multiple statements
- while (switch(select("Yes", "No") == 2 )) {
+ while (select("Yes", "No") == 2) {
mes("Why did you pick no?");
mes("You should pick yes instead!");
}
@@ -9172,6 +9172,12 @@ currently used font is used, default interface font is used again.
---------------------------------------
+*getfont()
+
+This command return the player's current font.
+if no player is attached it would always return a 0, which is also the default font.
+
+---------------------------------------'
*showdigit(<value>{, <type>})
Displays given numeric 'value' in large digital clock font on top of the
diff --git a/npc/battleground/kvm/kvm_item_pay.txt b/npc/battleground/kvm/kvm_item_pay.txt
index f9dac0766..e6ef623b5 100644
--- a/npc/battleground/kvm/kvm_item_pay.txt
+++ b/npc/battleground/kvm/kvm_item_pay.txt
@@ -37,15 +37,15 @@
//=========================================================================
bat_room,151,144,3 script KVM Logistic Officer#a 4_M_JOB_KNIGHT2,{
- if (countitem(War_Badge)) {
- .@pointstoadd = countitem(War_Badge);
- delitem 7773,.@pointstoadd;
+ if (countitem(KVM_Badge)) {
+ .@pointstoadd = countitem(KVM_Badge);
+ delitem KVM_Badge,.@pointstoadd;
kvm_point += .@pointstoadd;
mes("[Logistics]");
- mesf("Are those %ss I see?", getitemname(7773));
+ mesf("Are those %ss I see?", getitemname(KVM_Badge));
mes("We no longer accept that currency,\r"
"but I can exchange those for you.");
- mesf("So you have %d %ss?", .@pointstoadd, getitemname(7773));
+ mesf("So you have %d %ss?", .@pointstoadd, getitemname(KVM_Badge));
mesf("Alright, all set, you now have ^580080%d^000000 KVM Points.", kvm_point);
next;
}
diff --git a/npc/custom/battleground/bg_kvm01.txt b/npc/custom/battleground/bg_kvm01.txt
index a66e202e3..bb3ba3e06 100644
--- a/npc/custom/battleground/bg_kvm01.txt
+++ b/npc/custom/battleground/bg_kvm01.txt
@@ -329,7 +329,7 @@ bat_c01,51,130,5 script Guillaume Vintenar::VintenarKvM01a 4_M_KY_HEAD,{
}
setquest 6025;
- getitem 7773, .@reward;
+ getitem KVM_Badge, .@reward;
bg_leave;
warp "bat_room",155,150;
end;
@@ -365,7 +365,7 @@ bat_c01,148,53,1 script Croix Vintenar::VintenarKvM01b 4_M_CRU_HEAD,{
}
setquest 6025;
- getitem 7773, .@reward;
+ getitem KVM_Badge, .@reward;
bg_leave;
warp "bat_room",155,150;
end;
diff --git a/npc/custom/battleground/bg_kvm02.txt b/npc/custom/battleground/bg_kvm02.txt
index f1637069a..a6cadb3af 100644
--- a/npc/custom/battleground/bg_kvm02.txt
+++ b/npc/custom/battleground/bg_kvm02.txt
@@ -329,7 +329,7 @@ bat_c02,51,130,5 script Guillaume Vintenar::VintenarKvM02a 4_M_KY_HEAD,{
}
setquest 6025;
- getitem 7773, .@reward;
+ getitem KVM_Badge, .@reward;
bg_leave;
warp "bat_room",155,150;
end;
@@ -365,7 +365,7 @@ bat_c02,148,53,1 script Croix Vintenar::VintenarKvM02b 4_M_CRU_HEAD,{
}
setquest 6025;
- getitem 7773, .@reward;
+ getitem KVM_Badge, .@reward;
bg_leave;
warp "bat_room",155,150;
end;
diff --git a/npc/custom/battleground/bg_kvm03.txt b/npc/custom/battleground/bg_kvm03.txt
index 612047dcb..8f255c90f 100644
--- a/npc/custom/battleground/bg_kvm03.txt
+++ b/npc/custom/battleground/bg_kvm03.txt
@@ -329,7 +329,7 @@ bat_c03,51,130,5 script Guillaume Vintenar::VintenarKvM03a 4_M_KY_HEAD,{
}
setquest 6025;
- getitem 7773, .@reward;
+ getitem KVM_Badge, .@reward;
bg_leave;
warp "bat_room",155,150;
end;
@@ -365,7 +365,7 @@ bat_c03,148,53,1 script Croix Vintenar::VintenarKvM03b 4_M_CRU_HEAD,{
}
setquest 6025;
- getitem 7773, .@reward;
+ getitem KVM_Badge, .@reward;
bg_leave;
warp "bat_room",155,150;
end;
diff --git a/sql-files/item_db.sql b/sql-files/item_db.sql
index 3ebd77ed3..10475f05d 100644
--- a/sql-files/item_db.sql
+++ b/sql-files/item_db.sql
@@ -4647,9 +4647,9 @@ REPLACE INTO `item_db` VALUES ('12283','Internet_Cafe2','Internet Cafe2','2','0'
REPLACE INTO `item_db` VALUES ('12284','Internet_Cafe3','Internet Cafe3','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','sc_start SC_FOOD_INT, 5400000, 8; sc_start SC_FOOD_VIT, 5400000, 4; sc_start SC_FOOD_DEX, 5400000, 6; sc_start SC_PLUSMAGICPOWER, 5400000, 40;','','');
REPLACE INTO `item_db` VALUES ('12285','Internet_Cafe4','Internet Cafe4','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','sc_start SC_FOOD_DEX, 5400000, 8; sc_start SC_FOOD_LUK, 5400000, 4; sc_start SC_FOOD_AGI, 5400000, 6; sc_start SC_PLUSATTACKPOWER, 5400000, 24; sc_start SC_PLUSMAGICPOWER, 5400000, 24;','','');
REPLACE INTO `item_db` VALUES ('12286','Masquerade_Ball_Box2','Masquerade Ball Box2','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','getrandgroupitem 12286,1;','','');
-REPLACE INTO `item_db` VALUES ('12287','Love_Angel','Love Angel Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 1;','','');
-REPLACE INTO `item_db` VALUES ('12288','Squirrel','Squirrel Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 2;','','');
-REPLACE INTO `item_db` VALUES ('12289','Gogo','Gogo Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 3;','','');
+REPLACE INTO `item_db` VALUES ('12287','Love_Angel','Love Angel Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(1);','','');
+REPLACE INTO `item_db` VALUES ('12288','Squirrel','Squirrel Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(2);','','');
+REPLACE INTO `item_db` VALUES ('12289','Gogo','Gogo Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(3);','','');
REPLACE INTO `item_db` VALUES ('12290','Mysterious_Can','Mysterious Can Magic Powder','2','0','10','5','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'1',NULL,'0',NULL,'0','percentheal 5,0; skilleffect AL_BLESSING,0; sc_start SC_BLESSING,120000,5;','','');
REPLACE INTO `item_db` VALUES ('12291','Mysterious_PET_Bottle','Mysterious PET Bottle','2','0','10','5','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'1',NULL,'0',NULL,'0','percentheal 5,0; skilleffect AL_INCAGI,0; sc_start SC_INC_AGI,120000,5;','','');
REPLACE INTO `item_db` VALUES ('12292','Unripe_Fruit','Unripe Fruit','0','0','500','250','200','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','percentheal 20,0;','','');
@@ -4664,12 +4664,12 @@ REPLACE INTO `item_db` VALUES ('12300','Wild_Rose_Scroll','Wild Rose Contract','
REPLACE INTO `item_db` VALUES ('12301','Doppelganger_Scroll','Doppelganger Contract','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','mercenary_create M_DOPPELGANGER, 1800000;','','');
REPLACE INTO `item_db` VALUES ('12302','Ygnizem_Scroll','Egnigem Cenia Contract','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','mercenary_create M_YGNIZEM, 1800000;','','');
REPLACE INTO `item_db` VALUES ('12303','Water_Of_Blessing','Blessing Of Water','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('12304','Picture_Diary','Diary Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 4;','','');
-REPLACE INTO `item_db` VALUES ('12305','Mini_Heart','Mini Heart Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 5;','','');
-REPLACE INTO `item_db` VALUES ('12306','Newcomer','Freshman Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 6;','','');
-REPLACE INTO `item_db` VALUES ('12307','Kid','Kid Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 7;','','');
-REPLACE INTO `item_db` VALUES ('12308','Magic_Castle','Magic Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 8;','','');
-REPLACE INTO `item_db` VALUES ('12309','Bulging_Head','JJangu Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 9;','','');
+REPLACE INTO `item_db` VALUES ('12304','Picture_Diary','Diary Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(4);','','');
+REPLACE INTO `item_db` VALUES ('12305','Mini_Heart','Mini Heart Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(5);','','');
+REPLACE INTO `item_db` VALUES ('12306','Newcomer','Freshman Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(6);','','');
+REPLACE INTO `item_db` VALUES ('12307','Kid','Kid Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(7);','','');
+REPLACE INTO `item_db` VALUES ('12308','Magic_Castle','Magic Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(8);','','');
+REPLACE INTO `item_db` VALUES ('12309','Bulging_Head','JJangu Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(9);','','');
REPLACE INTO `item_db` VALUES ('12310','Spray_Of_Flowers','Spray Of Flowers','2','0','0','0','50','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','467',NULL,'1',NULL,'0',NULL,'0','sc_start SC_FOOD_BASICAVOIDANCE,600000,10;','','');
REPLACE INTO `item_db` VALUES ('12311','Large_Spray_Of_Flowers','Huge Spray Of Flowers','11','0','0','0','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','467',NULL,'1',NULL,'0',NULL,'0','itemskill ALL_PARTYFLEE,1;','','');
REPLACE INTO `item_db` VALUES ('12312','Thick_Manual50','Thick Battle Manual','2','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','sc_start SC_CASH_PLUSEXP,3600000,50;','','');
diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql
index bba22d6df..8a1388f15 100644
--- a/sql-files/item_db_re.sql
+++ b/sql-files/item_db_re.sql
@@ -6116,9 +6116,9 @@ REPLACE INTO `item_db` VALUES ('12283','Internet_Cafe2','Internet Cafe2','2','0'
REPLACE INTO `item_db` VALUES ('12284','Internet_Cafe3','Internet Cafe3','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','sc_start SC_FOOD_INT, 5400000, 8; sc_start SC_FOOD_VIT, 5400000, 4; sc_start SC_FOOD_DEX, 5400000, 6; sc_start SC_PLUSMAGICPOWER, 5400000, 40;','','');
REPLACE INTO `item_db` VALUES ('12285','Internet_Cafe4','Internet Cafe4','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','sc_start SC_FOOD_DEX, 5400000, 8; sc_start SC_FOOD_LUK, 5400000, 4; sc_start SC_FOOD_AGI, 5400000, 6; sc_start SC_PLUSATTACKPOWER, 5400000, 24; sc_start SC_PLUSMAGICPOWER, 5400000, 24;','','');
REPLACE INTO `item_db` VALUES ('12286','Masquerade_Ball_Box2','Masquerade Ball Box2','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','getrandgroupitem 12286,1;','','');
-REPLACE INTO `item_db` VALUES ('12287','Love_Angel','Love Angel Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 1;','','');
-REPLACE INTO `item_db` VALUES ('12288','Squirrel','Squirrel Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 2;','','');
-REPLACE INTO `item_db` VALUES ('12289','Gogo','Gogo Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 3;','','');
+REPLACE INTO `item_db` VALUES ('12287','Love_Angel','Love Angel Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(1);','','');
+REPLACE INTO `item_db` VALUES ('12288','Squirrel','Squirrel Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(2);','','');
+REPLACE INTO `item_db` VALUES ('12289','Gogo','Gogo Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(3);','','');
REPLACE INTO `item_db` VALUES ('12290','Mysterious_Can','Mysterious Can Magic Powder','2','0','10','5','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'1',NULL,'0',NULL,'0','percentheal 5,0; skilleffect AL_BLESSING,0; sc_start SC_BLESSING,120000,5;','','');
REPLACE INTO `item_db` VALUES ('12291','Mysterious_PET_Bottle','Mysterious PET Bottle','2','0','10','5','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'1',NULL,'0',NULL,'0','percentheal 5,0; skilleffect AL_INCAGI,0; sc_start SC_INC_AGI,120000,5;','','');
REPLACE INTO `item_db` VALUES ('12292','Unripe_Fruit','Unripe Yggdrasilberry','0','0','500','250','200','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','percentheal 20,0;','','');
@@ -6133,12 +6133,12 @@ REPLACE INTO `item_db` VALUES ('12300','Wild_Rose_Scroll','Wild Rose Contract','
REPLACE INTO `item_db` VALUES ('12301','Doppelganger_Scroll','Doppelganger Contract','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','mercenary_create M_DOPPELGANGER, 1800000;','','');
REPLACE INTO `item_db` VALUES ('12302','Ygnizem_Scroll','Egnigem Cenia Contract','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','499',NULL,'0',NULL,'0',NULL,'0','mercenary_create M_YGNIZEM, 1800000;','','');
REPLACE INTO `item_db` VALUES ('12303','Water_Of_Blessing','Blessing Of Water','2','0','0','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('12304','Picture_Diary','Diary Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 4;','','');
-REPLACE INTO `item_db` VALUES ('12305','Mini_Heart','Mini Heart Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 5;','','');
-REPLACE INTO `item_db` VALUES ('12306','Newcomer','Freshman Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 6;','','');
-REPLACE INTO `item_db` VALUES ('12307','Kid','Kid Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 7;','','');
-REPLACE INTO `item_db` VALUES ('12308','Magic_Castle','Magic Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 8;','','');
-REPLACE INTO `item_db` VALUES ('12309','Bulging_Head','JJangu Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont 9;','','');
+REPLACE INTO `item_db` VALUES ('12304','Picture_Diary','Diary Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(4);','','');
+REPLACE INTO `item_db` VALUES ('12305','Mini_Heart','Mini Heart Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(5);','','');
+REPLACE INTO `item_db` VALUES ('12306','Newcomer','Freshman Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(6);','','');
+REPLACE INTO `item_db` VALUES ('12307','Kid','Kid Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(7);','','');
+REPLACE INTO `item_db` VALUES ('12308','Magic_Castle','Magic Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(8);','','');
+REPLACE INTO `item_db` VALUES ('12309','Bulging_Head','JJangu Magic Powder','11','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','setfont(9);','','');
REPLACE INTO `item_db` VALUES ('12310','Spray_Of_Flowers','Spray Of Flowers','2','0','0','0','50','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','467',NULL,'1',NULL,'0',NULL,'0','sc_start SC_FOOD_BASICAVOIDANCE,600000,10;','','');
REPLACE INTO `item_db` VALUES ('12311','Large_Spray_Of_Flowers','Huge Spray Of Flowers','11','0','0','0','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','467',NULL,'1',NULL,'0',NULL,'0','itemskill ALL_PARTYFLEE,1;','','');
REPLACE INTO `item_db` VALUES ('12312','Thick_Manual50','Thick Battle Manual','2','0','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','sc_start SC_CASH_PLUSEXP,3600000,50;','','');
diff --git a/sql-files/main.sql b/sql-files/main.sql
index e364ec778..27839afa3 100644
--- a/sql-files/main.sql
+++ b/sql-files/main.sql
@@ -930,6 +930,7 @@ INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1546059075); -- 2018-12-2
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1554760320); -- 2019-04-08--21-52.sql
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1556147483); -- 2019-04-25--02-12.sql
INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1557414445); -- 2019-05-09--18-07.sql
+INSERT IGNORE INTO `sql_updates` (`timestamp`) VALUES (1565293394); -- 2019-08-08--19-43.sql
--
-- Table structure for table `storage`
diff --git a/sql-files/upgrades/2019-08-08--19-43.sql b/sql-files/upgrades/2019-08-08--19-43.sql
new file mode 100644
index 000000000..35faf4ace
--- /dev/null
+++ b/sql-files/upgrades/2019-08-08--19-43.sql
@@ -0,0 +1,95 @@
+#1565293394
+
+-- This file is part of Hercules.
+-- http://herc.ws - http://github.com/HerculesWS/Hercules
+--
+-- Copyright (C) 2019 Hercules Dev Team
+--
+-- Hercules is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ALTER TABLE `guild_castle` DROP PRIMARY KEY;
+ALTER TABLE `guild_castle` ADD COLUMN `castle_name` VARCHAR(24) AFTER `castle_id`;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas01' WHERE castle_id = 0;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas02' WHERE castle_id = 1;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas03' WHERE castle_id = 2;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas04' WHERE castle_id = 3;
+UPDATE `guild_castle` SET `castle_name` = 'aldeg_cas05' WHERE castle_id = 4;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas01' WHERE castle_id = 5;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas02' WHERE castle_id = 6;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas03' WHERE castle_id = 7;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas04' WHERE castle_id = 8;
+UPDATE `guild_castle` SET `castle_name` = 'gefg_cas05' WHERE castle_id = 9;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas01' WHERE castle_id = 10;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas02' WHERE castle_id = 11;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas03' WHERE castle_id = 12;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas04' WHERE castle_id = 13;
+UPDATE `guild_castle` SET `castle_name` = 'payg_cas05' WHERE castle_id = 14;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas01' WHERE castle_id = 15;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas02' WHERE castle_id = 16;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas03' WHERE castle_id = 17;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas04' WHERE castle_id = 18;
+UPDATE `guild_castle` SET `castle_name` = 'prtg_cas05' WHERE castle_id = 19;
+UPDATE `guild_castle` SET `castle_name` = 'nguild_alde' WHERE castle_id = 20;
+UPDATE `guild_castle` SET `castle_name` = 'nguild_gef' WHERE castle_id = 21;
+UPDATE `guild_castle` SET `castle_name` = 'nguild_pay' WHERE castle_id = 22;
+UPDATE `guild_castle` SET `castle_name` = 'nguild_prt' WHERE castle_id = 23;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas01' WHERE castle_id = 24;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas02' WHERE castle_id = 25;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas03' WHERE castle_id = 26;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas04' WHERE castle_id = 27;
+UPDATE `guild_castle` SET `castle_name` = 'schg_cas05' WHERE castle_id = 28;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas01' WHERE castle_id = 29;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas02' WHERE castle_id = 30;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas03' WHERE castle_id = 31;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas04' WHERE castle_id = 32;
+UPDATE `guild_castle` SET `castle_name` = 'arug_cas05' WHERE castle_id = 33;
+
+-- Change the castle ids
+UPDATE `guild_castle` SET `castle_id` = 1 WHERE castle_name = 'prtg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 2 WHERE castle_name = 'prtg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 3 WHERE castle_name = 'prtg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 4 WHERE castle_name = 'prtg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 5 WHERE castle_name = 'prtg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 6 WHERE castle_name = 'aldeg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 7 WHERE castle_name = 'aldeg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 8 WHERE castle_name = 'aldeg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 9 WHERE castle_name = 'aldeg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 10 WHERE castle_name = 'aldeg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 11 WHERE castle_name = 'gefg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 12 WHERE castle_name = 'gefg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 13 WHERE castle_name = 'gefg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 14 WHERE castle_name = 'gefg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 15 WHERE castle_name = 'gefg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 16 WHERE castle_name = 'payg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 17 WHERE castle_name = 'payg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 18 WHERE castle_name = 'payg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 19 WHERE castle_name = 'payg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 20 WHERE castle_name = 'payg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 21 WHERE castle_name = 'arug_cas01';
+UPDATE `guild_castle` SET `castle_id` = 22 WHERE castle_name = 'arug_cas02';
+UPDATE `guild_castle` SET `castle_id` = 23 WHERE castle_name = 'arug_cas03';
+UPDATE `guild_castle` SET `castle_id` = 24 WHERE castle_name = 'arug_cas04';
+UPDATE `guild_castle` SET `castle_id` = 25 WHERE castle_name = 'arug_cas05';
+UPDATE `guild_castle` SET `castle_id` = 26 WHERE castle_name = 'schg_cas01';
+UPDATE `guild_castle` SET `castle_id` = 27 WHERE castle_name = 'schg_cas02';
+UPDATE `guild_castle` SET `castle_id` = 29 WHERE castle_name = 'schg_cas04';
+UPDATE `guild_castle` SET `castle_id` = 28 WHERE castle_name = 'schg_cas03';
+UPDATE `guild_castle` SET `castle_id` = 30 WHERE castle_name = 'schg_cas05';
+UPDATE `guild_castle` SET `castle_id` = 31 WHERE castle_name = 'nguild_prt';
+UPDATE `guild_castle` SET `castle_id` = 32 WHERE castle_name = 'nguild_alde';
+UPDATE `guild_castle` SET `castle_id` = 33 WHERE castle_name = 'nguild_gef';
+UPDATE `guild_castle` SET `castle_id` = 34 WHERE castle_name = 'nguild_pay';
+ALTER TABLE `guild_castle` ADD PRIMARY KEY (`castle_id`);
+ALTER TABLE `guild_castle` DROP COLUMN `castle_name`;
+INSERT INTO `sql_updates` (`timestamp`) VALUES (1565293394);
diff --git a/sql-files/upgrades/index.txt b/sql-files/upgrades/index.txt
index 3025a728c..85bd2a245 100644
--- a/sql-files/upgrades/index.txt
+++ b/sql-files/upgrades/index.txt
@@ -55,3 +55,4 @@
2019-04-08--21-52.sql
2019-04-25--02-12.sql
2019-05-09--18-07.sql
+2019-08-08--19-43.sql
diff --git a/src/common/HPMDataCheck.h b/src/common/HPMDataCheck.h
index 96fea8fe0..fd34a1d82 100644
--- a/src/common/HPMDataCheck.h
+++ b/src/common/HPMDataCheck.h
@@ -665,6 +665,8 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
{ "PACKET_ZC_ACK_LEAVE_GUILD1", sizeof(struct PACKET_ZC_ACK_LEAVE_GUILD1), SERVER_TYPE_MAP },
{ "PACKET_ZC_ACK_LEAVE_GUILD2", sizeof(struct PACKET_ZC_ACK_LEAVE_GUILD2), SERVER_TYPE_MAP },
{ "PACKET_ZC_ACK_OPEN_WRITE_MAIL", sizeof(struct PACKET_ZC_ACK_OPEN_WRITE_MAIL), SERVER_TYPE_MAP },
+ { "PACKET_ZC_ACK_RANKING_name", sizeof(struct PACKET_ZC_ACK_RANKING_name), SERVER_TYPE_MAP },
+ { "PACKET_ZC_ACK_RANKING_points", sizeof(struct PACKET_ZC_ACK_RANKING_points), SERVER_TYPE_MAP },
{ "PACKET_ZC_ACK_RANKING_sub", sizeof(struct PACKET_ZC_ACK_RANKING_sub), SERVER_TYPE_MAP },
{ "PACKET_ZC_ACK_REMOVE_ITEM_MAIL", sizeof(struct PACKET_ZC_ACK_REMOVE_ITEM_MAIL), SERVER_TYPE_MAP },
{ "PACKET_ZC_ACK_REQMAKINGITEM", sizeof(struct PACKET_ZC_ACK_REQMAKINGITEM), SERVER_TYPE_MAP },
@@ -741,6 +743,7 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
{ "PACKET_ZC_SPRITE_CHANGE", sizeof(struct PACKET_ZC_SPRITE_CHANGE), SERVER_TYPE_MAP },
{ "PACKET_ZC_STATUS_CHANGE_ACK", sizeof(struct PACKET_ZC_STATUS_CHANGE_ACK), SERVER_TYPE_MAP },
{ "PACKET_ZC_STYLE_CHANGE_RES", sizeof(struct PACKET_ZC_STYLE_CHANGE_RES), SERVER_TYPE_MAP },
+ { "PACKET_ZC_TALKBOX_CHATCONTENTS", sizeof(struct PACKET_ZC_TALKBOX_CHATCONTENTS), SERVER_TYPE_MAP },
{ "PACKET_ZC_UI_ACTION", sizeof(struct PACKET_ZC_UI_ACTION), SERVER_TYPE_MAP },
{ "PACKET_ZC_UPDATE_ITEM_FROM_BUYING_STORE", sizeof(struct PACKET_ZC_UPDATE_ITEM_FROM_BUYING_STORE), SERVER_TYPE_MAP },
{ "PACKET_ZC_USE_ITEM_ACK", sizeof(struct PACKET_ZC_USE_ITEM_ACK), SERVER_TYPE_MAP },
diff --git a/src/common/mmo.h b/src/common/mmo.h
index 1fa6fadc8..66736bff0 100644
--- a/src/common/mmo.h
+++ b/src/common/mmo.h
@@ -907,6 +907,14 @@ struct guild_castle {
int mapindex;
char castle_name[NAME_LENGTH];
char castle_event[NAME_LENGTH];
+ int siege_type;
+ bool enable_client_warp;
+ struct {
+ int x;
+ int y;
+ int zeny;
+ int zeny_siege;
+ } client_warp;
int guild_id;
int economy;
int defense;
diff --git a/src/common/packets/packets2019_len_main.h b/src/common/packets/packets2019_len_main.h
index 949aae804..424abe14f 100644
--- a/src/common/packets/packets2019_len_main.h
+++ b/src/common/packets/packets2019_len_main.h
@@ -103,7 +103,11 @@ packetLen(0x007c, 44) // ZC_NOTIFY_STANDENTRY_NPC
packetLen(0x007d, 2) // CZ_NOTIFY_ACTORINIT
// Packet: 0x007e
+#if PACKETVER >= 20190904
+packetLen(0x007e, 46) // CZ_REQUEST_TIME
+#elif PACKETVER >= 20190109
packetLen(0x007e, 105) // CZ_REQUEST_TIME
+#endif
// Packet: 0x007f
packetLen(0x007f, 6) // ZC_NOTIFY_TIME
@@ -916,7 +920,11 @@ packetLen(0x018f, 8) // ZC_ACK_REQMAKINGITEM
packetLen(0x0190, 23) // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
// Packet: 0x0191
+#if PACKETVER >= 20190904
+packetLen(0x0191, 27) // ZC_TALKBOX_CHATCONTENTS
+#elif PACKETVER >= 20190109
packetLen(0x0191, 86) // ZC_TALKBOX_CHATCONTENTS
+#endif
// Packet: 0x0192
packetLen(0x0192, 24) // ZC_UPDATE_MAPINFO
@@ -1966,7 +1974,11 @@ packetLen(0x0365, 8) // CZ_MOVE_ITEM_FROM_STORE_TO_BODY2
packetLen(0x0366, 10) // CZ_USE_SKILL_TOGROUND2
// Packet: 0x0367
+#if PACKETVER >= 20190904
+packetLen(0x0367, 31) // CZ_USE_SKILL_TOGROUND_WITHTALKBOX2
+#elif PACKETVER >= 20190109
packetLen(0x0367, 90) // CZ_USE_SKILL_TOGROUND_WITHTALKBOX2
+#endif
// Packet: 0x0368
packetLen(0x0368, 6) // CZ_REQNAME2
@@ -4710,5 +4722,45 @@ packetLen(0x0b54, 8)
packetLen(0x0b55, -1)
#endif
+// Packet: 0x0b56
+#if PACKETVER >= 20190904
+packetLen(0x0b56, -1)
+#endif
+
+// Packet: 0x0b57
+#if PACKETVER >= 20190904
+packetLen(0x0b57, -1)
+#endif
+
+// Packet: 0x0b58
+#if PACKETVER >= 20190904
+packetLen(0x0b58, 2)
+#endif
+
+// Packet: 0x0b59
+#if PACKETVER >= 20190918
+packetLen(0x0b59, 2)
+#endif
+
+// Packet: 0x0b5a
+#if PACKETVER >= 20190918
+packetLen(0x0b5a, 4)
+#endif
+
+// Packet: 0x0b5b
+#if PACKETVER >= 20190918
+packetLen(0x0b5b, -1)
+#endif
+
+// Packet: 0x0b5c
+#if PACKETVER >= 20190918
+packetLen(0x0b5c, 10)
+#endif
+
+// Packet: 0x0b5d
+#if PACKETVER >= 20190918
+packetLen(0x0b5d, 2)
+#endif
+
#endif /* COMMON_PACKETS2019_LEN_MAIN_H */
diff --git a/src/common/packets/packets2019_len_re.h b/src/common/packets/packets2019_len_re.h
index c31a10191..32c14775d 100644
--- a/src/common/packets/packets2019_len_re.h
+++ b/src/common/packets/packets2019_len_re.h
@@ -103,7 +103,11 @@ packetLen(0x007c, 44) // ZC_NOTIFY_STANDENTRY_NPC
packetLen(0x007d, 2) // CZ_NOTIFY_ACTORINIT
// Packet: 0x007e
+#if PACKETVER >= 20190904
+packetLen(0x007e, 46) // CZ_REQUEST_TIME
+#elif PACKETVER >= 20190109
packetLen(0x007e, 105) // CZ_REQUEST_TIME
+#endif
// Packet: 0x007f
packetLen(0x007f, 6) // ZC_NOTIFY_TIME
@@ -916,7 +920,11 @@ packetLen(0x018f, 8) // ZC_ACK_REQMAKINGITEM
packetLen(0x0190, 23) // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
// Packet: 0x0191
+#if PACKETVER >= 20190904
+packetLen(0x0191, 27) // ZC_TALKBOX_CHATCONTENTS
+#elif PACKETVER >= 20190109
packetLen(0x0191, 86) // ZC_TALKBOX_CHATCONTENTS
+#endif
// Packet: 0x0192
packetLen(0x0192, 24) // ZC_UPDATE_MAPINFO
@@ -1972,7 +1980,11 @@ packetLen(0x0365, 8) // CZ_MOVE_ITEM_FROM_STORE_TO_BODY2
packetLen(0x0366, 10) // CZ_USE_SKILL_TOGROUND2
// Packet: 0x0367
+#if PACKETVER >= 20190904
+packetLen(0x0367, 31) // CZ_USE_SKILL_TOGROUND_WITHTALKBOX2
+#elif PACKETVER >= 20190109
packetLen(0x0367, 90) // CZ_USE_SKILL_TOGROUND_WITHTALKBOX2
+#endif
// Packet: 0x0368
packetLen(0x0368, 6) // CZ_REQNAME2
@@ -4722,5 +4734,45 @@ packetLen(0x0b54, 8)
packetLen(0x0b55, -1)
#endif
+// Packet: 0x0b56
+#if PACKETVER >= 20190904
+packetLen(0x0b56, -1)
+#endif
+
+// Packet: 0x0b57
+#if PACKETVER >= 20190904
+packetLen(0x0b57, -1)
+#endif
+
+// Packet: 0x0b58
+#if PACKETVER >= 20190904
+packetLen(0x0b58, 2)
+#endif
+
+// Packet: 0x0b59
+#if PACKETVER >= 20190918
+packetLen(0x0b59, 2)
+#endif
+
+// Packet: 0x0b5a
+#if PACKETVER >= 20190918
+packetLen(0x0b5a, 4)
+#endif
+
+// Packet: 0x0b5b
+#if PACKETVER >= 20190918
+packetLen(0x0b5b, -1)
+#endif
+
+// Packet: 0x0b5c
+#if PACKETVER >= 20190918
+packetLen(0x0b5c, 10)
+#endif
+
+// Packet: 0x0b5d
+#if PACKETVER >= 20190918
+packetLen(0x0b5d, 2)
+#endif
+
#endif /* COMMON_PACKETS2019_LEN_RE_H */
diff --git a/src/common/packets/packets2019_len_zero.h b/src/common/packets/packets2019_len_zero.h
index abe81796c..9cdc9db05 100644
--- a/src/common/packets/packets2019_len_zero.h
+++ b/src/common/packets/packets2019_len_zero.h
@@ -103,7 +103,11 @@ packetLen(0x007c, 44) // ZC_NOTIFY_STANDENTRY_NPC
packetLen(0x007d, 2) // CZ_NOTIFY_ACTORINIT
// Packet: 0x007e
+#if PACKETVER >= 20190828
+packetLen(0x007e, 46) // CZ_REQUEST_TIME
+#elif PACKETVER >= 20190116
packetLen(0x007e, 105) // CZ_REQUEST_TIME
+#endif
// Packet: 0x007f
packetLen(0x007f, 6) // ZC_NOTIFY_TIME
@@ -916,7 +920,11 @@ packetLen(0x018f, 8) // ZC_ACK_REQMAKINGITEM
packetLen(0x0190, 23) // CZ_USE_SKILL_TOGROUND_WITHTALKBOX
// Packet: 0x0191
+#if PACKETVER >= 20190828
+packetLen(0x0191, 27) // ZC_TALKBOX_CHATCONTENTS
+#elif PACKETVER >= 20190116
packetLen(0x0191, 86) // ZC_TALKBOX_CHATCONTENTS
+#endif
// Packet: 0x0192
packetLen(0x0192, 24) // ZC_UPDATE_MAPINFO
@@ -1966,7 +1974,11 @@ packetLen(0x0365, 8) // CZ_MOVE_ITEM_FROM_STORE_TO_BODY2
packetLen(0x0366, 10) // CZ_USE_SKILL_TOGROUND2
// Packet: 0x0367
+#if PACKETVER >= 20190828
+packetLen(0x0367, 31) // CZ_USE_SKILL_TOGROUND_WITHTALKBOX2
+#elif PACKETVER >= 20190116
packetLen(0x0367, 90) // CZ_USE_SKILL_TOGROUND_WITHTALKBOX2
+#endif
// Packet: 0x0368
packetLen(0x0368, 6) // CZ_REQNAME2
@@ -4697,5 +4709,50 @@ packetLen(0x0b53, 52)
packetLen(0x0b54, 8)
#endif
+// Packet: 0x0b55
+#if PACKETVER >= 20190828
+packetLen(0x0b55, -1)
+#endif
+
+// Packet: 0x0b56
+#if PACKETVER >= 20190828
+packetLen(0x0b56, -1)
+#endif
+
+// Packet: 0x0b57
+#if PACKETVER >= 20190828
+packetLen(0x0b57, -1)
+#endif
+
+// Packet: 0x0b58
+#if PACKETVER >= 20190828
+packetLen(0x0b58, 2)
+#endif
+
+// Packet: 0x0b59
+#if PACKETVER >= 20190918
+packetLen(0x0b59, 2)
+#endif
+
+// Packet: 0x0b5a
+#if PACKETVER >= 20190918
+packetLen(0x0b5a, 4)
+#endif
+
+// Packet: 0x0b5b
+#if PACKETVER >= 20190918
+packetLen(0x0b5b, -1)
+#endif
+
+// Packet: 0x0b5c
+#if PACKETVER >= 20190918
+packetLen(0x0b5c, 10)
+#endif
+
+// Packet: 0x0b5d
+#if PACKETVER >= 20190918
+packetLen(0x0b5d, 2)
+#endif
+
#endif /* COMMON_PACKETS2019_LEN_ZERO_H */
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index b3e5a1f12..145a5c95d 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -511,7 +511,7 @@ ACMD(where)
return false;
}
- pl_sd = map->nick2sd(atcmd_player_name);
+ pl_sd = map->nick2sd(atcmd_player_name, true);
if (pl_sd == NULL ||
strncmp(pl_sd->status.name, atcmd_player_name, NAME_LENGTH) != 0 ||
(pc_has_permission(pl_sd, PC_PERM_HIDE_SESSION) && pc_get_group_level(pl_sd) > pc_get_group_level(sd) && !pc_has_permission(sd, PC_PERM_WHO_DISPLAY_AID))
@@ -548,7 +548,7 @@ ACMD(jumpto)
return false;
}
- if ((pl_sd=map->nick2sd(message)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) {
+ if ((pl_sd=map->nick2sd(message, true)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -2904,7 +2904,7 @@ ACMD(recall)
return false;
}
- if ((pl_sd=map->nick2sd(message)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) {
+ if ((pl_sd=map->nick2sd(message, true)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -3229,7 +3229,7 @@ ACMD(kick)
return false;
}
- if ((pl_sd=map->nick2sd(message)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) {
+ if ((pl_sd=map->nick2sd(message, true)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -4364,7 +4364,7 @@ ACMD(nuke)
return false;
}
- if ((pl_sd = map->nick2sd(atcmd_player_name)) != NULL) {
+ if ((pl_sd = map->nick2sd(atcmd_player_name, true)) != NULL) {
if (pc_get_group_level(sd) >= pc_get_group_level(pl_sd)) { // you can kill only lower or same GM level
skill->castend_nodamage_id(&pl_sd->bl, &pl_sd->bl, NPC_SELFDESTRUCTION, 99, timer->gettick(), 0);
clif->message(fd, msg_fd(fd,109)); // Player has been nuked!
@@ -4684,7 +4684,7 @@ ACMD(jail)
return false;
}
- if ((pl_sd = map->nick2sd(atcmd_player_name)) == NULL) {
+ if ((pl_sd = map->nick2sd(atcmd_player_name, true)) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -4736,7 +4736,7 @@ ACMD(unjail)
return false;
}
- if ((pl_sd = map->nick2sd(atcmd_player_name)) == NULL) {
+ if ((pl_sd = map->nick2sd(atcmd_player_name, true)) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -4815,7 +4815,7 @@ ACMD(jailfor)
return false;
}
- if ((pl_sd = map->nick2sd(atcmd_player_name)) == NULL) {
+ if ((pl_sd = map->nick2sd(atcmd_player_name, true)) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -5346,7 +5346,7 @@ ACMD(follow)
return true;
}
- if ((pl_sd = map->nick2sd(message)) == NULL) {
+ if ((pl_sd = map->nick2sd(message, true)) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -5596,7 +5596,7 @@ ACMD(useskill)
if (!strcmp(target,"self"))
pl_sd = sd; //quick keyword
- else if ((pl_sd = map->nick2sd(target)) == NULL) {
+ else if ((pl_sd = map->nick2sd(target, true)) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -5664,7 +5664,7 @@ ACMD(skilltree)
return false;
}
- if ( (pl_sd = map->nick2sd(target)) == NULL ) {
+ if ( (pl_sd = map->nick2sd(target, true)) == NULL ) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -5734,7 +5734,7 @@ ACMD(marry)
return false;
}
- if ((pl_sd = map->nick2sd(player_name)) == NULL) {
+ if ((pl_sd = map->nick2sd(player_name, true)) == NULL) {
clif->message(fd, msg_fd(fd,3));
return false;
}
@@ -5864,7 +5864,7 @@ ACMD(changegm)
return false;
}
- if ((pl_sd=map->nick2sd(message)) == NULL || pl_sd->status.guild_id != sd->status.guild_id) {
+ if ((pl_sd=map->nick2sd(message, true)) == NULL || pl_sd->status.guild_id != sd->status.guild_id) {
clif->message(fd, msg_fd(fd,1184)); // Target character must be online and be a guild member.
return false;
}
@@ -5885,7 +5885,7 @@ ACMD(changeleader)
return false;
}
- if (party->changeleader(sd, map->nick2sd(message)))
+ if (party->changeleader(sd, map->nick2sd(message, true)))
return true;
return false;
}
@@ -6349,7 +6349,7 @@ ACMD(mobsearch)
}
if (mob_id == atoi(mob_name)) {
strcpy(mob_name,mob->db(mob_id)->jname); // DEFAULT_MOB_JNAME
- //strcpy(mob_name,mob_db(mob_id)->name); // DEFAULT_MOB_NAME
+ //strcpy(mob_name,mob->db(mob_id)->name); // DEFAULT_MOB_NAME
}
snprintf(atcmd_output, sizeof atcmd_output, msg_fd(fd,1220), mob_name, mapindex_id2name(sd->mapindex)); // Mob Search... %s %s
@@ -6651,7 +6651,7 @@ ACMD(trade)
return false;
}
- if ((pl_sd = map->nick2sd(message)) == NULL) {
+ if ((pl_sd = map->nick2sd(message, true)) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -6695,7 +6695,7 @@ ACMD(unmute)
return false;
}
- if ((pl_sd = map->nick2sd(message)) == NULL) {
+ if ((pl_sd = map->nick2sd(message, true)) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -6750,6 +6750,18 @@ ACMD(changesex)
return true;
}
+ACMD(changecharsex)
+{
+ int i;
+
+ 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], PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
+ chrif->changesex(sd, false);
+ return true;
+}
+
/*================================================
* @mute - Mutes a player for a set amount of time
*------------------------------------------------*/
@@ -6763,7 +6775,7 @@ ACMD(mute)
return false;
}
- if ((pl_sd = map->nick2sd(atcmd_player_name)) == NULL) {
+ if ((pl_sd = map->nick2sd(atcmd_player_name, true)) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -7060,7 +7072,7 @@ ACMD(showmobs)
if (mob_id == atoi(mob_name)) {
strcpy(mob_name,mob->db(mob_id)->jname); // DEFAULT_MOB_JNAME
- //strcpy(mob_name,mob_db(mob_id)->name); // DEFAULT_MOB_NAME
+ //strcpy(mob_name,mob->db(mob_id)->name); // DEFAULT_MOB_NAME
}
snprintf(atcmd_output, sizeof atcmd_output, msg_fd(fd,1252), // Mob Search... %s %s
@@ -7973,7 +7985,7 @@ ACMD(showdelay)
ACMD(invite)
{
unsigned int did = sd->duel_group;
- struct map_session_data *target_sd = map->nick2sd(message);
+ struct map_session_data *target_sd = map->nick2sd(message, true);
if (did == 0)
{
@@ -8046,7 +8058,7 @@ ACMD(duel)
}
duel->create(sd, maxpl);
} else {
- struct map_session_data *target_sd = map->nick2sd(message);
+ struct map_session_data *target_sd = map->nick2sd(message, true);
if (target_sd != NULL) {
unsigned int newduel;
if ((newduel = duel->create(sd, 2)) != -1) {
@@ -8191,7 +8203,7 @@ ACMD(clone)
return false;
}
- if ((pl_sd=map->nick2sd(message)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) {
+ if ((pl_sd=map->nick2sd(message, true)) == NULL && (pl_sd=map->charid2sd(atoi(message))) == NULL) {
clif->message(fd, msg_fd(fd,3)); // Character not found.
return false;
}
@@ -9309,7 +9321,7 @@ ACMD(channel)
return false;
}
- if (sub4[0] == '\0' || (pl_sd = map->nick2sd(sub4)) == NULL) {
+ if (sub4[0] == '\0' || (pl_sd = map->nick2sd(sub4, true)) == NULL) {
safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1434), sub4);// Player '%s' was not found
clif->message(fd, atcmd_output);
return false;
@@ -9356,7 +9368,7 @@ ACMD(channel)
clif->message(fd, atcmd_output);
return false;
}
- if (sub4[0] == '\0' || (pl_sd = map->nick2sd(sub4)) == NULL) {
+ if (sub4[0] == '\0' || (pl_sd = map->nick2sd(sub4, true)) == NULL) {
safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,1434), sub4);// Player '%s' was not found
clif->message(fd, atcmd_output);
return false;
@@ -10115,6 +10127,7 @@ static void atcommand_basecommands(void)
ACMD_DEF(clearweather),
ACMD_DEF(uptime),
ACMD_DEF(changesex),
+ ACMD_DEF(changecharsex),
ACMD_DEF(mute),
ACMD_DEF(refresh),
ACMD_DEF(refreshall),
@@ -10450,7 +10463,7 @@ static bool atcommand_exec(const int fd, struct map_session_data *sd, const char
return true;
}
- ssd = map->nick2sd(charname);
+ ssd = map->nick2sd(charname, true);
if (ssd == NULL) {
sprintf(output, msg_fd(fd,1389), command); // %s failed. Player not found.
clif->message(fd, output);
diff --git a/src/map/battle.h b/src/map/battle.h
index 779e360bf..4400d37d1 100644
--- a/src/map/battle.h
+++ b/src/map/battle.h
@@ -103,8 +103,8 @@ enum e_battle_check_target { //New definitions [Skotlex]
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_SITDOWN = 2, // Sit down
+ BDT_STANDUP = 3, // Stand up
BDT_ENDURE = 4, // Damage (endure)
BDT_SPLASH = 5, // Splash
BDT_SKILL = 6, // Skill
diff --git a/src/map/clif.c b/src/map/clif.c
index fdc9d8b44..1ed5e1d9f 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -4789,9 +4789,9 @@ static void clif_getareachar_unit(struct map_session_data *sd, struct block_list
//Modifies the type of damage according to status changes [Skotlex]
//Aegis data specifies that: 4 endure against single hit sources, 9 against multi-hit.
-static inline int clif_calc_delay(int type, int div, int damage, int delay)
+static inline enum battle_dmg_type clif_calc_delay(enum battle_dmg_type type, int div, int damage, int delay)
{
- return ( delay == 0 && damage > 0 ) ? ( div > 1 ? 9 : 4 ) : type;
+ return ( delay == 0 && damage > 0 ) ? ( div > 1 ? BDT_MULTIENDURE : BDT_ENDURE ) : type;
}
/*==========================================
@@ -4822,7 +4822,7 @@ static int clif_calc_walkdelay(struct block_list *bl, int delay, int type, int d
/// 08c8 <src ID>.L <dst ID>.L <server tick>.L <src speed>.L <dst speed>.L <damage>.L <IsSPDamage>.B <div>.W <type>.B <damage2>.L (ZC_NOTIFY_ACT2)
/// type: @see enum battle_dmg_type
/// for BDT_NORMAL: [ damage: total damage, div: amount of hits, damage2: assassin dual-wield damage ]
-static 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)
+static int clif_damage(struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, enum battle_dmg_type type, int64 in_damage2)
{
struct packet_damage p;
struct status_change *sc;
@@ -5268,7 +5268,7 @@ static void clif_playerSkillToPacket(struct map_session_data *sd, struct SKILLDA
skillData->sp = 0;
skillData->range2 = 0;
}
-#if PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190814
+#if PACKETVER_RE_NUM >= 20190807
if (newSkill)
skillData->level2 = 0;
else
@@ -5419,7 +5419,7 @@ static void clif_skillinfo(struct map_session_data *sd, int skill_id, int inf)
p->sp = 0;
p->range2 = 0;
}
-#if PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190814
+#if PACKETVER_RE_NUM >= 20190807
p->level2 = skill_lv;
#endif
if (sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT)
@@ -5573,7 +5573,7 @@ static void clif_skill_cooldown(struct map_session_data *sd, uint16 skill_id, un
/// Skill attack effect and damage.
/// 0114 <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.W <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL)
/// 01de <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <damage>.L <level>.W <div>.W <type>.B (ZC_NOTIFY_SKILL2)
-static int clif_skill_damage(struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 in_damage, int div, uint16 skill_id, uint16 skill_lv, int type)
+static int clif_skill_damage(struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 in_damage, int div, uint16 skill_id, uint16 skill_lv, enum battle_dmg_type type)
{
unsigned char buf[64];
struct status_change *sc;
@@ -5675,7 +5675,7 @@ static int clif_skill_damage(struct block_list *src, struct block_list *dst, int
/// Ground skill attack effect and damage (ZC_NOTIFY_SKILL_POSITION).
/// 0115 <skill id>.W <src id>.L <dst id>.L <tick>.L <src delay>.L <dst delay>.L <x>.W <y>.W <damage>.W <level>.W <div>.W <type>.B
#if 0
-static int clif_skill_damage2(struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int damage, int div, uint16 skill_id, uint16 skill_lv, int type)
+static int clif_skill_damage2(struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int damage, int div, uint16 skill_id, uint16 skill_lv, enum battle_dmg_type type)
{
unsigned char buf[64];
struct status_change *sc;
@@ -6458,7 +6458,7 @@ static void clif_wis_message(int fd, const char *nick, const char *mes, int mes_
safestrncpy(WFIFOP(fd,28), mes, mes_len + 1);
WFIFOSET(fd,WFIFOW(fd,2));
#else
- ssd = map->nick2sd(nick);
+ ssd = map->nick2sd(nick, false);
WFIFOHEAD(fd, mes_len + NAME_LENGTH + 9);
WFIFOW(fd,0) = 0x97;
@@ -8106,6 +8106,54 @@ static void clif_guild_allianceinfo(struct map_session_data *sd)
WFIFOSET(fd,WFIFOW(fd,2));
}
+static void clif_guild_castlelist(struct map_session_data *sd)
+{
+#if PACKETVER_MAIN_NUM >= 20190731 || PACKETVER_RE_NUM >= 20190717 || PACKETVER_ZERO_NUM >= 20190814
+ nullpo_retv(sd);
+
+ struct guild *g = sd->guild;
+ if (g == NULL)
+ return;
+
+ int castle_count = guild->checkcastles(g);
+ if (castle_count > 0) {
+ int len = sizeof(struct PACKET_ZC_GUILD_CASTLE_LIST) + castle_count;
+ struct PACKET_ZC_GUILD_CASTLE_LIST *p = aMalloc(len);
+ p->packetType = HEADER_ZC_GUILD_CASTLE_LIST;
+ p->packetLength = len;
+
+ int i = 0;
+ struct DBIterator *iter = db_iterator(guild->castle_db);
+ for (struct guild_castle *gc = dbi_first(iter); dbi_exists(iter); gc = dbi_next(iter)) {
+ if (gc->guild_id == g->guild_id) {
+ p->castle_list[i] = gc->castle_id;
+ ++i;
+ }
+ }
+ dbi_destroy(iter);
+
+ clif->send(p, len, &sd->bl, SELF);
+ aFree(p);
+ }
+#endif
+}
+
+static void clif_guild_castleinfo(struct map_session_data *sd, struct guild_castle *gc)
+{
+#if PACKETVER_MAIN_NUM >= 20190731 || PACKETVER_RE_NUM >= 20190717 || PACKETVER_ZERO_NUM >= 20190814
+
+ nullpo_retv(sd);
+ nullpo_retv(gc);
+
+ struct PACKET_ZC_CASTLE_INFO p = { 0 };
+ p.packetType = HEADER_ZC_CASTLE_INFO;
+ p.castle_id = gc->castle_id;
+ p.economy = gc->economy;
+ p.defense = gc->defense;
+ clif->send(&p, sizeof(p), &sd->bl, SELF);
+#endif
+}
+
/// Guild member manager information (ZC_MEMBERMGR_INFO).
/// 0154 <packet len>.W { <account>.L <char id>.L <hair style>.W <hair color>.W <gender>.W <class>.W <level>.W <contrib exp>.L <state>.L <position>.L <memo>.50B <name>.24B }*
/// state:
@@ -8689,14 +8737,14 @@ static void clif_emotion(struct block_list *bl, int type)
/// 0191 <id>.L <contents>.80B
static void clif_talkiebox(struct block_list *bl, const char *talkie)
{
- unsigned char buf[MESSAGE_SIZE+6];
nullpo_retv(bl);
nullpo_retv(talkie);
+ struct PACKET_ZC_TALKBOX_CHATCONTENTS p;
- WBUFW(buf,0) = 0x191;
- WBUFL(buf,2) = bl->id;
- safestrncpy(WBUFP(buf,6),talkie,MESSAGE_SIZE);
- clif->send(buf,packet_len(0x191),bl,AREA);
+ p.PacketType = HEADER_ZC_TALKBOX_CHATCONTENTS;
+ p.aid = bl->id;
+ safestrncpy(&p.message[0], talkie, TALKBOX_MESSAGE_SIZE);
+ clif->send(&p, sizeof(struct PACKET_ZC_TALKBOX_CHATCONTENTS), bl, AREA);
}
/// Displays wedding effect centered on an object (ZC_CONGRATULATION).
@@ -9298,9 +9346,6 @@ static void clif_pcname_ack(int fd, struct block_list *bl)
packet.gid = bl->id;
const struct map_session_data *ssd = BL_UCCAST(BL_PC, bl);
- const struct party_data *p = NULL;
- const struct guild *g = NULL;
- int ps = -1;
if (ssd->fakename[0] != '\0' && ssd->disguise != -1) {
packet.packet_id = reqName;
@@ -9326,9 +9371,12 @@ static void clif_pcname_ack(int fd, struct block_list *bl)
#endif
memcpy(packet.name, ssd->status.name, NAME_LENGTH);
+ const struct party_data *p = NULL;
+ int ps = -1;
if (ssd->status.party_id != 0) {
p = party->search(ssd->status.party_id);
}
+ const struct guild *g = NULL;
if (ssd->status.guild_id != 0) {
if ((g = ssd->guild) != NULL) {
int i;
@@ -9351,6 +9399,12 @@ static void clif_pcname_ack(int fd, struct block_list *bl)
memcpy(packet.guild_name, g->name,NAME_LENGTH);
memcpy(packet.position_name, g->position[ps].name, NAME_LENGTH);
}
+ else if (ssd->status.clan_id != 0) {
+ struct clan *c = clan->search(ssd->status.clan_id);
+ if (c != 0) {
+ memcpy(packet.position_name, c->name, NAME_LENGTH);
+ }
+ }
}
clif->send_selforarea(fd, bl, &packet, len);
@@ -11590,9 +11644,9 @@ static void clif_parse_WisMessage(int fd, struct map_session_data *sd)
}
// searching destination character
- dstsd = map->nick2sd(target);
+ dstsd = map->nick2sd(target, false);
- if (dstsd == NULL || strcmp(dstsd->status.name, target) != 0) {
+ if (dstsd == NULL) {
// Character not found (or found through partial match).
clif->wis_end(sd->fd, 1);
return;
@@ -12687,7 +12741,7 @@ static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uin
return;
}
//You can't use Graffiti/TalkieBox AND have a vending open, so this is safe.
- safestrncpy(sd->message, RFIFOP(fd,skillmoreinfo), MESSAGE_SIZE);
+ safestrncpy(sd->message, RFIFOP(fd, skillmoreinfo), TALKBOX_MESSAGE_SIZE);
}
if( sd->ud.skilltimer != INVALID_TIMER )
@@ -13438,7 +13492,7 @@ static void clif_parse_PartyInvite2(int fd, struct map_session_data *sd)
return;
}
- t_sd = map->nick2sd(name);
+ t_sd = map->nick2sd(name, true);
if(t_sd && t_sd->state.noask) { // @noask [LuzZza]
clif->noask_sub(sd, t_sd, 1);
@@ -14401,6 +14455,7 @@ static void clif_parse_GuildRequestInfo(int fd, struct map_session_data *sd)
case 0: // Basic Information Guild, hostile alliance information
clif->guild_basicinfo(sd);
clif->guild_allianceinfo(sd);
+ clif->guild_castlelist(sd);
break;
case 1: // Members list, list job title
clif->guild_positionnamelist(sd);
@@ -14711,7 +14766,7 @@ static void clif_parse_GuildInvite2(int fd, struct map_session_data *sd)
struct map_session_data *t_sd = NULL;
safestrncpy(nick, RFIFOP(fd, 2), NAME_LENGTH);
- t_sd = map->nick2sd(nick);
+ t_sd = map->nick2sd(nick, true);
clif_sub_guild_invite(fd, sd, t_sd);
}
@@ -15752,7 +15807,7 @@ static void clif_parse_FriendsListAdd(int fd, struct map_session_data *sd)
safestrncpy(nick, RFIFOP(fd,2), NAME_LENGTH);
- f_sd = map->nick2sd(nick);
+ f_sd = map->nick2sd(nick, true);
// ensure that the request player's friend list is not full
ARR_FIND(0, MAX_FRIENDS, i, sd->status.friends[i].char_id == 0);
@@ -15978,18 +16033,18 @@ static void clif_ranklist_sub(struct PACKET_ZC_ACK_RANKING_sub *ranks, enum fame
if (list[i].id > 0) {
const char* name;
if (strcmp(list[i].name, "-") == 0 && (name = map->charid2nick(list[i].id)) != NULL) {
- strncpy(ranks[i].name, name, NAME_LENGTH);
+ strncpy(ranks->names[i].name, name, NAME_LENGTH);
} else {
- strncpy(ranks[i].name, list[i].name, NAME_LENGTH);
+ strncpy(ranks->names[i].name, list[i].name, NAME_LENGTH);
}
} else {
- strncpy(ranks[i].name, "None", 5);
+ strncpy(ranks->names[i].name, "None", 5);
}
- ranks[i].points = list[i].fame; //points
+ ranks->points[i].points = list[i].fame; //points
}
for (;i < 10; i++) { // In case the MAX is less than 10.
- strncpy(ranks[i].name, "Unavailable", 12);
- ranks[i].points = 0;
+ strncpy(ranks->names[i].name, "Unavailable", 12);
+ ranks->points[i].points = 0;
}
#endif
}
@@ -16038,7 +16093,7 @@ static void clif_ranklist(struct map_session_data *sd, enum fame_list_type type)
#if PACKETVER_MAIN_NUM >= 20190731 || PACKETVER_RE_NUM >= 20190703 || PACKETVER_ZERO_NUM >= 20190724
clif->ranklist_sub2(p->chars, p->points, type);
#else
- clif->ranklist_sub(p->ranks, type);
+ clif->ranklist_sub(&p->ranks, type);
#endif
if (pc->famelist_type(sd->job) == type) {
@@ -16398,10 +16453,14 @@ static void clif_parse_AutoRevive(int fd, struct map_session_data *sd)
{
if (pc_istrading(sd) || pc_isvending(sd))
return;
+
if (!pc_isdead(sd))
return;
- int item_position = pc->search_inventory(sd, ITEMID_TOKEN_OF_SIEGFRIED);
+ if (sd->sc.data[SC_HELLPOWER]) //Cannot res while under the effect of SC_HELLPOWER.
+ return;
+
+ int item_position = pc->have_item_chain(sd, ECC_SIEGFRIED);
int hpsp = 100;
if (item_position == INDEX_NOT_FOUND) {
@@ -16411,18 +16470,15 @@ static void clif_parse_AutoRevive(int fd, struct map_session_data *sd)
return;
}
- if (sd->sc.data[SC_HELLPOWER]) //Cannot res while under the effect of SC_HELLPOWER.
- return;
-
if (!status->revive(&sd->bl, hpsp, hpsp))
return;
if (item_position == INDEX_NOT_FOUND)
- status_change_end(&sd->bl,SC_LIGHT_OF_REGENE,INVALID_TIMER);
+ status_change_end(&sd->bl, SC_LIGHT_OF_REGENE, INVALID_TIMER);
else
pc->delitem(sd, item_position, 1, 0, DELITEM_SKILLUSE, LOG_TYPE_CONSUME);
- clif->skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION, 4, 1);
+ clif->skill_nodamage(&sd->bl, &sd->bl, ALL_RESURRECTION, 4, 1);
}
/// Information about character's status values (ZC_ACK_STATUS_GM).
@@ -16483,7 +16539,7 @@ static void clif_parse_Check(int fd, struct map_session_data *sd)
safestrncpy(charname, RFIFOP(fd,packet_db[RFIFOW(fd,0)].pos[0]), sizeof(charname));
- if( ( pl_sd = map->nick2sd(charname) ) == NULL || pc_get_group_level(sd) < pc_get_group_level(pl_sd) ) {
+ if ((pl_sd = map->nick2sd(charname, true)) == NULL || pc_get_group_level(sd) < pc_get_group_level(pl_sd)) {
return;
}
@@ -20608,7 +20664,7 @@ static int clif_delay_damage_sub(int tid, int64 tick, int id, intptr_t data)
*
* @return clif->calc_walkdelay used in further processing
**/
-static int clif_delay_damage(int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, unsigned char type)
+static int clif_delay_damage(int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, enum battle_dmg_type type)
{
struct cdelayed_damage *dd;
struct status_change *sc;
@@ -23204,6 +23260,78 @@ static void clif_announce_refine_status(struct map_session_data *sd, int item_id
#endif
}
+static void clif_parse_GuildCastleTeleportRequest(int fd, struct map_session_data *sd) __attribute__((nonnull(2)));
+static void clif_parse_GuildCastleTeleportRequest(int fd, struct map_session_data *sd)
+{
+#if PACKETVER_MAIN_NUM >= 20190522 || PACKETVER_RE_NUM >= 20190522 || PACKETVER_ZERO_NUM >= 20190515
+ const struct PACKET_CZ_CASTLE_TELEPORT_REQUEST *p = RFIFO2PTR(fd);
+ struct guild *g = sd->guild;
+
+ if (g == NULL)
+ return;
+
+ struct guild_castle *gc = guild->castle_search(p->castle_id);
+ if (gc == NULL)
+ return;
+ if (gc->enable_client_warp == false)
+ return;
+ if (gc->guild_id != g->guild_id)
+ return;
+
+ if (map->list[sd->bl.m].flag.gvg_castle == 1)
+ return;
+
+ int zeny = gc->client_warp.zeny;
+ if (gc->siege_type == SIEGE_TYPE_FE && map->agit_flag == 1) {
+ zeny = gc->client_warp.zeny_siege;
+ } else if (gc->siege_type == SIEGE_TYPE_SE && map->agit2_flag == 1) {
+ zeny = gc->client_warp.zeny_siege;
+ } else if (gc->siege_type == SIEGE_TYPE_TE) {
+ clif->guild_castleteleport_res(sd, SIEGE_TP_INVALID_MODE);
+ return;
+ }
+
+ if (sd->status.zeny < zeny) {
+ clif->guild_castleteleport_res(sd, SIEGE_TP_NOT_ENOUGH_ZENY);
+ return;
+ }
+ sd->status.zeny -= zeny;
+ clif->updatestatus(sd, SP_ZENY);
+ pc->setpos(sd, gc->mapindex, gc->client_warp.x, gc->client_warp.y, CLR_OUTSIGHT);
+#endif
+}
+
+static void clif_guild_castleteleport_res(struct map_session_data *sd, enum siege_teleport_result result)
+{
+#if PACKETVER_MAIN_NUM >= 20190731 || PACKETVER_RE_NUM >= 20190717 || PACKETVER_ZERO_NUM >= 20190814
+
+ nullpo_retv(sd);
+
+ struct PACKET_ZC_CASTLE_TELEPORT_RESPONSE p = { 0 };
+ p.packetType = HEADER_ZC_CASTLE_TELEPORT_RESPONSE;
+ p.result = (int16)result;
+ clif->send(&p, sizeof(p), &sd->bl, SELF);
+#endif
+}
+static void clif_parse_GuildCastleInfoRequest(int fd, struct map_session_data *sd) __attribute__((nonnull(2)));
+static void clif_parse_GuildCastleInfoRequest(int fd, struct map_session_data *sd)
+{
+#if PACKETVER_MAIN_NUM >= 20190522 || PACKETVER_RE_NUM >= 20190522 || PACKETVER_ZERO_NUM >= 20190515
+ const struct PACKET_CZ_CASTLE_INFO_REQUEST *p = RFIFO2PTR(fd);
+ struct guild *g = sd->guild;
+
+ if (g == NULL)
+ return;
+
+ struct guild_castle *gc = guild->castle_search(p->castle_id);
+ if (gc == NULL)
+ return;
+ if (gc->guild_id != g->guild_id)
+ return;
+ clif->guild_castleinfo(sd, gc);
+#endif
+}
+
/*==========================================
* Main client packet processing function
*------------------------------------------*/
@@ -23888,6 +24016,8 @@ void clif_defaults(void)
clif->guild_masterormember = clif_guild_masterormember;
clif->guild_basicinfo = clif_guild_basicinfo;
clif->guild_allianceinfo = clif_guild_allianceinfo;
+ clif->guild_castlelist = clif_guild_castlelist;
+ clif->guild_castleinfo = clif_guild_castleinfo;
clif->guild_memberlist = clif_guild_memberlist;
clif->guild_skillinfo = clif_guild_skillinfo;
clif->guild_send_onlineinfo = clif_guild_send_onlineinfo;
@@ -24429,4 +24559,7 @@ void clif_defaults(void)
clif->pRefineryUIClose = clif_parse_RefineryUIClose;
clif->pRefineryUIRefine = clif_parse_RefineryUIRefine;
clif->announce_refine_status = clif_announce_refine_status;
+ clif->pGuildCastleTeleportRequest = clif_parse_GuildCastleTeleportRequest;
+ clif->pGuildCastleInfoRequest = clif_parse_GuildCastleInfoRequest;
+ clif->guild_castleteleport_res = clif_guild_castleteleport_res;
}
diff --git a/src/map/clif.h b/src/map/clif.h
index 07d2ef4a8..245352b9c 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -59,6 +59,7 @@ struct s_refine_requirement;
struct PACKET_ZC_ACK_RANKING_sub;
struct SKILLDATA;
+enum battle_dmg_type;
enum clif_messages;
enum rodex_add_item;
enum rodex_get_zeny;
@@ -632,6 +633,13 @@ enum inventory_type {
INVTYPE_GUILD_STORAGE = 3,
};
+/** Guild Teleport Results */
+enum siege_teleport_result {
+ SIEGE_TP_SUCCESS = 0x0,
+ SIEGE_TP_NOT_ENOUGH_ZENY = 0x1,
+ SIEGE_TP_INVALID_MODE = 0x2
+};
+
/**
* Structures
**/
@@ -861,7 +869,7 @@ struct clif_interface {
void (*scriptclear) (struct map_session_data *sd, int npcid);
/* client-user-interface-related */
void (*viewpoint) (struct map_session_data *sd, int npc_id, int type, int x, int y, int id, int color);
- int (*damage) (struct block_list* src, struct block_list* dst, int sdelay, int ddelay, int64 damage, short div, unsigned char type, int64 damage2);
+ int (*damage) (struct block_list* src, struct block_list* dst, int sdelay, int ddelay, int64 damage, short div, enum battle_dmg_type type, int64 damage2);
void (*sitting) (struct block_list* bl);
void (*standing) (struct block_list* bl);
void (*arrow_create_list) (struct map_session_data *sd);
@@ -987,7 +995,7 @@ struct clif_interface {
void (*wedding_effect) (struct block_list *bl);
void (*divorced) (struct map_session_data* sd, const char* name);
void (*callpartner) (struct map_session_data *sd);
- int (*skill_damage) (struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 damage, int div, uint16 skill_id, uint16 skill_lv, int type);
+ int (*skill_damage) (struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 damage, int div, uint16 skill_id, uint16 skill_lv, enum battle_dmg_type type);
int (*skill_nodamage) (struct block_list *src,struct block_list *dst,uint16 skill_id,int heal,int fail);
void (*skill_poseffect) (struct block_list *src, uint16 skill_id, int val, int x, int y, int64 tick);
void (*skill_estimation) (struct map_session_data *sd,struct block_list *dst);
@@ -1113,6 +1121,8 @@ struct clif_interface {
void (*guild_masterormember) (struct map_session_data *sd);
void (*guild_basicinfo) (struct map_session_data *sd);
void (*guild_allianceinfo) (struct map_session_data *sd);
+ void (*guild_castlelist) (struct map_session_data *sd);
+ void (*guild_castleinfo) (struct map_session_data *sd, struct guild_castle *gc);
void (*guild_memberlist) (struct map_session_data *sd);
void (*guild_skillinfo) (struct map_session_data* sd);
void (*guild_send_onlineinfo) (struct map_session_data *sd); //[LuzZza]
@@ -1282,7 +1292,7 @@ struct clif_interface {
/* */
void (*notify_bounditem) (struct map_session_data *sd, unsigned short index);
/* */
- int (*delay_damage) (int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, unsigned char type);
+ int (*delay_damage) (int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, enum battle_dmg_type type);
int (*delay_damage_sub) (int tid, int64 tick, int id, intptr_t data);
/* NPC Market */
void (*npc_market_open) (struct map_session_data *sd, struct npc_data *nd);
@@ -1646,6 +1656,9 @@ struct clif_interface {
void (*pRefineryUIClose) (int fd, struct map_session_data *sd);
void (*pRefineryUIRefine) (int fd, struct map_session_data *sd);
void (*announce_refine_status) (struct map_session_data *sd, int item_id, int refine_level, bool success, enum send_target target);
+ void (*pGuildCastleTeleportRequest) (int fd, struct map_session_data *sd);
+ void (*pGuildCastleInfoRequest) (int fd, struct map_session_data *sd);
+ void (*guild_castleteleport_res) (struct map_session_data *sd, enum siege_teleport_result result);
};
#ifdef HERCULES_CORE
diff --git a/src/map/guild.c b/src/map/guild.c
index 415a46db5..2faf60e2b 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -169,7 +169,7 @@ static bool guild_read_castledb_libconfig(void)
}
libconfig->destroy(&castle_conf);
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", i, config_filename);
+ ShowStatus("Done reading '"CL_WHITE"%u"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", db_size(guild->castle_db), config_filename);
return true;
}
@@ -217,10 +217,59 @@ static bool guild_read_castledb_libconfig_sub(struct config_setting_t *it, int i
}
safestrncpy(gc->castle_event, name, sizeof(gc->castle_event));
+ if (itemdb->lookup_const(it, "SiegeType", &i32) && (i32 >= SIEGE_TYPE_MAX || i32 < 0)) {
+ ShowWarning("guild_read_castledb_libconfig_sub: Invalid SiegeType in \"%s\", entry #%d, defaulting to SIEGE_TYPE_FE.\n", source, idx);
+ gc->siege_type = SIEGE_TYPE_FE;
+ } else {
+ gc->siege_type = i32;
+ }
+
+ libconfig->setting_lookup_bool_real(it, "EnableClientWarp", &gc->enable_client_warp);
+ if (gc->enable_client_warp == true) {
+ struct config_setting_t *wd = libconfig->setting_get_member(it, "ClientWarp");
+ guild->read_castledb_libconfig_sub_warp(wd, source, gc);
+ }
idb_put(guild->castle_db, gc->castle_id, gc);
return true;
}
+static bool guild_read_castledb_libconfig_sub_warp(struct config_setting_t *wd, const char *source, struct guild_castle *gc)
+{
+ nullpo_retr(false, wd);
+ nullpo_retr(false, gc);
+ nullpo_retr(false, source);
+
+ int64 i64 = 0;
+ struct config_setting_t *it = libconfig->setting_get_member(wd, "Position");
+ if (config_setting_is_list(it)) {
+ int m = map->mapindex2mapid(gc->mapindex);
+
+ gc->client_warp.x = libconfig->setting_get_int_elem(it, 0);
+ gc->client_warp.y = libconfig->setting_get_int_elem(it, 1);
+ if (gc->client_warp.x < 0 || gc->client_warp.x >= map->list[m].xs || gc->client_warp.y < 0 || gc->client_warp.y >= map->list[m].ys) {
+ ShowWarning("guild_read_castledb_libconfig_sub_warp: Invalid Position in \"%s\", for castle (%d).\n", source, gc->castle_id);
+ return false;
+ }
+ } else {
+ ShowWarning("guild_read_castledb_libconfig_sub_warp: Invalid format for Position in \"%s\", for castle (%d).\n", source, gc->castle_id);
+ return false;
+ }
+
+ if (libconfig->setting_lookup_int64(wd, "ZenyCost", &i64)) {
+ if (i64 > MAX_ZENY) {
+ ShowWarning("guild_read_castledb_libconfig_sub_warp: ZenyCost is too big in \"%s\", for castle (%d), capping to MAX_ZENY.\n", source, gc->castle_id);
+ }
+ gc->client_warp.zeny = cap_value((int)i64, 0, MAX_ZENY);
+ }
+ if (libconfig->setting_lookup_int64(wd, "ZenyCostSiegeTime", &i64)) {
+ if (i64 > MAX_ZENY) {
+ ShowWarning("guild_read_castledb_libconfig_sub_warp: ZenyCostSiegeTime is too big in \"%s\", for castle (%d), capping to MAX_ZENY.\n", source, gc->castle_id);
+ }
+ gc->client_warp.zeny_siege = cap_value((int)i64, 0, MAX_ZENY);
+ }
+ return true;
+}
+
/// lookup: guild id -> guild*
static struct guild *guild_search(int guild_id)
{
@@ -605,7 +654,7 @@ static int guild_recv_info(const struct guild *sg)
before=*sg;
//Perform the check on the user because the first load
guild->check_member(sg);
- if ((sd = map->nick2sd(sg->master)) != NULL) {
+ if ((sd = map->nick2sd(sg->master, false)) != NULL) {
//If the guild master is online the first time the guild_info is received,
//that means he was the first to join, so apply guild skill blocking here.
if( battle_config.guild_skill_relog_delay == 1)
@@ -2497,6 +2546,7 @@ void guild_defaults(void)
guild->read_guildskill_tree_db = guild_read_guildskill_tree_db;
guild->read_castledb_libconfig = guild_read_castledb_libconfig;
guild->read_castledb_libconfig_sub = guild_read_castledb_libconfig_sub;
+ guild->read_castledb_libconfig_sub_warp = guild_read_castledb_libconfig_sub_warp;
guild->payexp_timer_sub = guild_payexp_timer_sub;
guild->send_xy_timer_sub = guild_send_xy_timer_sub;
guild->send_xy_timer = guild_send_xy_timer;
diff --git a/src/map/guild.h b/src/map/guild.h
index d0374103f..41f52711d 100644
--- a/src/map/guild.h
+++ b/src/map/guild.h
@@ -166,6 +166,7 @@ struct guild_interface {
bool (*read_guildskill_tree_db) (char* split[], int columns, int current);
bool (*read_castledb_libconfig) (void);
bool (*read_castledb_libconfig_sub) (struct config_setting_t *it, int idx, const char *source);
+ bool (*read_castledb_libconfig_sub_warp) (struct config_setting_t *wd, const char *source, struct guild_castle *gc);
int (*payexp_timer_sub) (union DBKey key, struct DBData *data, va_list ap);
int (*send_xy_timer_sub) (union DBKey key, struct DBData *data, va_list ap);
int (*send_xy_timer) (int tid, int64 tick, int id, intptr_t data);
diff --git a/src/map/homunculus.c b/src/map/homunculus.c
index 31744f479..43cb8d84b 100644
--- a/src/map/homunculus.c
+++ b/src/map/homunculus.c
@@ -172,7 +172,7 @@ static int homunculus_dead(struct homun_data *hd)
}
//Vaporize a character's homun. If flag, HP needs to be 80% or above.
-static int homunculus_vaporize(struct map_session_data *sd, enum homun_state flag)
+static int homunculus_vaporize(struct map_session_data *sd, enum homun_state state, bool force)
{
struct homun_data *hd;
@@ -185,13 +185,13 @@ static int homunculus_vaporize(struct map_session_data *sd, enum homun_state fla
if (status->isdead(&hd->bl))
return 0; //Can't vaporize a dead homun.
- if (flag == HOM_ST_REST && get_percentage(hd->battle_status.hp, hd->battle_status.max_hp) < 80)
+ if (!force && get_percentage(hd->battle_status.hp, hd->battle_status.max_hp) < 80)
return 0;
hd->regen.state.block = 3; //Block regen while vaporized.
//Delete timers when vaporized.
homun->hunger_timer_delete(hd);
- hd->homunculus.vaporize = flag;
+ hd->homunculus.vaporize = state;
if(battle_config.hom_setting&0x40)
memset(hd->blockskill, 0, sizeof(hd->blockskill));
clif->hominfo(sd, sd->hd, 0);
@@ -258,7 +258,7 @@ static int homunculus_calc_skilltree(struct homun_data *hd, int flag_evolve)
for( i = 0; i < MAX_SKILL_TREE && ( id = homun->dbs->skill_tree[c][i].id ) > 0; i++ ) {
if( hd->homunculus.hskill[ id - HM_SKILLBASE ].id )
continue; //Skill already known.
- j = ( flag_evolve ) ? 10 : hd->homunculus.intimacy;
+ j = ( flag_evolve ) ? 1000 : hd->homunculus.intimacy;
if( j < homun->dbs->skill_tree[c][i].intimacylv )
continue;
if(!battle_config.skillfree) {
@@ -525,6 +525,21 @@ static bool homunculus_mutate(struct homun_data *hd, int homun_id)
return true;
}
+static int homunculus_gainexp_real(struct homun_data *hd, unsigned int exp)
+{
+ nullpo_ret(hd);
+ nullpo_ret(hd->master);
+
+ hd->homunculus.exp += exp;
+
+ if (hd->master->state.showexp && hd->exp_next > 0) {
+ char output[256];
+ sprintf(output, msg_fd(hd->master->fd, 449), exp, ((float)exp / (float)hd->exp_next * (float)100));
+ clif_disp_onlyself(hd->master, output);
+ }
+ return 1;
+}
+
static int homunculus_gainexp(struct homun_data *hd, unsigned int exp)
{
enum homun_type htype;
@@ -550,16 +565,10 @@ static int homunculus_gainexp(struct homun_data *hd, unsigned int exp)
break;
}
- hd->homunculus.exp += exp;
-
- if (hd->master->state.showexp && hd->exp_next > 0) {
- char output[256];
- sprintf(output, "Homunculus Experience Gained Base:%u (%.2f%%)", exp, ((float)exp / (float)hd->exp_next * (float)100));
- clif_disp_onlyself(hd->master, output);
- }
+ homun->gainexp_real(hd, exp);
- if(hd->homunculus.exp < hd->exp_next) {
- clif->hominfo(hd->master,hd,0);
+ if (hd->homunculus.exp < hd->exp_next) {
+ clif->hominfo(hd->master, hd, 0);
return 0;
}
@@ -826,7 +835,7 @@ static int homunculus_db_search(int key, int type)
* @param hom The homunculus source data.
* @retval false in case of errors.
*/
-static bool homunculus_create(struct map_session_data *sd, const struct s_homunculus *hom)
+static bool homunculus_create(struct map_session_data *sd, const struct s_homunculus *hom, bool is_new)
{
struct homun_data *hd;
int i = 0;
@@ -870,7 +879,9 @@ static bool homunculus_create(struct map_session_data *sd, const struct s_homunc
map->addiddb(&hd->bl);
status_calc_homunculus(hd,SCO_FIRST);
- status_percent_heal(&hd->bl, 100, 100);
+ if (is_new) {
+ status_percent_heal(&hd->bl, 100, 100);
+ }
hd->hungry_timer = INVALID_TIMER;
return true;
@@ -927,6 +938,7 @@ static bool homunculus_recv_data(int account_id, const struct s_homunculus *sh,
{
struct map_session_data *sd;
struct homun_data *hd;
+ bool is_new = false;
nullpo_retr(false, sh);
@@ -942,15 +954,17 @@ static bool homunculus_recv_data(int account_id, const struct s_homunculus *sh,
if (sd->status.char_id != sh->char_id && sd->status.hom_id != sh->hom_id)
return false;
- if (sd->status.hom_id == 0) //Hom just created.
+ if (sd->status.hom_id == 0) { // Hom just created.
sd->status.hom_id = sh->hom_id;
+ is_new = true;
+ }
if (sd->hd != NULL) {
//uh? Overwrite the data.
memcpy(&sd->hd->homunculus, sh, sizeof sd->hd->homunculus);
sd->hd->homunculus.char_id = sd->status.char_id; // Correct char id if necessary.
} else {
- homun->create(sd, sh);
+ homun->create(sd, sh, is_new);
}
hd = sd->hd;
@@ -1312,7 +1326,7 @@ static bool homunculus_read_skill_db_sub(char *split[], int columns, int current
homun->dbs->skill_tree[classid][j].need[k].lv = atoi(split[3+k*2+minJobLevelPresent+1]);
}
- homun->dbs->skill_tree[classid][j].intimacylv = atoi(split[13+minJobLevelPresent]);
+ homun->dbs->skill_tree[classid][j].intimacylv = atoi(split[13+minJobLevelPresent]) * 100;
return true;
}
@@ -1439,6 +1453,7 @@ void homunculus_defaults(void)
homun->evolve = homunculus_evolve;
homun->mutate = homunculus_mutate;
homun->gainexp = homunculus_gainexp;
+ homun->gainexp_real = homunculus_gainexp_real;
homun->add_intimacy = homunculus_add_intimacy;
homun->consume_intimacy = homunculus_consume_intimacy;
homun->healed = homunculus_healed;
diff --git a/src/map/homunculus.h b/src/map/homunculus.h
index 745c7cd84..2914a26cc 100644
--- a/src/map/homunculus.h
+++ b/src/map/homunculus.h
@@ -133,7 +133,7 @@ struct homun_skill_tree_entry {
short id;
unsigned char max;
unsigned char joblv;
- short intimacylv;
+ int intimacylv;
struct {
short id;
unsigned char lv;
@@ -167,7 +167,7 @@ struct homunculus_interface {
enum homun_type (*class2type) (int class_);
void (*damaged) (struct homun_data *hd);
int (*dead) (struct homun_data *hd);
- int (*vaporize) (struct map_session_data *sd, enum homun_state flag);
+ int (*vaporize) (struct map_session_data *sd, enum homun_state state, bool force);
int (*delete) (struct homun_data *hd, int emote);
int (*checkskill) (struct homun_data *hd, uint16 skill_id);
int (*calc_skilltree) (struct homun_data *hd, int flag_evolve);
@@ -178,6 +178,7 @@ struct homunculus_interface {
bool (*evolve) (struct homun_data *hd);
bool (*mutate) (struct homun_data *hd, int homun_id);
int (*gainexp) (struct homun_data *hd, unsigned int exp);
+ int (*gainexp_real) (struct homun_data *hd, unsigned int exp);
unsigned int (*add_intimacy) (struct homun_data * hd, unsigned int value);
unsigned int (*consume_intimacy) (struct homun_data *hd, unsigned int value);
void (*healed) (struct homun_data *hd);
@@ -189,7 +190,7 @@ struct homunculus_interface {
int (*change_name) (struct map_session_data *sd, const char *name);
bool (*change_name_ack) (struct map_session_data *sd, const char *name, int flag);
int (*db_search) (int key,int type);
- bool (*create) (struct map_session_data *sd, const struct s_homunculus *hom);
+ bool (*create) (struct map_session_data *sd, const struct s_homunculus *hom, bool is_new);
void (*init_timers) (struct homun_data * hd);
bool (*call) (struct map_session_data *sd);
bool (*recv_data) (int account_id, const struct s_homunculus *sh, int flag);
diff --git a/src/map/itemdb.c b/src/map/itemdb.c
index b871fed38..e5e7b9478 100644
--- a/src/map/itemdb.c
+++ b/src/map/itemdb.c
@@ -1555,141 +1555,107 @@ static void itemdb_read_chains(void)
else
itemdb->chain_cache[ECC_ORE] = i;
+ if (!script->get_constant("ITMCHAIN_SIEGFRIED", &i))
+ ShowWarning("itemdb_read_chains: failed to find 'ITMCHAIN_SIEGFRIED' chain to link to cache!\n");
+ else
+ itemdb->chain_cache[ECC_SIEGFRIED] = i;
+
ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, config_filename);
}
-/**
- * @return: amount of retrieved entries.
- **/
-static int itemdb_combo_split_atoi(char *str, int *val)
+static bool itemdb_read_combodb_libconfig(void)
{
- int i;
-
- nullpo_ret(val);
+ struct config_t combo_conf;
+ char filepath[256];
+ safesnprintf(filepath, sizeof(filepath), "%s/%s/%s", map->db_path, DBPATH, "item_combo_db.conf");
- for (i=0; i<MAX_ITEMS_PER_COMBO; i++) {
- if (!str) break;
+ if (libconfig->load_file(&combo_conf, filepath) == CONFIG_FALSE) {
+ ShowError("itemdb_read_combodb_libconfig: can't read %s\n", filepath);
+ return false;
+ }
- val[i] = atoi(str);
- str = strchr(str,':');
- if (str)
- *str++=0;
+ struct config_setting_t *combo_db = NULL;
+ if ((combo_db = libconfig->setting_get_member(combo_conf.root, "combo_db")) == NULL) {
+ ShowError("itemdb_read_combodb_libconfig: can't read %s\n", filepath);
+ return false;
}
- if( i == 0 ) //No data found.
- return 0;
+ int i = 0;
+ int count = 0;
+ struct config_setting_t *it = NULL;
+
+ while ((it = libconfig->setting_get_elem(combo_db, i++)) != NULL) {
+ if (itemdb->read_combodb_libconfig_sub(it, i - 1, filepath))
+ ++count;
+ }
- return i;
+ libconfig->destroy(&combo_conf);
+ ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, filepath);
+ return true;
}
-/**
- * <combo{:combo{:combo:{..}}}>,<{ script }>
- **/
-static void itemdb_read_combos(void)
+
+static bool itemdb_read_combodb_libconfig_sub(struct config_setting_t *it, int idx, const char *source)
{
- uint32 lines = 0, count = 0;
- char line[1024];
- char filepath[256];
- FILE* fp;
+ nullpo_retr(false, it);
+ nullpo_retr(false, source);
- safesnprintf(filepath, 256, "%s/%s", map->db_path, DBPATH"item_combo_db.txt");
+ struct config_setting_t *t = NULL;
- if ((fp = fopen(filepath, "r")) == NULL) {
- ShowError("itemdb_read_combos: File not found \"%s\".\n", filepath);
- return;
+ if ((t = libconfig->setting_get_member(it, "Items")) == NULL) {
+ ShowWarning("itemdb_read_combodb_libconfig_sub: invalid item list for combo (%d), in (%s), skipping..\n", idx, source);
+ return false;
}
- // process rows one by one
- while(fgets(line, sizeof(line), fp)) {
- char *str[2], *p;
-
- lines++;
-
- if (line[0] == '/' && line[1] == '/')
- continue;
-
- memset(str, 0, sizeof(str));
+ if (!config_setting_is_array(t)) {
+ ShowWarning("itemdb_read_combodb_libconfig_sub: the combo (%d) item list must be an array, in (%s), skipping..\n", idx, source);
+ return false;
+ }
- p = line;
- p = trim(p);
- if (*p == '\0')
- continue;// empty line
+ int len = libconfig->setting_length(t);
+ if (len > MAX_ITEMS_PER_COMBO) {
+ ShowWarning("itemdb_read_combodb_libconfig_sub: the size of combo (%d) item list is too big (%d, max = %d), in (%s), skipping..\n", idx, len, MAX_ITEMS_PER_COMBO, source);
+ return false;
+ }
- if (!strchr(p,',')) {
- /* is there even a single column? */
- ShowError("itemdb_read_combos: Insufficient columns in line %u of \"%s\", skipping.\n", lines, filepath);
- continue;
- }
+ struct item_combo *combo = NULL;
+ RECREATE(itemdb->combos, struct item_combo *, ++itemdb->combo_count);
+ CREATE(combo, struct item_combo, 1);
- str[0] = p;
- p = strchr(p,',');
- *p = '\0';
- p++;
+ combo->id = itemdb->combo_count - 1;
+ combo->count = len;
- str[1] = p;
- p = strchr(p,',');
- p++;
+ for (int i = 0; i < len; i++) {
+ struct item_data *item = NULL;
+ const char *name = libconfig->setting_get_string_elem(t, i);
- if (str[1][0] != '{') {
- ShowError("itemdb_read_combos(#1): Invalid format (Script column) in line %u of \"%s\", skipping.\n", lines, filepath);
- continue;
+ if ((item = itemdb->name2id(name)) == NULL) {
+ ShowWarning("itemdb_read_combodb_libconfig_sub: unknown item '%s', in (%s), skipping..\n", name, source);
+ --itemdb->combo_count;
+ aFree(combo);
+ return false;
}
+ combo->nameid[i] = item->nameid;
+ }
- /* no ending key anywhere (missing \}\) */
- if ( str[1][strlen(str[1])-1] != '}' ) {
- ShowError("itemdb_read_combos(#2): Invalid format (Script column) in line %u of \"%s\", skipping.\n", lines, filepath);
- continue;
- } else {
- int items[MAX_ITEMS_PER_COMBO];
- int v = 0, retcount = 0;
- struct item_combo *combo = NULL;
-
- if((retcount = itemdb->combo_split_atoi(str[0], items)) < 2) {
- ShowError("itemdb_read_combos: line %u of \"%s\" doesn't have enough items to make for a combo (min:2), skipping.\n", lines, filepath);
- continue;
- }
-
- /* validate */
- for(v = 0; v < retcount; v++) {
- if( !itemdb->exists(items[v]) ) {
- ShowError("itemdb_read_combos: line %u of \"%s\" contains unknown item ID %d, skipping.\n", lines, filepath, items[v]);
- break;
- }
- }
- /* failed at some item */
- if( v < retcount )
- continue;
-
- RECREATE(itemdb->combos, struct item_combo*, ++itemdb->combo_count);
-
- CREATE(combo, struct item_combo, 1);
-
- combo->count = retcount;
- combo->script = script->parse(str[1], filepath, lines, 0, NULL);
- combo->id = itemdb->combo_count - 1;
- /* populate ->nameid field */
- for( v = 0; v < retcount; v++ ) {
- combo->nameid[v] = items[v];
- }
-
- itemdb->combos[itemdb->combo_count - 1] = combo;
+ const char *str = NULL;
+ if (libconfig->setting_lookup_string(it, "Script", &str) == CONFIG_TRUE) {
+ combo->script = *str ? script->parse(str, source, -idx, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL;
+ } else {
+ ShowWarning("itemdb_read_combodb_libconfig_sub: invalid script for combo (%d) in (%s), skipping..\n", idx, source);
+ --itemdb->combo_count;
+ aFree(combo);
+ return false;
+ }
- /* populate the items to refer to this combo */
- for( v = 0; v < retcount; v++ ) {
- struct item_data * it;
- int index;
+ itemdb->combos[combo->id] = combo;
- it = itemdb->exists(items[v]);
- index = it->combos_count;
- RECREATE(it->combos, struct item_combo*, ++it->combos_count);
- it->combos[index] = combo;
- }
- }
- count++;
+ /* populate the items to refer to this combo */
+ for (int i = 0; i < len; i++) {
+ struct item_data *item = itemdb->exists(combo->nameid[i]);
+ RECREATE(item->combos, struct item_combo *, ++item->combos_count);
+ item->combos[item->combos_count - 1] = combo;
}
- fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%"PRIu32""CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, DBPATH"item_combo_db.txt");
-
- return;
+ return true;
}
/*======================================
@@ -1753,6 +1719,14 @@ static int itemdb_validate_entry(struct item_data *entry, int n, const char *sou
script->free_code(entry->unequip_script);
entry->unequip_script = NULL;
}
+ if (entry->rental_start_script != NULL) {
+ script->free_code(entry->rental_start_script);
+ entry->rental_start_script = NULL;
+ }
+ if (entry->rental_end_script != NULL) {
+ script->free_code(entry->rental_end_script);
+ entry->rental_end_script = NULL;
+ }
return 0;
#if PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114
}
@@ -1783,6 +1757,14 @@ static int itemdb_validate_entry(struct item_data *entry, int n, const char *sou
script->free_code(entry->unequip_script);
entry->unequip_script = NULL;
}
+ if (entry->rental_start_script != NULL) {
+ script->free_code(entry->rental_start_script);
+ entry->rental_start_script = NULL;
+ }
+ if (entry->rental_end_script != NULL) {
+ script->free_code(entry->rental_end_script);
+ entry->rental_end_script = NULL;
+ }
return 0;
}
}
@@ -1910,7 +1892,14 @@ static int itemdb_validate_entry(struct item_data *entry, int n, const char *sou
script->free_code(item->unequip_script);
item->unequip_script = NULL;
}
-
+ if (item->rental_start_script != NULL && item->rental_start_script != entry->rental_start_script) { // Don't free if it's inheriting the same script
+ script->free_code(item->rental_start_script);
+ item->rental_start_script = NULL;
+ }
+ if (item->rental_end_script != NULL && item->rental_end_script != entry->rental_end_script) { // Don't free if it's inheriting the same script
+ script->free_code(item->rental_end_script);
+ item->rental_end_script = NULL;
+ }
*item = *entry;
return item->nameid;
}
@@ -2026,6 +2015,8 @@ static int itemdb_readdb_libconfig_sub(struct config_setting_t *it, int n, const
* ">
* OnEquipScript: <" OnEquip Script ">
* OnUnequipScript: <" OnUnequip Script ">
+ * OnRentalStartScript: <" on renting script ">
+ * OnRentalEndScript: <" on renting end script ">
* Inherit: inherit or override
*/
if( !itemdb->lookup_const(it, "Id", &i32) ) {
@@ -2303,6 +2294,12 @@ static int itemdb_readdb_libconfig_sub(struct config_setting_t *it, int n, const
if( libconfig->setting_lookup_string(it, "OnUnequipScript", &str) )
id.unequip_script = *str ? script->parse(str, source, -id.nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL;
+ if (libconfig->setting_lookup_string(it, "OnRentalStartScript", &str) != CONFIG_FALSE)
+ id.rental_start_script = (*str != '\0') ? script->parse(str, source, -id.nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL;
+
+ if (libconfig->setting_lookup_string(it, "OnRentalEndScript", &str) != CONFIG_FALSE)
+ id.rental_end_script = (*str != '\0') ? script->parse(str, source, -id.nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL;
+
return itemdb->validate_entry(&id, n, source);
}
@@ -2488,7 +2485,7 @@ static void itemdb_read(bool minimal)
itemdb->name_constants();
- itemdb->read_combos();
+ itemdb->read_combodb_libconfig();
itemdb->read_groups();
itemdb->read_chains();
itemdb->read_packages();
@@ -2546,6 +2543,10 @@ static void destroy_item_data(struct item_data *self, int free_self)
script->free_code(self->equip_script);
if( self->unequip_script )
script->free_code(self->unequip_script);
+ if (self->rental_start_script != NULL)
+ script->free_code(self->rental_start_script);
+ if (self->rental_end_script != NULL)
+ script->free_code(self->rental_end_script);
if( self->combos )
aFree(self->combos);
HPM->data_store_destroy(&self->hdata);
@@ -2832,8 +2833,8 @@ void itemdb_defaults(void)
itemdb->isrestricted = itemdb_isrestricted;
itemdb->isidentified = itemdb_isidentified;
itemdb->isidentified2 = itemdb_isidentified2;
- itemdb->combo_split_atoi = itemdb_combo_split_atoi;
- itemdb->read_combos = itemdb_read_combos;
+ itemdb->read_combodb_libconfig = itemdb_read_combodb_libconfig;
+ itemdb->read_combodb_libconfig_sub = itemdb_read_combodb_libconfig_sub;
itemdb->gendercheck = itemdb_gendercheck;
itemdb->validate_entry = itemdb_validate_entry;
itemdb->readdb_options_additional_fields = itemdb_readdb_options_additional_fields;
diff --git a/src/map/itemdb.h b/src/map/itemdb.h
index d097bba9c..e3264d7d8 100644
--- a/src/map/itemdb.h
+++ b/src/map/itemdb.h
@@ -139,7 +139,6 @@ enum item_itemid {
ITEMID_COATING_BOTTLE = 7139,
ITEMID_FRAGMENT_OF_CRYSTAL = 7321,
ITEMID_SKULL_ = 7420,
- ITEMID_TOKEN_OF_SIEGFRIED = 7621,
ITEMID_SPECIAL_ALLOY_TRAP = 7940,
ITEMID_CATNIP_FRUIT = 11602,
ITEMID_RED_POUCH_OF_SURPRISE = 12024,
@@ -359,6 +358,7 @@ enum geneticist_item_list {
//
enum e_chain_cache {
ECC_ORE,
+ ECC_SIEGFRIED,
/* */
ECC_MAX,
};
@@ -526,6 +526,8 @@ struct item_data {
struct script_code *script; ///< Default script for everything.
struct script_code *equip_script; ///< Script executed once when equipping.
struct script_code *unequip_script; ///< Script executed once when unequipping.
+ struct script_code *rental_start_script; ///< Script executed once this item get rented
+ struct script_code *rental_end_script; ///< Script executed once this item rent ends
struct {
unsigned available : 1;
unsigned no_refine : 1; // [celest]
@@ -676,8 +678,8 @@ struct itemdb_interface {
int (*isrestricted) (struct item *item, int gmlv, int gmlv2, int(*func)(struct item_data *, int, int));
int (*isidentified) (int nameid);
int (*isidentified2) (struct item_data *data);
- int (*combo_split_atoi) (char *str, int *val);
- void (*read_combos) (void);
+ bool (*read_combodb_libconfig) (void);
+ bool (*read_combodb_libconfig_sub) (struct config_setting_t *it, int idx, const char *source);
int (*gendercheck) (struct item_data *id);
int (*validate_entry) (struct item_data *entry, int n, const char *source);
void (*readdb_options_additional_fields) (struct itemdb_option *ito, struct config_setting_t *t, const char *source);
diff --git a/src/map/map.c b/src/map/map.c
index f92be52e9..332bbe75f 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -2268,30 +2268,25 @@ static struct map_session_data *map_charid2sd(int charid)
* (without sensitive case if necessary)
* return map_session_data pointer or NULL
*------------------------------------------*/
-static struct map_session_data *map_nick2sd(const char *nick)
+static struct map_session_data *map_nick2sd(const char *nick, bool allow_partial)
{
- struct map_session_data* sd;
- struct map_session_data* found_sd;
- struct s_mapiterator* iter;
- size_t nicklen;
- int qty = 0;
-
- if( nick == NULL )
+ if (nick == NULL)
return NULL;
- nicklen = strlen(nick);
- iter = mapit_getallusers();
+ struct s_mapiterator *iter = mapit_getallusers();
+ struct map_session_data *found_sd = NULL;
+
+ if (battle_config.partial_name_scan && allow_partial) {
+ int nicklen = (int)strlen(nick);
+ int qty = 0;
- found_sd = NULL;
- for (sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) {
- if( battle_config.partial_name_scan )
- {// partial name search
- if( strnicmp(sd->status.name, nick, nicklen) == 0 )
- {
+ // partial name search
+ for (struct map_session_data *sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) {
+ if (strnicmp(sd->status.name, nick, nicklen) == 0) {
found_sd = sd;
- if( strcmp(sd->status.name, nick) == 0 )
- {// Perfect Match
+ if (strcmp(sd->status.name, nick) == 0) {
+ // Perfect Match
qty = 1;
break;
}
@@ -2299,17 +2294,20 @@ static struct map_session_data *map_nick2sd(const char *nick)
qty++;
}
}
- else if( strcasecmp(sd->status.name, nick) == 0 )
- {// exact search only
- found_sd = sd;
- break;
+
+ if (qty != 1)
+ found_sd = NULL;
+ } else {
+ // exact search only
+ for (struct map_session_data *sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) {
+ if (strcasecmp(sd->status.name, nick) == 0) {
+ found_sd = sd;
+ break;
+ }
}
}
mapit->free(iter);
- if( battle_config.partial_name_scan && qty != 1 )
- found_sd = NULL;
-
return found_sd;
}
diff --git a/src/map/map.h b/src/map/map.h
index 39eb07e4c..6b360e1bc 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -1208,7 +1208,7 @@ END_ZEROED_BLOCK;
void (*addiddb) (struct block_list *bl);
void (*deliddb) (struct block_list *bl);
/* */
- struct map_session_data * (*nick2sd) (const char *nick);
+ struct map_session_data * (*nick2sd) (const char *nick, bool allow_partial);
struct mob_data * (*getmob_boss) (int16 m);
struct mob_data * (*id2boss) (int id);
uint32 (*race_id2mask) (int race);
diff --git a/src/map/mapdefines.h b/src/map/mapdefines.h
index df9e9bccb..348ca98fd 100644
--- a/src/map/mapdefines.h
+++ b/src/map/mapdefines.h
@@ -21,6 +21,8 @@
#ifndef MAP_MAPDEFINES_H
#define MAP_MAPDEFINES_H
+#include "common/mmo.h" // packet versions
+
#define MAX_NPC_PER_MAP 512
#define AREA_SIZE (battle->bc->area_size)
#define CHAT_AREA_SIZE (battle->bc->chat_area_size)
@@ -57,8 +59,14 @@
#define MAPID_UPPERMASK 0x0fff
#define MAPID_THIRDMASK (JOBL_THIRD|MAPID_UPPERMASK)
-// Max size for inputs to Graffiti, Talkie Box and Vending text prompts
+// Max size for inputs to Vending text prompts
#define MESSAGE_SIZE (79 + 1)
+// Max size for inputs to Graffiti, Talkie Box text prompts
+#if PACKETVER_MAIN_NUM >= 20190904 || PACKETVER_RE_NUM >= 20190904 || PACKETVER_ZERO_NUM >= 20190828
+#define TALKBOX_MESSAGE_SIZE 21
+#else
+#define TALKBOX_MESSAGE_SIZE (79 + 1)
+#endif
// String length you can write in the 'talking box'
#define CHATBOX_SIZE (70 + 1)
// Chatroom-related string sizes
diff --git a/src/map/messages_main.h b/src/map/messages_main.h
index bc5bcf55d..1ef24d6ab 100644
--- a/src/map/messages_main.h
+++ b/src/map/messages_main.h
@@ -24,7 +24,7 @@
/* This file is autogenerated, please do not commit manual changes
-Latest version: 20190821
+Latest version: 20190918
*/
enum clif_messages {
@@ -21875,6 +21875,92 @@ Sold Out
*/
MSG_ID_E50 = 0xe50,
#endif
+#if PACKETVER >= 20190828
+/*20190828 to latest
+장착 중인 아이템은 교환할 수 없습니다. 장착을 해제한 뒤 시도해 주시길 바랍니다.
+*/
+ MSG_ID_E51 = 0xe51,
+#endif
+#if PACKETVER >= 20190904
+/*20190904 to latest
+길드 창고 이용 중엔 캐릭터 선택창으로 이동 할 수 없습니다.
+*/
+ MSG_ID_E52 = 0xe52,
+/*20190904 to latest
+아이템 태그가 포함되어 있어 사용할 수 없습니다.
+*/
+ MSG_ID_E53 = 0xe53,
+/*20190904 to latest
+Monster
+*/
+ MSG_ID_E54 = 0xe54,
+/*20190904 to latest
+Unknown
+*/
+ MSG_ID_E55 = 0xe55,
+/*20190904 to latest
+Undead
+*/
+ MSG_ID_E56 = 0xe56,
+/*20190904 to latest
+Animal
+*/
+ MSG_ID_E57 = 0xe57,
+/*20190904 to latest
+Plant
+*/
+ MSG_ID_E58 = 0xe58,
+/*20190904 to latest
+Insect
+*/
+ MSG_ID_E59 = 0xe59,
+/*20190904 to latest
+Marine
+*/
+ MSG_ID_E5A = 0xe5a,
+/*20190904 to latest
+Devil
+*/
+ MSG_ID_E5B = 0xe5b,
+/*20190904 to latest
+Human
+*/
+ MSG_ID_E5C = 0xe5c,
+/*20190904 to latest
+Angel
+*/
+ MSG_ID_E5D = 0xe5d,
+/*20190904 to latest
+Dragon
+*/
+ MSG_ID_E5E = 0xe5e,
+#endif
+#if PACKETVER >= 20190918
+/*20190918 to latest
+Balance: %s %c
+*/
+ MSG_ID_E5F = 0xe5f,
+/*20190918 to latest
+ ^ff0000본 아이템을 구매 후 7일 이내에는 청약 철회가 가능합니다. 다만, 7일이 지났거나 아이템을 개봉하시면 청약 철회 대상에서 제외 됩니다.또한 구매시 사용된 무료캐시는 청약철회시 반환되지 않습니다.^000000 정말로 아이템을 구매하시겠습니까? 구매하실 경우 %s캐시가 차감됩니다.
+*/
+ MSG_ID_E60 = 0xe60,
+/*20190918 to latest
+ ^ff0000본 아이템을 구매 후 7일 이내에는 청약 철회가 가능합니다. 다만, 7일이 지났거나 아이템을 개봉하시면 청약 철회 대상에서 제외 됩니다.또한 구매시 사용된 무료캐시는 청약철회시 반환되지 않습니다.^000000 정말로 아이템을 구매하시겠습니까? 구매하실 경우 일반 %s캐시, 무료 %s캐시가 차감됩니다.
+*/
+ MSG_ID_E61 = 0xe61,
+/*20190918 to latest
+[%s]의 호출이 거부되었습니다.
+*/
+ MSG_ID_E62 = 0xe62,
+/*20190918 to latest
+구매 한도액은 소지액을 초과할 수 없습니다.
+*/
+ MSG_ID_E63 = 0xe63,
+/*20190918 to latest
+노점을 여는데 실패하였습니다. 구매노점 개설을 닫아주시기 바랍니다.
+*/
+ MSG_ID_E64 = 0xe64,
+#endif
};
#endif /* MAP_MESSAGES_MAIN_H */
diff --git a/src/map/messages_re.h b/src/map/messages_re.h
index efebecdb2..4ae3dee1d 100644
--- a/src/map/messages_re.h
+++ b/src/map/messages_re.h
@@ -24,7 +24,7 @@
/* This file is autogenerated, please do not commit manual changes
-Latest version: 20190821
+Latest version: 20190918
*/
enum clif_messages {
@@ -21354,6 +21354,92 @@ Sold Out
*/
MSG_ID_E50 = 0xe50,
#endif
+#if PACKETVER >= 20190828
+/*20190828 to latest
+장착 중인 아이템은 교환할 수 없습니다. 장착을 해제한 뒤 시도해 주시길 바랍니다.
+*/
+ MSG_ID_E51 = 0xe51,
+#endif
+#if PACKETVER >= 20190904
+/*20190904 to latest
+길드 창고 이용 중엔 캐릭터 선택창으로 이동 할 수 없습니다.
+*/
+ MSG_ID_E52 = 0xe52,
+/*20190904 to latest
+아이템 태그가 포함되어 있어 사용할 수 없습니다.
+*/
+ MSG_ID_E53 = 0xe53,
+/*20190904 to latest
+Monster
+*/
+ MSG_ID_E54 = 0xe54,
+/*20190904 to latest
+Unknown
+*/
+ MSG_ID_E55 = 0xe55,
+/*20190904 to latest
+Undead
+*/
+ MSG_ID_E56 = 0xe56,
+/*20190904 to latest
+Animal
+*/
+ MSG_ID_E57 = 0xe57,
+/*20190904 to latest
+Plant
+*/
+ MSG_ID_E58 = 0xe58,
+/*20190904 to latest
+Insect
+*/
+ MSG_ID_E59 = 0xe59,
+/*20190904 to latest
+Marine
+*/
+ MSG_ID_E5A = 0xe5a,
+/*20190904 to latest
+Devil
+*/
+ MSG_ID_E5B = 0xe5b,
+/*20190904 to latest
+Human
+*/
+ MSG_ID_E5C = 0xe5c,
+/*20190904 to latest
+Angel
+*/
+ MSG_ID_E5D = 0xe5d,
+/*20190904 to latest
+Dragon
+*/
+ MSG_ID_E5E = 0xe5e,
+#endif
+#if PACKETVER >= 20190918
+/*20190918 to latest
+Balance: %s %c
+*/
+ MSG_ID_E5F = 0xe5f,
+/*20190918 to latest
+ ^ff0000본 아이템을 구매 후 7일 이내에는 청약 철회가 가능합니다. 다만, 7일이 지났거나 아이템을 개봉하시면 청약 철회 대상에서 제외 됩니다.또한 구매시 사용된 무료캐시는 청약철회시 반환되지 않습니다.^000000 정말로 아이템을 구매하시겠습니까? 구매하실 경우 %s캐시가 차감됩니다.
+*/
+ MSG_ID_E60 = 0xe60,
+/*20190918 to latest
+ ^ff0000본 아이템을 구매 후 7일 이내에는 청약 철회가 가능합니다. 다만, 7일이 지났거나 아이템을 개봉하시면 청약 철회 대상에서 제외 됩니다.또한 구매시 사용된 무료캐시는 청약철회시 반환되지 않습니다.^000000 정말로 아이템을 구매하시겠습니까? 구매하실 경우 일반 %s캐시, 무료 %s캐시가 차감됩니다.
+*/
+ MSG_ID_E61 = 0xe61,
+/*20190918 to latest
+호출이 거부되었습니다.
+*/
+ MSG_ID_E62 = 0xe62,
+/*20190918 to latest
+구매 한도액은 소지액을 초과할 수 없습니다.
+*/
+ MSG_ID_E63 = 0xe63,
+/*20190918 to latest
+노점을 여는데 실패하였습니다. 구매노점 개설을 닫아주시기 바랍니다.
+*/
+ MSG_ID_E64 = 0xe64,
+#endif
};
#endif /* MAP_MESSAGES_RE_H */
diff --git a/src/map/messages_zero.h b/src/map/messages_zero.h
index 344dbb29e..039d215ac 100644
--- a/src/map/messages_zero.h
+++ b/src/map/messages_zero.h
@@ -24,7 +24,7 @@
/* This file is autogenerated, please do not commit manual changes
-Latest version: 20190814
+Latest version: 20190918
*/
enum clif_messages {
@@ -17922,8 +17922,10 @@ Sale Start Time
계정 한정
*/
MSG_ID_E48 = 0xe48,
-/*20190814 to latest
+/*20190814 to 20190814
판매기간 : %d월 %d일 ~ %d월 %d일
+20190828 to latest
+판매기간 : %d월 %d일 %d시 %d분
*/
MSG_ID_E49 = 0xe49,
/*20190814 to latest
@@ -17947,6 +17949,102 @@ Sold Out
*/
MSG_ID_E4E = 0xe4e,
#endif
+#if PACKETVER >= 20190828
+/*20190828 to latest
+~ %d월 %d일 %d시 %d분
+*/
+ MSG_ID_E4F = 0xe4f,
+/*20190828 to latest
+상품을 더이상 추가할 수 없습니다
+*/
+ MSG_ID_E50 = 0xe50,
+/*20190828 to latest
+장착 중인 아이템은 교환할 수 없습니다. 장착을 해제한 뒤 시도해 주시길 바랍니다.
+*/
+ MSG_ID_E51 = 0xe51,
+#endif
+#if PACKETVER >= 20190911
+/*20190911 to latest
+길드 창고 이용 중엔 캐릭터 선택창으로 이동 할 수 없습니다.
+*/
+ MSG_ID_E52 = 0xe52,
+/*20190911 to latest
+아이템 태그가 포함되어 있어 사용할 수 없습니다.
+*/
+ MSG_ID_E53 = 0xe53,
+/*20190911 to latest
+Monster
+*/
+ MSG_ID_E54 = 0xe54,
+/*20190911 to latest
+Unknown
+*/
+ MSG_ID_E55 = 0xe55,
+/*20190911 to latest
+Undead
+*/
+ MSG_ID_E56 = 0xe56,
+/*20190911 to latest
+Animal
+*/
+ MSG_ID_E57 = 0xe57,
+/*20190911 to latest
+Plant
+*/
+ MSG_ID_E58 = 0xe58,
+/*20190911 to latest
+Insect
+*/
+ MSG_ID_E59 = 0xe59,
+/*20190911 to latest
+Marine
+*/
+ MSG_ID_E5A = 0xe5a,
+/*20190911 to latest
+Devil
+*/
+ MSG_ID_E5B = 0xe5b,
+/*20190911 to latest
+Human
+*/
+ MSG_ID_E5C = 0xe5c,
+/*20190911 to latest
+Angel
+*/
+ MSG_ID_E5D = 0xe5d,
+/*20190911 to latest
+Dragon
+*/
+ MSG_ID_E5E = 0xe5e,
+/*20190911 to latest
+Balance: %s %c
+*/
+ MSG_ID_E5F = 0xe5f,
+/*20190911 to latest
+ ^ff0000본 아이템을 구매 후 7일 이내에는 청약 철회가 가능합니다. 다만, 7일이 지났거나 아이템을 개봉하시면 청약 철회 대상에서 제외 됩니다.또한 구매시 사용된 무료캐시는 청약철회시 반환되지 않습니다.^000000 정말로 아이템을 구매하시겠습니까? 구매하실 경우 %s캐시가 차감됩니다.
+*/
+ MSG_ID_E60 = 0xe60,
+/*20190911 to latest
+ ^ff0000본 아이템을 구매 후 7일 이내에는 청약 철회가 가능합니다. 다만, 7일이 지났거나 아이템을 개봉하시면 청약 철회 대상에서 제외 됩니다.또한 구매시 사용된 무료캐시는 청약철회시 반환되지 않습니다.^000000 정말로 아이템을 구매하시겠습니까? 구매하실 경우 일반 %s캐시, 무료 %s캐시가 차감됩니다.
+*/
+ MSG_ID_E61 = 0xe61,
+/*20190911 to 20190911
+호출이 거부되었습니다.
+20190918 to latest
+[%s]의 호출이 거부되었습니다.
+*/
+ MSG_ID_E62 = 0xe62,
+#endif
+#if PACKETVER >= 20190918
+/*20190918 to latest
+구매 한도액은 소지액을 초과할 수 없습니다.
+*/
+ MSG_ID_E63 = 0xe63,
+/*20190918 to latest
+노점을 여는데 실패하였습니다. 구매노점 개설을 닫아주시기 바랍니다.
+*/
+ MSG_ID_E64 = 0xe64,
+#endif
};
#endif /* MAP_MESSAGES_ZERO_H */
diff --git a/src/map/mob.c b/src/map/mob.c
index bad3f7eb8..e04d6944e 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -239,6 +239,14 @@ static void mvptomb_destroy(struct mob_data *md)
m = nd->bl.m;
+ struct s_mapiterator *iter = mapit_geteachpc();
+ for (struct map_session_data *sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); sd = BL_UCAST(BL_PC, mapit->next(iter))) {
+ if (sd->npc_id == nd->bl.id) {
+ sd->state.npc_unloaded = 1;
+ }
+ }
+ mapit->free(iter);
+
clif->clearunit_area(&nd->bl,CLR_OUTSIGHT);
map->delblock(&nd->bl);
diff --git a/src/map/npc.c b/src/map/npc.c
index c3dff5870..868b8711a 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -1258,6 +1258,9 @@ static void run_tomb(struct map_session_data *sd, struct npc_data *nd)
char time[10];
nullpo_retv(nd);
+
+ sd->npc_id = nd->bl.id;
+
strftime(time, sizeof(time), "%H:%M", localtime(&nd->u.tomb.kill_time));
// TODO: Find exact color?
@@ -1349,8 +1352,10 @@ static int npc_scriptcont(struct map_session_data *sd, int id, bool closing)
return 1;
}
- if(id != npc->fake_nd->bl.id) { // Not item script
- if ((npc->checknear(sd,target)) == NULL){
+ if (id != npc->fake_nd->bl.id) { // Not item script
+ if (sd->state.npc_unloaded != 0) {
+ sd->state.npc_unloaded = 0;
+ } else if ((npc->checknear(sd,target)) == NULL) {
ShowWarning("npc_scriptcont: failed npc->checknear test.\n");
return 1;
}
@@ -1371,8 +1376,10 @@ static int npc_scriptcont(struct map_session_data *sd, int id, bool closing)
if( sd->progressbar.npc_id && DIFF_TICK(sd->progressbar.timeout,timer->gettick()) > 0 )
return 1;
- if( !sd->st )
+ if( !sd->st ) {
+ sd->npc_id = 0;
return 1;
+ }
if( closing && sd->st->state == CLOSE )
sd->st->state = END;
diff --git a/src/map/packets.h b/src/map/packets.h
index 83a9d0322..e91421cfc 100644
--- a/src/map/packets.h
+++ b/src/map/packets.h
@@ -1954,4 +1954,9 @@ packet(0x96e,clif->ackmergeitems);
packet(0x0b22,clif->pHotkeyRowShift2); // CZ_SHORTCUTKEYBAR_ROTATE
#endif
+#if PACKETVER_MAIN_NUM >= 20190522 || PACKETVER_RE_NUM >= 20190522 || PACKETVER_ZERO_NUM >= 20190515
+ packet(0x0b28,clif->pGuildCastleTeleportRequest);
+ packet(0x0b2c,clif->pGuildCastleInfoRequest);
+#endif
+
#endif /* MAP_PACKETS_H */
diff --git a/src/map/packets_keys_main.h b/src/map/packets_keys_main.h
index 565835cd7..b7f25a83d 100644
--- a/src/map/packets_keys_main.h
+++ b/src/map/packets_keys_main.h
@@ -37,7 +37,7 @@
packetKeys(0x49357d72,0x22c370a1,0x5f836591);
#endif
-// 2010-11-23aRagexeRE, 2010-11-24aRagexeRE, 2010-11-24bRagexeRE, 2010-11-25aRagexeRE, 2010-11-26aRagexeRE, 2010-11-30aRagexeRE, 2010-12-07aRagexeRE, 2010-12-14aRagexeRE, 2010-12-21aRagexeRE, 2010-12-23aRagexeRE, 2010-12-28aRagexeRE, 2011-01-04aRagexeRE, 2011-01-05aRagexeRE, 2011-01-11aRagexeRE, 2011-01-18aRagexeRE, 2011-01-25aRagexeRE, 2011-01-26aRagexeRE, 2011-01-26bRagexeRE, 2011-01-31aRagexeRE, 2011-01-31bRagexeRE, 2011-01-31cRagexeRE, 2011-02-08aRagexeRE, 2011-02-15aRagexeRE, 2011-02-22aRagexeRE, 2011-02-23aRagexeRE, 2011-02-23bRagexeRE, 2011-02-24aRagexeRE, 2011-02-25aRagexeRE, 2011-02-28aRagexeRE, 2011-03-08aRagexeRE, 2011-03-09aRagexeRE, 2011-03-09bRagexeRE, 2011-03-09cRagexeRE, 2011-03-09dRagexeRE, 2011-03-15aRagexeRE, 2011-03-22aRagexeRE, 2011-03-29aRagexeRE, 2011-03-30aRagexeRE, 2011-03-30cRagexeRE, 2011-04-05aRagexeRE, 2011-04-12aRagexeRE, 2011-04-19aRagexeRE, 2011-04-20aRagexeRE, 2011-04-26aRagexeRE, 2011-04-27aRagexeRE, 2011-05-03aRagexeRE, 2011-05-11aRagexeRE, 2011-05-17bRagexeRE, 2011-05-24aRagexeRE, 2011-05-26aRagexeRE, 2011-05-31aRagexeRE, 2011-06-07aRagexeRE, 2011-06-08aRagexeRE, 2011-06-08bRagexeRE, 2011-06-08cRagexeRE, 2011-06-09aRagexeRE, 2011-06-14bRagexeRE, 2011-06-22aRagexeRE, 2011-06-28aRagexeRE, 2011-07-06aRagexeRE, 2011-07-13aRagexeRE, 2011-07-13bRagexeRE, 2011-07-13cRagexeRE, 2011-07-19aRagexeRE, 2011-07-26aRagexeRE, 2011-08-03aRagexeRE, 2011-08-03bRagexeRE, 2011-08-10aRagexeRE, 2013-12-23aRagexeRE, 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-21aRagexeRE, 2018-03-28bRagexe, 2018-03-28bRagexeRE, 2018-04-04bRagexe, 2018-04-04cRagexeRE, 2018-04-18aRagexe, 2018-04-18bRagexeRE, 2018-04-25cRagexe, 2018-04-25cRagexeRE, 2018-05-02bRagexe, 2018-05-02bRagexeRE, 2018-05-02dRagexeRE, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-16cRagexeRE, 2018-05-23aRagexe, 2018-05-23aRagexeRE, 2018-05-30aRagexe, 2018-05-30bRagexeRE, 2018-05-30cRagexeRE, 2018-06-05bRagexe, 2018-06-05bRagexeRE, 2018-06-12aRagexeRE, 2018-06-12bRagexeRE, 2018-06-20cRagexe, 2018-06-20dRagexeRE, 2018-06-20eRagexe, 2018-06-20eRagexeRE, 2018-06-21aRagexe, 2018-06-21aRagexeRE, 2018-07-04aRagexe, 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexe, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexe, 2018-07-18cRagexeRE, 2018-08-01cRagexe, 2018-08-01cRagexeRE, 2018-08-08bRagexe, 2018-08-08bRagexeRE, 2018-08-22cRagexe, 2018-08-22cRagexeRE, 2018-08-29aRagexe, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-12dRagexeRE, 2018-09-19aRagexe, 2018-09-19aRagexeRE, 2018-10-02aRagexe, 2018-10-02aRagexeRE, 2018-10-02bRagexe, 2018-10-02bRagexeRE, 2018-10-17_02aRagexe, 2018-10-17_02aRagexeRE, 2018-10-17_03aRagexe, 2018-10-17_03aRagexeRE, 2018-10-17bRagexe, 2018-10-17bRagexeRE, 2018-10-24bRagexe, 2018-10-31aRagexe, 2018-10-31bRagexe, 2018-10-31cRagexeRE, 2018-11-07aRagexe, 2018-11-07aRagexeRE, 2018-11-14cRagexe, 2018-11-14cRagexeRE, 2018-11-14dRagexe, 2018-11-14dRagexeRE, 2018-11-21bRagexe, 2018-11-21cRagexeRE, 2018-11-28aRagexe, 2018-11-28aRagexeRE, 2018-11-28bRagexe, 2018-11-28cRagexe, 2018-12-05aRagexe, 2018-12-05bRagexeRE, 2018-12-12aRagexe, 2018-12-12aRagexeRE, 2018-12-12bRagexe, 2018-12-12bRagexeRE, 2018-12-19bRagexe, 2018-12-19bRagexeRE, 2018-12-26aRagexe, 2018-12-26aRagexeRE, 2019-01-09aRagexe, 2019-01-09bRagexeRE, 2019-01-16bRagexe, 2019-01-16bRagexeRE, 2019-01-16cRagexe, 2019-01-16cRagexeRE, 2019-01-23dRagexe, 2019-01-23dRagexeRE, 2019-02-13IRagexeRE, 2019-02-13bRagexe, 2019-02-13eRagexe, 2019-02-20aRagexeRE, 2019-02-27aRagexe, 2019-02-27bRagexeRE, 2019-02-28aRagexe, 2019-02-28aRagexeRE, 2019-03-06bRagexe, 2019-03-06bRagexeRE, 2019-03-06cRagexe, 2019-03-06cRagexeRE, 2019-03-13aRagexe, 2019-03-20aRagexe, 2019-03-20aRagexeRE, 2019-03-22aRagexe, 2019-03-22aRagexeRE, 2019-03-27bRagexe, 2019-03-27bRagexeRE, 2019-04-03aRagexe, 2019-04-03bRagexeRE, 2019-04-03cRagexeRE, 2019-04-17aRagexe, 2019-04-17cRagexeRE, 2019-04-18aRagexe, 2019-04-18aRagexeRE, 2019-05-08cRagexe, 2019-05-08dRagexeRE, 2019-05-08eRagexeRE, 2019-05-22bRagexe, 2019-05-22bRagexeRE, 2019-05-22cRagexe, 2019-05-22cRagexeRE, 2019-05-23aRagexe, 2019-05-29aRagexe, 2019-05-29bRagexeRE, 2019-05-29cRagexe, 2019-05-29cRagexeRE, 2019-05-30aRagexe, 2019-05-30aRagexeRE, 2019-06-05JRagexeRE, 2019-06-05KRagexe, 2019-06-05LRagexeRE, 2019-06-05fRagexe, 2019-06-05hRagexeRE, 2019-06-19bRagexe, 2019-06-19cRagexeRE, 2019-06-19eRagexe, 2019-06-19hRagexe, 2019-06-26bRagexeRE, 2019-07-03aRagexe, 2019-07-03bRagexeRE, 2019-07-17aRagexe, 2019-07-17cRagexeRE, 2019-07-17dRagexe, 2019-07-17dRagexeRE, 2019-07-24aRagexe, 2019-07-24bRagexeRE, 2019-07-31bRagexe, 2019-07-31bRagexeRE, 2019-08-02aRagexe, 2019-08-02aRagexeRE, 2019-08-07aRagexe, 2019-08-07dRagexeRE, 2019-08-21aRagexe, 2019-08-21cRagexeRE, 2019-08-21dRagexeRE
+// 2010-11-23aRagexeRE, 2010-11-24aRagexeRE, 2010-11-24bRagexeRE, 2010-11-25aRagexeRE, 2010-11-26aRagexeRE, 2010-11-30aRagexeRE, 2010-12-07aRagexeRE, 2010-12-14aRagexeRE, 2010-12-21aRagexeRE, 2010-12-23aRagexeRE, 2010-12-28aRagexeRE, 2011-01-04aRagexeRE, 2011-01-05aRagexeRE, 2011-01-11aRagexeRE, 2011-01-18aRagexeRE, 2011-01-25aRagexeRE, 2011-01-26aRagexeRE, 2011-01-26bRagexeRE, 2011-01-31aRagexeRE, 2011-01-31bRagexeRE, 2011-01-31cRagexeRE, 2011-02-08aRagexeRE, 2011-02-15aRagexeRE, 2011-02-22aRagexeRE, 2011-02-23aRagexeRE, 2011-02-23bRagexeRE, 2011-02-24aRagexeRE, 2011-02-25aRagexeRE, 2011-02-28aRagexeRE, 2011-03-08aRagexeRE, 2011-03-09aRagexeRE, 2011-03-09bRagexeRE, 2011-03-09cRagexeRE, 2011-03-09dRagexeRE, 2011-03-15aRagexeRE, 2011-03-22aRagexeRE, 2011-03-29aRagexeRE, 2011-03-30aRagexeRE, 2011-03-30cRagexeRE, 2011-04-05aRagexeRE, 2011-04-12aRagexeRE, 2011-04-19aRagexeRE, 2011-04-20aRagexeRE, 2011-04-26aRagexeRE, 2011-04-27aRagexeRE, 2011-05-03aRagexeRE, 2011-05-11aRagexeRE, 2011-05-17bRagexeRE, 2011-05-24aRagexeRE, 2011-05-26aRagexeRE, 2011-05-31aRagexeRE, 2011-06-07aRagexeRE, 2011-06-08aRagexeRE, 2011-06-08bRagexeRE, 2011-06-08cRagexeRE, 2011-06-09aRagexeRE, 2011-06-14bRagexeRE, 2011-06-22aRagexeRE, 2011-06-28aRagexeRE, 2011-07-06aRagexeRE, 2011-07-13aRagexeRE, 2011-07-13bRagexeRE, 2011-07-13cRagexeRE, 2011-07-19aRagexeRE, 2011-07-26aRagexeRE, 2011-08-03aRagexeRE, 2011-08-03bRagexeRE, 2011-08-10aRagexeRE, 2013-12-23aRagexeRE, 2014-05-08aRagexe, 2014-05-08aRagexeRE, 2014-06-11eRagexe, 2015-02-25hRagexe, 2018-03-15aRagexe, 2018-03-21aRagexe, 2018-03-21aRagexeRE, 2018-03-28bRagexe, 2018-03-28bRagexeRE, 2018-04-04bRagexe, 2018-04-04cRagexeRE, 2018-04-18aRagexe, 2018-04-18bRagexeRE, 2018-04-25cRagexe, 2018-04-25cRagexeRE, 2018-05-02bRagexe, 2018-05-02bRagexeRE, 2018-05-02dRagexeRE, 2018-05-09aRagexe, 2018-05-16cRagexe, 2018-05-16cRagexeRE, 2018-05-23aRagexe, 2018-05-23aRagexeRE, 2018-05-30aRagexe, 2018-05-30bRagexeRE, 2018-05-30cRagexeRE, 2018-06-05bRagexe, 2018-06-05bRagexeRE, 2018-06-12aRagexeRE, 2018-06-12bRagexeRE, 2018-06-20cRagexe, 2018-06-20dRagexeRE, 2018-06-20eRagexe, 2018-06-20eRagexeRE, 2018-06-21aRagexe, 2018-06-21aRagexeRE, 2018-07-04aRagexe, 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexe, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexe, 2018-07-18cRagexeRE, 2018-08-01cRagexe, 2018-08-01cRagexeRE, 2018-08-08bRagexe, 2018-08-08bRagexeRE, 2018-08-22cRagexe, 2018-08-22cRagexeRE, 2018-08-29aRagexe, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-08-31aRagexe, 2018-09-12dRagexe, 2018-09-12dRagexeRE, 2018-09-19aRagexe, 2018-09-19aRagexeRE, 2018-10-02aRagexe, 2018-10-02aRagexeRE, 2018-10-02bRagexe, 2018-10-02bRagexeRE, 2018-10-17_02aRagexe, 2018-10-17_02aRagexeRE, 2018-10-17_03aRagexe, 2018-10-17_03aRagexeRE, 2018-10-17bRagexe, 2018-10-17bRagexeRE, 2018-10-24bRagexe, 2018-10-31aRagexe, 2018-10-31bRagexe, 2018-10-31cRagexeRE, 2018-11-07aRagexe, 2018-11-07aRagexeRE, 2018-11-14cRagexe, 2018-11-14cRagexeRE, 2018-11-14dRagexe, 2018-11-14dRagexeRE, 2018-11-21bRagexe, 2018-11-21cRagexeRE, 2018-11-28aRagexe, 2018-11-28aRagexeRE, 2018-11-28bRagexe, 2018-11-28cRagexe, 2018-12-05aRagexe, 2018-12-05bRagexeRE, 2018-12-12aRagexe, 2018-12-12aRagexeRE, 2018-12-12bRagexe, 2018-12-12bRagexeRE, 2018-12-19bRagexe, 2018-12-19bRagexeRE, 2018-12-26aRagexe, 2018-12-26aRagexeRE, 2019-01-09aRagexe, 2019-01-09bRagexeRE, 2019-01-16bRagexe, 2019-01-16bRagexeRE, 2019-01-16cRagexe, 2019-01-16cRagexeRE, 2019-01-23dRagexe, 2019-01-23dRagexeRE, 2019-02-13IRagexeRE, 2019-02-13bRagexe, 2019-02-13eRagexe, 2019-02-20aRagexeRE, 2019-02-27aRagexe, 2019-02-27bRagexeRE, 2019-02-28aRagexe, 2019-02-28aRagexeRE, 2019-03-06bRagexe, 2019-03-06bRagexeRE, 2019-03-06cRagexe, 2019-03-06cRagexeRE, 2019-03-13aRagexe, 2019-03-20aRagexe, 2019-03-20aRagexeRE, 2019-03-22aRagexe, 2019-03-22aRagexeRE, 2019-03-27bRagexe, 2019-03-27bRagexeRE, 2019-04-03aRagexe, 2019-04-03bRagexeRE, 2019-04-03cRagexeRE, 2019-04-17aRagexe, 2019-04-17cRagexeRE, 2019-04-18aRagexe, 2019-04-18aRagexeRE, 2019-05-08cRagexe, 2019-05-08dRagexeRE, 2019-05-08eRagexeRE, 2019-05-22bRagexe, 2019-05-22bRagexeRE, 2019-05-22cRagexe, 2019-05-22cRagexeRE, 2019-05-23aRagexe, 2019-05-29aRagexe, 2019-05-29bRagexeRE, 2019-05-29cRagexe, 2019-05-29cRagexeRE, 2019-05-30aRagexe, 2019-05-30aRagexeRE, 2019-06-05JRagexeRE, 2019-06-05KRagexe, 2019-06-05LRagexeRE, 2019-06-05fRagexe, 2019-06-05hRagexeRE, 2019-06-19bRagexe, 2019-06-19cRagexeRE, 2019-06-19eRagexe, 2019-06-19hRagexe, 2019-06-26bRagexeRE, 2019-07-03aRagexe, 2019-07-03bRagexeRE, 2019-07-17aRagexe, 2019-07-17cRagexeRE, 2019-07-17dRagexe, 2019-07-17dRagexeRE, 2019-07-24aRagexe, 2019-07-24bRagexeRE, 2019-07-31bRagexe, 2019-07-31bRagexeRE, 2019-08-02aRagexe, 2019-08-02aRagexeRE, 2019-08-07aRagexe, 2019-08-07dRagexeRE, 2019-08-21aRagexe, 2019-08-21cRagexeRE, 2019-08-21dRagexeRE, 2019-08-28aRagexe, 2019-08-28aRagexeRE, 2019-09-04aRagexe, 2019-09-04bRagexe, 2019-09-04bRagexeRE, 2019-09-18bRagexe, 2019-09-18cRagexeRE
#if PACKETVER == 20101123 || \
PACKETVER == 20101124 || \
PACKETVER == 20101125 || \
@@ -162,7 +162,10 @@
PACKETVER == 20190731 || \
PACKETVER == 20190802 || \
PACKETVER == 20190807 || \
- PACKETVER >= 20190821
+ PACKETVER == 20190821 || \
+ PACKETVER == 20190828 || \
+ PACKETVER == 20190904 || \
+ PACKETVER >= 20190918
packetKeys(0x00000000,0x00000000,0x00000000);
#endif
diff --git a/src/map/packets_keys_zero.h b/src/map/packets_keys_zero.h
index 0e70ef641..2708d11e1 100644
--- a/src/map/packets_keys_zero.h
+++ b/src/map/packets_keys_zero.h
@@ -30,7 +30,7 @@
/* This file is autogenerated, please do not commit manual changes */
-// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero, 2018-09-28aRagexe_zero, 2018-10-10_2aRagexe_zero, 2018-10-24_2aRagexe_zero, 2018-11-14aRagexe_zero, 2018-11-20aRagexe_zero, 2018-11-28aRagexe_zero, 2018-12-12aRagexe_zero, 2018-12-19aRagexe_zero, 2018-12-26_2aRagexe_zero, 2019-01-16_2aRagexe_zero, 2019-01-17_1aRagexe_zero, 2019-01-30_2aRagexe_zero, 2019-02-13aRagexe_zero, 2019-02-20aRagexe_zero, 2019-02-27aRagexe_zero, 2019-03-13aRagexe_zero, 2019-03-27_2aRagexe_zero, 2019-03-27_3aRagexe_zero, 2019-04-03aRagexe_zero, 2019-04-10bRagexe_zero, 2019-04-24aRagexe_zero, 2019-05-02aRagexe_zero, 2019-05-08_2aRagexe_zero, 2019-05-08aRagexe_zero, 2019-05-15aRagexe_zero, 2019-05-29aRagexe_zero, 2019-05-30aRagexe_zero, 2019-06-05_2aRagexe_zero, 2019-06-26_2aRagexe_zero, 2019-06-26_3aRagexe_zero, 2019-07-09aRagexe_zero, 2019-07-10_3aRagexe_zero, 2019-07-17aRagexe_zero, 2019-07-24aRagexe_zero, 2019-08-14_3aRagexe_zero
+// 2017-10-18aRagexe_zero, 2017-10-19aRagexe_zero, 2017-10-23aRagexe_zero, 2017-10-23bRagexe_zero, 2017-10-23cRagexe_zero, 2017-10-24aRagexe_2_zero, 2017-10-24aRagexe_zero, 2017-10-25bRagexe_zero, 2017-10-27aRagexe_zero, 2017-10-27bRagexe_zero, 2017-10-30aRagexe_zero, 2017-10-31aRagexe_zero, 2017-11-09aRagexe_zero, 2017-11-13aRagexe_zero, 2017-11-13bRagexe_zero, 2018-03-15aRagexe_zero, 2018-03-21aRagexe_zero, 2018-03-21bRagexe_zero, 2018-03-28_1aRagexe_zero, 2018-03-28cRagexe_zero, 2018-04-11aRagexe_zero, 2018-04-25_3aRagexe_zero, 2018-05-09_3aRagexe_zero, 2018-05-23aRagexe_zero, 2018-06-05bRagexe_zero, 2018-06-05cRagexe_zero, 2018-06-27aRagexe_zero, 2018-07-03aRagexe_zero, 2018-07-11_2aRagexe_zero, 2018-07-25_2aRagexe_zero, 2018-08-01aRagexe_zero, 2018-08-08_2aRagexe_zero, 2018-08-22aRagexe_zero, 2018-08-29aRagexe_zero, 2018-09-05aRagexe_zero, 2018-09-12aRagexe_zero, 2018-09-19aRagexe_zero, 2018-09-28aRagexe_zero, 2018-10-10_2aRagexe_zero, 2018-10-24_2aRagexe_zero, 2018-11-14aRagexe_zero, 2018-11-20aRagexe_zero, 2018-11-28aRagexe_zero, 2018-12-12aRagexe_zero, 2018-12-19aRagexe_zero, 2018-12-26_2aRagexe_zero, 2019-01-16_2aRagexe_zero, 2019-01-17_1aRagexe_zero, 2019-01-30_2aRagexe_zero, 2019-02-13aRagexe_zero, 2019-02-20aRagexe_zero, 2019-02-27aRagexe_zero, 2019-03-13aRagexe_zero, 2019-03-27_2aRagexe_zero, 2019-03-27_3aRagexe_zero, 2019-04-03aRagexe_zero, 2019-04-10bRagexe_zero, 2019-04-24aRagexe_zero, 2019-05-02aRagexe_zero, 2019-05-08_2aRagexe_zero, 2019-05-08aRagexe_zero, 2019-05-15aRagexe_zero, 2019-05-29aRagexe_zero, 2019-05-30aRagexe_zero, 2019-06-05_2aRagexe_zero, 2019-06-26_2aRagexe_zero, 2019-06-26_3aRagexe_zero, 2019-07-09aRagexe_zero, 2019-07-10_3aRagexe_zero, 2019-07-17aRagexe_zero, 2019-07-24aRagexe_zero, 2019-08-14_3aRagexe_zero, 2019-08-28_2aRagexe_zero, 2019-08-28_3aRagexe_zero, 2019-09-11aRagexe_zero, 2019-09-18_2aRagexe_zero, 2019-09-18aRagexe_zero
#if PACKETVER == 20171018 || \
PACKETVER == 20171019 || \
PACKETVER == 20171023 || \
@@ -91,7 +91,10 @@
PACKETVER == 20190710 || \
PACKETVER == 20190717 || \
PACKETVER == 20190724 || \
- PACKETVER >= 20190814
+ PACKETVER == 20190814 || \
+ PACKETVER == 20190828 || \
+ PACKETVER == 20190911 || \
+ PACKETVER >= 20190918
packetKeys(0x00000000,0x00000000,0x00000000);
#endif
diff --git a/src/map/packets_shuffle_main.h b/src/map/packets_shuffle_main.h
index 082c940c9..e3e798dd1 100644
--- a/src/map/packets_shuffle_main.h
+++ b/src/map/packets_shuffle_main.h
@@ -9727,7 +9727,7 @@
packet(0x0967,clif->pSolveCharName,2); // CZ_REQNAME_BYGID // 6
#endif
-// 2018-11-21bRagexe, 2018-11-28aRagexe, 2018-11-28bRagexe, 2018-11-28cRagexe, 2018-12-05aRagexe, 2018-12-12aRagexe, 2018-12-12bRagexe, 2018-12-19bRagexe, 2018-12-26aRagexe, 2019-01-09aRagexe, 2019-01-16bRagexe, 2019-01-16cRagexe, 2019-01-23dRagexe, 2019-02-13bRagexe, 2019-02-13eRagexe, 2019-02-27aRagexe, 2019-02-28aRagexe, 2019-03-06bRagexe, 2019-03-06cRagexe, 2019-03-13aRagexe, 2019-03-20aRagexe, 2019-03-22aRagexe, 2019-03-27bRagexe, 2019-04-03aRagexe, 2019-04-17aRagexe, 2019-04-18aRagexe, 2019-05-08cRagexe, 2019-05-22bRagexe, 2019-05-22cRagexe, 2019-05-23aRagexe, 2019-05-29aRagexe, 2019-05-29cRagexe, 2019-05-30aRagexe, 2019-06-05fRagexe, 2019-06-05KRagexe, 2019-06-19bRagexe, 2019-06-19eRagexe, 2019-06-19hRagexe, 2019-07-03aRagexe, 2019-07-17aRagexe, 2019-07-17dRagexe, 2019-07-24aRagexe, 2019-07-31bRagexe, 2019-08-02aRagexe, 2019-08-07aRagexe, 2019-08-21aRagexe
+// 2018-11-21bRagexe, 2018-11-28aRagexe, 2018-11-28bRagexe, 2018-11-28cRagexe, 2018-12-05aRagexe, 2018-12-12aRagexe, 2018-12-12bRagexe, 2018-12-19bRagexe, 2018-12-26aRagexe, 2019-01-09aRagexe, 2019-01-16bRagexe, 2019-01-16cRagexe, 2019-01-23dRagexe, 2019-02-13bRagexe, 2019-02-13eRagexe, 2019-02-27aRagexe, 2019-02-28aRagexe, 2019-03-06bRagexe, 2019-03-06cRagexe, 2019-03-13aRagexe, 2019-03-20aRagexe, 2019-03-22aRagexe, 2019-03-27bRagexe, 2019-04-03aRagexe, 2019-04-17aRagexe, 2019-04-18aRagexe, 2019-05-08cRagexe, 2019-05-22bRagexe, 2019-05-22cRagexe, 2019-05-23aRagexe, 2019-05-29aRagexe, 2019-05-29cRagexe, 2019-05-30aRagexe, 2019-06-05fRagexe, 2019-06-05KRagexe, 2019-06-19bRagexe, 2019-06-19eRagexe, 2019-06-19hRagexe, 2019-07-03aRagexe, 2019-07-17aRagexe, 2019-07-17dRagexe, 2019-07-24aRagexe, 2019-07-31bRagexe, 2019-08-02aRagexe, 2019-08-07aRagexe, 2019-08-21aRagexe, 2019-08-28aRagexe
#if PACKETVER == 20181121 || \
PACKETVER == 20181128 || \
PACKETVER == 20181205 || \
@@ -9761,7 +9761,8 @@
PACKETVER == 20190731 || \
PACKETVER == 20190802 || \
PACKETVER == 20190807 || \
- PACKETVER >= 20190821
+ PACKETVER == 20190821 || \
+ PACKETVER >= 20190828
packet(0x0202,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS // 26
packet(0x022d,clif->pHomMenu,2,4); // CZ_COMMAND_MER // 5
packet(0x023b,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD // 36
@@ -9793,5 +9794,39 @@
packet(0x083c,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK // 14
#endif
+// 2019-09-04aRagexe, 2019-09-04bRagexe, 2019-09-18bRagexe
+#if PACKETVER == 20190904 || \
+ PACKETVER == 20190918
+ packet(0x0202,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS // 26
+ packet(0x022d,clif->pHomMenu,2,4); // CZ_COMMAND_MER // 5
+ packet(0x023b,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD // 36
+ packet(0x0281,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK // 4
+ packet(0x02c4,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ // 26
+ packet(0x035f,clif->pWalkToXY,2); // CZ_REQUEST_MOVE // 5
+ packet(0x0360,clif->pTickSend,2); // CZ_REQUEST_TIME // 6
+ packet(0x0361,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION // 5
+ packet(0x0362,clif->pTakeItem,2); // CZ_ITEM_PICKUP // 6
+ packet(0x0363,clif->pDropItem,2,4); // CZ_ITEM_THROW // 6
+ packet(0x0364,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE // 8
+ packet(0x0365,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY // 8
+ packet(0x0366,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND // 10
+ packet(0x0367,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX // 31
+ packet(0x0368,clif->pGetCharNameRequest,2); // CZ_REQNAME // 6
+ packet(0x0369,clif->pSolveCharName,2); // CZ_REQNAME_BYGID // 6
+ packet(0x0436,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER // 19
+ packet(0x0437,clif->pActionRequest,2,6); // CZ_REQUEST_ACT // 7
+ packet(0x0438,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL // 10
+ packet(0x07e4,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES // -1
+ packet(0x07ec,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD // 8
+ packet(0x0802,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER // 18
+ packet(0x0811,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE // -1
+ packet(0x0815,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE // 2
+ packet(0x0817,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE // 6
+ packet(0x0819,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE // -1
+ packet(0x0835,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO // -1
+ packet(0x0838,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE // 2
+ packet(0x083c,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK // 14
+#endif
+
#endif /* MAP_PACKETS_SHUFFLE_MAIN_H */
diff --git a/src/map/packets_shuffle_re.h b/src/map/packets_shuffle_re.h
index 044788301..f2a1b96ad 100644
--- a/src/map/packets_shuffle_re.h
+++ b/src/map/packets_shuffle_re.h
@@ -9663,7 +9663,7 @@
packet(0x083c,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK // 12
#endif
-// 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexeRE, 2018-08-01cRagexeRE, 2018-08-08bRagexeRE, 2018-08-22cRagexeRE, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-09-12dRagexeRE, 2018-09-19aRagexeRE, 2018-10-02aRagexeRE, 2018-10-02bRagexeRE, 2018-10-17_02aRagexeRE, 2018-10-17_03aRagexeRE, 2018-10-17bRagexeRE, 2018-10-31cRagexeRE, 2018-11-07aRagexeRE, 2018-11-14cRagexeRE, 2018-11-14dRagexeRE, 2018-11-21cRagexeRE, 2018-11-28aRagexeRE, 2018-12-05bRagexeRE, 2018-12-12aRagexeRE, 2018-12-12bRagexeRE, 2018-12-19bRagexeRE, 2018-12-26aRagexeRE, 2019-01-09bRagexeRE, 2019-01-16bRagexeRE, 2019-01-16cRagexeRE, 2019-01-23dRagexeRE, 2019-02-13IRagexeRE, 2019-02-20aRagexeRE, 2019-02-27bRagexeRE, 2019-02-28aRagexeRE, 2019-03-06bRagexeRE, 2019-03-06cRagexeRE, 2019-03-20aRagexeRE, 2019-03-22aRagexeRE, 2019-03-27bRagexeRE, 2019-04-03bRagexeRE, 2019-04-03cRagexeRE, 2019-04-17cRagexeRE, 2019-04-18aRagexeRE, 2019-05-08dRagexeRE, 2019-05-08eRagexeRE, 2019-05-22bRagexeRE, 2019-05-22cRagexeRE, 2019-05-29bRagexeRE, 2019-05-29cRagexeRE, 2019-05-30aRagexeRE, 2019-06-05hRagexeRE, 2019-06-05JRagexeRE, 2019-06-05LRagexeRE, 2019-06-19cRagexeRE, 2019-06-26bRagexeRE, 2019-07-03bRagexeRE, 2019-07-17cRagexeRE, 2019-07-17dRagexeRE, 2019-07-24bRagexeRE, 2019-07-31bRagexeRE, 2019-08-02aRagexeRE, 2019-08-07dRagexeRE, 2019-08-21cRagexeRE, 2019-08-21dRagexeRE
+// 2018-07-04aRagexeRE, 2018-07-11aRagexeRE, 2018-07-18bRagexeRE, 2018-07-18bRagexeRE1, 2018-07-18cRagexeRE, 2018-08-01cRagexeRE, 2018-08-08bRagexeRE, 2018-08-22cRagexeRE, 2018-08-29aRagexeRE, 2018-08-29bRagexeRE, 2018-09-12dRagexeRE, 2018-09-19aRagexeRE, 2018-10-02aRagexeRE, 2018-10-02bRagexeRE, 2018-10-17_02aRagexeRE, 2018-10-17_03aRagexeRE, 2018-10-17bRagexeRE, 2018-10-31cRagexeRE, 2018-11-07aRagexeRE, 2018-11-14cRagexeRE, 2018-11-14dRagexeRE, 2018-11-21cRagexeRE, 2018-11-28aRagexeRE, 2018-12-05bRagexeRE, 2018-12-12aRagexeRE, 2018-12-12bRagexeRE, 2018-12-19bRagexeRE, 2018-12-26aRagexeRE, 2019-01-09bRagexeRE, 2019-01-16bRagexeRE, 2019-01-16cRagexeRE, 2019-01-23dRagexeRE, 2019-02-13IRagexeRE, 2019-02-20aRagexeRE, 2019-02-27bRagexeRE, 2019-02-28aRagexeRE, 2019-03-06bRagexeRE, 2019-03-06cRagexeRE, 2019-03-20aRagexeRE, 2019-03-22aRagexeRE, 2019-03-27bRagexeRE, 2019-04-03bRagexeRE, 2019-04-03cRagexeRE, 2019-04-17cRagexeRE, 2019-04-18aRagexeRE, 2019-05-08dRagexeRE, 2019-05-08eRagexeRE, 2019-05-22bRagexeRE, 2019-05-22cRagexeRE, 2019-05-29bRagexeRE, 2019-05-29cRagexeRE, 2019-05-30aRagexeRE, 2019-06-05hRagexeRE, 2019-06-05JRagexeRE, 2019-06-05LRagexeRE, 2019-06-19cRagexeRE, 2019-06-26bRagexeRE, 2019-07-03bRagexeRE, 2019-07-17cRagexeRE, 2019-07-17dRagexeRE, 2019-07-24bRagexeRE, 2019-07-31bRagexeRE, 2019-08-02aRagexeRE, 2019-08-07dRagexeRE, 2019-08-21cRagexeRE, 2019-08-21dRagexeRE, 2019-08-28aRagexeRE
#if PACKETVER == 20180704 || \
PACKETVER == 20180711 || \
PACKETVER == 20180718 || \
@@ -9711,7 +9711,8 @@
PACKETVER == 20190731 || \
PACKETVER == 20190802 || \
PACKETVER == 20190807 || \
- PACKETVER >= 20190821
+ PACKETVER == 20190821 || \
+ PACKETVER >= 20190828
packet(0x0202,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS // 26
packet(0x022d,clif->pHomMenu,2,4); // CZ_COMMAND_MER // 5
packet(0x023b,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD // 36
@@ -9743,5 +9744,39 @@
packet(0x083c,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK // 14
#endif
+// 2019-09-04bRagexeRE, 2019-09-18cRagexeRE
+#if PACKETVER == 20190904 || \
+ PACKETVER == 20190918
+ packet(0x0202,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS // 26
+ packet(0x022d,clif->pHomMenu,2,4); // CZ_COMMAND_MER // 5
+ packet(0x023b,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD // 36
+ packet(0x0281,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK // 4
+ packet(0x02c4,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ // 26
+ packet(0x035f,clif->pWalkToXY,2); // CZ_REQUEST_MOVE // 5
+ packet(0x0360,clif->pTickSend,2); // CZ_REQUEST_TIME // 6
+ packet(0x0361,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION // 5
+ packet(0x0362,clif->pTakeItem,2); // CZ_ITEM_PICKUP // 6
+ packet(0x0363,clif->pDropItem,2,4); // CZ_ITEM_THROW // 6
+ packet(0x0364,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE // 8
+ packet(0x0365,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY // 8
+ packet(0x0366,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND // 10
+ packet(0x0367,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX // 31
+ packet(0x0368,clif->pGetCharNameRequest,2); // CZ_REQNAME // 6
+ packet(0x0369,clif->pSolveCharName,2); // CZ_REQNAME_BYGID // 6
+ packet(0x0436,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER // 19
+ packet(0x0437,clif->pActionRequest,2,6); // CZ_REQUEST_ACT // 7
+ packet(0x0438,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL // 10
+ packet(0x07e4,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES // -1
+ packet(0x07ec,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD // 8
+ packet(0x0802,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER // 18
+ packet(0x0811,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE // -1
+ packet(0x0815,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE // 2
+ packet(0x0817,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE // 6
+ packet(0x0819,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE // -1
+ packet(0x0835,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO // -1
+ packet(0x0838,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE // 2
+ packet(0x083c,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK // 14
+#endif
+
#endif /* MAP_PACKETS_SHUFFLE_RE_H */
diff --git a/src/map/packets_shuffle_zero.h b/src/map/packets_shuffle_zero.h
index 109dadaba..4d6da7a8a 100644
--- a/src/map/packets_shuffle_zero.h
+++ b/src/map/packets_shuffle_zero.h
@@ -803,5 +803,40 @@
packet(0x083c,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK // 14
#endif
+// 2019-08-28_2aRagexe_zero, 2019-08-28_3aRagexe_zero, 2019-09-11aRagexe_zero, 2019-09-18_2aRagexe_zero, 2019-09-18aRagexe_zero
+#if PACKETVER == 20190828 || \
+ PACKETVER == 20190911 || \
+ PACKETVER == 20190918
+ packet(0x0202,clif->pFriendsListAdd,2); // CZ_ADD_FRIENDS // 26
+ packet(0x022d,clif->pHomMenu,2,4); // CZ_COMMAND_MER // 5
+ packet(0x023b,clif->pStoragePassword,0); // CZ_ACK_STORE_PASSWORD // 36
+ packet(0x0281,clif->pDull/*,XXX*/); // CZ_GANGSI_RANK // 4
+ packet(0x02c4,clif->pPartyInvite2,2); // CZ_PARTY_JOIN_REQ // 26
+ packet(0x035f,clif->pWalkToXY,2); // CZ_REQUEST_MOVE // 5
+ packet(0x0360,clif->pTickSend,2); // CZ_REQUEST_TIME // 6
+ packet(0x0361,clif->pChangeDir,2,4); // CZ_CHANGE_DIRECTION // 5
+ packet(0x0362,clif->pTakeItem,2); // CZ_ITEM_PICKUP // 6
+ packet(0x0363,clif->pDropItem,2,4); // CZ_ITEM_THROW // 6
+ packet(0x0364,clif->pMoveToKafra,2,4); // CZ_MOVE_ITEM_FROM_BODY_TO_STORE // 8
+ packet(0x0365,clif->pMoveFromKafra,2,4); // CZ_MOVE_ITEM_FROM_STORE_TO_BODY // 8
+ packet(0x0366,clif->pUseSkillToPos,2,4,6,8); // CZ_USE_SKILL_TOGROUND // 10
+ packet(0x0367,clif->pUseSkillToPosMoreInfo,2,4,6,8,10); // CZ_USE_SKILL_TOGROUND_WITHTALKBOX // 31
+ packet(0x0368,clif->pGetCharNameRequest,2); // CZ_REQNAME // 6
+ packet(0x0369,clif->pSolveCharName,2); // CZ_REQNAME_BYGID // 6
+ packet(0x0436,clif->pWantToConnection,2,6,10,14,18); // CZ_ENTER // 19
+ packet(0x0437,clif->pActionRequest,2,6); // CZ_REQUEST_ACT // 7
+ packet(0x0438,clif->pUseSkillToId,2,4,6); // CZ_USE_SKILL // 10
+ packet(0x07e4,clif->pItemListWindowSelected,2,4,8); // CZ_ITEMLISTWIN_RES // -1
+ packet(0x07ec,clif->pDull/*,XXX*/); // CZ_JOIN_BATTLE_FIELD // 8
+ packet(0x0802,clif->pPartyBookingRegisterReq,2,4); // CZ_PARTY_BOOKING_REQ_REGISTER // 18
+ packet(0x0811,clif->pReqOpenBuyingStore,2,4,8,9,89); // CZ_REQ_OPEN_BUYING_STORE // -1
+ packet(0x0815,clif->pReqCloseBuyingStore,0); // CZ_REQ_CLOSE_BUYING_STORE // 2
+ packet(0x0817,clif->pReqClickBuyingStore,2); // CZ_REQ_CLICK_TO_BUYING_STORE // 6
+ packet(0x0819,clif->pReqTradeBuyingStore,2,4,8,12); // CZ_REQ_TRADE_BUYING_STORE // -1
+ packet(0x0835,clif->pSearchStoreInfo,2,4,5,9,13,14,15); // CZ_SEARCH_STORE_INFO // -1
+ packet(0x0838,clif->pSearchStoreInfoNextPage,0); // CZ_SEARCH_STORE_INFO_NEXT_PAGE // 2
+ packet(0x083c,clif->pSearchStoreInfoListItemClick,2,6,10); // CZ_SSILIST_ITEM_CLICK // 14
+#endif
+
#endif /* MAP_PACKETS_SHUFFLE_ZERO_H */
diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h
index d12dc14d4..24bb718da 100644
--- a/src/map/packets_struct.h
+++ b/src/map/packets_struct.h
@@ -3460,6 +3460,14 @@ struct PACKET_ZC_REFINE_STATUS {
DEFINE_PACKET_HEADER(ZC_REFINE_STATUS, 0x0ada);
#endif
+struct PACKET_ZC_ACK_RANKING_name {
+ char name[NAME_LENGTH];
+} __attribute__((packed));
+
+struct PACKET_ZC_ACK_RANKING_points {
+ uint32 points;
+} __attribute__((packed));
+
#if PACKETVER_MAIN_NUM >= 20190731 || PACKETVER_RE_NUM >= 20190703 || PACKETVER_ZERO_NUM >= 20190724
struct PACKET_ZC_ACK_RANKING_sub {
char name[NAME_LENGTH];
@@ -3476,21 +3484,22 @@ struct PACKET_ZC_ACK_RANKING {
DEFINE_PACKET_HEADER(ZC_ACK_RANKING, 0x0af6);
#elif PACKETVER_MAIN_NUM >= 20130605 || PACKETVER_RE_NUM >= 20130529 || defined(PACKETVER_ZERO)
struct PACKET_ZC_ACK_RANKING_sub {
- char name[NAME_LENGTH];
- uint32 points;
+ struct PACKET_ZC_ACK_RANKING_name names[10];
+ struct PACKET_ZC_ACK_RANKING_points points[10];
} __attribute__((packed));
struct PACKET_ZC_ACK_RANKING {
int16 packetType;
int16 rankType;
- struct PACKET_ZC_ACK_RANKING_sub ranks[10];
+ struct PACKET_ZC_ACK_RANKING_sub ranks;
uint32 myPoints;
} __attribute__((packed));
+
DEFINE_PACKET_HEADER(ZC_ACK_RANKING, 0x097d);
#else
struct PACKET_ZC_ACK_RANKING_sub {
- char name[NAME_LENGTH];
- uint32 points;
+ struct PACKET_ZC_ACK_RANKING_name names[10];
+ struct PACKET_ZC_ACK_RANKING_points points[10];
} __attribute__((packed));
#endif
@@ -3514,7 +3523,7 @@ DEFINE_PACKET_HEADER(ZC_HAT_EFFECT, 0x0a3b);
#endif
// [4144] this struct updated not in all packets in client
-#if PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190814
+#if PACKETVER_RE_NUM >= 20190807
struct SKILLDATA {
uint16 id;
int inf;
@@ -3540,7 +3549,7 @@ struct PACKET_ZC_ADD_SKILL {
int16 packetType;
struct SKILLDATA skill;
} __attribute__((packed));
-#if PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190814
+#if PACKETVER_RE_NUM >= 20190807
DEFINE_PACKET_HEADER(ZC_ADD_SKILL, 0x0b31);
#else
DEFINE_PACKET_HEADER(ZC_ADD_SKILL, 0x0111);
@@ -3551,13 +3560,13 @@ struct PACKET_ZC_SKILLINFO_LIST {
int16 packetLength;
struct SKILLDATA skills[];
} __attribute__((packed));
-#if PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190814
+#if PACKETVER_RE_NUM >= 20190807
DEFINE_PACKET_HEADER(ZC_SKILLINFO_LIST, 0x0b32);
#else
DEFINE_PACKET_HEADER(ZC_SKILLINFO_LIST, 0x010f);
#endif
-#if PACKETVER_RE_NUM >= 20190807 || PACKETVER_ZERO_NUM >= 20190814
+#if PACKETVER_RE_NUM >= 20190807
struct PACKET_ZC_SKILLINFO_UPDATE2 {
int16 packetType;
uint16 id;
@@ -3610,6 +3619,56 @@ struct PACKET_ZC_NPC_MARKET_PURCHASE_RESULT {
DEFINE_PACKET_HEADER(ZC_NPC_MARKET_PURCHASE_RESULT, 0x09d7);
#endif
+struct PACKET_ZC_TALKBOX_CHATCONTENTS {
+ int16 PacketType;
+ uint32 aid;
+ char message[TALKBOX_MESSAGE_SIZE];
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_TALKBOX_CHATCONTENTS, 0x0191);
+
+#if PACKETVER_MAIN_NUM >= 20190731 || PACKETVER_RE_NUM >= 20190717 || PACKETVER_ZERO_NUM >= 20190814
+struct PACKET_ZC_GUILD_CASTLE_LIST {
+ int16 packetType;
+ int16 packetLength;
+ int8 castle_list[];
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_GUILD_CASTLE_LIST, 0x0b27);
+#endif
+
+#if PACKETVER_MAIN_NUM >= 20190522 || PACKETVER_RE_NUM >= 20190522 || PACKETVER_ZERO_NUM >= 20190515
+struct PACKET_CZ_CASTLE_TELEPORT_REQUEST {
+ int16 packetType;
+ int8 castle_id;
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(CZ_CASTLE_TELEPORT_REQUEST, 0x0b28);
+#endif
+
+#if PACKETVER_MAIN_NUM >= 20190731 || PACKETVER_RE_NUM >= 20190717 || PACKETVER_ZERO_NUM >= 20190814
+struct PACKET_ZC_CASTLE_TELEPORT_RESPONSE {
+ int16 packetType;
+ int16 result;
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_CASTLE_TELEPORT_RESPONSE, 0x0b2e);
+#endif
+
+#if PACKETVER_MAIN_NUM >= 20190731 || PACKETVER_RE_NUM >= 20190717 || PACKETVER_ZERO_NUM >= 20190814
+struct PACKET_ZC_CASTLE_INFO {
+ int16 packetType;
+ int8 castle_id;
+ int32 economy;
+ int32 defense;
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_CASTLE_INFO, 0x0b2d);
+#endif
+
+#if PACKETVER_MAIN_NUM >= 20190522 || PACKETVER_RE_NUM >= 20190522 || PACKETVER_ZERO_NUM >= 20190515
+struct PACKET_CZ_CASTLE_INFO_REQUEST {
+ int16 packetType;
+ int8 castle_id;
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(CZ_CASTLE_INFO_REQUEST, 0x0b2c);
+#endif
+
#if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
#pragma pack(pop)
#endif // not NetBSD < 6 / Solaris
diff --git a/src/map/pc.c b/src/map/pc.c
index 24f71f47b..2cefa7674 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -565,72 +565,8 @@ static int pc_inventory_rental_clear(struct map_session_data *sd)
/* assumes i is valid (from default areas where it is called, it is) */
static void pc_rental_expire(struct map_session_data *sd, int i)
{
- int nameid;
-
nullpo_retv(sd);
Assert_retv(i >= 0 && i < sd->status.inventorySize);
- nameid = sd->status.inventory[i].nameid;
-
- /* Soon to be dropped, we got plans to integrate it with item db */
- switch( nameid ) {
- case ITEMID_BOARDING_HALTER:
- status_change_end(&sd->bl,SC_ALL_RIDING,INVALID_TIMER);
- break;
- case ITEMID_LOVE_ANGEL:
- if( sd->status.font == 1 ) {
- sd->status.font = 0;
- clif->font(sd);
- }
- break;
- case ITEMID_SQUIRREL:
- if( sd->status.font == 2 ) {
- sd->status.font = 0;
- clif->font(sd);
- }
- break;
- case ITEMID_GOGO:
- if( sd->status.font == 3 ) {
- sd->status.font = 0;
- clif->font(sd);
- }
- break;
- case ITEMID_PICTURE_DIARY:
- if( sd->status.font == 4 ) {
- sd->status.font = 0;
- clif->font(sd);
- }
- break;
- case ITEMID_MINI_HEART:
- if( sd->status.font == 5 ) {
- sd->status.font = 0;
- clif->font(sd);
- }
- break;
- case ITEMID_NEWCOMER:
- if( sd->status.font == 6 ) {
- sd->status.font = 0;
- clif->font(sd);
- }
- break;
- case ITEMID_KID:
- if( sd->status.font == 7 ) {
- sd->status.font = 0;
- clif->font(sd);
- }
- break;
- case ITEMID_MAGIC_CASTLE:
- if( sd->status.font == 8 ) {
- sd->status.font = 0;
- clif->font(sd);
- }
- break;
- case ITEMID_BULGING_HEAD:
- if( sd->status.font == 9 ) {
- sd->status.font = 0;
- clif->font(sd);
- }
- break;
- }
clif->rental_expired(sd->fd, i, sd->status.inventory[i].nameid);
pc->delitem(sd, i, sd->status.inventory[i].amount, 0, DELITEM_NORMAL, LOG_TYPE_RENTAL);
@@ -1536,17 +1472,16 @@ static int pc_reg_received(struct map_session_data *sd)
if (sd->status.guild_id)
guild->member_joined(sd);
- // pet
- if (sd->status.pet_id > 0)
- intif->request_petdata(sd->status.account_id, sd->status.char_id, sd->status.pet_id);
-
- // Homunculus [albator]
- if( sd->status.hom_id > 0 )
- intif->homunculus_requestload(sd->status.account_id, sd->status.hom_id);
- if( sd->status.mer_id > 0 )
- intif->mercenary_request(sd->status.mer_id, sd->status.char_id);
- if( sd->status.ele_id > 0 )
- intif->elemental_request(sd->status.ele_id, sd->status.char_id);
+ if (sd->state.standalone == 0 && sd->state.autotrade == 0) { // prevents loading pets, homunculi, mercenaries or elementals if the character doesn't have a client attached
+ if (sd->status.pet_id != 0)
+ intif->request_petdata(sd->status.account_id, sd->status.char_id, sd->status.pet_id);
+ if (sd->status.hom_id != 0)
+ intif->homunculus_requestload(sd->status.account_id, sd->status.hom_id);
+ if (sd->status.mer_id != 0)
+ intif->mercenary_request(sd->status.mer_id, sd->status.char_id);
+ if (sd->status.ele_id != 0)
+ intif->elemental_request(sd->status.ele_id, sd->status.char_id);
+ }
map->addiddb(&sd->bl);
map->delnickdb(sd->status.char_id, sd->status.name);
@@ -4790,13 +4725,15 @@ static int pc_additem(struct map_session_data *sd, const struct item *item_data,
pc->equipitem(sd, i, data->equip);
/* rental item check */
- if( item_data->expire_time ) {
- if( time(NULL) > item_data->expire_time ) {
- pc->rental_expire(sd,i);
+ if (item_data->expire_time > 0) {
+ if (time(NULL) > item_data->expire_time) {
+ pc->rental_expire(sd, i);
} else {
- int seconds = (int)( item_data->expire_time - time(NULL) );
+ int seconds = (int)(item_data->expire_time - time(NULL));
clif->rental_time(sd->fd, sd->status.inventory[i].nameid, seconds);
pc->inventory_rental_add(sd, seconds);
+ if (data->rental_start_script != NULL)
+ script->run_item_rental_start_script(sd, data, 0);
}
}
quest->questinfo_refresh(sd);
@@ -4827,12 +4764,21 @@ static int pc_delitem(struct map_session_data *sd, int n, int amount, int type,
sd->status.inventory[n].amount -= amount;
sd->weight -= sd->inventory_data[n]->weight*amount ;
+
+ // It's here because the data would most likely get zeroed in following if [Hemagx]
+ struct item_data *itd = sd->inventory_data[n];
+ bool is_rental = (sd->status.inventory[n].expire_time > 0) ? true : false;
+
if( sd->status.inventory[n].amount <= 0 ){
if(sd->status.inventory[n].equip)
pc->unequipitem(sd, n, PCUNEQUIPITEM_RECALC|PCUNEQUIPITEM_FORCE);
memset(&sd->status.inventory[n],0,sizeof(sd->status.inventory[0]));
sd->inventory_data[n] = NULL;
}
+
+ if (is_rental && itd->rental_end_script != NULL)
+ script->run_item_rental_end_script(sd, itd, 0);
+
if(!(type&1))
clif->delitem(sd,n,amount,reason);
if(!(type&2))
@@ -7765,7 +7711,7 @@ static int pc_resetskill(struct map_session_data *sd, int flag)
pc->setoption(sd, i);
if( homun_alive(sd->hd) && pc->checkskill(sd, AM_CALLHOMUN) )
- homun->vaporize(sd, HOM_ST_REST);
+ homun->vaporize(sd, HOM_ST_REST, true);
if ((sd->sc.data[SC_SPRITEMABLE] && pc->checkskill(sd, SU_SPRITEMABLE)))
status_change_end(&sd->bl, SC_SPRITEMABLE, INVALID_TIMER);
@@ -8006,7 +7952,7 @@ static void pc_damage(struct map_session_data *sd, struct block_list *src, unsig
if( sd->status.pet_id > 0 && sd->pd && battle_config.pet_damage_support )
pet->target_check(sd,src,1);
- if( sd->status.ele_id > 0 )
+ if (sd->status.ele_id != 0 && sd->ed != NULL)
elemental->set_target(sd,src);
if (battle_config.prevent_logout_trigger & PLT_DAMAGE)
@@ -8054,7 +8000,7 @@ static int pc_dead(struct map_session_data *sd, struct block_list *src)
if (sd->status.hom_id > 0){
if(battle_config.homunculus_auto_vapor && sd->hd)
- homun->vaporize(sd, HOM_ST_REST);
+ homun->vaporize(sd, HOM_ST_REST, true);
}
if( sd->md )
@@ -9069,7 +9015,7 @@ static int pc_jobchange(struct map_session_data *sd, int class, int upper)
pc->setoption(sd, i);
if(homun_alive(sd->hd) && !pc->checkskill(sd, AM_CALLHOMUN))
- homun->vaporize(sd, HOM_ST_REST);
+ homun->vaporize(sd, HOM_ST_REST, true);
if ((sd->sc.data[SC_SPRITEMABLE] && pc->checkskill(sd, SU_SPRITEMABLE)))
status_change_end(&sd->bl, SC_SPRITEMABLE, INVALID_TIMER);
@@ -12215,6 +12161,29 @@ static int pc_have_magnifier(struct map_session_data *sd)
}
/**
+ * checks if player have any item that listed in item chain
+ * @param sd map_session_data of Player
+ * @param chain_id unsigned short of item chain id
+ * @return index of inventory, INDEX_NOT_FOUND if it is not found
+ */
+static int pc_have_item_chain(struct map_session_data *sd, unsigned short chain_id)
+{
+ if (chain_id >= itemdb->chain_count) {
+ ShowError("itemdb_chain_item: unknown chain id %d\n", chain_id);
+ return INDEX_NOT_FOUND;
+ }
+
+ for (int n = 0; n < itemdb->chains[chain_id].qty; n++) {
+ struct item_chain_entry *entry = &itemdb->chains[chain_id].items[n];
+ int index = pc->search_inventory(sd, entry->id);
+ if (index != INDEX_NOT_FOUND)
+ return index;
+ }
+
+ return INDEX_NOT_FOUND;
+}
+
+/**
* Checks if player have basic skills learned.
* @param sd Player Data
* @param level Required Level of Novice Skill
@@ -12823,6 +12792,7 @@ void pc_defaults(void)
pc->update_idle_time = pc_update_idle_time;
pc->have_magnifier = pc_have_magnifier;
+ pc->have_item_chain = pc_have_item_chain;
pc->check_basicskill = pc_check_basicskill;
diff --git a/src/map/pc.h b/src/map/pc.h
index 8df02a891..2d21dabf6 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -238,6 +238,7 @@ struct map_session_data {
unsigned int loggingout : 1;
unsigned int warp_clean : 1;
unsigned int refine_ui : 1;
+ unsigned int npc_unloaded : 1; ///< The player is talking with an unloaded NPCs (respawned tombstones)
} state;
struct {
unsigned char no_weapon_damage, no_magic_damage, no_misc_damage;
@@ -1184,6 +1185,7 @@ END_ZEROED_BLOCK; /* End */
void (*update_idle_time) (struct map_session_data* sd, enum e_battle_config_idletime type);
int (*have_magnifier) (struct map_session_data *sd);
+ int (*have_item_chain) (struct map_session_data *sd, unsigned short chain_id);
bool (*process_chat_message) (struct map_session_data *sd, const char *message);
int (*wis_message_to_gm) (const char *sender_name, int permission, const char *message);
diff --git a/src/map/script.c b/src/map/script.c
index 72c20d789..c7ec3c26f 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -2813,7 +2813,7 @@ static struct map_session_data *script_charid2sd(struct script_state *st, int ch
static struct map_session_data *script_nick2sd(struct script_state *st, const char *name)
{
struct map_session_data *sd;
- if ((sd = map->nick2sd(name)) == NULL) {
+ if ((sd = map->nick2sd(name, false)) == NULL) {
ShowWarning("script_nick2sd: Player name '%s' not found!\n", name);
script->reportfunc(st);
script->reportsrc(st);
@@ -8780,7 +8780,7 @@ static BUILDIN(getcharid)
struct map_session_data *sd;
if (script_hasdata(st, 3))
- sd = map->nick2sd(script_getstr(st, 3));
+ sd = map->nick2sd(script_getstr(st, 3), false);
else
sd = script->rid2sd(st);
@@ -12629,7 +12629,7 @@ static BUILDIN(homunculus_morphembryo)
clif->additem(sd, 0, 0, i);
clif->emotion(&sd->hd->bl, E_SWT);
} else {
- homun->vaporize(sd, HOM_ST_MORPH);
+ homun->vaporize(sd, HOM_ST_MORPH, true);
success = true;
}
} else {
@@ -16488,7 +16488,7 @@ static BUILDIN(getmapxy)
case 0: //Get Character Position
if (script_hasdata(st,6)) {
if (script_isstringtype(st,6))
- sd = map->nick2sd(script_getstr(st,6));
+ sd = map->nick2sd(script_getstr(st,6), false);
else
sd = map->id2sd(script_getnum(st,6));
} else {
@@ -16515,7 +16515,7 @@ static BUILDIN(getmapxy)
case 2: //Get Pet Position
if (script_hasdata(st,6)) {
if (script_isstringtype(st,6))
- sd = map->nick2sd(script_getstr(st,6));
+ sd = map->nick2sd(script_getstr(st,6), false);
else {
bl = map->id2bl(script_getnum(st,6));
break;
@@ -16537,7 +16537,7 @@ static BUILDIN(getmapxy)
case 4: //Get Homun Position
if (script_hasdata(st,6)) {
if (script_isstringtype(st,6)) {
- sd = map->nick2sd(script_getstr(st,6));
+ sd = map->nick2sd(script_getstr(st,6), false);
} else {
bl = map->id2bl(script_getnum(st,6));
break;
@@ -16552,7 +16552,7 @@ static BUILDIN(getmapxy)
case 5: //Get Mercenary Position
if (script_hasdata(st,6)) {
if (script_isstringtype(st,6)) {
- sd = map->nick2sd(script_getstr(st,6));
+ sd = map->nick2sd(script_getstr(st,6), false);
} else {
bl = map->id2bl(script_getnum(st,6));
break;
@@ -16567,7 +16567,7 @@ static BUILDIN(getmapxy)
case 6: //Get Elemental Position
if (script_hasdata(st,6)) {
if (script_isstringtype(st,6)) {
- sd = map->nick2sd(script_getstr(st,6));
+ sd = map->nick2sd(script_getstr(st,6), false);
} else {
bl = map->id2bl(script_getnum(st,6));
break;
@@ -22744,6 +22744,19 @@ static BUILDIN(setfont)
return true;
}
+static BUILDIN(getfont)
+{
+ struct map_session_data *sd = script->rid2sd(st);
+
+ if (sd == NULL) {
+ script_pushint(st, 0);
+ return true;
+ }
+
+ script_pushint(st, sd->status.font);
+ return true;
+}
+
static int buildin_mobuseskill_sub(struct block_list *bl, va_list ap)
{
struct mob_data *md = NULL;
@@ -23070,7 +23083,7 @@ static BUILDIN(getcharip)
/* check if a character name is specified */
if (script_hasdata(st, 2)) {
if (script_isstringtype(st, 2)) {
- sd = map->nick2sd(script_getstr(st, 2));
+ sd = map->nick2sd(script_getstr(st, 2), false);
} else {
int id = script_getnum(st, 2);
sd = (map->id2sd(id) ? map->id2sd(id) : map->charid2sd(id));
@@ -25891,6 +25904,36 @@ static void script_run_item_unequip_script(struct map_session_data *sd, struct i
script->current_item_id = 0;
}
+static void script_run_item_rental_start_script(struct map_session_data *sd, struct item_data *data, int oid) __attribute__((nonnull(1, 2)));
+
+/**
+ * Run item rental start script
+ * @param sd player session data. Must be correct and checked before.
+ * @param data rental item data. Must be correct and checked before.
+ * @param oid npc id. Can be also 0 or fake npc id.
+ **/
+static void script_run_item_rental_start_script(struct map_session_data *sd, struct item_data *data, int oid)
+{
+ script->current_item_id = data->nameid;
+ script->run(data->rental_start_script, 0, sd->bl.id, oid);
+ script->current_item_id = 0;
+}
+
+static void script_run_item_rental_end_script(struct map_session_data *sd, struct item_data *data, int oid) __attribute__((nonnull(1, 2)));
+
+/**
+* Run item rental end script
+* @param sd player session data. Must be correct and checked before.
+* @param data rental item data. Must be correct and checked before.
+* @param oid npc id. Can be also 0 or fake npc id.
+**/
+static void script_run_item_rental_end_script(struct map_session_data *sd, struct item_data *data, int oid)
+{
+ script->current_item_id = data->nameid;
+ script->run(data->rental_end_script, 0, sd->bl.id, oid);
+ script->current_item_id = 0;
+}
+
#define BUILDIN_DEF(x,args) { buildin_ ## x , #x , args, false }
#define BUILDIN_DEF2(x,x2,args) { buildin_ ## x , x2 , args, false }
#define BUILDIN_DEF_DEPRECATED(x,args) { buildin_ ## x , #x , args, true }
@@ -26326,6 +26369,7 @@ static void script_parse_builtin(void)
BUILDIN_DEF(mercenary_set_faith,"ii"),
BUILDIN_DEF(readbook,"ii"),
BUILDIN_DEF(setfont,"i"),
+ BUILDIN_DEF(getfont, ""),
BUILDIN_DEF(areamobuseskill,"siiiiviiiii"),
BUILDIN_DEF(progressbar,"si"),
BUILDIN_DEF(progressbar_unit,"si?"),
@@ -27078,6 +27122,11 @@ static void script_hardcoded_constants(void)
script->set_constant("GUILD_ONLINE_VENDOR", GUILD_ONLINE_VENDOR, false, false);
script->set_constant("GUILD_ONLINE_NO_VENDOR", GUILD_ONLINE_NO_VENDOR, false, false);
+ script->constdb_comment("Siege Types");
+ script->set_constant("SIEGE_TYPE_FE", SIEGE_TYPE_FE, false, false);
+ script->set_constant("SIEGE_TYPE_SE", SIEGE_TYPE_SE, false, false);
+ script->set_constant("SIEGE_TYPE_TE", SIEGE_TYPE_TE, false, false);
+
script->constdb_comment("Renewal");
#ifdef RENEWAL
script->set_constant("RENEWAL", 1, false, false);
@@ -27438,4 +27487,6 @@ void script_defaults(void)
script->run_use_script = script_run_use_script;
script->run_item_equip_script = script_run_item_equip_script;
script->run_item_unequip_script = script_run_item_unequip_script;
+ script->run_item_rental_start_script = script_run_item_rental_start_script;
+ script->run_item_rental_end_script = script_run_item_rental_end_script;
}
diff --git a/src/map/script.h b/src/map/script.h
index 5dc480a15..a75b948ab 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -542,6 +542,16 @@ enum pcblock_action_flag {
};
/**
+ * Types of Siege (WoE)
+ */
+enum siege_type {
+ SIEGE_TYPE_FE,
+ SIEGE_TYPE_SE,
+ SIEGE_TYPE_TE,
+ SIEGE_TYPE_MAX
+};
+
+/**
* Structures
**/
@@ -1039,6 +1049,8 @@ struct script_interface {
void (*run_use_script) (struct map_session_data *sd, struct item_data *data, int oid);
void (*run_item_equip_script) (struct map_session_data *sd, struct item_data *data, int oid);
void (*run_item_unequip_script) (struct map_session_data *sd, struct item_data *data, int oid);
+ void (*run_item_rental_end_script) (struct map_session_data *sd, struct item_data *data, int oid);
+ void (*run_item_rental_start_script) (struct map_session_data *sd, struct item_data *data, int oid);
};
#ifdef HERCULES_CORE
diff --git a/src/map/skill.c b/src/map/skill.c
index af61c887c..4b6ab7d0d 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -8710,7 +8710,7 @@ static int skill_castend_nodamage_id(struct block_list *src, struct block_list *
case AM_REST:
if (sd) {
- if (homun->vaporize(sd,HOM_ST_REST))
+ if (homun->vaporize(sd, HOM_ST_REST, false))
clif->skill_nodamage(src, bl, skill_id, skill_lv, 1);
else
clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0, 0);
diff --git a/src/map/status.c b/src/map/status.c
index 90dfe2bfd..ba32b267e 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -9072,7 +9072,7 @@ static int status_change_start(struct block_list *src, struct block_list *bl, en
if (sd->status.pet_id > 0)
pet->menu(sd, 3);
if (homun_alive(sd->hd))
- homun->vaporize(sd,HOM_ST_REST);
+ homun->vaporize(sd, HOM_ST_REST, true);
if (sd->md)
mercenary->delete(sd->md,3);
}
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
index 76662b375..8c2f3b7a3 100644
--- a/src/plugins/HPMHooking/HPMHooking.Defs.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -1276,8 +1276,8 @@ typedef void (*HPMHOOK_pre_clif_scriptclear) (struct map_session_data **sd, int
typedef void (*HPMHOOK_post_clif_scriptclear) (struct map_session_data *sd, int npcid);
typedef void (*HPMHOOK_pre_clif_viewpoint) (struct map_session_data **sd, int *npc_id, int *type, int *x, int *y, int *id, int *color);
typedef void (*HPMHOOK_post_clif_viewpoint) (struct map_session_data *sd, int npc_id, int type, int x, int y, int id, int color);
-typedef int (*HPMHOOK_pre_clif_damage) (struct block_list **src, struct block_list **dst, int *sdelay, int *ddelay, int64 *damage, short *div, unsigned char *type, int64 *damage2);
-typedef int (*HPMHOOK_post_clif_damage) (int retVal___, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 damage, short div, unsigned char type, int64 damage2);
+typedef int (*HPMHOOK_pre_clif_damage) (struct block_list **src, struct block_list **dst, int *sdelay, int *ddelay, int64 *damage, short *div, enum battle_dmg_type *type, int64 *damage2);
+typedef int (*HPMHOOK_post_clif_damage) (int retVal___, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 damage, short div, enum battle_dmg_type type, int64 damage2);
typedef void (*HPMHOOK_pre_clif_sitting) (struct block_list **bl);
typedef void (*HPMHOOK_post_clif_sitting) (struct block_list *bl);
typedef void (*HPMHOOK_pre_clif_standing) (struct block_list **bl);
@@ -1524,8 +1524,8 @@ typedef void (*HPMHOOK_pre_clif_divorced) (struct map_session_data **sd, const c
typedef void (*HPMHOOK_post_clif_divorced) (struct map_session_data *sd, const char *name);
typedef void (*HPMHOOK_pre_clif_callpartner) (struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_callpartner) (struct map_session_data *sd);
-typedef int (*HPMHOOK_pre_clif_skill_damage) (struct block_list **src, struct block_list **dst, int64 *tick, int *sdelay, int *ddelay, int64 *damage, int *div, uint16 *skill_id, uint16 *skill_lv, int *type);
-typedef int (*HPMHOOK_post_clif_skill_damage) (int retVal___, struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 damage, int div, uint16 skill_id, uint16 skill_lv, int type);
+typedef int (*HPMHOOK_pre_clif_skill_damage) (struct block_list **src, struct block_list **dst, int64 *tick, int *sdelay, int *ddelay, int64 *damage, int *div, uint16 *skill_id, uint16 *skill_lv, enum battle_dmg_type *type);
+typedef int (*HPMHOOK_post_clif_skill_damage) (int retVal___, struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 damage, int div, uint16 skill_id, uint16 skill_lv, enum battle_dmg_type type);
typedef int (*HPMHOOK_pre_clif_skill_nodamage) (struct block_list **src, struct block_list **dst, uint16 *skill_id, int *heal, int *fail);
typedef int (*HPMHOOK_post_clif_skill_nodamage) (int retVal___, struct block_list *src, struct block_list *dst, uint16 skill_id, int heal, int fail);
typedef void (*HPMHOOK_pre_clif_skill_poseffect) (struct block_list **src, uint16 *skill_id, int *val, int *x, int *y, int64 *tick);
@@ -1756,6 +1756,10 @@ typedef void (*HPMHOOK_pre_clif_guild_basicinfo) (struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_guild_basicinfo) (struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_guild_allianceinfo) (struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_guild_allianceinfo) (struct map_session_data *sd);
+typedef void (*HPMHOOK_pre_clif_guild_castlelist) (struct map_session_data **sd);
+typedef void (*HPMHOOK_post_clif_guild_castlelist) (struct map_session_data *sd);
+typedef void (*HPMHOOK_pre_clif_guild_castleinfo) (struct map_session_data **sd, struct guild_castle **gc);
+typedef void (*HPMHOOK_post_clif_guild_castleinfo) (struct map_session_data *sd, struct guild_castle *gc);
typedef void (*HPMHOOK_pre_clif_guild_memberlist) (struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_guild_memberlist) (struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_guild_skillinfo) (struct map_session_data **sd);
@@ -2046,8 +2050,8 @@ typedef void (*HPMHOOK_pre_clif_show_modifiers) (struct map_session_data **sd);
typedef void (*HPMHOOK_post_clif_show_modifiers) (struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_notify_bounditem) (struct map_session_data **sd, unsigned short *index);
typedef void (*HPMHOOK_post_clif_notify_bounditem) (struct map_session_data *sd, unsigned short index);
-typedef int (*HPMHOOK_pre_clif_delay_damage) (int64 *tick, struct block_list **src, struct block_list **dst, int *sdelay, int *ddelay, int64 *in_damage, short *div, unsigned char *type);
-typedef int (*HPMHOOK_post_clif_delay_damage) (int retVal___, int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, unsigned char type);
+typedef int (*HPMHOOK_pre_clif_delay_damage) (int64 *tick, struct block_list **src, struct block_list **dst, int *sdelay, int *ddelay, int64 *in_damage, short *div, enum battle_dmg_type *type);
+typedef int (*HPMHOOK_post_clif_delay_damage) (int retVal___, int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, enum battle_dmg_type type);
typedef int (*HPMHOOK_pre_clif_delay_damage_sub) (int *tid, int64 *tick, int *id, intptr_t *data);
typedef int (*HPMHOOK_post_clif_delay_damage_sub) (int retVal___, int tid, int64 tick, int id, intptr_t data);
typedef void (*HPMHOOK_pre_clif_npc_market_open) (struct map_session_data **sd, struct npc_data **nd);
@@ -2726,6 +2730,12 @@ typedef void (*HPMHOOK_pre_clif_pRefineryUIRefine) (int *fd, struct map_session_
typedef void (*HPMHOOK_post_clif_pRefineryUIRefine) (int fd, struct map_session_data *sd);
typedef void (*HPMHOOK_pre_clif_announce_refine_status) (struct map_session_data **sd, int *item_id, int *refine_level, bool *success, enum send_target *target);
typedef void (*HPMHOOK_post_clif_announce_refine_status) (struct map_session_data *sd, int item_id, int refine_level, bool success, enum send_target target);
+typedef void (*HPMHOOK_pre_clif_pGuildCastleTeleportRequest) (int *fd, struct map_session_data **sd);
+typedef void (*HPMHOOK_post_clif_pGuildCastleTeleportRequest) (int fd, struct map_session_data *sd);
+typedef void (*HPMHOOK_pre_clif_pGuildCastleInfoRequest) (int *fd, struct map_session_data **sd);
+typedef void (*HPMHOOK_post_clif_pGuildCastleInfoRequest) (int fd, struct map_session_data *sd);
+typedef void (*HPMHOOK_pre_clif_guild_castleteleport_res) (struct map_session_data **sd, enum siege_teleport_result *result);
+typedef void (*HPMHOOK_post_clif_guild_castleteleport_res) (struct map_session_data *sd, enum siege_teleport_result result);
#endif // MAP_CLIF_H
#ifdef COMMON_CORE_H /* cmdline */
typedef void (*HPMHOOK_pre_cmdline_init) (void);
@@ -3058,6 +3068,8 @@ typedef bool (*HPMHOOK_pre_guild_read_castledb_libconfig) (void);
typedef bool (*HPMHOOK_post_guild_read_castledb_libconfig) (bool retVal___);
typedef bool (*HPMHOOK_pre_guild_read_castledb_libconfig_sub) (struct config_setting_t **it, int *idx, const char **source);
typedef bool (*HPMHOOK_post_guild_read_castledb_libconfig_sub) (bool retVal___, struct config_setting_t *it, int idx, const char *source);
+typedef bool (*HPMHOOK_pre_guild_read_castledb_libconfig_sub_warp) (struct config_setting_t **wd, const char **source, struct guild_castle **gc);
+typedef bool (*HPMHOOK_post_guild_read_castledb_libconfig_sub_warp) (bool retVal___, struct config_setting_t *wd, const char *source, struct guild_castle *gc);
typedef int (*HPMHOOK_pre_guild_payexp_timer_sub) (union DBKey *key, struct DBData **data, va_list ap);
typedef int (*HPMHOOK_post_guild_payexp_timer_sub) (int retVal___, union DBKey key, struct DBData *data, va_list ap);
typedef int (*HPMHOOK_pre_guild_send_xy_timer_sub) (union DBKey *key, struct DBData **data, va_list ap);
@@ -3136,8 +3148,8 @@ typedef void (*HPMHOOK_pre_homun_damaged) (struct homun_data **hd);
typedef void (*HPMHOOK_post_homun_damaged) (struct homun_data *hd);
typedef int (*HPMHOOK_pre_homun_dead) (struct homun_data **hd);
typedef int (*HPMHOOK_post_homun_dead) (int retVal___, struct homun_data *hd);
-typedef int (*HPMHOOK_pre_homun_vaporize) (struct map_session_data **sd, enum homun_state *flag);
-typedef int (*HPMHOOK_post_homun_vaporize) (int retVal___, struct map_session_data *sd, enum homun_state flag);
+typedef int (*HPMHOOK_pre_homun_vaporize) (struct map_session_data **sd, enum homun_state *state, bool *force);
+typedef int (*HPMHOOK_post_homun_vaporize) (int retVal___, struct map_session_data *sd, enum homun_state state, bool force);
typedef int (*HPMHOOK_pre_homun_delete) (struct homun_data **hd, int *emote);
typedef int (*HPMHOOK_post_homun_delete) (int retVal___, struct homun_data *hd, int emote);
typedef int (*HPMHOOK_pre_homun_checkskill) (struct homun_data **hd, uint16 *skill_id);
@@ -3158,6 +3170,8 @@ typedef bool (*HPMHOOK_pre_homun_mutate) (struct homun_data **hd, int *homun_id)
typedef bool (*HPMHOOK_post_homun_mutate) (bool retVal___, struct homun_data *hd, int homun_id);
typedef int (*HPMHOOK_pre_homun_gainexp) (struct homun_data **hd, unsigned int *exp);
typedef int (*HPMHOOK_post_homun_gainexp) (int retVal___, struct homun_data *hd, unsigned int exp);
+typedef int (*HPMHOOK_pre_homun_gainexp_real) (struct homun_data **hd, unsigned int *exp);
+typedef int (*HPMHOOK_post_homun_gainexp_real) (int retVal___, struct homun_data *hd, unsigned int exp);
typedef unsigned int (*HPMHOOK_pre_homun_add_intimacy) (struct homun_data **hd, unsigned int *value);
typedef unsigned int (*HPMHOOK_post_homun_add_intimacy) (unsigned int retVal___, struct homun_data *hd, unsigned int value);
typedef unsigned int (*HPMHOOK_pre_homun_consume_intimacy) (struct homun_data **hd, unsigned int *value);
@@ -3180,8 +3194,8 @@ typedef bool (*HPMHOOK_pre_homun_change_name_ack) (struct map_session_data **sd,
typedef bool (*HPMHOOK_post_homun_change_name_ack) (bool retVal___, struct map_session_data *sd, const char *name, int flag);
typedef int (*HPMHOOK_pre_homun_db_search) (int *key, int *type);
typedef int (*HPMHOOK_post_homun_db_search) (int retVal___, int key, int type);
-typedef bool (*HPMHOOK_pre_homun_create) (struct map_session_data **sd, const struct s_homunculus **hom);
-typedef bool (*HPMHOOK_post_homun_create) (bool retVal___, struct map_session_data *sd, const struct s_homunculus *hom);
+typedef bool (*HPMHOOK_pre_homun_create) (struct map_session_data **sd, const struct s_homunculus **hom, bool *is_new);
+typedef bool (*HPMHOOK_post_homun_create) (bool retVal___, struct map_session_data *sd, const struct s_homunculus *hom, bool is_new);
typedef void (*HPMHOOK_pre_homun_init_timers) (struct homun_data **hd);
typedef void (*HPMHOOK_post_homun_init_timers) (struct homun_data *hd);
typedef bool (*HPMHOOK_pre_homun_call) (struct map_session_data **sd);
@@ -4042,10 +4056,10 @@ typedef int (*HPMHOOK_pre_itemdb_isidentified) (int *nameid);
typedef int (*HPMHOOK_post_itemdb_isidentified) (int retVal___, int nameid);
typedef int (*HPMHOOK_pre_itemdb_isidentified2) (struct item_data **data);
typedef int (*HPMHOOK_post_itemdb_isidentified2) (int retVal___, struct item_data *data);
-typedef int (*HPMHOOK_pre_itemdb_combo_split_atoi) (char **str, int **val);
-typedef int (*HPMHOOK_post_itemdb_combo_split_atoi) (int retVal___, char *str, int *val);
-typedef void (*HPMHOOK_pre_itemdb_read_combos) (void);
-typedef void (*HPMHOOK_post_itemdb_read_combos) (void);
+typedef bool (*HPMHOOK_pre_itemdb_read_combodb_libconfig) (void);
+typedef bool (*HPMHOOK_post_itemdb_read_combodb_libconfig) (bool retVal___);
+typedef bool (*HPMHOOK_pre_itemdb_read_combodb_libconfig_sub) (struct config_setting_t **it, int *idx, const char **source);
+typedef bool (*HPMHOOK_post_itemdb_read_combodb_libconfig_sub) (bool retVal___, struct config_setting_t *it, int idx, const char *source);
typedef int (*HPMHOOK_pre_itemdb_gendercheck) (struct item_data **id);
typedef int (*HPMHOOK_post_itemdb_gendercheck) (int retVal___, struct item_data *id);
typedef int (*HPMHOOK_pre_itemdb_validate_entry) (struct item_data **entry, int *n, const char **source);
@@ -4668,8 +4682,8 @@ typedef void (*HPMHOOK_pre_map_addiddb) (struct block_list **bl);
typedef void (*HPMHOOK_post_map_addiddb) (struct block_list *bl);
typedef void (*HPMHOOK_pre_map_deliddb) (struct block_list **bl);
typedef void (*HPMHOOK_post_map_deliddb) (struct block_list *bl);
-typedef struct map_session_data* (*HPMHOOK_pre_map_nick2sd) (const char **nick);
-typedef struct map_session_data* (*HPMHOOK_post_map_nick2sd) (struct map_session_data* retVal___, const char *nick);
+typedef struct map_session_data* (*HPMHOOK_pre_map_nick2sd) (const char **nick, bool *allow_partial);
+typedef struct map_session_data* (*HPMHOOK_post_map_nick2sd) (struct map_session_data* retVal___, const char *nick, bool allow_partial);
typedef struct mob_data* (*HPMHOOK_pre_map_getmob_boss) (int16 *m);
typedef struct mob_data* (*HPMHOOK_post_map_getmob_boss) (struct mob_data* retVal___, int16 m);
typedef struct mob_data* (*HPMHOOK_pre_map_id2boss) (int *id);
@@ -6372,6 +6386,8 @@ typedef void (*HPMHOOK_pre_pc_update_idle_time) (struct map_session_data **sd, e
typedef void (*HPMHOOK_post_pc_update_idle_time) (struct map_session_data *sd, enum e_battle_config_idletime type);
typedef int (*HPMHOOK_pre_pc_have_magnifier) (struct map_session_data **sd);
typedef int (*HPMHOOK_post_pc_have_magnifier) (int retVal___, struct map_session_data *sd);
+typedef int (*HPMHOOK_pre_pc_have_item_chain) (struct map_session_data **sd, unsigned short *chain_id);
+typedef int (*HPMHOOK_post_pc_have_item_chain) (int retVal___, struct map_session_data *sd, unsigned short chain_id);
typedef bool (*HPMHOOK_pre_pc_process_chat_message) (struct map_session_data **sd, const char **message);
typedef bool (*HPMHOOK_post_pc_process_chat_message) (bool retVal___, struct map_session_data *sd, const char *message);
typedef int (*HPMHOOK_pre_pc_wis_message_to_gm) (const char **sender_name, int *permission, const char **message);
@@ -7046,6 +7062,10 @@ typedef void (*HPMHOOK_pre_script_run_item_equip_script) (struct map_session_dat
typedef void (*HPMHOOK_post_script_run_item_equip_script) (struct map_session_data *sd, struct item_data *data, int oid);
typedef void (*HPMHOOK_pre_script_run_item_unequip_script) (struct map_session_data **sd, struct item_data **data, int *oid);
typedef void (*HPMHOOK_post_script_run_item_unequip_script) (struct map_session_data *sd, struct item_data *data, int oid);
+typedef void (*HPMHOOK_pre_script_run_item_rental_end_script) (struct map_session_data **sd, struct item_data **data, int *oid);
+typedef void (*HPMHOOK_post_script_run_item_rental_end_script) (struct map_session_data *sd, struct item_data *data, int oid);
+typedef void (*HPMHOOK_pre_script_run_item_rental_start_script) (struct map_session_data **sd, struct item_data **data, int *oid);
+typedef void (*HPMHOOK_post_script_run_item_rental_start_script) (struct map_session_data *sd, struct item_data *data, int oid);
#endif // MAP_SCRIPT_H
#ifdef MAP_SEARCHSTORE_H /* searchstore */
typedef bool (*HPMHOOK_pre_searchstore_open) (struct map_session_data **sd, unsigned int *uses, unsigned short *effect);
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index 9feb01586..37c42d8c2 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -1346,6 +1346,10 @@ struct {
struct HPMHookPoint *HP_clif_guild_basicinfo_post;
struct HPMHookPoint *HP_clif_guild_allianceinfo_pre;
struct HPMHookPoint *HP_clif_guild_allianceinfo_post;
+ struct HPMHookPoint *HP_clif_guild_castlelist_pre;
+ struct HPMHookPoint *HP_clif_guild_castlelist_post;
+ struct HPMHookPoint *HP_clif_guild_castleinfo_pre;
+ struct HPMHookPoint *HP_clif_guild_castleinfo_post;
struct HPMHookPoint *HP_clif_guild_memberlist_pre;
struct HPMHookPoint *HP_clif_guild_memberlist_post;
struct HPMHookPoint *HP_clif_guild_skillinfo_pre;
@@ -2316,6 +2320,12 @@ struct {
struct HPMHookPoint *HP_clif_pRefineryUIRefine_post;
struct HPMHookPoint *HP_clif_announce_refine_status_pre;
struct HPMHookPoint *HP_clif_announce_refine_status_post;
+ struct HPMHookPoint *HP_clif_pGuildCastleTeleportRequest_pre;
+ struct HPMHookPoint *HP_clif_pGuildCastleTeleportRequest_post;
+ struct HPMHookPoint *HP_clif_pGuildCastleInfoRequest_pre;
+ struct HPMHookPoint *HP_clif_pGuildCastleInfoRequest_post;
+ struct HPMHookPoint *HP_clif_guild_castleteleport_res_pre;
+ struct HPMHookPoint *HP_clif_guild_castleteleport_res_post;
struct HPMHookPoint *HP_cmdline_init_pre;
struct HPMHookPoint *HP_cmdline_init_post;
struct HPMHookPoint *HP_cmdline_final_pre;
@@ -2622,6 +2632,8 @@ struct {
struct HPMHookPoint *HP_guild_read_castledb_libconfig_post;
struct HPMHookPoint *HP_guild_read_castledb_libconfig_sub_pre;
struct HPMHookPoint *HP_guild_read_castledb_libconfig_sub_post;
+ struct HPMHookPoint *HP_guild_read_castledb_libconfig_sub_warp_pre;
+ struct HPMHookPoint *HP_guild_read_castledb_libconfig_sub_warp_post;
struct HPMHookPoint *HP_guild_payexp_timer_sub_pre;
struct HPMHookPoint *HP_guild_payexp_timer_sub_post;
struct HPMHookPoint *HP_guild_send_xy_timer_sub_pre;
@@ -2718,6 +2730,8 @@ struct {
struct HPMHookPoint *HP_homun_mutate_post;
struct HPMHookPoint *HP_homun_gainexp_pre;
struct HPMHookPoint *HP_homun_gainexp_post;
+ struct HPMHookPoint *HP_homun_gainexp_real_pre;
+ struct HPMHookPoint *HP_homun_gainexp_real_post;
struct HPMHookPoint *HP_homun_add_intimacy_pre;
struct HPMHookPoint *HP_homun_add_intimacy_post;
struct HPMHookPoint *HP_homun_consume_intimacy_pre;
@@ -3218,10 +3232,10 @@ struct {
struct HPMHookPoint *HP_itemdb_isidentified_post;
struct HPMHookPoint *HP_itemdb_isidentified2_pre;
struct HPMHookPoint *HP_itemdb_isidentified2_post;
- struct HPMHookPoint *HP_itemdb_combo_split_atoi_pre;
- struct HPMHookPoint *HP_itemdb_combo_split_atoi_post;
- struct HPMHookPoint *HP_itemdb_read_combos_pre;
- struct HPMHookPoint *HP_itemdb_read_combos_post;
+ struct HPMHookPoint *HP_itemdb_read_combodb_libconfig_pre;
+ struct HPMHookPoint *HP_itemdb_read_combodb_libconfig_post;
+ struct HPMHookPoint *HP_itemdb_read_combodb_libconfig_sub_pre;
+ struct HPMHookPoint *HP_itemdb_read_combodb_libconfig_sub_post;
struct HPMHookPoint *HP_itemdb_gendercheck_pre;
struct HPMHookPoint *HP_itemdb_gendercheck_post;
struct HPMHookPoint *HP_itemdb_validate_entry_pre;
@@ -4956,6 +4970,8 @@ struct {
struct HPMHookPoint *HP_pc_update_idle_time_post;
struct HPMHookPoint *HP_pc_have_magnifier_pre;
struct HPMHookPoint *HP_pc_have_magnifier_post;
+ struct HPMHookPoint *HP_pc_have_item_chain_pre;
+ struct HPMHookPoint *HP_pc_have_item_chain_post;
struct HPMHookPoint *HP_pc_process_chat_message_pre;
struct HPMHookPoint *HP_pc_process_chat_message_post;
struct HPMHookPoint *HP_pc_wis_message_to_gm_pre;
@@ -5580,6 +5596,10 @@ struct {
struct HPMHookPoint *HP_script_run_item_equip_script_post;
struct HPMHookPoint *HP_script_run_item_unequip_script_pre;
struct HPMHookPoint *HP_script_run_item_unequip_script_post;
+ struct HPMHookPoint *HP_script_run_item_rental_end_script_pre;
+ struct HPMHookPoint *HP_script_run_item_rental_end_script_post;
+ struct HPMHookPoint *HP_script_run_item_rental_start_script_pre;
+ struct HPMHookPoint *HP_script_run_item_rental_start_script_post;
struct HPMHookPoint *HP_searchstore_open_pre;
struct HPMHookPoint *HP_searchstore_open_post;
struct HPMHookPoint *HP_searchstore_query_pre;
@@ -8123,6 +8143,10 @@ struct {
int HP_clif_guild_basicinfo_post;
int HP_clif_guild_allianceinfo_pre;
int HP_clif_guild_allianceinfo_post;
+ int HP_clif_guild_castlelist_pre;
+ int HP_clif_guild_castlelist_post;
+ int HP_clif_guild_castleinfo_pre;
+ int HP_clif_guild_castleinfo_post;
int HP_clif_guild_memberlist_pre;
int HP_clif_guild_memberlist_post;
int HP_clif_guild_skillinfo_pre;
@@ -9093,6 +9117,12 @@ struct {
int HP_clif_pRefineryUIRefine_post;
int HP_clif_announce_refine_status_pre;
int HP_clif_announce_refine_status_post;
+ int HP_clif_pGuildCastleTeleportRequest_pre;
+ int HP_clif_pGuildCastleTeleportRequest_post;
+ int HP_clif_pGuildCastleInfoRequest_pre;
+ int HP_clif_pGuildCastleInfoRequest_post;
+ int HP_clif_guild_castleteleport_res_pre;
+ int HP_clif_guild_castleteleport_res_post;
int HP_cmdline_init_pre;
int HP_cmdline_init_post;
int HP_cmdline_final_pre;
@@ -9399,6 +9429,8 @@ struct {
int HP_guild_read_castledb_libconfig_post;
int HP_guild_read_castledb_libconfig_sub_pre;
int HP_guild_read_castledb_libconfig_sub_post;
+ int HP_guild_read_castledb_libconfig_sub_warp_pre;
+ int HP_guild_read_castledb_libconfig_sub_warp_post;
int HP_guild_payexp_timer_sub_pre;
int HP_guild_payexp_timer_sub_post;
int HP_guild_send_xy_timer_sub_pre;
@@ -9495,6 +9527,8 @@ struct {
int HP_homun_mutate_post;
int HP_homun_gainexp_pre;
int HP_homun_gainexp_post;
+ int HP_homun_gainexp_real_pre;
+ int HP_homun_gainexp_real_post;
int HP_homun_add_intimacy_pre;
int HP_homun_add_intimacy_post;
int HP_homun_consume_intimacy_pre;
@@ -9995,10 +10029,10 @@ struct {
int HP_itemdb_isidentified_post;
int HP_itemdb_isidentified2_pre;
int HP_itemdb_isidentified2_post;
- int HP_itemdb_combo_split_atoi_pre;
- int HP_itemdb_combo_split_atoi_post;
- int HP_itemdb_read_combos_pre;
- int HP_itemdb_read_combos_post;
+ int HP_itemdb_read_combodb_libconfig_pre;
+ int HP_itemdb_read_combodb_libconfig_post;
+ int HP_itemdb_read_combodb_libconfig_sub_pre;
+ int HP_itemdb_read_combodb_libconfig_sub_post;
int HP_itemdb_gendercheck_pre;
int HP_itemdb_gendercheck_post;
int HP_itemdb_validate_entry_pre;
@@ -11733,6 +11767,8 @@ struct {
int HP_pc_update_idle_time_post;
int HP_pc_have_magnifier_pre;
int HP_pc_have_magnifier_post;
+ int HP_pc_have_item_chain_pre;
+ int HP_pc_have_item_chain_post;
int HP_pc_process_chat_message_pre;
int HP_pc_process_chat_message_post;
int HP_pc_wis_message_to_gm_pre;
@@ -12357,6 +12393,10 @@ struct {
int HP_script_run_item_equip_script_post;
int HP_script_run_item_unequip_script_pre;
int HP_script_run_item_unequip_script_post;
+ int HP_script_run_item_rental_end_script_pre;
+ int HP_script_run_item_rental_end_script_post;
+ int HP_script_run_item_rental_start_script_pre;
+ int HP_script_run_item_rental_start_script_post;
int HP_searchstore_open_pre;
int HP_searchstore_open_post;
int HP_searchstore_query_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index d591f3c56..748db6123 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -697,6 +697,8 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->guild_masterormember, HP_clif_guild_masterormember) },
{ HP_POP(clif->guild_basicinfo, HP_clif_guild_basicinfo) },
{ HP_POP(clif->guild_allianceinfo, HP_clif_guild_allianceinfo) },
+ { HP_POP(clif->guild_castlelist, HP_clif_guild_castlelist) },
+ { HP_POP(clif->guild_castleinfo, HP_clif_guild_castleinfo) },
{ HP_POP(clif->guild_memberlist, HP_clif_guild_memberlist) },
{ HP_POP(clif->guild_skillinfo, HP_clif_guild_skillinfo) },
{ HP_POP(clif->guild_send_onlineinfo, HP_clif_guild_send_onlineinfo) },
@@ -1182,6 +1184,9 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->pRefineryUIClose, HP_clif_pRefineryUIClose) },
{ HP_POP(clif->pRefineryUIRefine, HP_clif_pRefineryUIRefine) },
{ HP_POP(clif->announce_refine_status, HP_clif_announce_refine_status) },
+ { HP_POP(clif->pGuildCastleTeleportRequest, HP_clif_pGuildCastleTeleportRequest) },
+ { HP_POP(clif->pGuildCastleInfoRequest, HP_clif_pGuildCastleInfoRequest) },
+ { HP_POP(clif->guild_castleteleport_res, HP_clif_guild_castleteleport_res) },
/* cmdline_interface */
{ HP_POP(cmdline->init, HP_cmdline_init) },
{ HP_POP(cmdline->final, HP_cmdline_final) },
@@ -1344,6 +1349,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(guild->read_guildskill_tree_db, HP_guild_read_guildskill_tree_db) },
{ HP_POP(guild->read_castledb_libconfig, HP_guild_read_castledb_libconfig) },
{ HP_POP(guild->read_castledb_libconfig_sub, HP_guild_read_castledb_libconfig_sub) },
+ { HP_POP(guild->read_castledb_libconfig_sub_warp, HP_guild_read_castledb_libconfig_sub_warp) },
{ HP_POP(guild->payexp_timer_sub, HP_guild_payexp_timer_sub) },
{ HP_POP(guild->send_xy_timer_sub, HP_guild_send_xy_timer_sub) },
{ HP_POP(guild->send_xy_timer, HP_guild_send_xy_timer) },
@@ -1394,6 +1400,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(homun->evolve, HP_homun_evolve) },
{ HP_POP(homun->mutate, HP_homun_mutate) },
{ HP_POP(homun->gainexp, HP_homun_gainexp) },
+ { HP_POP(homun->gainexp_real, HP_homun_gainexp_real) },
{ HP_POP(homun->add_intimacy, HP_homun_add_intimacy) },
{ HP_POP(homun->consume_intimacy, HP_homun_consume_intimacy) },
{ HP_POP(homun->healed, HP_homun_healed) },
@@ -1648,8 +1655,8 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(itemdb->isrestricted, HP_itemdb_isrestricted) },
{ HP_POP(itemdb->isidentified, HP_itemdb_isidentified) },
{ HP_POP(itemdb->isidentified2, HP_itemdb_isidentified2) },
- { HP_POP(itemdb->combo_split_atoi, HP_itemdb_combo_split_atoi) },
- { HP_POP(itemdb->read_combos, HP_itemdb_read_combos) },
+ { HP_POP(itemdb->read_combodb_libconfig, HP_itemdb_read_combodb_libconfig) },
+ { HP_POP(itemdb->read_combodb_libconfig_sub, HP_itemdb_read_combodb_libconfig_sub) },
{ HP_POP(itemdb->gendercheck, HP_itemdb_gendercheck) },
{ HP_POP(itemdb->validate_entry, HP_itemdb_validate_entry) },
{ HP_POP(itemdb->readdb_options_additional_fields, HP_itemdb_readdb_options_additional_fields) },
@@ -2536,6 +2543,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(pc->check_job_name, HP_pc_check_job_name) },
{ HP_POP(pc->update_idle_time, HP_pc_update_idle_time) },
{ HP_POP(pc->have_magnifier, HP_pc_have_magnifier) },
+ { HP_POP(pc->have_item_chain, HP_pc_have_item_chain) },
{ HP_POP(pc->process_chat_message, HP_pc_process_chat_message) },
{ HP_POP(pc->wis_message_to_gm, HP_pc_wis_message_to_gm) },
{ HP_POP(pc->wis_message_to_gm_sub, HP_pc_wis_message_to_gm_sub) },
@@ -2856,6 +2864,8 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(script->run_use_script, HP_script_run_use_script) },
{ HP_POP(script->run_item_equip_script, HP_script_run_item_equip_script) },
{ HP_POP(script->run_item_unequip_script, HP_script_run_item_unequip_script) },
+ { HP_POP(script->run_item_rental_end_script, HP_script_run_item_rental_end_script) },
+ { HP_POP(script->run_item_rental_start_script, HP_script_run_item_rental_start_script) },
/* searchstore_interface */
{ HP_POP(searchstore->open, HP_searchstore_open) },
{ HP_POP(searchstore->query, HP_searchstore_query) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index 005742aca..e519887c9 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -11278,11 +11278,11 @@ void HP_clif_viewpoint(struct map_session_data *sd, int npc_id, int type, int x,
}
return;
}
-int HP_clif_damage(struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 damage, short div, unsigned char type, int64 damage2) {
+int HP_clif_damage(struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 damage, short div, enum battle_dmg_type type, int64 damage2) {
int hIndex = 0;
int retVal___ = 0;
if (HPMHooks.count.HP_clif_damage_pre > 0) {
- int (*preHookFunc) (struct block_list **src, struct block_list **dst, int *sdelay, int *ddelay, int64 *damage, short *div, unsigned char *type, int64 *damage2);
+ int (*preHookFunc) (struct block_list **src, struct block_list **dst, int *sdelay, int *ddelay, int64 *damage, short *div, enum battle_dmg_type *type, int64 *damage2);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_damage_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_clif_damage_pre[hIndex].func;
@@ -11297,7 +11297,7 @@ int HP_clif_damage(struct block_list *src, struct block_list *dst, int sdelay, i
retVal___ = HPMHooks.source.clif.damage(src, dst, sdelay, ddelay, damage, div, type, damage2);
}
if (HPMHooks.count.HP_clif_damage_post > 0) {
- int (*postHookFunc) (int retVal___, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 damage, short div, unsigned char type, int64 damage2);
+ int (*postHookFunc) (int retVal___, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 damage, short div, enum battle_dmg_type type, int64 damage2);
for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_damage_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_clif_damage_post[hIndex].func;
retVal___ = postHookFunc(retVal___, src, dst, sdelay, ddelay, damage, div, type, damage2);
@@ -14532,11 +14532,11 @@ void HP_clif_callpartner(struct map_session_data *sd) {
}
return;
}
-int HP_clif_skill_damage(struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 damage, int div, uint16 skill_id, uint16 skill_lv, int type) {
+int HP_clif_skill_damage(struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 damage, int div, uint16 skill_id, uint16 skill_lv, enum battle_dmg_type type) {
int hIndex = 0;
int retVal___ = 0;
if (HPMHooks.count.HP_clif_skill_damage_pre > 0) {
- int (*preHookFunc) (struct block_list **src, struct block_list **dst, int64 *tick, int *sdelay, int *ddelay, int64 *damage, int *div, uint16 *skill_id, uint16 *skill_lv, int *type);
+ int (*preHookFunc) (struct block_list **src, struct block_list **dst, int64 *tick, int *sdelay, int *ddelay, int64 *damage, int *div, uint16 *skill_id, uint16 *skill_lv, enum battle_dmg_type *type);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_skill_damage_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_clif_skill_damage_pre[hIndex].func;
@@ -14551,7 +14551,7 @@ int HP_clif_skill_damage(struct block_list *src, struct block_list *dst, int64 t
retVal___ = HPMHooks.source.clif.skill_damage(src, dst, tick, sdelay, ddelay, damage, div, skill_id, skill_lv, type);
}
if (HPMHooks.count.HP_clif_skill_damage_post > 0) {
- int (*postHookFunc) (int retVal___, struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 damage, int div, uint16 skill_id, uint16 skill_lv, int type);
+ int (*postHookFunc) (int retVal___, struct block_list *src, struct block_list *dst, int64 tick, int sdelay, int ddelay, int64 damage, int div, uint16 skill_id, uint16 skill_lv, enum battle_dmg_type type);
for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_skill_damage_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_clif_skill_damage_post[hIndex].func;
retVal___ = postHookFunc(retVal___, src, dst, tick, sdelay, ddelay, damage, div, skill_id, skill_lv, type);
@@ -17552,6 +17552,58 @@ void HP_clif_guild_allianceinfo(struct map_session_data *sd) {
}
return;
}
+void HP_clif_guild_castlelist(struct map_session_data *sd) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_guild_castlelist_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_guild_castlelist_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_guild_castlelist_pre[hIndex].func;
+ preHookFunc(&sd);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.guild_castlelist(sd);
+ }
+ if (HPMHooks.count.HP_clif_guild_castlelist_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_guild_castlelist_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_guild_castlelist_post[hIndex].func;
+ postHookFunc(sd);
+ }
+ }
+ return;
+}
+void HP_clif_guild_castleinfo(struct map_session_data *sd, struct guild_castle *gc) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_guild_castleinfo_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd, struct guild_castle **gc);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_guild_castleinfo_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_guild_castleinfo_pre[hIndex].func;
+ preHookFunc(&sd, &gc);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.guild_castleinfo(sd, gc);
+ }
+ if (HPMHooks.count.HP_clif_guild_castleinfo_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd, struct guild_castle *gc);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_guild_castleinfo_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_guild_castleinfo_post[hIndex].func;
+ postHookFunc(sd, gc);
+ }
+ }
+ return;
+}
void HP_clif_guild_memberlist(struct map_session_data *sd) {
int hIndex = 0;
if (HPMHooks.count.HP_clif_guild_memberlist_pre > 0) {
@@ -21332,11 +21384,11 @@ void HP_clif_notify_bounditem(struct map_session_data *sd, unsigned short index)
}
return;
}
-int HP_clif_delay_damage(int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, unsigned char type) {
+int HP_clif_delay_damage(int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, enum battle_dmg_type type) {
int hIndex = 0;
int retVal___ = 0;
if (HPMHooks.count.HP_clif_delay_damage_pre > 0) {
- int (*preHookFunc) (int64 *tick, struct block_list **src, struct block_list **dst, int *sdelay, int *ddelay, int64 *in_damage, short *div, unsigned char *type);
+ int (*preHookFunc) (int64 *tick, struct block_list **src, struct block_list **dst, int *sdelay, int *ddelay, int64 *in_damage, short *div, enum battle_dmg_type *type);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_delay_damage_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_clif_delay_damage_pre[hIndex].func;
@@ -21351,7 +21403,7 @@ int HP_clif_delay_damage(int64 tick, struct block_list *src, struct block_list *
retVal___ = HPMHooks.source.clif.delay_damage(tick, src, dst, sdelay, ddelay, in_damage, div, type);
}
if (HPMHooks.count.HP_clif_delay_damage_post > 0) {
- int (*postHookFunc) (int retVal___, int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, unsigned char type);
+ int (*postHookFunc) (int retVal___, int64 tick, struct block_list *src, struct block_list *dst, int sdelay, int ddelay, int64 in_damage, short div, enum battle_dmg_type type);
for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_delay_damage_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_clif_delay_damage_post[hIndex].func;
retVal___ = postHookFunc(retVal___, tick, src, dst, sdelay, ddelay, in_damage, div, type);
@@ -30193,6 +30245,84 @@ void HP_clif_announce_refine_status(struct map_session_data *sd, int item_id, in
}
return;
}
+void HP_clif_pGuildCastleTeleportRequest(int fd, struct map_session_data *sd) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_pGuildCastleTeleportRequest_pre > 0) {
+ void (*preHookFunc) (int *fd, struct map_session_data **sd);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_pGuildCastleTeleportRequest_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_pGuildCastleTeleportRequest_pre[hIndex].func;
+ preHookFunc(&fd, &sd);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.pGuildCastleTeleportRequest(fd, sd);
+ }
+ if (HPMHooks.count.HP_clif_pGuildCastleTeleportRequest_post > 0) {
+ void (*postHookFunc) (int fd, struct map_session_data *sd);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_pGuildCastleTeleportRequest_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_pGuildCastleTeleportRequest_post[hIndex].func;
+ postHookFunc(fd, sd);
+ }
+ }
+ return;
+}
+void HP_clif_pGuildCastleInfoRequest(int fd, struct map_session_data *sd) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_pGuildCastleInfoRequest_pre > 0) {
+ void (*preHookFunc) (int *fd, struct map_session_data **sd);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_pGuildCastleInfoRequest_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_pGuildCastleInfoRequest_pre[hIndex].func;
+ preHookFunc(&fd, &sd);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.pGuildCastleInfoRequest(fd, sd);
+ }
+ if (HPMHooks.count.HP_clif_pGuildCastleInfoRequest_post > 0) {
+ void (*postHookFunc) (int fd, struct map_session_data *sd);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_pGuildCastleInfoRequest_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_pGuildCastleInfoRequest_post[hIndex].func;
+ postHookFunc(fd, sd);
+ }
+ }
+ return;
+}
+void HP_clif_guild_castleteleport_res(struct map_session_data *sd, enum siege_teleport_result result) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_guild_castleteleport_res_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd, enum siege_teleport_result *result);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_guild_castleteleport_res_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_guild_castleteleport_res_pre[hIndex].func;
+ preHookFunc(&sd, &result);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.guild_castleteleport_res(sd, result);
+ }
+ if (HPMHooks.count.HP_clif_guild_castleteleport_res_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd, enum siege_teleport_result result);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_guild_castleteleport_res_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_guild_castleteleport_res_post[hIndex].func;
+ postHookFunc(sd, result);
+ }
+ }
+ return;
+}
/* cmdline_interface */
void HP_cmdline_init(void) {
int hIndex = 0;
@@ -34304,6 +34434,33 @@ bool HP_guild_read_castledb_libconfig_sub(struct config_setting_t *it, int idx,
}
return retVal___;
}
+bool HP_guild_read_castledb_libconfig_sub_warp(struct config_setting_t *wd, const char *source, struct guild_castle *gc) {
+ int hIndex = 0;
+ bool retVal___ = false;
+ if (HPMHooks.count.HP_guild_read_castledb_libconfig_sub_warp_pre > 0) {
+ bool (*preHookFunc) (struct config_setting_t **wd, const char **source, struct guild_castle **gc);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_guild_read_castledb_libconfig_sub_warp_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_guild_read_castledb_libconfig_sub_warp_pre[hIndex].func;
+ retVal___ = preHookFunc(&wd, &source, &gc);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.guild.read_castledb_libconfig_sub_warp(wd, source, gc);
+ }
+ if (HPMHooks.count.HP_guild_read_castledb_libconfig_sub_warp_post > 0) {
+ bool (*postHookFunc) (bool retVal___, struct config_setting_t *wd, const char *source, struct guild_castle *gc);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_guild_read_castledb_libconfig_sub_warp_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_guild_read_castledb_libconfig_sub_warp_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, wd, source, gc);
+ }
+ }
+ return retVal___;
+}
int HP_guild_payexp_timer_sub(union DBKey key, struct DBData *data, va_list ap) {
int hIndex = 0;
int retVal___ = 0;
@@ -35356,15 +35513,15 @@ int HP_homun_dead(struct homun_data *hd) {
}
return retVal___;
}
-int HP_homun_vaporize(struct map_session_data *sd, enum homun_state flag) {
+int HP_homun_vaporize(struct map_session_data *sd, enum homun_state state, bool force) {
int hIndex = 0;
int retVal___ = 0;
if (HPMHooks.count.HP_homun_vaporize_pre > 0) {
- int (*preHookFunc) (struct map_session_data **sd, enum homun_state *flag);
+ int (*preHookFunc) (struct map_session_data **sd, enum homun_state *state, bool *force);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_homun_vaporize_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_homun_vaporize_pre[hIndex].func;
- retVal___ = preHookFunc(&sd, &flag);
+ retVal___ = preHookFunc(&sd, &state, &force);
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -35372,13 +35529,13 @@ int HP_homun_vaporize(struct map_session_data *sd, enum homun_state flag) {
}
}
{
- retVal___ = HPMHooks.source.homun.vaporize(sd, flag);
+ retVal___ = HPMHooks.source.homun.vaporize(sd, state, force);
}
if (HPMHooks.count.HP_homun_vaporize_post > 0) {
- int (*postHookFunc) (int retVal___, struct map_session_data *sd, enum homun_state flag);
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd, enum homun_state state, bool force);
for (hIndex = 0; hIndex < HPMHooks.count.HP_homun_vaporize_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_homun_vaporize_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, sd, flag);
+ retVal___ = postHookFunc(retVal___, sd, state, force);
}
}
return retVal___;
@@ -35652,6 +35809,33 @@ int HP_homun_gainexp(struct homun_data *hd, unsigned int exp) {
}
return retVal___;
}
+int HP_homun_gainexp_real(struct homun_data *hd, unsigned int exp) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if (HPMHooks.count.HP_homun_gainexp_real_pre > 0) {
+ int (*preHookFunc) (struct homun_data **hd, unsigned int *exp);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_homun_gainexp_real_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_homun_gainexp_real_pre[hIndex].func;
+ retVal___ = preHookFunc(&hd, &exp);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.homun.gainexp_real(hd, exp);
+ }
+ if (HPMHooks.count.HP_homun_gainexp_real_post > 0) {
+ int (*postHookFunc) (int retVal___, struct homun_data *hd, unsigned int exp);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_homun_gainexp_real_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_homun_gainexp_real_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, hd, exp);
+ }
+ }
+ return retVal___;
+}
unsigned int HP_homun_add_intimacy(struct homun_data *hd, unsigned int value) {
int hIndex = 0;
unsigned int retVal___ = 0;
@@ -35946,15 +36130,15 @@ int HP_homun_db_search(int key, int type) {
}
return retVal___;
}
-bool HP_homun_create(struct map_session_data *sd, const struct s_homunculus *hom) {
+bool HP_homun_create(struct map_session_data *sd, const struct s_homunculus *hom, bool is_new) {
int hIndex = 0;
bool retVal___ = false;
if (HPMHooks.count.HP_homun_create_pre > 0) {
- bool (*preHookFunc) (struct map_session_data **sd, const struct s_homunculus **hom);
+ bool (*preHookFunc) (struct map_session_data **sd, const struct s_homunculus **hom, bool *is_new);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_homun_create_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_homun_create_pre[hIndex].func;
- retVal___ = preHookFunc(&sd, &hom);
+ retVal___ = preHookFunc(&sd, &hom, &is_new);
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -35962,13 +36146,13 @@ bool HP_homun_create(struct map_session_data *sd, const struct s_homunculus *hom
}
}
{
- retVal___ = HPMHooks.source.homun.create(sd, hom);
+ retVal___ = HPMHooks.source.homun.create(sd, hom, is_new);
}
if (HPMHooks.count.HP_homun_create_post > 0) {
- bool (*postHookFunc) (bool retVal___, struct map_session_data *sd, const struct s_homunculus *hom);
+ bool (*postHookFunc) (bool retVal___, struct map_session_data *sd, const struct s_homunculus *hom, bool is_new);
for (hIndex = 0; hIndex < HPMHooks.count.HP_homun_create_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_homun_create_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, sd, hom);
+ retVal___ = postHookFunc(retVal___, sd, hom, is_new);
}
}
return retVal___;
@@ -42310,15 +42494,15 @@ int HP_itemdb_isidentified2(struct item_data *data) {
}
return retVal___;
}
-int HP_itemdb_combo_split_atoi(char *str, int *val) {
+bool HP_itemdb_read_combodb_libconfig(void) {
int hIndex = 0;
- int retVal___ = 0;
- if (HPMHooks.count.HP_itemdb_combo_split_atoi_pre > 0) {
- int (*preHookFunc) (char **str, int **val);
+ bool retVal___ = false;
+ if (HPMHooks.count.HP_itemdb_read_combodb_libconfig_pre > 0) {
+ bool (*preHookFunc) (void);
*HPMforce_return = false;
- for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_combo_split_atoi_pre; hIndex++) {
- preHookFunc = HPMHooks.list.HP_itemdb_combo_split_atoi_pre[hIndex].func;
- retVal___ = preHookFunc(&str, &val);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_read_combodb_libconfig_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_itemdb_read_combodb_libconfig_pre[hIndex].func;
+ retVal___ = preHookFunc();
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -42326,42 +42510,43 @@ int HP_itemdb_combo_split_atoi(char *str, int *val) {
}
}
{
- retVal___ = HPMHooks.source.itemdb.combo_split_atoi(str, val);
+ retVal___ = HPMHooks.source.itemdb.read_combodb_libconfig();
}
- if (HPMHooks.count.HP_itemdb_combo_split_atoi_post > 0) {
- int (*postHookFunc) (int retVal___, char *str, int *val);
- for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_combo_split_atoi_post; hIndex++) {
- postHookFunc = HPMHooks.list.HP_itemdb_combo_split_atoi_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, str, val);
+ if (HPMHooks.count.HP_itemdb_read_combodb_libconfig_post > 0) {
+ bool (*postHookFunc) (bool retVal___);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_read_combodb_libconfig_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_itemdb_read_combodb_libconfig_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___);
}
}
return retVal___;
}
-void HP_itemdb_read_combos(void) {
+bool HP_itemdb_read_combodb_libconfig_sub(struct config_setting_t *it, int idx, const char *source) {
int hIndex = 0;
- if (HPMHooks.count.HP_itemdb_read_combos_pre > 0) {
- void (*preHookFunc) (void);
+ bool retVal___ = false;
+ if (HPMHooks.count.HP_itemdb_read_combodb_libconfig_sub_pre > 0) {
+ bool (*preHookFunc) (struct config_setting_t **it, int *idx, const char **source);
*HPMforce_return = false;
- for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_read_combos_pre; hIndex++) {
- preHookFunc = HPMHooks.list.HP_itemdb_read_combos_pre[hIndex].func;
- preHookFunc();
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_read_combodb_libconfig_sub_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_itemdb_read_combodb_libconfig_sub_pre[hIndex].func;
+ retVal___ = preHookFunc(&it, &idx, &source);
}
if (*HPMforce_return) {
*HPMforce_return = false;
- return;
+ return retVal___;
}
}
{
- HPMHooks.source.itemdb.read_combos();
+ retVal___ = HPMHooks.source.itemdb.read_combodb_libconfig_sub(it, idx, source);
}
- if (HPMHooks.count.HP_itemdb_read_combos_post > 0) {
- void (*postHookFunc) (void);
- for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_read_combos_post; hIndex++) {
- postHookFunc = HPMHooks.list.HP_itemdb_read_combos_post[hIndex].func;
- postHookFunc();
+ if (HPMHooks.count.HP_itemdb_read_combodb_libconfig_sub_post > 0) {
+ bool (*postHookFunc) (bool retVal___, struct config_setting_t *it, int idx, const char *source);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_read_combodb_libconfig_sub_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_itemdb_read_combodb_libconfig_sub_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, it, idx, source);
}
}
- return;
+ return retVal___;
}
int HP_itemdb_gendercheck(struct item_data *id) {
int hIndex = 0;
@@ -47466,15 +47651,15 @@ void HP_map_deliddb(struct block_list *bl) {
}
return;
}
-struct map_session_data* HP_map_nick2sd(const char *nick) {
+struct map_session_data* HP_map_nick2sd(const char *nick, bool allow_partial) {
int hIndex = 0;
struct map_session_data* retVal___ = NULL;
if (HPMHooks.count.HP_map_nick2sd_pre > 0) {
- struct map_session_data* (*preHookFunc) (const char **nick);
+ struct map_session_data* (*preHookFunc) (const char **nick, bool *allow_partial);
*HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_map_nick2sd_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_map_nick2sd_pre[hIndex].func;
- retVal___ = preHookFunc(&nick);
+ retVal___ = preHookFunc(&nick, &allow_partial);
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -47482,13 +47667,13 @@ struct map_session_data* HP_map_nick2sd(const char *nick) {
}
}
{
- retVal___ = HPMHooks.source.map.nick2sd(nick);
+ retVal___ = HPMHooks.source.map.nick2sd(nick, allow_partial);
}
if (HPMHooks.count.HP_map_nick2sd_post > 0) {
- struct map_session_data* (*postHookFunc) (struct map_session_data* retVal___, const char *nick);
+ struct map_session_data* (*postHookFunc) (struct map_session_data* retVal___, const char *nick, bool allow_partial);
for (hIndex = 0; hIndex < HPMHooks.count.HP_map_nick2sd_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_map_nick2sd_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, nick);
+ retVal___ = postHookFunc(retVal___, nick, allow_partial);
}
}
return retVal___;
@@ -65957,6 +66142,33 @@ int HP_pc_have_magnifier(struct map_session_data *sd) {
}
return retVal___;
}
+int HP_pc_have_item_chain(struct map_session_data *sd, unsigned short chain_id) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if (HPMHooks.count.HP_pc_have_item_chain_pre > 0) {
+ int (*preHookFunc) (struct map_session_data **sd, unsigned short *chain_id);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_have_item_chain_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_pc_have_item_chain_pre[hIndex].func;
+ retVal___ = preHookFunc(&sd, &chain_id);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.pc.have_item_chain(sd, chain_id);
+ }
+ if (HPMHooks.count.HP_pc_have_item_chain_post > 0) {
+ int (*postHookFunc) (int retVal___, struct map_session_data *sd, unsigned short chain_id);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_pc_have_item_chain_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_pc_have_item_chain_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, sd, chain_id);
+ }
+ }
+ return retVal___;
+}
bool HP_pc_process_chat_message(struct map_session_data *sd, const char *message) {
int hIndex = 0;
bool retVal___ = false;
@@ -74461,6 +74673,58 @@ void HP_script_run_item_unequip_script(struct map_session_data *sd, struct item_
}
return;
}
+void HP_script_run_item_rental_end_script(struct map_session_data *sd, struct item_data *data, int oid) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_script_run_item_rental_end_script_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd, struct item_data **data, int *oid);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_script_run_item_rental_end_script_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_script_run_item_rental_end_script_pre[hIndex].func;
+ preHookFunc(&sd, &data, &oid);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.run_item_rental_end_script(sd, data, oid);
+ }
+ if (HPMHooks.count.HP_script_run_item_rental_end_script_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd, struct item_data *data, int oid);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_script_run_item_rental_end_script_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_script_run_item_rental_end_script_post[hIndex].func;
+ postHookFunc(sd, data, oid);
+ }
+ }
+ return;
+}
+void HP_script_run_item_rental_start_script(struct map_session_data *sd, struct item_data *data, int oid) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_script_run_item_rental_start_script_pre > 0) {
+ void (*preHookFunc) (struct map_session_data **sd, struct item_data **data, int *oid);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_script_run_item_rental_start_script_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_script_run_item_rental_start_script_pre[hIndex].func;
+ preHookFunc(&sd, &data, &oid);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.script.run_item_rental_start_script(sd, data, oid);
+ }
+ if (HPMHooks.count.HP_script_run_item_rental_start_script_post > 0) {
+ void (*postHookFunc) (struct map_session_data *sd, struct item_data *data, int oid);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_script_run_item_rental_start_script_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_script_run_item_rental_start_script_post[hIndex].func;
+ postHookFunc(sd, data, oid);
+ }
+ }
+ return;
+}
/* searchstore_interface */
bool HP_searchstore_open(struct map_session_data *sd, unsigned int uses, unsigned short effect) {
int hIndex = 0;
diff --git a/tools/itemcombodbconverter.py b/tools/itemcombodbconverter.py
new file mode 100644
index 000000000..ae4deeba3
--- /dev/null
+++ b/tools/itemcombodbconverter.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python3
+# -*- coding: utf8 -*-
+#
+# This file is part of Hercules.
+# http://herc.ws - http://github.com/HerculesWS/Hercules
+#
+# Copyright (C) 2019 Hercules Dev Team
+# Copyright (C) 2019 Asheraf
+#
+# Hercules is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+import argparse
+import json
+import re
+from utils import libconf
+import utils.common as Tools
+
+
+def ConvertFile(args):
+ print(r'''//================= Hercules Database =====================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2019 Hercules Dev Team
+//=
+//= Hercules is free software: you can redistribute it and/or modify
+//= it under the terms of the GNU General Public License as published by
+//= the Free Software Foundation, either version 3 of the License, or
+//= (at your option) any later version.
+//=
+//= This program is distributed in the hope that it will be useful,
+//= but WITHOUT ANY WARRANTY; without even the implied warranty of
+//= MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//= GNU General Public License for more details.
+//=
+//= You should have received a copy of the GNU General Public License
+//= along with this program. If not, see <http://www.gnu.org/licenses/>.
+//================= Description ===========================================
+// Configurations file for status effects
+//=========================================================================
+
+combo_db: (
+/**************************************************************************
+ ************* Entry structure ********************************************
+ **************************************************************************
+{
+ // ================ Mandatory fields ===============================
+ Items: ["item_list"] (string, array) list of items
+ Script: <"
+ Script
+ (it can be multi-line)
+ ">
+}
+**************************************************************************/''')
+ ItemDB = Tools.LoadDBConsts('item_db', f'{args.mode}', '../')
+ with open (f'../db/{args.mode}/item_combo_db.txt') as dbfile:
+ line = 0
+ for entry in dbfile:
+ line = line + 1
+ if not entry.strip() or entry.startswith('//'):
+ continue
+ m = re.search(r'(^[0-9:]+),\{(.*)\}$', entry)
+ if not m:
+ print(f'Error: Invalid pattern in entry {entry}, line {line}, aborting..')
+ exit()
+
+ items_list = m.group(1).split(':')
+ script = m.group(2)
+ for item in range(len(items_list)):
+ if int(items_list[item]) not in ItemDB:
+ print(f'Error: invalid item {item} found in line {line}, aborting..')
+ exit()
+ items_list[item] = ItemDB[int(items_list[item])]
+
+ if args.enable_jsbeautifier:
+ import jsbeautifier
+ opts = jsbeautifier.default_options()
+ opts.indent_with_tabs = True
+ opts.indent_level = 2
+ script = jsbeautifier.beautify(script, opts)
+ print(
+f'''{{
+ Items: {json.dumps(items_list)}
+ Script: <"\n{script}\n\t">
+}},''')
+ print(')')
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(description='Convert item combo db to new format')
+ parser.add_argument('--mode', type=str, dest='mode', help='Define usage mode re/pre-re.')
+ parser.add_argument('--enable-jsbeautifier', type=bool, dest='enable_jsbeautifier', help='Use jsbeautifier to auto format script fields.')
+ parsed_args = parser.parse_args()
+ ConvertFile(parsed_args)
diff --git a/tools/utils/common.py b/tools/utils/common.py
index acceb9b30..06695751a 100644
--- a/tools/utils/common.py
+++ b/tools/utils/common.py
@@ -21,7 +21,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import io
-import libconf as libconf
+import sys
+if sys.version_info >= (3, 0):
+ from utils import libconf as libconf
+else:
+ import libconf as libconf
import os.path
def LoadDBConsts(DBname, mode, serverpath):