summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db/pre-re/item_db.conf27
-rw-r--r--db/re/item_db.conf27
-rw-r--r--doc/script_commands.txt20
-rw-r--r--npc/re/other/achievement_treasures.txt342
-rw-r--r--npc/re/scripts.conf1
-rw-r--r--sql-files/item_db.sql10
-rw-r--r--sql-files/item_db_re.sql10
-rw-r--r--src/common/HPMDataCheck.h1
-rw-r--r--src/map/clif.c80
-rw-r--r--src/map/clif.h1
-rw-r--r--src/map/packets_struct.h21
-rw-r--r--src/map/script.c70
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc2
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc4
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc1
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc26
16 files changed, 587 insertions, 56 deletions
diff --git a/db/pre-re/item_db.conf b/db/pre-re/item_db.conf
index 7d9708f81..38833636d 100644
--- a/db/pre-re/item_db.conf
+++ b/db/pre-re/item_db.conf
@@ -67261,7 +67261,10 @@ item_db: (
Buy: 2
Weight: 10
BuyingStore: true
- Script: <" sc_start4 SC_ARMORPROPERTY,1200000,-15,0,20,0; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_FIRE, 1200000, 20);
+ sc_start(SC_RESIST_PROPERTY_WATER, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);
+ ">
},
{
Id: 12119
@@ -67271,7 +67274,10 @@ item_db: (
Buy: 2
Weight: 10
BuyingStore: true
- Script: <" sc_start4 SC_ARMORPROPERTY,1200000,20,0,0,-15; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_WATER, 1200000, 20);
+ sc_start(SC_RESIST_PROPERTY_WIND, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);
+ ">
},
{
Id: 12120
@@ -67281,7 +67287,10 @@ item_db: (
Buy: 2
Weight: 10
BuyingStore: true
- Script: <" sc_start4 SC_ARMORPROPERTY,1200000,0,20,-15,0; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_GROUND, 1200000, 20);
+ sc_start(SC_RESIST_PROPERTY_FIRE, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);
+ ">
},
{
Id: 12121
@@ -67291,7 +67300,10 @@ item_db: (
Buy: 2
Weight: 10
BuyingStore: true
- Script: <" sc_start4 SC_ARMORPROPERTY,1200000,0,-15,0,20; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_WIND, 1200000, 20);
+ sc_start(SC_RESIST_PROPERTY_GROUND, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);
+ ">
},
{
Id: 12122
@@ -69521,7 +69533,12 @@ item_db: (
Name: "Undead Elemental Scroll"
Type: "IT_USABLE"
Weight: 10
- Script: <" sc_start4 SC_ARMOR_RESIST,300000,20,20,20,20; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_FIRE, 300000, 20);
+ sc_start(SC_RESIST_PROPERTY_WATER, 300000, 20);
+ sc_start(SC_RESIST_PROPERTY_WIND, 300000, 20);
+ sc_start(SC_RESIST_PROPERTY_GROUND, 300000, 20);
+ ">
},
{
Id: 12280
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index d06c02279..fb0df3d2d 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -86890,7 +86890,10 @@ item_db: (
Buy: 2
Weight: 10
BuyingStore: true
- Script: <" sc_start4 SC_ARMORPROPERTY,1200000,-15,0,20,0; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_FIRE, 1200000, 20);
+ sc_start(SC_RESIST_PROPERTY_WATER, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);
+ ">
},
{
Id: 12119
@@ -86900,7 +86903,10 @@ item_db: (
Buy: 2
Weight: 10
BuyingStore: true
- Script: <" sc_start4 SC_ARMORPROPERTY,1200000,20,0,0,-15; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_WATER, 1200000, 20);
+ sc_start(SC_RESIST_PROPERTY_WIND, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);
+ ">
},
{
Id: 12120
@@ -86910,7 +86916,10 @@ item_db: (
Buy: 2
Weight: 10
BuyingStore: true
- Script: <" sc_start4 SC_ARMORPROPERTY,1200000,0,20,-15,0; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_GROUND, 1200000, 20);
+ sc_start(SC_RESIST_PROPERTY_FIRE, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);
+ ">
},
{
Id: 12121
@@ -86920,7 +86929,10 @@ item_db: (
Buy: 2
Weight: 10
BuyingStore: true
- Script: <" sc_start4 SC_ARMORPROPERTY,1200000,0,-15,0,20; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_WIND, 1200000, 20);
+ sc_start(SC_RESIST_PROPERTY_GROUND, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);
+ ">
},
{
Id: 12122
@@ -89170,7 +89182,12 @@ item_db: (
Name: "Undead Elemental Scroll"
Type: "IT_USABLE"
Weight: 10
- Script: <" sc_start4 SC_ARMOR_RESIST,300000,20,20,20,20; ">
+ Script: <"
+ sc_start(SC_RESIST_PROPERTY_FIRE, 300000, 20);
+ sc_start(SC_RESIST_PROPERTY_WATER, 300000, 20);
+ sc_start(SC_RESIST_PROPERTY_WIND, 300000, 20);
+ sc_start(SC_RESIST_PROPERTY_GROUND, 300000, 20);
+ ">
},
{
Id: 12280
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index 399af30b3..1914285f0 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -7046,6 +7046,18 @@ NPCs talking while hidden then revealing... you can wonder around =P).
---------------------------------------
+*cloakonnpc("<NPC object name>"{, <account_id>})
+*cloakoffnpc("<NPC object name>"{, <account_id>})
+
+These commands are used to apply the cloaking effect on npcs
+this is a visual effect only and it does NOT stop the player
+from interacting with the npc.
+
+If an account_id is specified then the effect will only display to the given id,
+otherwise it's displayed to the entire npc area.
+
+---------------------------------------
+
*doevent("<NPC object name>::<event label>")
This command will start a new execution thread in a specified NPC object
@@ -10627,6 +10639,14 @@ returns progress on success and false on failure
---------------------------------------
+*achievement_iscompleted(<ach_id>{, <account_id>})
+
+Checks whether the attached player have completed all the given achievement objectives.
+
+returns true if yes and false if no.
+
+---------------------------------------
+
*itempreview(<index>)
Update already opened preview window with item from
diff --git a/npc/re/other/achievement_treasures.txt b/npc/re/other/achievement_treasures.txt
new file mode 100644
index 000000000..38fb69d77
--- /dev/null
+++ b/npc/re/other/achievement_treasures.txt
@@ -0,0 +1,342 @@
+//================= Hercules Script =======================================
+//= _ _ _
+//= | | | | | |
+//= | |_| | ___ _ __ ___ _ _| | ___ ___
+//= | _ |/ _ \ '__/ __| | | | |/ _ \/ __|
+//= | | | | __/ | | (__| |_| | | __/\__ \
+//= \_| |_/\___|_| \___|\__,_|_|\___||___/
+//================= License ===============================================
+//= This file is part of Hercules.
+//= http://herc.ws - http://github.com/HerculesWS/Hercules
+//=
+//= Copyright (C) 2020 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/>.
+//=========================================================================
+// Exploration Achievements
+//=========================================================================
+
+- script achievement_tr FAKE_NPC,{
+ sscanf(strnpcinfo(NPC_NAME_HIDDEN), "tr%d", .@id);
+ if (!achievement_iscompleted(.@id))
+ achievement_progress(.@id, 1, 1, true);
+ end;
+OnInit:
+ cloakonnpc(strnpcinfo(NPC_NAME));
+ end;
+}
+
+- script achievement_wp FAKE_NPC,{
+OnTouch:
+ sscanf(strnpcinfo(NPC_NAME_HIDDEN), "wp%d", .@id);
+ if (!achievement_iscompleted(.@id))
+ cloakoffnpc(sprintf("#tr%d", .@id), playerattached());
+ end;
+}
+
+// Treasure Chests
+prt_fild01,146,126,4 duplicate(achievement_tr) #tr120001 4_TREASURE_BOX
+prt_fild02,142,221,4 duplicate(achievement_tr) #tr120002 4_TREASURE_BOX
+prt_fild03,172,139,4 duplicate(achievement_tr) #tr120003 4_TREASURE_BOX
+prt_fild04,118,57,4 duplicate(achievement_tr) #tr120004 4_TREASURE_BOX
+prt_fild05,189,291,4 duplicate(achievement_tr) #tr120005 4_TREASURE_BOX
+prt_fild06,298,304,4 duplicate(achievement_tr) #tr120006 4_TREASURE_BOX
+prt_fild07,44,104,4 duplicate(achievement_tr) #tr120007 4_TREASURE_BOX
+prt_fild08,203,222,4 duplicate(achievement_tr) #tr120008 4_TREASURE_BOX
+prt_fild09,37,354,4 duplicate(achievement_tr) #tr120009 4_TREASURE_BOX
+prt_fild10,177,206,4 duplicate(achievement_tr) #tr120010 4_TREASURE_BOX
+gef_fild00,73,119,4 duplicate(achievement_tr) #tr120011 4_TREASURE_BOX
+gef_fild01,222,224,4 duplicate(achievement_tr) #tr120012 4_TREASURE_BOX
+gef_fild05,202,292,4 duplicate(achievement_tr) #tr120013 4_TREASURE_BOX
+gef_fild06,279,105,4 duplicate(achievement_tr) #tr120014 4_TREASURE_BOX
+gef_fild07,184,249,4 duplicate(achievement_tr) #tr120015 4_TREASURE_BOX
+gef_fild09,170,73,4 duplicate(achievement_tr) #tr120016 4_TREASURE_BOX
+gef_fild11,239,248,4 duplicate(achievement_tr) #tr120017 4_TREASURE_BOX
+moc_fild11,188,218,4 duplicate(achievement_tr) #tr120018 4_TREASURE_BOX
+moc_fild12,234,96,4 duplicate(achievement_tr) #tr120019 4_TREASURE_BOX
+moc_fild13,290,207,4 duplicate(achievement_tr) #tr120020 4_TREASURE_BOX
+moc_fild16,196,108,4 duplicate(achievement_tr) #tr120021 4_TREASURE_BOX
+moc_fild17,269,105,4 duplicate(achievement_tr) #tr120022 4_TREASURE_BOX
+moc_fild18,54,284,4 duplicate(achievement_tr) #tr120023 4_TREASURE_BOX
+pay_fild01,167,243,4 duplicate(achievement_tr) #tr120024 4_TREASURE_BOX
+pay_fild02,105,240,4 duplicate(achievement_tr) #tr120025 4_TREASURE_BOX
+pay_fild03,144,97,4 duplicate(achievement_tr) #tr120026 4_TREASURE_BOX
+pay_fild04,257,95,4 duplicate(achievement_tr) #tr120027 4_TREASURE_BOX
+pay_fild07,365,37,4 duplicate(achievement_tr) #tr120028 4_TREASURE_BOX
+pay_fild08,237,345,4 duplicate(achievement_tr) #tr120029 4_TREASURE_BOX
+pay_fild09,251,42,4 duplicate(achievement_tr) #tr120030 4_TREASURE_BOX
+pay_fild10,196,38,4 duplicate(achievement_tr) #tr120031 4_TREASURE_BOX
+mjolnir_01,47,60,4 duplicate(achievement_tr) #tr120032 4_TREASURE_BOX
+mjolnir_02,77,49,4 duplicate(achievement_tr) #tr120033 4_TREASURE_BOX
+mjolnir_03,190,200,4 duplicate(achievement_tr) #tr120034 4_TREASURE_BOX
+mjolnir_04,201,146,4 duplicate(achievement_tr) #tr120035 4_TREASURE_BOX
+mjolnir_05,43,327,4 duplicate(achievement_tr) #tr120036 4_TREASURE_BOX
+mjolnir_06,162,290,4 duplicate(achievement_tr) #tr120037 4_TREASURE_BOX
+mjolnir_07,321,127,4 duplicate(achievement_tr) #tr120038 4_TREASURE_BOX
+mjolnir_08,175,225,4 duplicate(achievement_tr) #tr120039 4_TREASURE_BOX
+mjolnir_09,299,123,4 duplicate(achievement_tr) #tr120040 4_TREASURE_BOX
+mjolnir_10,353,371,4 duplicate(achievement_tr) #tr120041 4_TREASURE_BOX
+mjolnir_11,325,178,4 duplicate(achievement_tr) #tr120042 4_TREASURE_BOX
+mjolnir_12,110,298,4 duplicate(achievement_tr) #tr120043 4_TREASURE_BOX
+cmd_fild01,112,200,4 duplicate(achievement_tr) #tr120044 4_TREASURE_BOX
+cmd_fild02,86,94,4 duplicate(achievement_tr) #tr120045 4_TREASURE_BOX
+cmd_fild03,144,190,4 duplicate(achievement_tr) #tr120046 4_TREASURE_BOX
+cmd_fild04,151,191,4 duplicate(achievement_tr) #tr120047 4_TREASURE_BOX
+cmd_fild06,221,108,4 duplicate(achievement_tr) #tr120048 4_TREASURE_BOX
+cmd_fild07,269,322,4 duplicate(achievement_tr) #tr120049 4_TREASURE_BOX
+cmd_fild08,181,136,4 duplicate(achievement_tr) #tr120050 4_TREASURE_BOX
+cmd_fild09,211,266,4 duplicate(achievement_tr) #tr120051 4_TREASURE_BOX
+yuno_fild01,284,138,4 duplicate(achievement_tr) #tr120052 4_TREASURE_BOX
+yuno_fild12,76,268,4 duplicate(achievement_tr) #tr120053 4_TREASURE_BOX
+yuno_fild02,142,191,4 duplicate(achievement_tr) #tr120054 4_TREASURE_BOX
+yuno_fild03,135,329,4 duplicate(achievement_tr) #tr120055 4_TREASURE_BOX
+yuno_fild04,35,369,4 duplicate(achievement_tr) #tr120056 4_TREASURE_BOX
+yuno_fild06,262,220,4 duplicate(achievement_tr) #tr120057 4_TREASURE_BOX
+yuno_fild07,113,339,4 duplicate(achievement_tr) #tr120058 4_TREASURE_BOX
+yuno_fild08,179,209,4 duplicate(achievement_tr) #tr120059 4_TREASURE_BOX
+yuno_fild09,166,228,4 duplicate(achievement_tr) #tr120060 4_TREASURE_BOX
+yuno_fild11,141,357,4 duplicate(achievement_tr) #tr120061 4_TREASURE_BOX
+hu_fild01,347,312,4 duplicate(achievement_tr) #tr120062 4_TREASURE_BOX
+hu_fild02,80,152,4 duplicate(achievement_tr) #tr120063 4_TREASURE_BOX
+hu_fild04,322,313,4 duplicate(achievement_tr) #tr120064 4_TREASURE_BOX
+hu_fild06,204,228,4 duplicate(achievement_tr) #tr120065 4_TREASURE_BOX
+hu_fild05,197,210,4 duplicate(achievement_tr) #tr120066 4_TREASURE_BOX
+ein_fild01,266,277,4 duplicate(achievement_tr) #tr120067 4_TREASURE_BOX
+ein_fild03,99,332,4 duplicate(achievement_tr) #tr120068 4_TREASURE_BOX
+ein_fild04,334,305,4 duplicate(achievement_tr) #tr120069 4_TREASURE_BOX
+ein_fild05,337,233,4 duplicate(achievement_tr) #tr120070 4_TREASURE_BOX
+ein_fild06,174,245,4 duplicate(achievement_tr) #tr120071 4_TREASURE_BOX
+ein_fild07,188,50,4 duplicate(achievement_tr) #tr120072 4_TREASURE_BOX
+ein_fild08,258,78,4 duplicate(achievement_tr) #tr120073 4_TREASURE_BOX
+ein_fild09,330,76,4 duplicate(achievement_tr) #tr120074 4_TREASURE_BOX
+lhz_fild01,118,73,4 duplicate(achievement_tr) #tr120075 4_TREASURE_BOX
+lhz_fild02,239,243,4 duplicate(achievement_tr) #tr120076 4_TREASURE_BOX
+lhz_fild03,313,132,4 duplicate(achievement_tr) #tr120077 4_TREASURE_BOX
+ra_fild01,138,166,4 duplicate(achievement_tr) #tr120078 4_TREASURE_BOX
+ra_fild03,224,275,4 duplicate(achievement_tr) #tr120079 4_TREASURE_BOX
+ra_fild08,326,45,4 duplicate(achievement_tr) #tr120080 4_TREASURE_BOX
+ra_fild12,352,165,4 duplicate(achievement_tr) #tr120081 4_TREASURE_BOX
+ra_fild04,92,302,4 duplicate(achievement_tr) #tr120082 4_TREASURE_BOX
+ra_fild05,59,59,4 duplicate(achievement_tr) #tr120083 4_TREASURE_BOX
+ra_fild06,362,230,4 duplicate(achievement_tr) #tr120084 4_TREASURE_BOX
+ve_fild01,180,234,4 duplicate(achievement_tr) #tr120085 4_TREASURE_BOX
+ve_fild02,65,194,4 duplicate(achievement_tr) #tr120086 4_TREASURE_BOX
+ve_fild03,197,242,4 duplicate(achievement_tr) #tr120087 4_TREASURE_BOX
+ve_fild04,288,279,4 duplicate(achievement_tr) #tr120088 4_TREASURE_BOX
+ve_fild07,33,113,4 duplicate(achievement_tr) #tr120089 4_TREASURE_BOX
+ecl_fild01,234,217,4 duplicate(achievement_tr) #tr120090 4_TREASURE_BOX
+bif_fild02,155,322,4 duplicate(achievement_tr) #tr120091 4_TREASURE_BOX
+bif_fild01,147,64,4 duplicate(achievement_tr) #tr120092 4_TREASURE_BOX
+spl_fild01,335,315,4 duplicate(achievement_tr) #tr120093 4_TREASURE_BOX
+spl_fild02,153,358,4 duplicate(achievement_tr) #tr120094 4_TREASURE_BOX
+spl_fild03,61,286,4 duplicate(achievement_tr) #tr120095 4_TREASURE_BOX
+man_fild01,41,172,4 duplicate(achievement_tr) #tr120096 4_TREASURE_BOX
+man_fild02,268,357,4 duplicate(achievement_tr) #tr120097 4_TREASURE_BOX
+man_fild03,198,91,4 duplicate(achievement_tr) #tr120098 4_TREASURE_BOX
+dic_fild01,227,82,4 duplicate(achievement_tr) #tr120099 4_TREASURE_BOX
+dic_fild02,147,196,4 duplicate(achievement_tr) #tr120100 4_TREASURE_BOX
+ama_fild01,187,337,4 duplicate(achievement_tr) #tr120101 4_TREASURE_BOX
+gon_fild01,171,332,4 duplicate(achievement_tr) #tr120102 4_TREASURE_BOX
+lou_fild01,104,232,4 duplicate(achievement_tr) #tr120103 4_TREASURE_BOX
+ayo_fild01,289,70,4 duplicate(achievement_tr) #tr120104 4_TREASURE_BOX
+mosk_fild02,176,77,4 duplicate(achievement_tr) #tr120105 4_TREASURE_BOX
+bra_fild01,99,193,4 duplicate(achievement_tr) #tr120106 4_TREASURE_BOX
+dew_fild01,175,287,4 duplicate(achievement_tr) #tr120107 4_TREASURE_BOX
+ma_fild01,308,206,4 duplicate(achievement_tr) #tr120108 4_TREASURE_BOX
+ma_fild02,246,323,4 duplicate(achievement_tr) #tr120109 4_TREASURE_BOX
+abbey03,27,72,4 duplicate(achievement_tr) #tr120110 4_TREASURE_BOX
+abyss_03,86,55,4 duplicate(achievement_tr) #tr120111 4_TREASURE_BOX
+alde_dun04,90,107,4 duplicate(achievement_tr) #tr120112 4_TREASURE_BOX
+ama_dun03,60,163,4 duplicate(achievement_tr) #tr120113 4_TREASURE_BOX
+anthell02,253,41,4 duplicate(achievement_tr) #tr120114 4_TREASURE_BOX
+ayo_dun02,150,256,4 duplicate(achievement_tr) #tr120115 4_TREASURE_BOX
+beach_dun3,102,71,4 duplicate(achievement_tr) #tr120116 4_TREASURE_BOX
+bra_dun02,171,121,4 duplicate(achievement_tr) #tr120117 4_TREASURE_BOX
+c_tower4,37,158,4 duplicate(achievement_tr) #tr120118 4_TREASURE_BOX
+dew_dun02,87,272,4 duplicate(achievement_tr) #tr120119 4_TREASURE_BOX
+dic_dun03,216,211,4 duplicate(achievement_tr) #tr120120 4_TREASURE_BOX
+ecl_tdun04,37,37,4 duplicate(achievement_tr) #tr120121 4_TREASURE_BOX
+ein_dun02,31,255,4 duplicate(achievement_tr) #tr120122 4_TREASURE_BOX
+gef_dun02,222,163,4 duplicate(achievement_tr) #tr120123 4_TREASURE_BOX
+gl_sew04,288,6,4 duplicate(achievement_tr) #tr120124 4_TREASURE_BOX
+gl_knt02,126,235,4 duplicate(achievement_tr) #tr120125 4_TREASURE_BOX
+gl_cas02,53,151,4 duplicate(achievement_tr) #tr120126 4_TREASURE_BOX
+gl_prison1,126,158,4 duplicate(achievement_tr) #tr120127 4_TREASURE_BOX
+gon_dun03,166,231,4 duplicate(achievement_tr) #tr120128 4_TREASURE_BOX
+ice_dun03,45,261,4 duplicate(achievement_tr) #tr120129 4_TREASURE_BOX
+in_sphinx5,154,107,4 duplicate(achievement_tr) #tr120130 4_TREASURE_BOX
+iz_dun05,64,223,4 duplicate(achievement_tr) #tr120131 4_TREASURE_BOX
+kh_dun02,70,107,4 duplicate(achievement_tr) #tr120132 4_TREASURE_BOX
+lhz_dun03,240,221,4 duplicate(achievement_tr) #tr120133 4_TREASURE_BOX
+lou_dun03,29,228,4 duplicate(achievement_tr) #tr120134 4_TREASURE_BOX
+mag_dun02,197,77,4 duplicate(achievement_tr) #tr120135 4_TREASURE_BOX
+mjo_dun03,76,220,4 duplicate(achievement_tr) #tr120136 4_TREASURE_BOX
+moc_pryd06,102,121,4 duplicate(achievement_tr) #tr120137 4_TREASURE_BOX
+orcsdun02,31,72,4 duplicate(achievement_tr) #tr120138 4_TREASURE_BOX
+pay_dun04,120,124,4 duplicate(achievement_tr) #tr120139 4_TREASURE_BOX
+prt_maze03,11,14,4 duplicate(achievement_tr) #tr120140 4_TREASURE_BOX
+prt_sewb4,19,183,4 duplicate(achievement_tr) #tr120141 4_TREASURE_BOX
+tha_t06,150,176,4 duplicate(achievement_tr) #tr120142 4_TREASURE_BOX
+thor_v03,220,221,4 duplicate(achievement_tr) #tr120143 4_TREASURE_BOX
+treasure02,19,142,4 duplicate(achievement_tr) #tr120144 4_TREASURE_BOX
+tur_dun04,134,130,4 duplicate(achievement_tr) #tr120145 4_TREASURE_BOX
+xmas_dun02,120,224,4 duplicate(achievement_tr) #tr120146 4_TREASURE_BOX
+
+// Hidden Warps
+prt_fild01,146,126,0 duplicate(achievement_wp) #wp120001 HIDDEN_WARP_NPC,5,5
+prt_fild02,142,221,0 duplicate(achievement_wp) #wp120002 HIDDEN_WARP_NPC,5,5
+prt_fild03,172,139,0 duplicate(achievement_wp) #wp120003 HIDDEN_WARP_NPC,5,5
+prt_fild04,118,57,0 duplicate(achievement_wp) #wp120004 HIDDEN_WARP_NPC,5,5
+prt_fild05,189,291,0 duplicate(achievement_wp) #wp120005 HIDDEN_WARP_NPC,5,5
+prt_fild06,298,304,0 duplicate(achievement_wp) #wp120006 HIDDEN_WARP_NPC,5,5
+prt_fild07,44,104,0 duplicate(achievement_wp) #wp120007 HIDDEN_WARP_NPC,5,5
+prt_fild08,203,222,0 duplicate(achievement_wp) #wp120008 HIDDEN_WARP_NPC,5,5
+prt_fild09,37,354,0 duplicate(achievement_wp) #wp120009 HIDDEN_WARP_NPC,5,5
+prt_fild10,177,206,0 duplicate(achievement_wp) #wp120010 HIDDEN_WARP_NPC,5,5
+gef_fild00,73,119,0 duplicate(achievement_wp) #wp120011 HIDDEN_WARP_NPC,5,5
+gef_fild01,222,224,0 duplicate(achievement_wp) #wp120012 HIDDEN_WARP_NPC,5,5
+gef_fild05,202,292,0 duplicate(achievement_wp) #wp120013 HIDDEN_WARP_NPC,5,5
+gef_fild06,279,105,0 duplicate(achievement_wp) #wp120014 HIDDEN_WARP_NPC,5,5
+gef_fild07,184,249,0 duplicate(achievement_wp) #wp120015 HIDDEN_WARP_NPC,5,5
+gef_fild09,170,73,0 duplicate(achievement_wp) #wp120016 HIDDEN_WARP_NPC,5,5
+gef_fild11,239,248,0 duplicate(achievement_wp) #wp120017 HIDDEN_WARP_NPC,5,5
+moc_fild11,188,218,0 duplicate(achievement_wp) #wp120018 HIDDEN_WARP_NPC,5,5
+moc_fild12,234,96,0 duplicate(achievement_wp) #wp120019 HIDDEN_WARP_NPC,5,5
+moc_fild13,290,207,0 duplicate(achievement_wp) #wp120020 HIDDEN_WARP_NPC,5,5
+moc_fild16,196,108,0 duplicate(achievement_wp) #wp120021 HIDDEN_WARP_NPC,5,5
+moc_fild17,269,105,0 duplicate(achievement_wp) #wp120022 HIDDEN_WARP_NPC,5,5
+moc_fild18,54,284,0 duplicate(achievement_wp) #wp120023 HIDDEN_WARP_NPC,5,5
+pay_fild01,167,243,0 duplicate(achievement_wp) #wp120024 HIDDEN_WARP_NPC,5,5
+pay_fild02,105,240,0 duplicate(achievement_wp) #wp120025 HIDDEN_WARP_NPC,5,5
+pay_fild03,144,97,0 duplicate(achievement_wp) #wp120026 HIDDEN_WARP_NPC,5,5
+pay_fild04,257,95,0 duplicate(achievement_wp) #wp120027 HIDDEN_WARP_NPC,5,5
+pay_fild07,365,37,0 duplicate(achievement_wp) #wp120028 HIDDEN_WARP_NPC,5,5
+pay_fild08,237,345,0 duplicate(achievement_wp) #wp120029 HIDDEN_WARP_NPC,5,5
+pay_fild09,251,42,0 duplicate(achievement_wp) #wp120030 HIDDEN_WARP_NPC,5,5
+pay_fild10,196,38,0 duplicate(achievement_wp) #wp120031 HIDDEN_WARP_NPC,5,5
+mjolnir_01,47,60,0 duplicate(achievement_wp) #wp120032 HIDDEN_WARP_NPC,5,5
+mjolnir_02,77,49,0 duplicate(achievement_wp) #wp120033 HIDDEN_WARP_NPC,5,5
+mjolnir_03,190,200,0 duplicate(achievement_wp) #wp120034 HIDDEN_WARP_NPC,5,5
+mjolnir_04,201,146,0 duplicate(achievement_wp) #wp120035 HIDDEN_WARP_NPC,5,5
+mjolnir_05,43,327,0 duplicate(achievement_wp) #wp120036 HIDDEN_WARP_NPC,5,5
+mjolnir_06,162,290,0 duplicate(achievement_wp) #wp120037 HIDDEN_WARP_NPC,5,5
+mjolnir_07,321,127,0 duplicate(achievement_wp) #wp120038 HIDDEN_WARP_NPC,5,5
+mjolnir_08,175,225,0 duplicate(achievement_wp) #wp120039 HIDDEN_WARP_NPC,5,5
+mjolnir_09,299,123,0 duplicate(achievement_wp) #wp120040 HIDDEN_WARP_NPC,5,5
+mjolnir_10,353,371,0 duplicate(achievement_wp) #wp120041 HIDDEN_WARP_NPC,5,5
+mjolnir_11,325,178,0 duplicate(achievement_wp) #wp120042 HIDDEN_WARP_NPC,5,5
+mjolnir_12,110,298,0 duplicate(achievement_wp) #wp120043 HIDDEN_WARP_NPC,5,5
+cmd_fild01,112,200,0 duplicate(achievement_wp) #wp120044 HIDDEN_WARP_NPC,5,5
+cmd_fild02,86,94,0 duplicate(achievement_wp) #wp120045 HIDDEN_WARP_NPC,5,5
+cmd_fild03,144,190,0 duplicate(achievement_wp) #wp120046 HIDDEN_WARP_NPC,5,5
+cmd_fild04,151,191,0 duplicate(achievement_wp) #wp120047 HIDDEN_WARP_NPC,5,5
+cmd_fild06,221,108,0 duplicate(achievement_wp) #wp120048 HIDDEN_WARP_NPC,5,5
+cmd_fild07,269,322,0 duplicate(achievement_wp) #wp120049 HIDDEN_WARP_NPC,5,5
+cmd_fild08,181,136,0 duplicate(achievement_wp) #wp120050 HIDDEN_WARP_NPC,5,5
+cmd_fild09,211,266,0 duplicate(achievement_wp) #wp120051 HIDDEN_WARP_NPC,5,5
+yuno_fild01,284,138,0 duplicate(achievement_wp) #wp120052 HIDDEN_WARP_NPC,5,5
+yuno_fild12,76,268,0 duplicate(achievement_wp) #wp120053 HIDDEN_WARP_NPC,5,5
+yuno_fild02,142,191,0 duplicate(achievement_wp) #wp120054 HIDDEN_WARP_NPC,5,5
+yuno_fild03,135,329,0 duplicate(achievement_wp) #wp120055 HIDDEN_WARP_NPC,5,5
+yuno_fild04,35,369,0 duplicate(achievement_wp) #wp120056 HIDDEN_WARP_NPC,5,5
+yuno_fild06,262,220,0 duplicate(achievement_wp) #wp120057 HIDDEN_WARP_NPC,5,5
+yuno_fild07,113,339,0 duplicate(achievement_wp) #wp120058 HIDDEN_WARP_NPC,5,5
+yuno_fild08,179,209,0 duplicate(achievement_wp) #wp120059 HIDDEN_WARP_NPC,5,5
+yuno_fild09,166,228,0 duplicate(achievement_wp) #wp120060 HIDDEN_WARP_NPC,5,5
+yuno_fild11,141,357,0 duplicate(achievement_wp) #wp120061 HIDDEN_WARP_NPC,5,5
+hu_fild01,347,312,0 duplicate(achievement_wp) #wp120062 HIDDEN_WARP_NPC,5,5
+hu_fild02,80,152,0 duplicate(achievement_wp) #wp120063 HIDDEN_WARP_NPC,5,5
+hu_fild04,322,313,0 duplicate(achievement_wp) #wp120064 HIDDEN_WARP_NPC,5,5
+hu_fild06,204,228,0 duplicate(achievement_wp) #wp120065 HIDDEN_WARP_NPC,5,5
+hu_fild05,197,210,0 duplicate(achievement_wp) #wp120066 HIDDEN_WARP_NPC,5,5
+ein_fild01,266,277,0 duplicate(achievement_wp) #wp120067 HIDDEN_WARP_NPC,5,5
+ein_fild03,99,332,0 duplicate(achievement_wp) #wp120068 HIDDEN_WARP_NPC,5,5
+ein_fild04,334,305,0 duplicate(achievement_wp) #wp120069 HIDDEN_WARP_NPC,5,5
+ein_fild05,337,233,0 duplicate(achievement_wp) #wp120070 HIDDEN_WARP_NPC,5,5
+ein_fild06,174,245,0 duplicate(achievement_wp) #wp120071 HIDDEN_WARP_NPC,5,5
+ein_fild07,188,50,0 duplicate(achievement_wp) #wp120072 HIDDEN_WARP_NPC,5,5
+ein_fild08,258,78,0 duplicate(achievement_wp) #wp120073 HIDDEN_WARP_NPC,5,5
+ein_fild09,330,76,0 duplicate(achievement_wp) #wp120074 HIDDEN_WARP_NPC,5,5
+lhz_fild01,118,73,0 duplicate(achievement_wp) #wp120075 HIDDEN_WARP_NPC,5,5
+lhz_fild02,239,243,0 duplicate(achievement_wp) #wp120076 HIDDEN_WARP_NPC,5,5
+lhz_fild03,313,132,0 duplicate(achievement_wp) #wp120077 HIDDEN_WARP_NPC,5,5
+ra_fild01,138,166,0 duplicate(achievement_wp) #wp120078 HIDDEN_WARP_NPC,5,5
+ra_fild03,224,275,0 duplicate(achievement_wp) #wp120079 HIDDEN_WARP_NPC,5,5
+ra_fild08,326,45,0 duplicate(achievement_wp) #wp120080 HIDDEN_WARP_NPC,5,5
+ra_fild12,352,165,0 duplicate(achievement_wp) #wp120081 HIDDEN_WARP_NPC,5,5
+ra_fild04,92,302,0 duplicate(achievement_wp) #wp120082 HIDDEN_WARP_NPC,5,5
+ra_fild05,59,59,0 duplicate(achievement_wp) #wp120083 HIDDEN_WARP_NPC,5,5
+ra_fild06,362,230,0 duplicate(achievement_wp) #wp120084 HIDDEN_WARP_NPC,5,5
+ve_fild01,180,234,0 duplicate(achievement_wp) #wp120085 HIDDEN_WARP_NPC,5,5
+ve_fild02,65,194,0 duplicate(achievement_wp) #wp120086 HIDDEN_WARP_NPC,5,5
+ve_fild03,197,242,0 duplicate(achievement_wp) #wp120087 HIDDEN_WARP_NPC,5,5
+ve_fild04,288,279,0 duplicate(achievement_wp) #wp120088 HIDDEN_WARP_NPC,5,5
+ve_fild07,33,113,0 duplicate(achievement_wp) #wp120089 HIDDEN_WARP_NPC,5,5
+ecl_fild01,234,217,0 duplicate(achievement_wp) #wp120090 HIDDEN_WARP_NPC,5,5
+bif_fild02,155,322,0 duplicate(achievement_wp) #wp120091 HIDDEN_WARP_NPC,5,5
+bif_fild01,147,64,0 duplicate(achievement_wp) #wp120092 HIDDEN_WARP_NPC,5,5
+spl_fild01,335,315,0 duplicate(achievement_wp) #wp120093 HIDDEN_WARP_NPC,5,5
+spl_fild02,153,358,0 duplicate(achievement_wp) #wp120094 HIDDEN_WARP_NPC,5,5
+spl_fild03,61,286,0 duplicate(achievement_wp) #wp120095 HIDDEN_WARP_NPC,5,5
+man_fild01,41,172,0 duplicate(achievement_wp) #wp120096 HIDDEN_WARP_NPC,5,5
+man_fild02,268,357,0 duplicate(achievement_wp) #wp120097 HIDDEN_WARP_NPC,5,5
+man_fild03,198,91,0 duplicate(achievement_wp) #wp120098 HIDDEN_WARP_NPC,5,5
+dic_fild01,227,82,0 duplicate(achievement_wp) #wp120099 HIDDEN_WARP_NPC,5,5
+dic_fild02,147,196,0 duplicate(achievement_wp) #wp120100 HIDDEN_WARP_NPC,5,5
+ama_fild01,187,337,0 duplicate(achievement_wp) #wp120101 HIDDEN_WARP_NPC,5,5
+gon_fild01,171,332,0 duplicate(achievement_wp) #wp120102 HIDDEN_WARP_NPC,5,5
+lou_fild01,104,232,0 duplicate(achievement_wp) #wp120103 HIDDEN_WARP_NPC,5,5
+ayo_fild01,289,70,0 duplicate(achievement_wp) #wp120104 HIDDEN_WARP_NPC,5,5
+mosk_fild02,176,77,0 duplicate(achievement_wp) #wp120105 HIDDEN_WARP_NPC,5,5
+bra_fild01,99,193,0 duplicate(achievement_wp) #wp120106 HIDDEN_WARP_NPC,5,5
+dew_fild01,175,287,0 duplicate(achievement_wp) #wp120107 HIDDEN_WARP_NPC,5,5
+ma_fild01,308,206,0 duplicate(achievement_wp) #wp120108 HIDDEN_WARP_NPC,5,5
+ma_fild02,246,323,0 duplicate(achievement_wp) #wp120109 HIDDEN_WARP_NPC,5,5
+abbey03,27,72,0 duplicate(achievement_wp) #wp120110 HIDDEN_WARP_NPC,5,5
+abyss_03,86,55,0 duplicate(achievement_wp) #wp120111 HIDDEN_WARP_NPC,5,5
+alde_dun04,90,107,0 duplicate(achievement_wp) #wp120112 HIDDEN_WARP_NPC,5,5
+ama_dun03,60,163,0 duplicate(achievement_wp) #wp120113 HIDDEN_WARP_NPC,5,5
+anthell02,253,41,0 duplicate(achievement_wp) #wp120114 HIDDEN_WARP_NPC,5,5
+ayo_dun02,150,256,0 duplicate(achievement_wp) #wp120115 HIDDEN_WARP_NPC,5,5
+beach_dun3,102,71,0 duplicate(achievement_wp) #wp120116 HIDDEN_WARP_NPC,5,5
+bra_dun02,171,121,0 duplicate(achievement_wp) #wp120117 HIDDEN_WARP_NPC,5,5
+c_tower4,37,158,0 duplicate(achievement_wp) #wp120118 HIDDEN_WARP_NPC,5,5
+dew_dun02,87,272,0 duplicate(achievement_wp) #wp120119 HIDDEN_WARP_NPC,5,5
+dic_dun03,216,211,0 duplicate(achievement_wp) #wp120120 HIDDEN_WARP_NPC,5,5
+ecl_tdun04,37,37,0 duplicate(achievement_wp) #wp120121 HIDDEN_WARP_NPC,5,5
+ein_dun02,31,255,0 duplicate(achievement_wp) #wp120122 HIDDEN_WARP_NPC,5,5
+gef_dun02,222,163,0 duplicate(achievement_wp) #wp120123 HIDDEN_WARP_NPC,5,5
+gl_sew04,288,6,0 duplicate(achievement_wp) #wp120124 HIDDEN_WARP_NPC,5,5
+gl_knt02,126,235,0 duplicate(achievement_wp) #wp120125 HIDDEN_WARP_NPC,5,5
+gl_cas02,53,151,0 duplicate(achievement_wp) #wp120126 HIDDEN_WARP_NPC,5,5
+gl_prison1,126,158,0 duplicate(achievement_wp) #wp120127 HIDDEN_WARP_NPC,5,5
+gon_dun03,166,231,0 duplicate(achievement_wp) #wp120128 HIDDEN_WARP_NPC,5,5
+ice_dun03,45,261,0 duplicate(achievement_wp) #wp120129 HIDDEN_WARP_NPC,5,5
+in_sphinx5,154,107,0 duplicate(achievement_wp) #wp120130 HIDDEN_WARP_NPC,5,5
+iz_dun05,64,223,0 duplicate(achievement_wp) #wp120131 HIDDEN_WARP_NPC,5,5
+kh_dun02,70,107,0 duplicate(achievement_wp) #wp120132 HIDDEN_WARP_NPC,5,5
+lhz_dun03,240,221,0 duplicate(achievement_wp) #wp120133 HIDDEN_WARP_NPC,5,5
+lou_dun03,29,228,0 duplicate(achievement_wp) #wp120134 HIDDEN_WARP_NPC,5,5
+mag_dun02,197,77,0 duplicate(achievement_wp) #wp120135 HIDDEN_WARP_NPC,5,5
+mjo_dun03,76,220,0 duplicate(achievement_wp) #wp120136 HIDDEN_WARP_NPC,5,5
+moc_pryd06,102,121,0 duplicate(achievement_wp) #wp120137 HIDDEN_WARP_NPC,5,5
+orcsdun02,31,72,0 duplicate(achievement_wp) #wp120138 HIDDEN_WARP_NPC,5,5
+pay_dun04,120,124,0 duplicate(achievement_wp) #wp120139 HIDDEN_WARP_NPC,5,5
+prt_maze03,11,14,0 duplicate(achievement_wp) #wp120140 HIDDEN_WARP_NPC,5,5
+prt_sewb4,19,183,0 duplicate(achievement_wp) #wp120141 HIDDEN_WARP_NPC,5,5
+tha_t06,150,176,0 duplicate(achievement_wp) #wp120142 HIDDEN_WARP_NPC,5,5
+thor_v03,220,221,0 duplicate(achievement_wp) #wp120143 HIDDEN_WARP_NPC,5,5
+treasure02,19,142,0 duplicate(achievement_wp) #wp120144 HIDDEN_WARP_NPC,5,5
+tur_dun04,134,130,0 duplicate(achievement_wp) #wp120145 HIDDEN_WARP_NPC,5,5
+xmas_dun02,120,224,0 duplicate(achievement_wp) #wp120146 HIDDEN_WARP_NPC,5,5
diff --git a/npc/re/scripts.conf b/npc/re/scripts.conf
index 2499d99b2..5ecf6b741 100644
--- a/npc/re/scripts.conf
+++ b/npc/re/scripts.conf
@@ -136,6 +136,7 @@
"npc/re/other/turbo_track.txt",
// - Clan System
"npc/re/other/clans.txt",
+"npc/re/other/achievement_treasures.txt",
//================= Quests ================================================
// - Eden Group -------------------------------------------------
diff --git a/sql-files/item_db.sql b/sql-files/item_db.sql
index a0f07fc7a..c6546502e 100644
--- a/sql-files/item_db.sql
+++ b/sql-files/item_db.sql
@@ -4491,10 +4491,10 @@ REPLACE INTO `item_db` VALUES ('12114','Elemental_Fire','Elemental Converter','1
REPLACE INTO `item_db` VALUES ('12115','Elemental_Water','Elemental Converter','11','0','2','1','10','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','itemskill ITEM_ENCHANTARMS,2;','','');
REPLACE INTO `item_db` VALUES ('12116','Elemental_Earth','Elemental Converter','11','0','2','1','10','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','itemskill ITEM_ENCHANTARMS,3;','','');
REPLACE INTO `item_db` VALUES ('12117','Elemental_Wind','Elemental Converter','11','0','2','1','10','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','itemskill ITEM_ENCHANTARMS,5;','','');
-REPLACE INTO `item_db` VALUES ('12118','Resist_Fire','Fireproof Potion','2','0','2','1','10','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','sc_start4 SC_ARMORPROPERTY,1200000,-15,0,20,0;','','');
-REPLACE INTO `item_db` VALUES ('12119','Resist_Water','Coldproof Potion','2','0','2','1','10','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','sc_start4 SC_ARMORPROPERTY,1200000,20,0,0,-15;','','');
-REPLACE INTO `item_db` VALUES ('12120','Resist_Earth','Earthproof Potion','2','0','2','1','10','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','sc_start4 SC_ARMORPROPERTY,1200000,0,20,-15,0;','','');
-REPLACE INTO `item_db` VALUES ('12121','Resist_Wind','Thunderproof Potion','2','0','2','1','10','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','sc_start4 SC_ARMORPROPERTY,1200000,0,-15,0,20;','','');
+REPLACE INTO `item_db` VALUES ('12118','Resist_Fire','Fireproof Potion','2','0','2','1','10','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','sc_start(SC_RESIST_PROPERTY_FIRE, 1200000, 20); sc_start(SC_RESIST_PROPERTY_WATER, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);','','');
+REPLACE INTO `item_db` VALUES ('12119','Resist_Water','Coldproof Potion','2','0','2','1','10','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','sc_start(SC_RESIST_PROPERTY_WATER, 1200000, 20); sc_start(SC_RESIST_PROPERTY_WIND, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);','','');
+REPLACE INTO `item_db` VALUES ('12120','Resist_Earth','Earthproof Potion','2','0','2','1','10','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','sc_start(SC_RESIST_PROPERTY_GROUND, 1200000, 20); sc_start(SC_RESIST_PROPERTY_FIRE, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);','','');
+REPLACE INTO `item_db` VALUES ('12121','Resist_Wind','Thunderproof Potion','2','0','2','1','10','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','sc_start(SC_RESIST_PROPERTY_WIND, 1200000, 20); sc_start(SC_RESIST_PROPERTY_GROUND, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);','','');
REPLACE INTO `item_db` VALUES ('12122','Sesame_Pastry','Sesame Pastry','2','0','2','1','70','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','sc_start SC_FOOD_BASICHIT,1200000,30;','','');
REPLACE INTO `item_db` VALUES ('12123','Honey_Pastry','Honey Pastry','2','0','2','1','70','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','sc_start SC_FOOD_BASICAVOIDANCE,1200000,30;','','');
REPLACE INTO `item_db` VALUES ('12124','Rainbow_Cake','Rainbow Cake','2','0','2','1','70','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','sc_start SC_BATKFOOD,1200000,10; sc_start SC_MATKFOOD,120000,10;','','');
@@ -4649,7 +4649,7 @@ REPLACE INTO `item_db` VALUES ('12275','Gold_Pill_2','Taecheongdan','0','0','0',
REPLACE INTO `item_db` VALUES ('12276','Mimic_Scroll','Mimic Scroll','2','0','2','1','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','mercenary_create M_MIMIC, 1800000;','','');
REPLACE INTO `item_db` VALUES ('12277','Disguise_Scroll','Disguise Scroll','2','0','2','1','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','mercenary_create M_DISGUISE, 1800000;','','');
REPLACE INTO `item_db` VALUES ('12278','Alice_Scroll','Alice Scroll','2','0','2','1','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','73',NULL,'0',NULL,'0',NULL,'0','mercenary_create M_ALICE, 1800000;','','');
-REPLACE INTO `item_db` VALUES ('12279','Undead_Element_Scroll','Undead Elemental Scroll','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_start4 SC_ARMOR_RESIST,300000,20,20,20,20;','','');
+REPLACE INTO `item_db` VALUES ('12279','Undead_Element_Scroll','Undead Elemental Scroll','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_RESIST_PROPERTY_FIRE, 300000, 20); sc_start(SC_RESIST_PROPERTY_WATER, 300000, 20); sc_start(SC_RESIST_PROPERTY_WIND, 300000, 20); sc_start(SC_RESIST_PROPERTY_GROUND, 300000, 20);','','');
REPLACE INTO `item_db` VALUES ('12280','Holy_Element_Scroll','Holy Elemental Scroll','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','specialeffect(EF_BENEDICTIO, AREA, playerattached()); sc_start SC_BENEDICTIO,300000,1;','','');
REPLACE INTO `item_db` VALUES ('12281','Tresure_Box_WoE','Event Treasure Box','2','0','20','10','150','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 12281,1;','','');
REPLACE INTO `item_db` VALUES ('12282','Internet_Cafe1','Internet Cafe1','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_STR, 5400000, 3; sc_start SC_FOOD_DEX, 5400000, 3; sc_start SC_FOOD_AGI, 5400000, 3; sc_start SC_FOOD_INT, 5400000, 3; sc_start SC_FOOD_VIT, 5400000, 3; sc_start SC_FOOD_LUK, 5400000, 3; sc_start SC_PLUSATTACKPOWER, 5400000, 15; sc_start SC_PLUSMAGICPOWER, 5400000, 15;','','');
diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql
index 58d89d11e..e69201f62 100644
--- a/sql-files/item_db_re.sql
+++ b/sql-files/item_db_re.sql
@@ -5959,10 +5959,10 @@ REPLACE INTO `item_db` VALUES ('12114','Elemental_Fire','Elemental Converter','1
REPLACE INTO `item_db` VALUES ('12115','Elemental_Water','Elemental Converter','11','0','2','1','10','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','itemskill ITEM_ENCHANTARMS,2;','','');
REPLACE INTO `item_db` VALUES ('12116','Elemental_Earth','Elemental Converter','11','0','2','1','10','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','itemskill ITEM_ENCHANTARMS,3;','','');
REPLACE INTO `item_db` VALUES ('12117','Elemental_Wind','Elemental Converter','11','0','2','1','10','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','itemskill ITEM_ENCHANTARMS,5;','','');
-REPLACE INTO `item_db` VALUES ('12118','Resist_Fire','Fireproof Potion','2','0','2','1','10','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','sc_start4 SC_ARMORPROPERTY,1200000,-15,0,20,0;','','');
-REPLACE INTO `item_db` VALUES ('12119','Resist_Water','Coldproof Potion','2','0','2','1','10','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','sc_start4 SC_ARMORPROPERTY,1200000,20,0,0,-15;','','');
-REPLACE INTO `item_db` VALUES ('12120','Resist_Earth','Earthproof Potion','2','0','2','1','10','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','sc_start4 SC_ARMORPROPERTY,1200000,0,20,-15,0;','','');
-REPLACE INTO `item_db` VALUES ('12121','Resist_Wind','Thunderproof Potion','2','0','2','1','10','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','sc_start4 SC_ARMORPROPERTY,1200000,0,-15,0,20;','','');
+REPLACE INTO `item_db` VALUES ('12118','Resist_Fire','Fireproof Potion','2','0','2','1','10','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','sc_start(SC_RESIST_PROPERTY_FIRE, 1200000, 20); sc_start(SC_RESIST_PROPERTY_WATER, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);','','');
+REPLACE INTO `item_db` VALUES ('12119','Resist_Water','Coldproof Potion','2','0','2','1','10','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','sc_start(SC_RESIST_PROPERTY_WATER, 1200000, 20); sc_start(SC_RESIST_PROPERTY_WIND, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);','','');
+REPLACE INTO `item_db` VALUES ('12120','Resist_Earth','Earthproof Potion','2','0','2','1','10','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','sc_start(SC_RESIST_PROPERTY_GROUND, 1200000, 20); sc_start(SC_RESIST_PROPERTY_FIRE, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);','','');
+REPLACE INTO `item_db` VALUES ('12121','Resist_Wind','Thunderproof Potion','2','0','2','1','10','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','sc_start(SC_RESIST_PROPERTY_WIND, 1200000, 20); sc_start(SC_RESIST_PROPERTY_GROUND, 1200000, -15, 10000, SCFLAG_NOAVOID | SCFLAG_NOICON);','','');
REPLACE INTO `item_db` VALUES ('12122','Sesame_Pastry','Sesame Pastry','2','0','2','1','70','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','sc_start SC_FOOD_BASICHIT,1200000,30;','','');
REPLACE INTO `item_db` VALUES ('12123','Honey_Pastry','Honey Pastry','2','0','2','1','70','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','sc_start SC_FOOD_BASICAVOIDANCE, 1200000, 30;','','');
REPLACE INTO `item_db` VALUES ('12124','Rainbow_Cake','Rainbow Cake','2','0','2','1','70','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','sc_start SC_PLUSATTACKPOWER, 1200000, 10; sc_start SC_PLUSMAGICPOWER, 120000, 10;','','');
@@ -6117,7 +6117,7 @@ REPLACE INTO `item_db` VALUES ('12275','Gold_Pill_2','Taecheongdan','0','0','0',
REPLACE INTO `item_db` VALUES ('12276','Mimic_Scroll','Mimic Scroll','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','mercenary_create M_MIMIC, 1800000;','','');
REPLACE INTO `item_db` VALUES ('12277','Disguise_Scroll','Disguise Scroll','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','mercenary_create M_DISGUISE, 1800000;','','');
REPLACE INTO `item_db` VALUES ('12278','Alice_Scroll','Alice 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','475',NULL,'0',NULL,'0',NULL,'0','mercenary_create M_ALICE, 1800000;','','');
-REPLACE INTO `item_db` VALUES ('12279','Undead_Element_Scroll','Undead Elemental Scroll','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_start4 SC_ARMOR_RESIST,300000,20,20,20,20;','','');
+REPLACE INTO `item_db` VALUES ('12279','Undead_Element_Scroll','Undead Elemental Scroll','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_RESIST_PROPERTY_FIRE, 300000, 20); sc_start(SC_RESIST_PROPERTY_WATER, 300000, 20); sc_start(SC_RESIST_PROPERTY_WIND, 300000, 20); sc_start(SC_RESIST_PROPERTY_GROUND, 300000, 20);','','');
REPLACE INTO `item_db` VALUES ('12280','Holy_Element_Scroll','Holy Elemental Scroll','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','specialeffect(EF_BENEDICTIO, AREA, playerattached()); sc_start SC_BENEDICTIO,300000,1;','','');
REPLACE INTO `item_db` VALUES ('12281','Tresure_Box_WoE','Event Treasure Box','2','0','20','10','150','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','packageitem();','','');
REPLACE INTO `item_db` VALUES ('12282','Internet_Cafe1','Internet Cafe1','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_STR, 5400000, 3; sc_start SC_FOOD_DEX, 5400000, 3; sc_start SC_FOOD_AGI, 5400000, 3; sc_start SC_FOOD_INT, 5400000, 3; sc_start SC_FOOD_VIT, 5400000, 3; sc_start SC_FOOD_LUK, 5400000, 3; sc_start SC_PLUSATTACKPOWER, 5400000, 15; sc_start SC_PLUSMAGICPOWER, 5400000, 15;','','');
diff --git a/src/common/HPMDataCheck.h b/src/common/HPMDataCheck.h
index 129ec7475..11f79a11b 100644
--- a/src/common/HPMDataCheck.h
+++ b/src/common/HPMDataCheck.h
@@ -744,6 +744,7 @@ HPExport const struct s_HPMDataCheck HPMDataCheck[] = {
{ "PACKET_ZC_SKILLINFO_LIST", sizeof(struct PACKET_ZC_SKILLINFO_LIST), SERVER_TYPE_MAP },
{ "PACKET_ZC_SKILLINFO_UPDATE2", sizeof(struct PACKET_ZC_SKILLINFO_UPDATE2), SERVER_TYPE_MAP },
{ "PACKET_ZC_SPRITE_CHANGE", sizeof(struct PACKET_ZC_SPRITE_CHANGE), SERVER_TYPE_MAP },
+ { "PACKET_ZC_STATE_CHANGE", sizeof(struct PACKET_ZC_STATE_CHANGE), SERVER_TYPE_MAP },
{ "PACKET_ZC_STATUS_CHANGE_ACK", sizeof(struct PACKET_ZC_STATUS_CHANGE_ACK), SERVER_TYPE_MAP },
{ "PACKET_ZC_STYLE_CHANGE_RES", sizeof(struct PACKET_ZC_STYLE_CHANGE_RES), SERVER_TYPE_MAP },
{ "PACKET_ZC_TALKBOX_CHATCONTENTS", sizeof(struct PACKET_ZC_TALKBOX_CHATCONTENTS), SERVER_TYPE_MAP },
diff --git a/src/map/clif.c b/src/map/clif.c
index 1223d2b7e..868117a96 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -4032,51 +4032,58 @@ static void clif_misceffect(struct block_list *bl, int type)
/// 0229 <id>.L <body state>.W <health state>.W <effect state>.L <pk mode>.B (ZC_STATE_CHANGE3)
static void clif_changeoption(struct block_list *bl)
{
- unsigned char buf[32];
- struct status_change *sc;
- struct map_session_data* sd;
-
nullpo_retv(bl);
- if ( !(sc = status->get_sc(bl)) && bl->type != BL_NPC ) return; //How can an option change if there's no sc?
+ struct status_change *sc = status->get_sc(bl);
- sd = BL_CAST(BL_PC, bl);
+ if (sc == NULL && bl->type != BL_NPC) // How can an option change if there's no sc?
+ return;
-#if PACKETVER >= 7
- WBUFW(buf,0) = 0x229;
- WBUFL(buf,2) = bl->id;
- WBUFW(buf,6) = (sc) ? sc->opt1 : 0;
- WBUFW(buf,8) = (sc) ? sc->opt2 : 0;
- WBUFL(buf,10) = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0);
- WBUFB(buf,14) = (sd)? sd->status.karma : 0;
+ struct map_session_data *sd = BL_CAST(BL_PC, bl);
+ struct PACKET_ZC_STATE_CHANGE p;
+ p.packetType = HEADER_ZC_STATE_CHANGE;
+ p.AID = bl->id;
+ p.bodyState = (sc != NULL) ? sc->opt1 : 0;
+ p.healthState = (sc != NULL) ? sc->opt2 : 0;
+ p.effectState = (sc != NULL) ? sc->option : BL_UCCAST(BL_NPC, bl)->option;
+ p.isPKModeON = (sd != NULL) ? sd->status.karma : 0;
if (clif->isdisguised(bl)) {
- clif->send(buf,packet_len(0x229),bl,AREA_WOS);
- WBUFL(buf,2) = -bl->id;
- clif->send(buf,packet_len(0x229),bl,SELF);
- WBUFL(buf,2) = bl->id;
- WBUFL(buf,10) = OPTION_INVISIBLE;
- clif->send(buf,packet_len(0x229),bl,SELF);
+ clif->send(&p, sizeof(p), bl, AREA_WOS);
+ p.AID = -bl->id;
+ clif->send(&p, sizeof(p), bl, SELF);
+ p.AID = bl->id;
+ p.effectState = OPTION_INVISIBLE;
+ clif->send(&p, sizeof(p), bl, SELF);
} else {
- clif->send(buf,packet_len(0x229),bl,AREA);
+ clif->send(&p, sizeof(p), bl, AREA);
}
-#else
- WBUFW(buf,0) = 0x119;
- WBUFL(buf,2) = bl->id;
- WBUFW(buf,6) = (sc) ? sc->opt1 : 0;
- WBUFW(buf,8) = (sc) ? sc->opt2 : 0;
- WBUFL(buf,10) = (sc != NULL) ? sc->option : ((bl->type == BL_NPC) ? BL_UCCAST(BL_NPC, bl)->option : 0);
- WBUFB(buf,12) = (sd)? sd->status.karma : 0;
+}
+
+static void clif_changeoption_target(struct block_list *bl, struct block_list *target_bl, enum send_target target)
+{
+ nullpo_retv(bl);
+ nullpo_retv(target_bl);
+
+ struct status_change *sc = status->get_sc(bl);
+
+ if (sc == NULL && bl->type != BL_NPC) // How can an option change if there's no sc?
+ return;
+
+ struct map_session_data *sd = BL_CAST(BL_PC, bl);
+ struct PACKET_ZC_STATE_CHANGE p;
+ p.packetType = HEADER_ZC_STATE_CHANGE;
+ p.AID = bl->id;
+ p.bodyState = (sc != NULL) ? sc->opt1 : 0;
+ p.healthState = (sc != NULL) ? sc->opt2 : 0;
+ p.effectState = (sc != NULL) ? sc->option : BL_UCCAST(BL_NPC, bl)->option;
+ p.isPKModeON = (sd != NULL) ? sd->status.karma : 0;
if (clif->isdisguised(bl)) {
- clif->send(buf,packet_len(0x119),bl,AREA_WOS);
- WBUFL(buf,2) = -bl->id;
- clif->send(buf,packet_len(0x119),bl,SELF);
- WBUFL(buf,2) = bl->id;
- WBUFW(buf,10) = OPTION_INVISIBLE;
- clif->send(buf,packet_len(0x119),bl,SELF);
- } else {
- clif->send(buf,packet_len(0x119),bl,AREA);
+ p.AID = -bl->id;
+ clif->send(&p, sizeof(p), target_bl, target);
+ p.AID = bl->id;
+ p.effectState = OPTION_INVISIBLE;
}
-#endif
+ clif->send(&p, sizeof(p), target_bl, target);
}
/// Displays status change effects on NPCs/monsters (ZC_NPC_SHOWEFST_UPDATE).
@@ -24212,6 +24219,7 @@ void clif_defaults(void)
/* visual effects client-side */
clif->misceffect = clif_misceffect;
clif->changeoption = clif_changeoption;
+ clif->changeoption_target = clif_changeoption_target;
clif->changeoption2 = clif_changeoption2;
clif->emotion = clif_emotion;
clif->talkiebox = clif_talkiebox;
diff --git a/src/map/clif.h b/src/map/clif.h
index 252dfefe1..25ac65af5 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -1006,6 +1006,7 @@ struct clif_interface {
/* visual effects client-side */
void (*misceffect) (struct block_list* bl,int type);
void (*changeoption) (struct block_list* bl);
+ void (*changeoption_target) (struct block_list *bl, struct block_list *target_bl, enum send_target target);
void (*changeoption2) (struct block_list* bl);
void (*emotion) (struct block_list *bl,int type);
void (*talkiebox) (struct block_list* bl, const char* talkie);
diff --git a/src/map/packets_struct.h b/src/map/packets_struct.h
index c2c99629a..31b28e831 100644
--- a/src/map/packets_struct.h
+++ b/src/map/packets_struct.h
@@ -3851,6 +3851,27 @@ struct PACKET_CZ_NPC_EXPANDED_BARTER_PURCHASE {
DEFINE_PACKET_HEADER(CZ_NPC_EXPANDED_BARTER_PURCHASE, 0x0b57);
#endif
+#if PACKETVER >= 7
+struct PACKET_ZC_STATE_CHANGE {
+ int16 packetType;
+ uint32 AID;
+ int16 bodyState;
+ int16 healthState;
+ int32 effectState;
+ int8 isPKModeON;
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_STATE_CHANGE, 0x0229);
+#else
+struct PACKET_ZC_STATE_CHANGE {
+ int16 PacketType;
+ uint32 AID;
+ int16 bodyState;
+ int16 healthState;
+ int16 effectState;
+ int8 isPKModeON;
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(ZC_STATE_CHANGE, 0x0119);
+#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)
diff --git a/src/map/script.c b/src/map/script.c
index c3e8436f7..b89176dba 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -12489,6 +12489,56 @@ static BUILDIN(hideonnpc)
npc->enable(str,4);
return true;
}
+/*==========================================
+ *------------------------------------------*/
+static BUILDIN(cloakonnpc)
+{
+ struct npc_data *nd = npc->name2id(script_getstr(st, 2));
+ if (nd == NULL) {
+ ShowError("buildin_cloakonnpc: invalid npc name '%s'.\n", script_getstr(st, 2));
+ return false;
+ }
+
+ if (script_hasdata(st, 3)) {
+ struct map_session_data *sd = map->id2sd(script_getnum(st, 3));
+ if (sd == NULL)
+ return false;
+
+ uint32 val = nd->option;
+ nd->option |= OPTION_CLOAK;
+ clif->changeoption_target(&nd->bl, &sd->bl, SELF);
+ nd->option = val;
+ } else {
+ nd->option |= OPTION_CLOAK;
+ clif->changeoption(&nd->bl);
+ }
+ return true;
+}
+/*==========================================
+ *------------------------------------------*/
+static BUILDIN(cloakoffnpc)
+{
+ struct npc_data *nd = npc->name2id(script_getstr(st, 2));
+ if (nd == NULL) {
+ ShowError("buildin_cloakoffnpc: invalid npc name '%s'.\n", script_getstr(st, 2));
+ return false;
+ }
+
+ if (script_hasdata(st, 3)) {
+ struct map_session_data *sd = map->id2sd(script_getnum(st, 3));
+ if (sd == NULL)
+ return false;
+
+ uint32 val = nd->option;
+ nd->option &= ~OPTION_CLOAK;
+ clif->changeoption_target(&nd->bl, &sd->bl, SELF);
+ nd->option = val;
+ } else {
+ nd->option &= ~OPTION_CLOAK;
+ clif->changeoption(&nd->bl);
+ }
+ return true;
+}
/* Starts a status effect on the target unit or on the attached player.
*
@@ -22241,6 +22291,23 @@ static BUILDIN(achievement_progress)
return true;
}
+static BUILDIN(achievement_iscompleted)
+{
+ struct map_session_data *sd = script_hasdata(st, 3) ? map->id2sd(script_getnum(st, 3)) : script->rid2sd(st);
+ if (sd == NULL)
+ return false;
+
+ int aid = script_getnum(st, 2);
+ const struct achievement_data *ad = achievement->get(aid);
+ if (ad == NULL) {
+ ShowError("buildin_achievement_iscompleted: Invalid Achievement %d provided.\n", aid);
+ return false;
+ }
+
+ script_pushint(st, achievement->check_complete(sd, ad));
+ return true;
+}
+
/*==========================================
* BattleGround System
*------------------------------------------*/
@@ -26705,6 +26772,8 @@ static void script_parse_builtin(void)
BUILDIN_DEF(disablenpc,"s"),
BUILDIN_DEF(hideoffnpc,"s"),
BUILDIN_DEF(hideonnpc,"s"),
+ BUILDIN_DEF(cloakonnpc,"s?"),
+ BUILDIN_DEF(cloakoffnpc,"s?"),
BUILDIN_DEF(sc_start,"iii???"),
BUILDIN_DEF2(sc_start,"sc_start2","iiii???"),
BUILDIN_DEF2(sc_start,"sc_start4","iiiiii???"),
@@ -26987,6 +27056,7 @@ static void script_parse_builtin(void)
BUILDIN_DEF(agitcheck2,""),
// Achievements [Smokexyz/Hercules]
BUILDIN_DEF(achievement_progress, "iiii?"),
+ BUILDIN_DEF(achievement_iscompleted, "i?"),
// BattleGround
BUILDIN_DEF(waitingroom2bg,"siiss?"),
BUILDIN_DEF(waitingroom2bg_single,"isiis"),
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
index 4345108d3..8c6f43433 100644
--- a/src/plugins/HPMHooking/HPMHooking.Defs.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -1514,6 +1514,8 @@ typedef void (*HPMHOOK_pre_clif_misceffect) (struct block_list **bl, int *type);
typedef void (*HPMHOOK_post_clif_misceffect) (struct block_list *bl, int type);
typedef void (*HPMHOOK_pre_clif_changeoption) (struct block_list **bl);
typedef void (*HPMHOOK_post_clif_changeoption) (struct block_list *bl);
+typedef void (*HPMHOOK_pre_clif_changeoption_target) (struct block_list **bl, struct block_list **target_bl, enum send_target *target);
+typedef void (*HPMHOOK_post_clif_changeoption_target) (struct block_list *bl, struct block_list *target_bl, enum send_target target);
typedef void (*HPMHOOK_pre_clif_changeoption2) (struct block_list **bl);
typedef void (*HPMHOOK_post_clif_changeoption2) (struct block_list *bl);
typedef void (*HPMHOOK_pre_clif_emotion) (struct block_list **bl, int *type);
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index b5f04af50..53ba3403c 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -1104,6 +1104,8 @@ struct {
struct HPMHookPoint *HP_clif_misceffect_post;
struct HPMHookPoint *HP_clif_changeoption_pre;
struct HPMHookPoint *HP_clif_changeoption_post;
+ struct HPMHookPoint *HP_clif_changeoption_target_pre;
+ struct HPMHookPoint *HP_clif_changeoption_target_post;
struct HPMHookPoint *HP_clif_changeoption2_pre;
struct HPMHookPoint *HP_clif_changeoption2_post;
struct HPMHookPoint *HP_clif_emotion_pre;
@@ -7969,6 +7971,8 @@ struct {
int HP_clif_misceffect_post;
int HP_clif_changeoption_pre;
int HP_clif_changeoption_post;
+ int HP_clif_changeoption_target_pre;
+ int HP_clif_changeoption_target_post;
int HP_clif_changeoption2_pre;
int HP_clif_changeoption2_post;
int HP_clif_emotion_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index 1967f8c82..0904a1dac 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -576,6 +576,7 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(clif->quitsave, HP_clif_quitsave) },
{ HP_POP(clif->misceffect, HP_clif_misceffect) },
{ HP_POP(clif->changeoption, HP_clif_changeoption) },
+ { HP_POP(clif->changeoption_target, HP_clif_changeoption_target) },
{ HP_POP(clif->changeoption2, HP_clif_changeoption2) },
{ HP_POP(clif->emotion, HP_clif_emotion) },
{ HP_POP(clif->talkiebox, HP_clif_talkiebox) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index d7d183f28..319e675a8 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -14402,6 +14402,32 @@ void HP_clif_changeoption(struct block_list *bl) {
}
return;
}
+void HP_clif_changeoption_target(struct block_list *bl, struct block_list *target_bl, enum send_target target) {
+ int hIndex = 0;
+ if (HPMHooks.count.HP_clif_changeoption_target_pre > 0) {
+ void (*preHookFunc) (struct block_list **bl, struct block_list **target_bl, enum send_target *target);
+ *HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_changeoption_target_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_clif_changeoption_target_pre[hIndex].func;
+ preHookFunc(&bl, &target_bl, &target);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return;
+ }
+ }
+ {
+ HPMHooks.source.clif.changeoption_target(bl, target_bl, target);
+ }
+ if (HPMHooks.count.HP_clif_changeoption_target_post > 0) {
+ void (*postHookFunc) (struct block_list *bl, struct block_list *target_bl, enum send_target target);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_clif_changeoption_target_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_clif_changeoption_target_post[hIndex].func;
+ postHookFunc(bl, target_bl, target);
+ }
+ }
+ return;
+}
void HP_clif_changeoption2(struct block_list *bl) {
int hIndex = 0;
if (HPMHooks.count.HP_clif_changeoption2_pre > 0) {