diff options
44 files changed, 6107 insertions, 1115 deletions
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_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_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/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/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/map/atcommand.c b/src/map/atcommand.c index b472694c4..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; } @@ -3559,7 +3559,7 @@ ACMD(idsearch) safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,77), item_name); // Search results for '%s' (name: id): clif->message(fd, atcmd_output); - match = itemdb->search_name_array(item_array, MAX_SEARCH, item_name, 0); + match = itemdb->search_name_array(item_array, MAX_SEARCH, item_name, IT_SEARCH_NAME_PARTIAL); if (match > MAX_SEARCH) { safesnprintf(atcmd_output, sizeof(atcmd_output), msg_fd(fd,269), MAX_SEARCH, match); clif->message(fd, atcmd_output); @@ -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; } @@ -6775,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; } @@ -7072,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 @@ -7453,7 +7453,7 @@ ACMD(iteminfo) return false; } if ((item_array[0] = itemdb->exists(atoi(message))) == NULL) - count = itemdb->search_name_array(item_array, MAX_SEARCH, message, 0); + count = itemdb->search_name_array(item_array, MAX_SEARCH, message, IT_SEARCH_NAME_PARTIAL); if (!count) { clif->message(fd, msg_fd(fd,19)); // Invalid item ID or name. @@ -7504,7 +7504,7 @@ ACMD(whodrops) return false; } if ((item_array[0] = itemdb->exists(atoi(message))) == NULL) - count = itemdb->search_name_array(item_array, MAX_SEARCH, message, 0); + count = itemdb->search_name_array(item_array, MAX_SEARCH, message, IT_SEARCH_NAME_PARTIAL); if (!count) { clif->message(fd, msg_fd(fd,19)); // Invalid item ID or name. @@ -7985,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) { @@ -8058,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) { @@ -8203,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; } @@ -9321,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; @@ -9368,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; @@ -10463,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/clif.c b/src/map/clif.c index c7f81a471..1ed5e1d9f 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -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: @@ -11596,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; @@ -13444,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); @@ -14407,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); @@ -14717,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); } @@ -15274,7 +15323,7 @@ static void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) safestrncpy(item_monster_name, p->str, sizeof(item_monster_name)); - if ( (count=itemdb->search_name_array(item_array, 10, item_monster_name, 1)) > 0 ) { + if ( (count=itemdb->search_name_array(item_array, 10, item_monster_name, IT_SEARCH_NAME_EXACT)) > 0 ) { for(i = 0; i < count; i++) { if( !item_array[i] ) continue; @@ -15758,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); @@ -16490,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; } @@ -23211,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 *------------------------------------------*/ @@ -23895,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; @@ -24436,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 f3d7c78eb..245352b9c 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -633,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 **/ @@ -1114,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] @@ -1647,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/itemdb.c b/src/map/itemdb.c index bb2732b17..e5e7b9478 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -117,73 +117,105 @@ static struct item_data *itemdb_name2id(const char *str) */ static int itemdb_searchname_array_sub(union DBKey key, struct DBData data, va_list ap) { - struct item_data *item = DB->data2ptr(&data); - char *str; - str=va_arg(ap,char *); + struct item_data *itd = DB->data2ptr(&data); + const char *str = va_arg(ap, const char *); + enum item_name_search_flag flag = va_arg(ap, enum item_name_search_flag); + nullpo_ret(str); - if (item == &itemdb->dummy) + + if (itd == &itemdb->dummy) return 1; //Invalid item. - if(stristr(item->jname,str)) - return 0; - if(battle_config.case_sensitive_aegisnames && strstr(item->name,str)) - return 0; - if(!battle_config.case_sensitive_aegisnames && stristr(item->name,str)) + + if ( + (flag == IT_SEARCH_NAME_PARTIAL + && (stristr(itd->jname, str) != NULL + || (battle_config.case_sensitive_aegisnames && strstr(itd->name, str)) + || (!battle_config.case_sensitive_aegisnames && stristr(itd->name, str)) + )) + || (flag == IT_SEARCH_NAME_EXACT + && (strcmp(itd->jname, str) == 0 + || (battle_config.case_sensitive_aegisnames && strcmp(itd->name, str) == 0) + || (!battle_config.case_sensitive_aegisnames && strcasecmp(itd->name, str) == 0) + )) + ) { + return 0; - return strcmpi(item->jname,str); + } else { + return 1; + } } -/*========================================== - * Founds up to N matches. Returns number of matches [Skotlex] - * search flag : - * 0 - approximate match - * 1 - exact match - *------------------------------------------*/ -static int itemdb_searchname_array(struct item_data **data, int size, const char *str, int flag) +/** + * Finds up to passed size matches + * @param data array of struct item_data for returning the results in + * @param size size of the array + * @param str string used in this search + * @param flag search mode refer to enum item_name_search_flag for possible values + * @return returns all found matches in the database which could be bigger than size + **/ +static int itemdb_searchname_array(struct item_data **data, const int size, const char *str, enum item_name_search_flag flag) { - struct item_data* item; - int i; - int count=0; - nullpo_ret(data); nullpo_ret(str); - // Search in the array - for( i = 0; i < ARRAYLENGTH(itemdb->array); ++i ) - { - item = itemdb->array[i]; - if( item == NULL ) + Assert_ret(flag >= IT_SEARCH_NAME_PARTIAL && flag < IT_SEARCH_NAME_MAX); + Assert_ret(size > 0); + + int + results_count = 0, + length = 0; + + // Search in array + for (int i = 0; i < ARRAYLENGTH(itemdb->array); ++i) { + struct item_data *itd = itemdb->array[i]; + + if (itd == NULL) continue; - if( - (!flag - && (stristr(item->jname,str) - || (battle_config.case_sensitive_aegisnames && strstr(item->name,str)) - || (!battle_config.case_sensitive_aegisnames && stristr(item->name,str)) - )) - || (flag - && (strcmp(item->jname,str) == 0 - || (battle_config.case_sensitive_aegisnames && strcmp(item->name,str) == 0) - || (!battle_config.case_sensitive_aegisnames && strcasecmp(item->name,str) == 0) - )) - ) { - if( count < size ) - data[count] = item; - ++count; + if ( + (flag == IT_SEARCH_NAME_PARTIAL + && (stristr(itd->jname, str) != NULL + || (battle_config.case_sensitive_aegisnames && strstr(itd->name, str)) + || (!battle_config.case_sensitive_aegisnames && stristr(itd->name, str)) + )) + || (flag == IT_SEARCH_NAME_EXACT + && (strcmp(itd->jname, str) == 0 + || (battle_config.case_sensitive_aegisnames && strcmp(itd->name, str) == 0) + || (!battle_config.case_sensitive_aegisnames && strcasecmp(itd->name, str) == 0) + )) + ) { + if (length < size) { + data[length] = itd; + ++length; + } + + ++results_count; } } - // search in the db - if( count < size ) - { - struct DBData *db_data[MAX_SEARCH]; - int db_count = 0; - size -= count; - db_count = itemdb->other->getall(itemdb->other, (struct DBData**)&db_data, size, itemdb->searchname_array_sub, str); - for (i = 0; i < db_count; i++) - data[count++] = DB->data2ptr(db_data[i]); - count += db_count; + // Search in dbmap + int dbmap_size = size - length; + if (dbmap_size > 0) { + struct DBData **dbmap_data = NULL; + int dbmap_count = 0; + CREATE(dbmap_data, struct DBData *, dbmap_size); + + dbmap_count = itemdb->other->getall(itemdb->other, dbmap_data, dbmap_size, itemdb->searchname_array_sub, str, flag); + dbmap_size = min(dbmap_count, dbmap_size); + + for (int i = 0; i < dbmap_size; ++i) { + data[length] = DB->data2ptr(dbmap_data[i]); + ++length; + } + + results_count += dbmap_count; + aFree(dbmap_data); + } else { // We got all matches we can return, so we only need to count now. + results_count += itemdb->other->getall(itemdb->other, NULL, 0, itemdb->searchname_array_sub, str, flag); } - return count; + + return results_count; } + /* [Ind/Hercules] */ static int itemdb_chain_item(unsigned short chain_id, int *rate) { @@ -1531,138 +1563,99 @@ static void itemdb_read_chains(void) 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; - return i; + while ((it = libconfig->setting_get_elem(combo_db, i++)) != NULL) { + if (itemdb->read_combodb_libconfig_sub(it, i - 1, filepath)) + ++count; + } + + 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; } /*====================================== @@ -1726,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 } @@ -1756,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; } } @@ -1883,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; } @@ -1999,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) ) { @@ -2276,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); } @@ -2461,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(); @@ -2519,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); @@ -2805,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 7da7609f1..e3264d7d8 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -412,6 +412,16 @@ enum ItemOptionTypes { IT_OPT_MAX }; +/** + * Item name search flags + **/ + +enum item_name_search_flag { + IT_SEARCH_NAME_PARTIAL, + IT_SEARCH_NAME_EXACT, + IT_SEARCH_NAME_MAX, +}; + /** Convenience item list (entry) used in various functions */ struct itemlist_entry { int id; ///< Item ID or (inventory) index @@ -516,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] @@ -633,7 +645,7 @@ struct itemdb_interface { /* */ struct item_data* (*name2id) (const char *str); struct item_data* (*search_name) (const char *name); - int (*search_name_array) (struct item_data** data, int size, const char *str, int flag); + int (*search_name_array) (struct item_data **data, const int size, const char *str, enum item_name_search_flag flag); struct item_data* (*load)(int nameid); struct item_data* (*search)(int nameid); struct item_data* (*exists) (int nameid); @@ -666,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/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_struct.h b/src/map/packets_struct.h index 93b4abcca..24bb718da 100644 --- a/src/map/packets_struct.h +++ b/src/map/packets_struct.h @@ -3626,6 +3626,49 @@ struct PACKET_ZC_TALKBOX_CHATCONTENTS { } __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 8ac820d79..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); @@ -4789,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); @@ -4826,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)) diff --git a/src/map/pc.h b/src/map/pc.h index 49edea61b..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; diff --git a/src/map/script.c b/src/map/script.c index c712eb01d..df6e0d329 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); @@ -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; @@ -18804,7 +18804,7 @@ static BUILDIN(searchitem) if ((items[0] = itemdb->exists(atoi(itemname)))) { count = 1; } else { - count = itemdb->search_name_array(items, ARRAYLENGTH(items), itemname, 0); + count = itemdb->search_name_array(items, ARRAYLENGTH(items), itemname, IT_SEARCH_NAME_PARTIAL); if (count > MAX_SEARCH) count = MAX_SEARCH; } @@ -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/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc index 8560d2eff..7e81d48de 100644 --- a/src/plugins/HPMHooking/HPMHooking.Defs.inc +++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc @@ -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); @@ -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); @@ -3978,8 +3990,8 @@ typedef struct item_data* (*HPMHOOK_pre_itemdb_name2id) (const char **str); typedef struct item_data* (*HPMHOOK_post_itemdb_name2id) (struct item_data* retVal___, const char *str); typedef struct item_data* (*HPMHOOK_pre_itemdb_search_name) (const char **name); typedef struct item_data* (*HPMHOOK_post_itemdb_search_name) (struct item_data* retVal___, const char *name); -typedef int (*HPMHOOK_pre_itemdb_search_name_array) (struct item_data ***data, int *size, const char **str, int *flag); -typedef int (*HPMHOOK_post_itemdb_search_name_array) (int retVal___, struct item_data **data, int size, const char *str, int flag); +typedef int (*HPMHOOK_pre_itemdb_search_name_array) (struct item_data ***data, const int *size, const char **str, enum item_name_search_flag *flag); +typedef int (*HPMHOOK_post_itemdb_search_name_array) (int retVal___, struct item_data **data, const int size, const char *str, enum item_name_search_flag flag); typedef struct item_data* (*HPMHOOK_pre_itemdb_load) (int *nameid); typedef struct item_data* (*HPMHOOK_post_itemdb_load) (struct item_data* retVal___, int nameid); typedef struct item_data* (*HPMHOOK_pre_itemdb_search) (int *nameid); @@ -4044,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); @@ -4670,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); @@ -7050,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 1bf974d28..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; @@ -3220,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; @@ -5584,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; @@ -8127,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; @@ -9097,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; @@ -9403,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; @@ -10001,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; @@ -12365,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 290c27961..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) }, @@ -1649,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) }, @@ -2858,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 325d7407d..1817b0660 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc @@ -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) { @@ -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; @@ -41438,11 +41595,11 @@ struct item_data* HP_itemdb_search_name(const char *name) { } return retVal___; } -int HP_itemdb_search_name_array(struct item_data **data, int size, const char *str, int flag) { +int HP_itemdb_search_name_array(struct item_data **data, const int size, const char *str, enum item_name_search_flag flag) { int hIndex = 0; int retVal___ = 0; if (HPMHooks.count.HP_itemdb_search_name_array_pre > 0) { - int (*preHookFunc) (struct item_data ***data, int *size, const char **str, int *flag); + int (*preHookFunc) (struct item_data ***data, const int *size, const char **str, enum item_name_search_flag *flag); *HPMforce_return = false; for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_search_name_array_pre; hIndex++) { preHookFunc = HPMHooks.list.HP_itemdb_search_name_array_pre[hIndex].func; @@ -41457,7 +41614,7 @@ int HP_itemdb_search_name_array(struct item_data **data, int size, const char *s retVal___ = HPMHooks.source.itemdb.search_name_array(data, size, str, flag); } if (HPMHooks.count.HP_itemdb_search_name_array_post > 0) { - int (*postHookFunc) (int retVal___, struct item_data **data, int size, const char *str, int flag); + int (*postHookFunc) (int retVal___, struct item_data **data, const int size, const char *str, enum item_name_search_flag flag); for (hIndex = 0; hIndex < HPMHooks.count.HP_itemdb_search_name_array_post; hIndex++) { postHookFunc = HPMHooks.list.HP_itemdb_search_name_array_post[hIndex].func; retVal___ = postHookFunc(retVal___, data, size, str, flag); @@ -42337,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; @@ -42353,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; @@ -47493,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; @@ -47509,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___; @@ -74515,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/src/plugins/constdb2doc.c b/src/plugins/constdb2doc.c index 3f681ea1a..ebaf7a833 100644 --- a/src/plugins/constdb2doc.c +++ b/src/plugins/constdb2doc.c @@ -22,7 +22,8 @@ /// db/constants.conf -> doc/constants.md generator plugin #include "common/hercules.h" -//#include "common/memmgr.h" +#include "common/db.h" +#include "common/memmgr.h" #include "common/nullpo.h" #include "common/strlib.h" #include "map/itemdb.h" @@ -143,17 +144,26 @@ struct item_data *constdb2doc_itemdb_search(int nameid) void constdb2doc_itemdb(void) { - int i; - nullpo_retv(out_fp); fprintf(out_fp, "## Items (db/"DBPATH"item_db.conf)\n"); - for (i = 0; i < ARRAYLENGTH(itemdb->array); i++) { + for (int i = 0; i < ARRAYLENGTH(itemdb->array); i++) { struct item_data *id = constdb2doc_itemdb_search(i); if (id == NULL || id->name[0] == '\0') continue; fprintf(out_fp, "- `%s`: %d\n", id->name, id->nameid); } + + if (db_size(itemdb->other) > 0) { + struct DBIterator *iter = db_iterator(itemdb->other); + for (struct item_data *itd = dbi_first(iter); dbi_exists(iter); itd = dbi_next(iter)) { + if (itd == &itemdb->dummy) + continue; + fprintf(out_fp, "- `%s`: %d\n", itd->name, itd->nameid); + } + dbi_destroy(iter); + } + fprintf(out_fp, "\n"); } 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): |