summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/messages.conf3
-rw-r--r--db/constants.conf113
-rw-r--r--db/pre-re/item_db.conf152
-rw-r--r--db/pre-re/skill_db.conf1
-rw-r--r--db/re/item_db.conf131
-rw-r--r--db/re/skill_db.conf1
-rw-r--r--doc/constants.md44
-rw-r--r--doc/script_commands.txt146
-rw-r--r--sql-files/item_db.sql50
-rw-r--r--sql-files/item_db_re.sql50
-rw-r--r--src/map/clif.c29
-rw-r--r--src/map/clif.h1
-rw-r--r--src/map/itemdb.h50
-rw-r--r--src/map/npc.h3
-rw-r--r--src/map/packets.h311
-rw-r--r--src/map/pc.c42
-rw-r--r--src/map/script.c1600
-rw-r--r--src/map/script.h75
-rw-r--r--src/map/status.h84
19 files changed, 2643 insertions, 243 deletions
diff --git a/conf/messages.conf b/conf/messages.conf
index efc8d8a36..3cebc4173 100644
--- a/conf/messages.conf
+++ b/conf/messages.conf
@@ -51,7 +51,8 @@
23: Job level can't go any higher.
24: Job level raised.
25: Job level lowered.
-//26-27 FREE
+26: [%d] seconds left until you can use
+//27 FREE
28: No player found.
29: 1 player found.
30: %d players found.
diff --git a/db/constants.conf b/db/constants.conf
index 79530e7d1..d108e0976 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -3504,6 +3504,51 @@ constants_db: {
4_F_REBELLION2: 10201
4_F_REBELLION3: 10202
4_M_ILYA: 10203
+ // Free ID - 10204
+ 4_ELDER: 10205
+ 4_LUNATIC: 10206
+ 4_F_NOVICE2: 10207
+ 4_WICKEDNYMPH: 10208
+ 4_F_PREMI: 10209
+ 4_M_COSTELL: 10210
+ 4_M_YATTWARP: 10211
+ 4_M_EVOKASCUDI: 10212
+ 4_M_JOHNNYJAMES: 10213
+ 4_M_ALBERTFORD: 10214
+ 4_M_SEANMCCURDY: 10215
+ 4_M_KARAMPUCCI: 10216
+ 4_M_CACTUSMAN1: 10217
+ 4_M_CACTUSMAN2: 10218
+ 4_M_CACTUSMAN3: 10219
+ 4_M_CACTUSLADY: 10220
+ 4_M_GAST: 10221
+ 4_M_CACTUSCHILD: 10222
+ 4_KING: 10223
+ 4_F_BOMI: 10224
+ 4_M_CACTUSCHIEF: 10225
+ 4_F_CACTUSCHILD2: 10226
+ 4_F_CACTUSLADY2: 10227
+ 4_F_CACTUSLADY3: 10228
+ 4_M_CACTUS: 10229
+ 4_M_COWRAIDERS1: 10230
+ 4_M_COWRAIDERS2: 10231
+ 4_M_COWRAIDERS3: 10232
+ 4_F_JP14THEVT: 10233
+ 4_M_POORSCHOLAR: 10234
+ 4_M_PEPPERROTI: 10235
+ JP_NPC01: 10236
+ 4_PURPLE_WARP: 10237
+ 4_F_NARIN: 10238
+ 4_M_URGENT_MAN: 10239
+ 4_M_KEEN_SOLDIER: 10240
+ 4_F_SLOPPY_WOMAN: 10241
+ 4_F_DRKAFRA01: 10242
+ 4_M_DRZONDA01: 10243
+ 4_M_SWD_RENO: 10244
+ 4_M_KNG_RENO: 10245
+ 4_M_AC_RUMIN: 10246
+ 4_M_HIGH_WIZARD: 10247
+ 4_SYSTEM_BOX: 10248
comment__: "Mercenary IDs"
MER_LIF: 6001
@@ -3699,7 +3744,7 @@ constants_db: {
MOUNT_DRAGON_BLUE: 7
MOUNT_DRAGON_RED: 8
- comment__: "gettime"
+ comment__: "Gettime Types"
GETTIME_SECOND: 1
GETTIME_MINUTE: 2
GETTIME_HOUR: 3
@@ -3722,7 +3767,14 @@ constants_db: {
UNITTYPE_HOM: 4
UNITTYPE_MER: 5
UNITTYPE_ELEM: 6
-
+
+ comment__: "Unit AI Types"
+ AI_NONE: 0 //0: Normal mob.
+ AI_ATTACK: 1 //1: Standard summon, attacks mobs.
+ AI_SPHERE: 2 //2: Alchemist Marine Sphere
+ AI_FLORA: 3 //3: Alchemist Summon Flora
+ AI_ZANZOU: 4 //4: Summon Zanzou
+
comment__: "Colors"
C_AQUA: 0x00FFFF
C_BLACK: 0x000000
@@ -3749,4 +3801,61 @@ constants_db: {
comment__: "Genders"
SEX_FEMALE: 0
SEX_MALE: 1
+
+ comment__: "Script Unit Data Types"
+ UDT_TYPE: 0
+ UDT_SIZE: 1
+ UDT_LEVEL: 2
+ UDT_HP: 3
+ UDT_MAXHP: 4
+ UDT_SP: 5
+ UDT_MAXSP: 6
+ UDT_MASTERAID: 7
+ UDT_MASTERCID: 8
+ UDT_MAPIDXY: 9
+ UDT_WALKTOXY: 10
+ UDT_SPEED: 11
+ UDT_MODE: 12
+ UDT_AI: 13
+ UDT_SCOPTION: 14
+ UDT_SEX: 15
+ UDT_CLASS: 16
+ UDT_HAIRSTYLE: 17
+ UDT_HAIRCOLOR: 18
+ UDT_HEADBOTTOM: 19
+ UDT_HEADMIDDLE: 20
+ UDT_HEADTOP: 21
+ UDT_CLOTHCOLOR: 22
+ UDT_SHIELD: 23
+ UDT_WEAPON: 24
+ UDT_LOOKDIR: 25
+ UDT_CANMOVETICK: 26
+ UDT_STR: 27
+ UDT_AGI: 28
+ UDT_VIT: 29
+ UDT_INT: 30
+ UDT_DEX: 31
+ UDT_LUK: 32
+ UDT_ATKRANGE: 33
+ UDT_ATKMIN: 34
+ UDT_ATKMAX: 35
+ UDT_MATKMIN: 36
+ UDT_MATKMAX: 37
+ UDT_DEF: 38
+ UDT_MDEF: 39
+ UDT_HIT: 40
+ UDT_FLEE: 41
+ UDT_PDODGE: 42
+ UDT_CRIT: 43
+ UDT_RACE: 44
+ UDT_ELETYPE: 45
+ UDT_ELELEVEL: 46
+ UDT_AMOTION: 47
+ UDT_ADELAY: 48
+ UDT_DMOTION: 49
+ UDT_HUNGER: 50
+ UDT_INTIMACY: 51
+ UDT_LIFETIME: 52
+ UDT_MERC_KILLCOUNT: 53
+ UDT_STATADD: 54
}
diff --git a/db/pre-re/item_db.conf b/db/pre-re/item_db.conf
index a681d5753..cfa7cb7d1 100644
--- a/db/pre-re/item_db.conf
+++ b/db/pre-re/item_db.conf
@@ -1197,6 +1197,9 @@ item_db: (
Buy: 2000
Weight: 100
BuyingStore: true
+ Nouse: {
+ sitting: true
+ }
Script: <" itemskill SM_ENDURE,1; ">
},
{
@@ -1207,6 +1210,9 @@ item_db: (
Buy: 1500
Weight: 100
BuyingStore: true
+ Nouse: {
+ sitting: true
+ }
Script: <" itemskill SM_SELFPROVOKE,1; ">
},
{
@@ -74741,11 +74747,15 @@ item_db: (
Name: "Paralyze"
Type: 0
Buy: 2
- Weight: 100
+ Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 8
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_PARALYSE,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_PARALYSE, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -74754,11 +74764,15 @@ item_db: (
Name: "Leech End"
Type: 0
Buy: 2
- Weight: 100
+ Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 8
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_LEECHESEND,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_LEECHESEND, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -74767,11 +74781,15 @@ item_db: (
Name: "Oblivion Curse"
Type: 0
Buy: 2
- Weight: 100
+ Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 8
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_OBLIVIONCURSE,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_OBLIVIONCURSE, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -74780,11 +74798,15 @@ item_db: (
Name: "Disheart"
Type: 0
Buy: 2
- Weight: 100
+ Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 8
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_DEATHHURT,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_DEATHHURT, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -74793,11 +74815,15 @@ item_db: (
Name: "Toxin"
Type: 0
Buy: 2
- Weight: 100
+ Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 8
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_TOXIN,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_TOXIN, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -74806,11 +74832,15 @@ item_db: (
Name: "Pyrexia"
Type: 0
Buy: 2
- Weight: 100
+ Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 8
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_PYREXIA,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_PYREXIA, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -74819,11 +74849,16 @@ item_db: (
Name: "Magic Mushroom"
Type: 0
Buy: 2
- Weight: 100
+ Weight: 20
+ BuyingStore: true
+ Job: {
+ Assassin: true
+ }
+ Upper: 8
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_MAGICMUSHROOM,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_MAGICMUSHROOM, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -74832,11 +74867,15 @@ item_db: (
Name: "Venom Bleed"
Type: 0
Buy: 2
- Weight: 100
+ Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 8
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_VENOMBLEED,15000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_VENOMBLEED, 15000, 0, 10, SCFLAG_FIXEDTICK;
">
},
@@ -74848,6 +74887,9 @@ item_db: (
Type: 11
Buy: 100
Weight: 100
+ Job: {
+ Knight: true
+ }
Upper: 8
Delay: 120000
Trade: {
@@ -74863,7 +74905,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_REFRESH,1; ">
+ Script: <" itemskill RK_REFRESH, 1; ">
},
{
Id: 12726
@@ -74872,6 +74914,9 @@ item_db: (
Type: 11
Buy: 100
Weight: 100
+ Job: {
+ Knight: true
+ }
Upper: 8
Delay: 30000
Trade: {
@@ -74887,7 +74932,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_CRUSHSTRIKE,1; ">
+ Script: <" itemskill RK_CRUSHSTRIKE, 1; ">
},
{
Id: 12727
@@ -74896,6 +74941,9 @@ item_db: (
Type: 11
Buy: 100
Weight: 100
+ Job: {
+ Knight: true
+ }
Upper: 8
Delay: 60000
Trade: {
@@ -74911,7 +74959,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_MILLENNIUMSHIELD,1; ">
+ Script: <" itemskill RK_MILLENNIUMSHIELD, 1; ">
},
{
Id: 12728
@@ -74920,6 +74968,9 @@ item_db: (
Type: 11
Buy: 100
Weight: 100
+ Job: {
+ Knight: true
+ }
Upper: 8
Trade: {
nodrop: true
@@ -74934,7 +74985,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_VITALITYACTIVATION,1; ">
+ Script: <" itemskill RK_VITALITYACTIVATION, 1; ">
},
{
Id: 12729
@@ -74943,6 +74994,9 @@ item_db: (
Type: 11
Buy: 100
Weight: 100
+ Job: {
+ Knight: true
+ }
Upper: 8
Trade: {
nodrop: true
@@ -74957,7 +75011,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_FIGHTINGSPIRIT,1; ">
+ Script: <" itemskill RK_FIGHTINGSPIRIT, 1; ">
},
{
Id: 12730
@@ -74966,6 +75020,9 @@ item_db: (
Type: 11
Buy: 100
Weight: 100
+ Job: {
+ Knight: true
+ }
Upper: 8
Trade: {
nodrop: true
@@ -74980,7 +75037,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_ABUNDANCE,1; ">
+ Script: <" itemskill RK_ABUNDANCE, 1; ">
},
{
Id: 12731
@@ -74989,6 +75046,9 @@ item_db: (
Type: 11
Buy: 100
Weight: 100
+ Job: {
+ Knight: true
+ }
Upper: 8
Trade: {
nodrop: true
@@ -75003,7 +75063,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_GIANTGROWTH,1; ">
+ Script: <" itemskill RK_GIANTGROWTH, 1; ">
},
{
Id: 12732
@@ -75012,6 +75072,9 @@ item_db: (
Type: 11
Buy: 100
Weight: 100
+ Job: {
+ Knight: true
+ }
Upper: 8
Delay: 1000
Trade: {
@@ -75027,7 +75090,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_STORMBLAST,1; ">
+ Script: <" itemskill RK_STORMBLAST, 1; ">
},
{
Id: 12733
@@ -75036,6 +75099,9 @@ item_db: (
Type: 11
Buy: 100
Weight: 100
+ Job: {
+ Knight: true
+ }
Upper: 8
Trade: {
nodrop: true
@@ -75050,9 +75116,10 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_STONEHARDSKIN,1; ">
+ Script: <" itemskill RK_STONEHARDSKIN, 1; ">
},
-// Rune Knight Rune Ores
+
+//== Rune Knight Rune Ores =============================
{
Id: 12734
AegisName: "Runstone_Quality"
@@ -75060,10 +75127,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
- Upper: 8
BuyingStore: true
Script: <" makerune 5; ">
},
@@ -75074,10 +75137,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
- Upper: 8
BuyingStore: true
Script: <" makerune 11; ">
},
@@ -75088,10 +75147,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
- Upper: 8
BuyingStore: true
Script: <" makerune 14; ">
},
@@ -75102,10 +75157,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
- Upper: 8
BuyingStore: true
Script: <" makerune 2; ">
},
@@ -75116,10 +75167,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
- Upper: 8
BuyingStore: true
Script: <" makerune 8; ">
},
@@ -96076,7 +96123,20 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 8
Delay: 60000
+ Trade: {
+ nodrop: true
+ notrade: true
+ noselltonpc: true
+ nocart: true
+ nogstorage: true
+ nomail: true
+ noauction: true
+ }
Stack: [20, 1]
Script: <" itemskill RK_LUXANIMA,1; ">
},
diff --git a/db/pre-re/skill_db.conf b/db/pre-re/skill_db.conf
index 39ae0b313..80527b4f6 100644
--- a/db/pre-re/skill_db.conf
+++ b/db/pre-re/skill_db.conf
@@ -29842,6 +29842,7 @@ skill_db: (
}
Requirements: {
SPCost: 40
+ State: "Cart"
}
},
{
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index ca826e58d..d1f416b08 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -1218,6 +1218,9 @@ item_db: (
Buy: 2000
Weight: 100
BuyingStore: true
+ Nouse: {
+ sitting: true
+ }
Script: <" itemskill SM_ENDURE,1; ">
},
{
@@ -1228,6 +1231,9 @@ item_db: (
Buy: 1500
Weight: 100
BuyingStore: true
+ Nouse: {
+ sitting: true
+ }
Script: <" itemskill SM_SELFPROVOKE,1; ">
},
{
@@ -94153,10 +94159,14 @@ item_db: (
Type: 0
Buy: 2
Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 56
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_PARALYSE,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_PARALYSE, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -94166,10 +94176,14 @@ item_db: (
Type: 0
Buy: 2
Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 56
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_LEECHESEND,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_LEECHESEND, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -94179,10 +94193,14 @@ item_db: (
Type: 0
Buy: 2
Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 56
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_OBLIVIONCURSE,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_OBLIVIONCURSE, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -94192,10 +94210,14 @@ item_db: (
Type: 0
Buy: 2
Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 56
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_DEATHHURT,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_DEATHHURT, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -94205,10 +94227,14 @@ item_db: (
Type: 0
Buy: 2
Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 56
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_TOXIN,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_TOXIN, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -94218,10 +94244,14 @@ item_db: (
Type: 0
Buy: 2
Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 56
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_PYREXIA,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_PYREXIA, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -94231,10 +94261,14 @@ item_db: (
Type: 0
Buy: 2
Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 56
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_MAGICMUSHROOM,300000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_MAGICMUSHROOM, 300000, 0, 10, SCFLAG_FIXEDTICK;
">
},
{
@@ -94244,10 +94278,14 @@ item_db: (
Type: 0
Buy: 2
Weight: 20
+ Job: {
+ Assassin: true
+ }
+ Upper: 56
BuyingStore: true
Script: <"
specialeffect2 EF_ENCHANTPOISON;
- sc_start SC_VENOMBLEED,15000,0,10,SCFLAG_FIXEDTICK;
+ sc_start SC_VENOMBLEED, 15000, 0, 10, SCFLAG_FIXEDTICK;
">
},
@@ -94259,6 +94297,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Delay: 120000
Trade: {
nodrop: true
@@ -94273,7 +94315,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_REFRESH,1; ">
+ Script: <" itemskill RK_REFRESH, 1; ">
},
{
Id: 12726
@@ -94282,6 +94324,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Delay: 30000
Trade: {
nodrop: true
@@ -94296,7 +94342,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_CRUSHSTRIKE,1; ">
+ Script: <" itemskill RK_CRUSHSTRIKE, 1; ">
},
{
Id: 12727
@@ -94305,6 +94351,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Delay: 60000
Trade: {
nodrop: true
@@ -94319,7 +94369,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_MILLENNIUMSHIELD,1; ">
+ Script: <" itemskill RK_MILLENNIUMSHIELD, 1; ">
},
{
Id: 12728
@@ -94328,6 +94378,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Trade: {
nodrop: true
notrade: true
@@ -94341,7 +94395,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_VITALITYACTIVATION,1; ">
+ Script: <" itemskill RK_VITALITYACTIVATION, 1; ">
},
{
Id: 12729
@@ -94350,6 +94404,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Trade: {
nodrop: true
notrade: true
@@ -94363,7 +94421,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_FIGHTINGSPIRIT,1; ">
+ Script: <" itemskill RK_FIGHTINGSPIRIT, 1; ">
},
{
Id: 12730
@@ -94372,6 +94430,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Trade: {
nodrop: true
notrade: true
@@ -94385,7 +94447,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_ABUNDANCE,1; ">
+ Script: <" itemskill RK_ABUNDANCE, 1; ">
},
{
Id: 12731
@@ -94394,6 +94456,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Trade: {
nodrop: true
notrade: true
@@ -94407,7 +94473,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_GIANTGROWTH,1; ">
+ Script: <" itemskill RK_GIANTGROWTH, 1; ">
},
{
Id: 12732
@@ -94416,6 +94482,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Delay: 1000
Trade: {
nodrop: true
@@ -94430,7 +94500,7 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_STORMBLAST,1; ">
+ Script: <" itemskill RK_STORMBLAST, 1; ">
},
{
Id: 12733
@@ -94439,6 +94509,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Trade: {
nodrop: true
notrade: true
@@ -94452,8 +94526,10 @@ item_db: (
sitting: true
}
Stack: [20, 1]
- Script: <" itemskill RK_STONEHARDSKIN,1; ">
+ Script: <" itemskill RK_STONEHARDSKIN, 1; ">
},
+
+//== Rune Knight Rune Ores =============================
{
Id: 12734
AegisName: "Runstone_Quality"
@@ -94461,9 +94537,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
BuyingStore: true
Script: <" makerune 5; ">
},
@@ -94474,9 +94547,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
BuyingStore: true
Script: <" makerune 11; ">
},
@@ -94487,9 +94557,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
BuyingStore: true
Script: <" makerune 14; ">
},
@@ -94500,9 +94567,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
BuyingStore: true
Script: <" makerune 2; ">
},
@@ -94513,9 +94577,6 @@ item_db: (
Type: 0
Buy: 2
Weight: 100
- Job: {
- Knight: true
- }
BuyingStore: true
Script: <" makerune 8; ">
},
@@ -146815,6 +146876,10 @@ item_db: (
Type: 11
Buy: 2
Weight: 100
+ Job: {
+ Knight: true
+ }
+ Upper: 56
Delay: 60000
Trade: {
nodrop: true
@@ -146826,7 +146891,7 @@ item_db: (
noauction: true
}
Stack: [20, 1]
- Script: <" itemskill RK_LUXANIMA,1; ">
+ Script: <" itemskill RK_LUXANIMA, 1; ">
},
{
Id: 22669
diff --git a/db/re/skill_db.conf b/db/re/skill_db.conf
index ffc5e4e52..2a59785fa 100644
--- a/db/re/skill_db.conf
+++ b/db/re/skill_db.conf
@@ -30657,6 +30657,7 @@ skill_db: (
}
Requirements: {
SPCost: 40
+ State: "Cart"
}
},
{
diff --git a/doc/constants.md b/doc/constants.md
index c6665126c..1d5c816ba 100644
--- a/doc/constants.md
+++ b/doc/constants.md
@@ -3430,6 +3430,50 @@
- `4_F_REBELLION2`: 10201
- `4_F_REBELLION3`: 10202
- `4_M_ILYA`: 10203
+- `4_ELDER`: 10205
+- `4_LUNATIC`: 10206
+- `4_F_NOVICE2`: 10207
+- `4_WICKEDNYMPH`: 10208
+- `4_F_PREMI`: 10209
+- `4_M_COSTELL`: 10210
+- `4_M_YATTWARP`: 10211
+- `4_M_EVOKASCUDI`: 10212
+- `4_M_JOHNNYJAMES`: 10213
+- `4_M_ALBERTFORD`: 10214
+- `4_M_SEANMCCURDY`: 10215
+- `4_M_KARAMPUCCI`: 10216
+- `4_M_CACTUSMAN1`: 10217
+- `4_M_CACTUSMAN2`: 10218
+- `4_M_CACTUSMAN3`: 10219
+- `4_M_CACTUSLADY`: 10220
+- `4_M_GAST`: 10221
+- `4_M_CACTUSCHILD`: 10222
+- `4_KING`: 10223
+- `4_F_BOMI`: 10224
+- `4_M_CACTUSCHIEF`: 10225
+- `4_F_CACTUSCHILD2`: 10226
+- `4_F_CACTUSLADY2`: 10227
+- `4_F_CACTUSLADY3`: 10228
+- `4_M_CACTUS`: 10229
+- `4_M_COWRAIDERS1`: 10230
+- `4_M_COWRAIDERS2`: 10231
+- `4_M_COWRAIDERS3`: 10232
+- `4_F_JP14THEVT`: 10233
+- `4_M_POORSCHOLAR`: 10234
+- `4_M_PEPPERROTI`: 10235
+- `JP_NPC01`: 10236
+- `4_PURPLE_WARP`: 10237
+- `4_F_NARIN`: 10238
+- `4_M_URGENT_MAN`: 10239
+- `4_M_KEEN_SOLDIER`: 10240
+- `4_F_SLOPPY_WOMAN`: 10241
+- `4_F_DRKAFRA01`: 10242
+- `4_M_DRZONDA01`: 10243
+- `4_M_SWD_RENO`: 10244
+- `4_M_KNG_RENO`: 10245
+- `4_M_AC_RUMIN`: 10246
+- `4_M_HIGH_WIZARD`: 10247
+- `4_SYSTEM_BOX`: 10248
### Mercenary IDs
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index e7a8d774f..e4df77051 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -9477,3 +9477,149 @@ to be used within a "OnPayFunds" event of a NST_CUSTOM trader.
Returns the amount of still-available <Item_ID> in the shop (on a NST_MARKET trader).
---------------------------------------
+
+*setunitdata(<GUID>, <DataType>, <Val1> {,<Val2>,<Val3>})
+
+Sets or alters the data in real-time for game objects of the following types -
+NPCs, Pets, Monsters, Homunuculus', Mercenaries, Elementals.
+
+Applicable Data Types (available as constants) -
+ Data Types Description (parameter type)
+ UDT_SIZE: Unit Size (int)
+ UDT_LEVEL: Level (int)
+ UDT_HP: Current HP (int)
+ UDT_MAXHP: Max HP (int)
+ UDT_SP: SP (int)
+ UDT_MAXSP: MAX SP (int)
+ UDT_MASTERAID: Master Account ID (for Summons) (int)
+ UDT_MASTERCID: Master Char ID (for Summons) (int)
+ UDT_MAPIDXY: Warp a Unit to a map. (Val1 = (string) MapName, Val2 = (int) x, Val3 = (int) y)
+ UDT_WALKTOXY: Make a unit walk to certain co-ordinates. (Val1 = (int) x, Val2 = (int) y)
+ UDT_SPEED: Unit Speed. (int)
+ UDT_MODE: Mode (Mobs only) (int)
+ UDT_AI: Unit AI Type (see constants.conf for Unit AI Types)
+ UDT_SCOPTION: Status Options. (see constants.conf for Unit Option Types)
+ UDT_SEX: Gender of the unit. (see constants.conf for Genders)
+ UDT_CLASS: Class of the unit. (Monster ID) (int)
+ UDT_HAIRSTYLE: Hair Style ID. (int)
+ UDT_HAIRCOLOR: Hair Color ID. (int)
+ UDT_HEADBOTTOM: Headgear Bottom Sprite ID. (int)
+ UDT_HEADMIDDLE: Headgear Middle Sprite ID. (int)
+ UDT_HEADTOP: Headgear Top Sprite ID. (int)
+ UDT_CLOTHCOLOR: Cloth Color ID. (int)
+ UDT_SHIELD: Shield Sprite ID. (int)
+ UDT_WEAPON: Weapon Sprite ID. (int)
+ UDT_LOOKDIR: Face direction. (int)
+ UDT_CANMOVETICK: Stop a unit from move for n seconds. (int)
+ UDT_STR: Unit STR. (int)
+ UDT_AGI: Unit AGI. (int)
+ UDT_VIT: Unit VIT. (int)
+ UDT_INT: Unit INT. (int)
+ UDT_DEX: Unit DEX. (int)
+ UDT_LUK: Unit LUK. (int)
+ UDT_ATKRANGE: Attack range of a unit. (int)
+ UDT_ATKMIN: Min Atk of a unit. (int)
+ UDT_ATKMAX: Max Atk of a unit. (int)
+ UDT_MATKMIN: Min MATK of a unit. (int)
+ UDT_MATKMAX: Max MATK of a unit. (int)
+ UDT_DEF: DEF. (int)
+ UDT_MDEF: MDEF. (int)
+ UDT_HIT: HIT. (int)
+ UDT_FLEE: FLEE. (int)
+ UDT_PDODGE: Perfect Dodge. (int)
+ UDT_CRIT: Critical Rate. (int)
+ UDT_RACE: Race. (Eg. string constants RC_DemiHuman or Integer 7).
+ UDT_ELETYPE: Element. (Eg. string constants Ele_Neutral or Integer 0).
+ UDT_ELELEVEL: Element Level (int).
+ UDT_AMOTION: AMotion Rate (int).
+ UDT_ADELAY: ADelay Rate (int).
+ UDT_DMOTION: DMotion Rate (int).
+ UDT_HUNGER: Hunger Rate (int) - for summons.
+ UDT_INTIMACY: Intimacy Rate (int) - for summons.
+ UDT_LIFETIME: LifeTime (int) - for summons.
+ UDT_MERC_KILLCOUNT: Kill count for mercenaries (int).
+ UDT_STATADD: Status Points (int) - for NPCs.
+
+returns 0 if value could not be set, 1 if successful.
+
+---------------------------------------
+
+*getunitdata (<GUID>,<DataType>{,<Variable>})
+
+Retrieves real-time data of a game object. For data with multiple return values,
+an array variable may be passed to store the data in.
+
+Applicable Data types (available as constants) -
+ Data Types Description (return type)
+ UDT_SIZE: Unit Size (int)
+ UDT_LEVEL: Level (int)
+ UDT_HP: Current HP (int)
+ UDT_MAXHP: Max HP (int)
+ UDT_SP: SP (int)
+ UDT_MAXSP: MAX SP (int)
+ UDT_MASTERAID: Master Account ID (for Summons) (int)
+ UDT_MASTERCID: Master Char ID (for Summons) (int)
+ UDT_MAPIDXY: Warp a Unit to a map. (Val1 = (string) MapName, Val2 = (int) x, Val3 = (int) y)
+ UDT_SPEED: Unit Speed. (int)
+ UDT_MODE: Mode (Mobs only) (int)
+ UDT_AI: Unit AI Type (see constants.conf for Unit AI Types)
+ UDT_SCOPTION: Status Options. (see constants.conf for Unit Option Types)
+ UDT_SEX: Gender of the unit. (see constants.conf for Genders)
+ UDT_CLASS: Class of the unit. (Monster ID) (int)
+ UDT_HAIRSTYLE: Hair Style ID. (int)
+ UDT_HAIRCOLOR: Hair Color ID. (int)
+ UDT_HEADBOTTOM: Headgear Bottom Sprite ID. (int)
+ UDT_HEADMIDDLE: Headgear Middle Sprite ID. (int)
+ UDT_HEADTOP: Headgear Top Sprite ID. (int)
+ UDT_CLOTHCOLOR: Cloth Color ID. (int)
+ UDT_SHIELD: Shield Sprite ID. (int)
+ UDT_WEAPON: Weapon Sprite ID. (int)
+ UDT_LOOKDIR: Face direction. (int)
+ UDT_CANMOVETICK: Stop a unit from move for n seconds. (int)
+ UDT_STR: Unit STR. (int)
+ UDT_AGI: Unit AGI. (int)
+ UDT_VIT: Unit VIT. (int)
+ UDT_INT: Unit INT. (int)
+ UDT_DEX: Unit DEX. (int)
+ UDT_LUK: Unit LUK. (int)
+ UDT_ATKRANGE: Attack range of a unit. (int)
+ UDT_ATKMIN: Min Atk of a unit. (int)
+ UDT_ATKMAX: Max Atk of a unit. (int)
+ UDT_MATKMIN: Min MATK of a unit. (int)
+ UDT_MATKMAX: Max MATK of a unit. (int)
+ UDT_DEF: DEF. (int)
+ UDT_MDEF: MDEF. (int)
+ UDT_HIT: HIT. (int)
+ UDT_FLEE: FLEE. (int)
+ UDT_PDODGE: Perfect Dodge. (int)
+ UDT_CRIT: Critical Rate. (int)
+ UDT_RACE: Race. (Eg. string constants RC_DemiHuman or Integer 7).
+ UDT_ELETYPE: Element. (Eg. string constants Ele_Neutral or Integer 0).
+ UDT_ELELEVEL: Element Level (int).
+ UDT_AMOTION: AMotion Rate (int).
+ UDT_ADELAY: ADelay Rate (int).
+ UDT_DMOTION: DMotion Rate (int).
+ UDT_HUNGER: Hunger Rate (int) - for summons.
+ UDT_INTIMACY: Intimacy Rate (int) - for summons.
+ UDT_LIFETIME: LifeTime (int) - for summons.
+ UDT_MERC_KILLCOUNT: Kill count for mercenaries (int).
+
+returns 0 if value could not be retrieved.
+
+---------------------------------------
+
+*getunitname(<GID>)
+
+Retrieve the name of a unit.
+
+returns "Unknown" if the value could not be retrieved.
+
+---------------------------------------
+
+*setunitname(<GID>, <Name>)
+
+Changes the name of a unit.
+
+Supported Types - [ MOB | HOM | PET ].
+
+returns 1 on success, 0 on failure.
diff --git a/sql-files/item_db.sql b/sql-files/item_db.sql
index 774dacb5d..4ff49624c 100644
--- a/sql-files/item_db.sql
+++ b/sql-files/item_db.sql
@@ -167,8 +167,8 @@ REPLACE INTO `item_db` VALUES ('601','Wing_Of_Fly','Fly Wing','11','60','30','50
REPLACE INTO `item_db` VALUES ('602','Wing_Of_Butterfly','Butterfly Wing','11','300','150','50','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 AL_TELEPORT,3;','','');
REPLACE INTO `item_db` VALUES ('603','Old_Blue_Box','Old Blue Box','2','10000','5000','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','getrandgroupitem 603,1;','','');
REPLACE INTO `item_db` VALUES ('604','Branch_Of_Dead_Tree','Dead Branch','2','50','25','50','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','monster \"this\",-1,-1,\"--ja--\",-1,1,\"\";','','');
-REPLACE INTO `item_db` VALUES ('605','Anodyne','Anodyne','11','2000','1000','100','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 SM_ENDURE,1;','','');
-REPLACE INTO `item_db` VALUES ('606','Aloebera','Aloevera','11','1500','750','100','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 SM_SELFPROVOKE,1;','','');
+REPLACE INTO `item_db` VALUES ('605','Anodyne','Anodyne','11','2000','1000','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','itemskill SM_ENDURE,1;','','');
+REPLACE INTO `item_db` VALUES ('606','Aloebera','Aloevera','11','1500','750','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','itemskill SM_SELFPROVOKE,1;','','');
REPLACE INTO `item_db` VALUES ('607','Yggdrasilberry','Yggdrasil Berry','0','5000','2500','300','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 100,100;','','');
REPLACE INTO `item_db` VALUES ('608','Seed_Of_Yggdrasil','Yggdrasil Seed','0','5000','2500','300','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 50,50;','','');
REPLACE INTO `item_db` VALUES ('609','Amulet','Amulet','2','100','50','100','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','','','');
@@ -4937,28 +4937,28 @@ REPLACE INTO `item_db` VALUES ('12713','Monster_Extract','Monster Extract','2','
REPLACE INTO `item_db` VALUES ('12714','Easter_Scroll','Easter Scroll','2','1','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','getrandgroupitem 12714,1;','','');
REPLACE INTO `item_db` VALUES ('12715','Black_Treasure_Box','Black Treasure Box','2','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','','','');
REPLACE INTO `item_db` VALUES ('12716','Indian_Rice_Cake','Indian Rice Cake','2','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','','','');
-REPLACE INTO `item_db` VALUES ('12717','Poison_Paralysis','Paralyze','0','2','1','100','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_PARALYSE,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12718','Poison_Leech','Leech End','0','2','1','100','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_LEECHESEND,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12719','Poison_Oblivion','Oblivion Curse','0','2','1','100','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_OBLIVIONCURSE,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12720','Poison_Contamination','Disheart','0','2','1','100','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_DEATHHURT,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12721','Poison_Numb','Toxin','0','2','1','100','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_TOXIN,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12722','Poison_Fever','Pyrexia','0','2','1','100','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_PYREXIA,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12723','Poison_Laughing','Magic Mushroom','0','2','1','100','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_MAGICMUSHROOM,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12724','Poison_Fatigue','Venom Bleed','0','2','1','100','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_VENOMBLEED,15000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12725','Runstone_Nosiege','Nauthiz Rune','11','100','50','100','0','0','0','0','0','18446744073709551615','8','2','0','0','0',NULL,'0','1','0','0','0','0','120000','475',NULL,'1',NULL,'20','1','0','itemskill RK_REFRESH,1;','','');
-REPLACE INTO `item_db` VALUES ('12726','Runstone_Rhydo','Raido Rune','11','100','50','100','0','0','0','0','0','18446744073709551615','8','2','0','0','0',NULL,'0','1','0','0','0','0','30000','475',NULL,'1',NULL,'20','1','0','itemskill RK_CRUSHSTRIKE,1;','','');
-REPLACE INTO `item_db` VALUES ('12727','Runstone_Verkana','Berkana Rune','11','100','50','100','0','0','0','0','0','18446744073709551615','8','2','0','0','0',NULL,'0','1','0','0','0','0','60000','475',NULL,'1',NULL,'20','1','0','itemskill RK_MILLENNIUMSHIELD,1;','','');
-REPLACE INTO `item_db` VALUES ('12728','Runstone_Isia','Isa Rune','11','100','50','100','0','0','0','0','0','18446744073709551615','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_VITALITYACTIVATION,1;','','');
-REPLACE INTO `item_db` VALUES ('12729','Runstone_Asir','Othila Rune','11','100','50','100','0','0','0','0','0','18446744073709551615','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_FIGHTINGSPIRIT,1;','','');
-REPLACE INTO `item_db` VALUES ('12730','Runstone_Urj','Uruz Rune','11','100','50','100','0','0','0','0','0','18446744073709551615','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_ABUNDANCE,1;','','');
-REPLACE INTO `item_db` VALUES ('12731','Runstone_Turisus','Thurisaz Rune','11','100','50','100','0','0','0','0','0','18446744073709551615','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_GIANTGROWTH,1;','','');
-REPLACE INTO `item_db` VALUES ('12732','Runstone_Pertz','Wyrd Rune','11','100','50','100','0','0','0','0','0','18446744073709551615','8','2','0','0','0',NULL,'0','1','0','0','0','0','1000','475',NULL,'1',NULL,'20','1','0','itemskill RK_STORMBLAST,1;','','');
-REPLACE INTO `item_db` VALUES ('12733','Runstone_Hagalas','Hagalaz Rune','11','100','50','100','0','0','0','0','0','18446744073709551615','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_STONEHARDSKIN,1;','','');
-REPLACE INTO `item_db` VALUES ('12734','Runstone_Quality','Luxurious Rune','0','2','1','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 5;','','');
-REPLACE INTO `item_db` VALUES ('12735','Runstone_Ancient','Ancient Rune','0','2','1','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 11;','','');
-REPLACE INTO `item_db` VALUES ('12736','Runstone_Mystic','Mystic Rune','0','2','1','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 14;','','');
-REPLACE INTO `item_db` VALUES ('12737','Runstone_Ordinary','General Rune','0','2','1','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 2;','','');
-REPLACE INTO `item_db` VALUES ('12738','Runstone_Rare','Rare Rune','0','2','1','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 8;','','');
+REPLACE INTO `item_db` VALUES ('12717','Poison_Paralysis','Paralyze','0','2','1','20','0','0','0','0','0','4096','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_PARALYSE, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12718','Poison_Leech','Leech End','0','2','1','20','0','0','0','0','0','4096','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_LEECHESEND, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12719','Poison_Oblivion','Oblivion Curse','0','2','1','20','0','0','0','0','0','4096','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_OBLIVIONCURSE, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12720','Poison_Contamination','Disheart','0','2','1','20','0','0','0','0','0','4096','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_DEATHHURT, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12721','Poison_Numb','Toxin','0','2','1','20','0','0','0','0','0','4096','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_TOXIN, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12722','Poison_Fever','Pyrexia','0','2','1','20','0','0','0','0','0','4096','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_PYREXIA, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12723','Poison_Laughing','Magic Mushroom','0','2','1','20','0','0','0','0','0','4096','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_MAGICMUSHROOM, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12724','Poison_Fatigue','Venom Bleed','0','2','1','20','0','0','0','0','0','4096','8','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_VENOMBLEED, 15000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12725','Runstone_Nosiege','Nauthiz Rune','11','100','50','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','120000','475',NULL,'1',NULL,'20','1','0','itemskill RK_REFRESH, 1;','','');
+REPLACE INTO `item_db` VALUES ('12726','Runstone_Rhydo','Raido Rune','11','100','50','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','30000','475',NULL,'1',NULL,'20','1','0','itemskill RK_CRUSHSTRIKE, 1;','','');
+REPLACE INTO `item_db` VALUES ('12727','Runstone_Verkana','Berkana Rune','11','100','50','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','60000','475',NULL,'1',NULL,'20','1','0','itemskill RK_MILLENNIUMSHIELD, 1;','','');
+REPLACE INTO `item_db` VALUES ('12728','Runstone_Isia','Isa Rune','11','100','50','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_VITALITYACTIVATION, 1;','','');
+REPLACE INTO `item_db` VALUES ('12729','Runstone_Asir','Othila Rune','11','100','50','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_FIGHTINGSPIRIT, 1;','','');
+REPLACE INTO `item_db` VALUES ('12730','Runstone_Urj','Uruz Rune','11','100','50','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_ABUNDANCE, 1;','','');
+REPLACE INTO `item_db` VALUES ('12731','Runstone_Turisus','Thurisaz Rune','11','100','50','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_GIANTGROWTH, 1;','','');
+REPLACE INTO `item_db` VALUES ('12732','Runstone_Pertz','Wyrd Rune','11','100','50','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','1000','475',NULL,'1',NULL,'20','1','0','itemskill RK_STORMBLAST, 1;','','');
+REPLACE INTO `item_db` VALUES ('12733','Runstone_Hagalas','Hagalaz Rune','11','100','50','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_STONEHARDSKIN, 1;','','');
+REPLACE INTO `item_db` VALUES ('12734','Runstone_Quality','Luxurious Rune','0','2','1','100','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','makerune 5;','','');
+REPLACE INTO `item_db` VALUES ('12735','Runstone_Ancient','Ancient Rune','0','2','1','100','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','makerune 11;','','');
+REPLACE INTO `item_db` VALUES ('12736','Runstone_Mystic','Mystic Rune','0','2','1','100','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','makerune 14;','','');
+REPLACE INTO `item_db` VALUES ('12737','Runstone_Ordinary','General Rune','0','2','1','100','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','makerune 2;','','');
+REPLACE INTO `item_db` VALUES ('12738','Runstone_Rare','Rare Rune','0','2','1','100','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','makerune 8;','','');
REPLACE INTO `item_db` VALUES ('12739','Snow_Flower','Snow Flowers','2','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','percentheal 10,10;','','');
REPLACE INTO `item_db` VALUES ('12740','Inc_Str_Scroll','Amplification Scroll','2','1','0','0','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','specialeffect2 EF_POTION_BERSERK; sc_start SC_STR_SCROLL, 60000, 20;','','');
REPLACE INTO `item_db` VALUES ('12741','Inc_Int_Scroll','Intellect Amplification Scroll','2','1','0','0','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','specialeffect2 EF_SPELLBREAKER; sc_start SC_INT_SCROLL, 60000, 20;','','');
@@ -6228,6 +6228,6 @@ REPLACE INTO `item_db` VALUES ('19504','T_Sunglasses','T Sunglasses','5','0','0'
REPLACE INTO `item_db` VALUES ('19505','T_Cigarette','T Cigarette','5','0','0','0','0','0','0','0','0','18446744073709551615','63','2','4096','0','0',NULL,'0','0','54','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('19506','T_Valkyrie_Feather_Band','T Valkyrie Feather Band','5','0','0','0','0','0','0','0','0','18446744073709551615','63','2','1024','0','0',NULL,'1','0','300','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
REPLACE INTO `item_db` VALUES ('19507','Fine_Sun','Clear Sun','5','0','0','0','0','0','0','0','0','18446744073709551615','63','2','1024','0','1',NULL,'0','0','654','0','0','0','0','0',NULL,'0',NULL,'0',NULL,'0','','','');
-REPLACE INTO `item_db` VALUES ('22540','Runstone_Lux','Lux Anima Rune','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','60000','0',NULL,'0',NULL,'20','1','0','itemskill RK_LUXANIMA,1;','','');
+REPLACE INTO `item_db` VALUES ('22540','Runstone_Lux','Lux Anima Rune','11','2','1','100','0','0','0','0','0','128','8','2','0','0','0',NULL,'0','1','0','0','0','0','60000','475',NULL,'0',NULL,'20','1','0','itemskill RK_LUXANIMA,1;','','');
REPLACE INTO `item_db` VALUES ('22777','Buff_Gift_Set','Buff Gift Set','2','20','10','100','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','getitem 14534,5; getitem 12215,5; getitem 12216,5;','','');
REPLACE INTO `item_db` VALUES ('22837','Integer_Time','Integer Time','2','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','50',NULL,'0','1','0','0','0','0','0','507',NULL,'0',NULL,'0',NULL,'0','TmpRouletteBronze += 1;','','');
diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql
index 9434ed539..2cf498356 100644
--- a/sql-files/item_db_re.sql
+++ b/sql-files/item_db_re.sql
@@ -169,8 +169,8 @@ REPLACE INTO `item_db` VALUES ('601','Wing_Of_Fly','Fly Wing','11','60','30','50
REPLACE INTO `item_db` VALUES ('602','Wing_Of_Butterfly','Butterfly Wing','11','300','150','50','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 AL_TELEPORT,3;','','');
REPLACE INTO `item_db` VALUES ('603','Old_Blue_Box','Old Blue Box','2','10000','5000','200','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','8',NULL,'0',NULL,'0',NULL,'0','getrandgroupitem 603,1;','','');
REPLACE INTO `item_db` VALUES ('604','Branch_Of_Dead_Tree','Dead Branch','2','50','25','50','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','monster \"this\",-1,-1,\"--ja--\",-1,1,\"\";','','');
-REPLACE INTO `item_db` VALUES ('605','Anodyne','Anodyne','11','2000','1000','100','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 SM_ENDURE,1;','','');
-REPLACE INTO `item_db` VALUES ('606','Aloebera','Aloevera','11','1500','750','100','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 SM_SELFPROVOKE,1;','','');
+REPLACE INTO `item_db` VALUES ('605','Anodyne','Anodyne','11','2000','1000','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','itemskill SM_ENDURE,1;','','');
+REPLACE INTO `item_db` VALUES ('606','Aloebera','Aloevera','11','1500','750','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','itemskill SM_SELFPROVOKE,1;','','');
REPLACE INTO `item_db` VALUES ('607','Yggdrasilberry','Yggdrasil Berry','0','5000','2500','300','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','1','5000','0',NULL,'0',NULL,'0',NULL,'0','percentheal 100,100;','','');
REPLACE INTO `item_db` VALUES ('608','Seed_Of_Yggdrasil','Yggdrasil Seed','0','5000','2500','300','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','1','3000','0',NULL,'0',NULL,'0',NULL,'0','percentheal 50,50;','','');
REPLACE INTO `item_db` VALUES ('609','Amulet','Amulet','2','100','50','100','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','','','');
@@ -6484,28 +6484,28 @@ REPLACE INTO `item_db` VALUES ('12713','Monster_Extract','Monster Extract','2','
REPLACE INTO `item_db` VALUES ('12714','Easter_Scroll','Easter Scroll','2','1','0','10','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','467',NULL,'0',NULL,'0',NULL,'0','getrandgroupitem Easter_Scroll,1;','','');
REPLACE INTO `item_db` VALUES ('12715','Black_Treasure_Box','Black Treasure Chest','2','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','','','');
REPLACE INTO `item_db` VALUES ('12716','Indian_Rice_Cake','Indian Rice Cake','2','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','','','');
-REPLACE INTO `item_db` VALUES ('12717','Poison_Paralysis','Paralysis','0','2','1','20','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_PARALYSE,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12718','Poison_Leech','Leech End','0','2','1','20','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_LEECHESEND,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12719','Poison_Oblivion','Oblivion Curse','0','2','1','20','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_OBLIVIONCURSE,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12720','Poison_Contamination','Death Hurt','0','2','1','20','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_DEATHHURT,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12721','Poison_Numb','Toxin','0','2','1','20','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_TOXIN,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12722','Poison_Fever','Pyrexia','0','2','1','20','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_PYREXIA,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12723','Poison_Laughing','Magic Mushroom','0','2','1','20','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_MAGICMUSHROOM,300000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12724','Poison_Fatigue','Venom Bleed','0','2','1','20','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','specialeffect2 EF_ENCHANTPOISON; sc_start SC_VENOMBLEED,15000,0,10,SCFLAG_FIXEDTICK;','','');
-REPLACE INTO `item_db` VALUES ('12725','Runstone_Nosiege','Nosiege Runestone','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','120000','475',NULL,'1',NULL,'20','1','0','itemskill RK_REFRESH,1;','','');
-REPLACE INTO `item_db` VALUES ('12726','Runstone_Rhydo','Rhydo Runestone','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','30000','475',NULL,'1',NULL,'20','1','0','itemskill RK_CRUSHSTRIKE,1;','','');
-REPLACE INTO `item_db` VALUES ('12727','Runstone_Verkana','Verkana Runestone','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','60000','475',NULL,'1',NULL,'20','1','0','itemskill RK_MILLENNIUMSHIELD,1;','','');
-REPLACE INTO `item_db` VALUES ('12728','Runstone_Isia','Isia Runestone','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_VITALITYACTIVATION,1;','','');
-REPLACE INTO `item_db` VALUES ('12729','Runstone_Asir','Asir Runestone','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_FIGHTINGSPIRIT,1;','','');
-REPLACE INTO `item_db` VALUES ('12730','Runstone_Urj','Urj Runestone','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_ABUNDANCE,1;','','');
-REPLACE INTO `item_db` VALUES ('12731','Runstone_Turisus','Turisus Runestone','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_GIANTGROWTH,1;','','');
-REPLACE INTO `item_db` VALUES ('12732','Runstone_Pertz','Pertz Runestone','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','1000','475',NULL,'1',NULL,'20','1','0','itemskill RK_STORMBLAST,1;','','');
-REPLACE INTO `item_db` VALUES ('12733','Runstone_Hagalas','Hagalas Runestone','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_STONEHARDSKIN,1;','','');
-REPLACE INTO `item_db` VALUES ('12734','Runstone_Quality','Quality Rough Runestone','0','2','1','100','0','0','0','0','0','128','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 5;','','');
-REPLACE INTO `item_db` VALUES ('12735','Runstone_Ancient','Ancient Rough Runestone','0','2','1','100','0','0','0','0','0','128','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 11;','','');
-REPLACE INTO `item_db` VALUES ('12736','Runstone_Mystic','Mystic Rough Runestone','0','2','1','100','0','0','0','0','0','128','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 14;','','');
-REPLACE INTO `item_db` VALUES ('12737','Runstone_Ordinary','General Rough Runestone','0','2','1','100','0','0','0','0','0','128','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 2;','','');
-REPLACE INTO `item_db` VALUES ('12738','Runstone_Rare','Rare Rough Runestone','0','2','1','100','0','0','0','0','0','128','63','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','makerune 8;','','');
+REPLACE INTO `item_db` VALUES ('12717','Poison_Paralysis','Paralysis','0','2','1','20','0','0','0','0','0','4096','56','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_PARALYSE, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12718','Poison_Leech','Leech End','0','2','1','20','0','0','0','0','0','4096','56','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_LEECHESEND, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12719','Poison_Oblivion','Oblivion Curse','0','2','1','20','0','0','0','0','0','4096','56','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_OBLIVIONCURSE, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12720','Poison_Contamination','Death Hurt','0','2','1','20','0','0','0','0','0','4096','56','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_DEATHHURT, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12721','Poison_Numb','Toxin','0','2','1','20','0','0','0','0','0','4096','56','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_TOXIN, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12722','Poison_Fever','Pyrexia','0','2','1','20','0','0','0','0','0','4096','56','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_PYREXIA, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12723','Poison_Laughing','Magic Mushroom','0','2','1','20','0','0','0','0','0','4096','56','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_MAGICMUSHROOM, 300000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12724','Poison_Fatigue','Venom Bleed','0','2','1','20','0','0','0','0','0','4096','56','2','0','0','0',NULL,'0','1','0','0','0','1','0','0',NULL,'0',NULL,'0',NULL,'0','specialeffect2 EF_ENCHANTPOISON; sc_start SC_VENOMBLEED, 15000, 0, 10, SCFLAG_FIXEDTICK;','','');
+REPLACE INTO `item_db` VALUES ('12725','Runstone_Nosiege','Nosiege Runestone','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','120000','475',NULL,'1',NULL,'20','1','0','itemskill RK_REFRESH, 1;','','');
+REPLACE INTO `item_db` VALUES ('12726','Runstone_Rhydo','Rhydo Runestone','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','30000','475',NULL,'1',NULL,'20','1','0','itemskill RK_CRUSHSTRIKE, 1;','','');
+REPLACE INTO `item_db` VALUES ('12727','Runstone_Verkana','Verkana Runestone','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','60000','475',NULL,'1',NULL,'20','1','0','itemskill RK_MILLENNIUMSHIELD, 1;','','');
+REPLACE INTO `item_db` VALUES ('12728','Runstone_Isia','Isia Runestone','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_VITALITYACTIVATION, 1;','','');
+REPLACE INTO `item_db` VALUES ('12729','Runstone_Asir','Asir Runestone','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_FIGHTINGSPIRIT, 1;','','');
+REPLACE INTO `item_db` VALUES ('12730','Runstone_Urj','Urj Runestone','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_ABUNDANCE, 1;','','');
+REPLACE INTO `item_db` VALUES ('12731','Runstone_Turisus','Turisus Runestone','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_GIANTGROWTH, 1;','','');
+REPLACE INTO `item_db` VALUES ('12732','Runstone_Pertz','Pertz Runestone','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','1000','475',NULL,'1',NULL,'20','1','0','itemskill RK_STORMBLAST, 1;','','');
+REPLACE INTO `item_db` VALUES ('12733','Runstone_Hagalas','Hagalas Runestone','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','0','475',NULL,'1',NULL,'20','1','0','itemskill RK_STONEHARDSKIN, 1;','','');
+REPLACE INTO `item_db` VALUES ('12734','Runstone_Quality','Quality Rough Runestone','0','2','1','100','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','makerune 5;','','');
+REPLACE INTO `item_db` VALUES ('12735','Runstone_Ancient','Ancient Rough Runestone','0','2','1','100','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','makerune 11;','','');
+REPLACE INTO `item_db` VALUES ('12736','Runstone_Mystic','Mystic Rough Runestone','0','2','1','100','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','makerune 14;','','');
+REPLACE INTO `item_db` VALUES ('12737','Runstone_Ordinary','General Rough Runestone','0','2','1','100','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','makerune 2;','','');
+REPLACE INTO `item_db` VALUES ('12738','Runstone_Rare','Rare Rough Runestone','0','2','1','100','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','makerune 8;','','');
REPLACE INTO `item_db` VALUES ('12739','Snow_Flower','Snow Flower','2','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','percentheal 10,10;','','');
REPLACE INTO `item_db` VALUES ('12740','Inc_Str_Scroll','Amplification Scroll','2','1','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','specialeffect2 EF_POTION_BERSERK; sc_start SC_STR_SCROLL, 60000, 20;','','');
REPLACE INTO `item_db` VALUES ('12741','Inc_Int_Scroll','Intellect Amplification Scroll','2','1','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','specialeffect2 EF_SPELLBREAKER; sc_start SC_INT_SCROLL, 60000, 20;','','');
@@ -9772,7 +9772,7 @@ REPLACE INTO `item_db` VALUES ('22085','Elegant_Doram_Shoes','Elegant Doram Shoe
REPLACE INTO `item_db` VALUES ('22508','Para_Team_Mark_','Eden Group Mark','11','0','0','0','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','1200000','507',NULL,'0',NULL,'0',NULL,'0','warp \"moc_para01\", 171, 115;','','');
REPLACE INTO `item_db` VALUES ('22514','Candy_Holder','Candy Holder','11','20','10','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','','','');
REPLACE INTO `item_db` VALUES ('22515','Key_Of_Twisted_Time','Twisted Key of Time','3','10','5','300','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','','','');
-REPLACE INTO `item_db` VALUES ('22540','Runstone_Lux','Lux Anima Rune','11','2','1','100','0','0','0','0','0','18446744073709551615','63','2','0','0','0',NULL,'0','1','0','0','0','0','60000','475',NULL,'0',NULL,'20','1','0','itemskill RK_LUXANIMA,1;','','');
+REPLACE INTO `item_db` VALUES ('22540','Runstone_Lux','Lux Anima Rune','11','2','1','100','0','0','0','0','0','128','56','2','0','0','0',NULL,'0','1','0','0','0','0','60000','475',NULL,'0',NULL,'20','1','0','itemskill RK_LUXANIMA, 1;','','');
REPLACE INTO `item_db` VALUES ('22669','HALLOWEEN_G_BOX','Halloween Box','2','0','0','20','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 22669,1;','','');
REPLACE INTO `item_db` VALUES ('22670','DARK_INVITATION','Invitation of Darkness','2','10','5','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','.@temp = rand(1,3); if (.@temp == 1) { specialeffect2 EF_DEVIL; warp \"niflheim\",193,186; } else if (.@temp == 2) { specialeffect2 EF_DEVIL; warp \"niflheim\",106,254; } else { specialeffect2 EF_DEVIL; warp \"niflheim\",347,255; }','','');
REPLACE INTO `item_db` VALUES ('22675','Mysterious_Scroll','Mysterious Scroll','2','20','10','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,3600000,30;','','');
diff --git a/src/map/clif.c b/src/map/clif.c
index 5939222e9..8ab6e71a4 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -11025,39 +11025,36 @@ void clif_parse_RemoveOption(int fd,struct map_session_data *sd)
void clif_parse_ChangeCart(int fd,struct map_session_data *sd) __attribute__((nonnull (2)));
/// Request to change cart's visual look (CZ_REQ_CHANGECART).
/// 01af <num>.W
-void clif_parse_ChangeCart(int fd,struct map_session_data *sd)
+void clif_parse_ChangeCart(int fd, struct map_session_data *sd)
{// TODO: State tracking?
int type;
- if( pc->checkskill(sd, MC_CHANGECART) < 1 )
+ if (pc->checkskill(sd, MC_CHANGECART) == 0)
return;
#ifdef RENEWAL
- if( sd->npc_id || sd->state.workinprogress&1 ){
+ if (sd->npc_id || sd->state.workinprogress&1) {
clif->msgtable(sd, MSG_NPC_WORK_IN_PROGRESS);
return;
}
#endif
- type = RFIFOW(fd,2);
+ type = RFIFOW(fd, 2);
+
+ if (
#ifdef NEW_CARTS
- if( (type == 9 && sd->status.base_level > 131) ||
- (type == 8 && sd->status.base_level > 121) ||
- (type == 7 && sd->status.base_level > 111) ||
- (type == 6 && sd->status.base_level > 101) ||
+ (type == 9 && sd->status.base_level > 130) ||
+ (type == 8 && sd->status.base_level > 120) ||
+ (type == 7 && sd->status.base_level > 110) ||
+ (type == 6 && sd->status.base_level > 100) ||
+#endif
(type == 5 && sd->status.base_level > 90) ||
(type == 4 && sd->status.base_level > 80) ||
(type == 3 && sd->status.base_level > 65) ||
(type == 2 && sd->status.base_level > 40) ||
(type == 1))
-#else
- if( (type == 5 && sd->status.base_level > 90) ||
- (type == 4 && sd->status.base_level > 80) ||
- (type == 3 && sd->status.base_level > 65) ||
- (type == 2 && sd->status.base_level > 40) ||
- (type == 1))
-#endif
- pc->setcart(sd,type);
+
+ pc->setcart(sd, type);
}
/// Request to select cart's visual look for new cart design (CZ_SELECTCART).
diff --git a/src/map/clif.h b/src/map/clif.h
index e16655c1a..6b5fb8dca 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -69,6 +69,7 @@ struct view_data;
#define COLOR_RED 0xff0000U
#define COLOR_GREEN 0x00ff00U
#define COLOR_WHITE 0xffffffU
+#define COLOR_YELLOW 0xffff00U
#define COLOR_DEFAULT COLOR_GREEN
/**
diff --git a/src/map/itemdb.h b/src/map/itemdb.h
index 618111d2a..138a783ae 100644
--- a/src/map/itemdb.h
+++ b/src/map/itemdb.h
@@ -147,6 +147,23 @@ enum item_itemid {
ITEMID_BLACK_THING = 12435,
ITEMID_BOARDING_HALTER = 12622,
ITEMID_NOBLE_NAMEPLATE = 12705,
+ ITEMID_POISON_PARALYSIS = 12717,
+ ITEMID_POISON_LEECH = 12718,
+ ITEMID_POISON_OBLIVION = 12719,
+ ITEMID_POISON_CONTAMINATION = 12720,
+ ITEMID_POISON_NUMB = 12721,
+ ITEMID_POISON_FEVER = 12722,
+ ITEMID_POISON_LAUGHING = 12723,
+ ITEMID_POISON_FATIGUE = 12724,
+ ITEMID_NAUTHIZ = 12725,
+ ITEMID_RAIDO = 12726,
+ ITEMID_BERKANA = 12727,
+ ITEMID_ISA = 12728,
+ ITEMID_OTHILA = 12729,
+ ITEMID_URUZ = 12730,
+ ITEMID_THURISAZ = 12731,
+ ITEMID_WYRD = 12732,
+ ITEMID_HAGALAZ = 12733,
ITEMID_DUN_TELE_SCROLL1 = 14527,
ITEMID_BATTLE_MANUAL25 = 14532,
ITEMID_BATTLE_MANUAL100 = 14533,
@@ -161,6 +178,7 @@ enum item_itemid {
ITEMID_PILEBUNCKER_S = 16030,
ITEMID_PILEBUNCKER_P = 16031,
ITEMID_PILEBUNCKER_T = 16032,
+ ITEMID_LUX_ANIMA = 22540,
};
enum cards_item_list {
@@ -262,37 +280,6 @@ enum cash_food_item_list {
};
/**
- * GC Poison
- */
-enum poison_item_list {
- ITEMID_POISON_PARALYSIS = 12717,
- ITEMID_POISON_LEECH, // 12718
- ITEMID_POISON_OBLIVION, // 12719
- ITEMID_POISON_CONTAMINATION, // 12720
- ITEMID_POISON_NUMB, // 12721
- ITEMID_POISON_FEVER, // 12722
- ITEMID_POISON_LAUGHING, // 12723
- ITEMID_POISON_FATIGUE, // 12724
-};
-
-
-/**
- * Rune Knight
- **/
-enum rune_item_list {
- ITEMID_NAUTHIZ = 12725,
- ITEMID_RAIDO, // 12726
- ITEMID_BERKANA, // 12727
- ITEMID_ISA, // 12728
- ITEMID_OTHILA, // 12729
- ITEMID_URUZ, // 12730
- ITEMID_THURISAZ, // 12731
- ITEMID_WYRD, // 12732
- ITEMID_HAGALAZ, // 12733
- ITEMID_LUX_ANIMA = 22540,
-};
-
-/**
* Geneticist
*/
enum geneticist_item_list {
@@ -566,7 +553,6 @@ struct item_data {
#define itemdb_canrefine(n) (!itemdb->search(n)->flag.no_refine)
#define itemdb_allowoption(n) (!itemdb->search(n)->flag.no_options)
-#define itemdb_is_rune(n) (((n) >= ITEMID_NAUTHIZ && (n) <= ITEMID_HAGALAZ) || (n) == ITEMID_LUX_ANIMA)
#define itemdb_is_element(n) ((n) >= ITEMID_SCARLET_PTS && (n) <= ITEMID_LIME_GREEN_PTS)
#define itemdb_is_spellbook(n) ((n) >= ITEMID_MAGIC_BOOK_FB && (n) <= ITEMID_MAGIC_BOOK_DL)
#define itemdb_is_poison(n) ((n) >= ITEMID_POISON_PARALYSIS && (n) <= ITEMID_POISON_FATIGUE)
diff --git a/src/map/npc.h b/src/map/npc.h
index 6180e9765..3bd11d536 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -125,7 +125,6 @@ struct npc_data {
struct hplugin_data_store *hdata; ///< HPM Plugin Data Store
};
-
#define START_NPC_NUM 110000000
enum actor_classes {
@@ -142,7 +141,7 @@ enum actor_classes {
#define MAX_NPC_CLASS 1000
// New NPC range
#define MAX_NPC_CLASS2_START 10001
-#define MAX_NPC_CLASS2_END 10203
+#define MAX_NPC_CLASS2_END 10248
//Script NPC events.
enum npce_event {
diff --git a/src/map/packets.h b/src/map/packets.h
index 418beb41a..cc2312356 100644
--- a/src/map/packets.h
+++ b/src/map/packets.h
@@ -2222,6 +2222,44 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x0436,4,clif->pDull); // CZ_GANGSI_RANK
#endif
+// 2012-09-25aRagexe
+#if PACKETVER >= 20120925
+// new packets (not all)
+ packet(0x0998,8,clif->pEquipItem,2,4);
+#endif
+
+// 2013-02-06aRagexe
+#if PACKETVER >= 20130206
+// new packets
+ packet(0x09a4,18); // ZC_DISPATCH_TIMING_INFO_CHN
+// changed packet sizes
+#endif
+
+// 2013-03-06aRagexe
+#if PACKETVER >= 20130306
+// new packets
+ packet(0x09a6,12); // ZC_BANKING_CHECK
+ packet(0x09a7,14,clif->pDull/*,XXX*/); // CZ_REQ_BANKING_DEPOSIT
+ packet(0x09a8,4); // ZC_ACK_BANKING_DEPOSIT
+ packet(0x09a9,14,clif->pDull/*,XXX*/); // CZ_REQ_BANKING_WITHDRAW
+ packet(0x09aa,4); // ZC_ACK_BANKING_WITHDRAW
+// changed packet sizes
+#endif
+
+// 2013-03-13aRagexe
+#if PACKETVER >= 20130313
+// new packets
+ packet(0x09ab,-1,clif->pDull/*,XXX*/); // CZ_REQ_BANKING_CHECK
+ packet(0x09ac,20,clif->pDull/*,XXX*/); // CZ_REQ_CASH_BARGAIN_SALE_ITEM_INFO
+ packet(0x09ad,6); // ZC_ACK_CASH_BARGAIN_SALE_ITEM_INFO
+ packet(0x09ae,-1,clif->pDull/*,XXX*/); // CZ_REQ_APPLY_BARGAIN_SALE_ITEM
+ packet(0x09af,-1); // ZC_ACK_APPLY_BARGAIN_SALE_ITEM
+ packet(0x09b0,8,clif->pDull/*,XXX*/); // CZ_REQ_REMOVE_BARGAIN_SALE_ITEM
+ packet(0x09b1,6); // ZC_ACK_REMOVE_BARGAIN_SALE_ITEM
+ packet(0x09b2,-1); // ZC_NOTIFY_BARGAIN_SALE_SELLING
+// changed packet sizes
+#endif
+
//2013-03-20Ragexe (Judas + Yommy)
#if PACKETVER >= 20130320
// Shuffle Start
@@ -2260,13 +2298,36 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x095a,8,clif->pDull); // CZ_JOIN_BATTLE_FIELD
// Shuffle End
- // New Packets
- packet(0x0998,8,clif->pEquipItem,2,4);
+ // New Packets (wrong version or packet not exists)
packet(0x0447,2); // PACKET_CZ_BLOCKING_PLAY_CANCEL
packet(0x099f,24);
// New Packets End
#endif
+#if PACKETVER >= 20130320
+// new packets
+// changed packet sizes
+ packet(0x09a7,10,clif->pBankDeposit,2,4,6); // CZ_REQ_BANKING_DEPOSIT
+ packet(0x09a8,12); // ZC_ACK_BANKING_DEPOSIT
+ packet(0x09a9,10,clif->pBankWithdraw,2,4,6); // CZ_REQ_BANKING_WITHDRAW
+ packet(0x09aa,12); // ZC_ACK_BANKING_WITHDRAW
+ packet(0x09ab,6,clif->pBankCheck,2,4); // CZ_REQ_BANKING_CHECK
+#endif
+
+// 2013-03-27bRagexe
+#if PACKETVER >= 20130327
+// new packets
+ packet(0x09ac,-1,clif->pDull/*,XXX*/); // CZ_REQ_CASH_BARGAIN_SALE_ITEM_INFO
+ packet(0x09ad,10); // ZC_ACK_CASH_BARGAIN_SALE_ITEM_INFO
+ packet(0x09ae,17,clif->pDull/*,XXX*/); // CZ_REQ_APPLY_BARGAIN_SALE_ITEM
+ packet(0x09af,4); // ZC_ACK_APPLY_BARGAIN_SALE_ITEM
+ packet(0x09b0,8,clif->pDull/*,XXX*/); // CZ_REQ_REMOVE_BARGAIN_SALE_ITEM
+ packet(0x09b1,4); // ZC_ACK_REMOVE_BARGAIN_SALE_ITEM
+ packet(0x09b2,6); // ZC_NOTIFY_BARGAIN_SALE_SELLING
+ packet(0x09b3,6); // ZC_NOTIFY_BARGAIN_SALE_CLOSE
+// changed packet sizes
+#endif
+
//2013-05-15aRagexe (Shakto)
#if PACKETVER >= 20130515
// Shuffle Start
@@ -2529,20 +2590,74 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x0436,4,clif->pDull); // CZ_GANGSI_RANK
#endif
-/* Bank System [Yommy/Hercules] */
-#if PACKETVER >= 20130724
-// shuffle packets not added
- packet(0x09A6,12); // ZC_BANKING_CHECK
- packet(0x09A7,10,clif->pBankDeposit,2,4,6);
- packet(0x09A8,16); // ZC_ACK_BANKING_DEPOSIT
- packet(0x09A9,10,clif->pBankWithdraw,2,4,6);
- packet(0x09AA,16); // ZC_ACK_BANKING_WITHDRAW
- packet(0x09AB,6,clif->pBankCheck,2,4);
- ////
- packet(0x09B6,6,clif->pBankOpen,2,4);
- packet(0x09B7,4); // ZC_ACK_OPEN_BANKING
- packet(0x09B8,6,clif->pBankClose,2,4);
- packet(0x09B9,4); // ZC_ACK_CLOSE_BANKING
+// 2013-04-17aRagexe
+#if PACKETVER >= 20130417
+// new packets
+ packet(0x09b4,6,clif->pDull/*,XXX*/); // CZ_OPEN_BARGAIN_SALE_TOOL
+ packet(0x09b5,2); // ZC_OPEN_BARGAIN_SALE_TOOL
+ packet(0x09b6,6,clif->pBankOpen,2,4); // CZ_REQ_OPEN_BANKING
+ packet(0x09b7,4); // ZC_ACK_OPEN_BANKING
+ packet(0x09b8,6,clif->pBankClose,2,4); // CZ_REQ_CLOSE_BANKING
+ packet(0x09b9,4); // ZC_ACK_CLOSE_BANKING
+// changed packet sizes
+#endif
+
+// 2013-04-24aRagexe
+#if PACKETVER >= 20130424
+// new packets
+ packet(0x09ba,6,clif->pDull/*,XXX*/); // CZ_REQ_OPEN_GUILD_STORAGE
+ packet(0x09bb,4); // ZC_ACK_OPEN_GUILD_STORAGE
+ packet(0x09bc,6,clif->pDull/*,XXX*/); // CZ_CLOSE_BARGAIN_SALE_TOOL
+ packet(0x09bd,2); // ZC_CLOSE_BARGAIN_SALE_TOOL
+// changed packet sizes
+#endif
+
+// 2013-05-02aRagexe
+#if PACKETVER >= 20130502
+// new packets
+ packet(0x09be,6,clif->pDull/*,XXX*/); // CZ_REQ_CLOSE_GUILD_STORAGE
+ packet(0x09bf,4); // ZC_ACK_CLOSE_GUILD_STORAGE
+// changed packet sizes
+ packet(0x09bb,6); // ZC_ACK_OPEN_GUILD_STORAGE
+#endif
+
+// 2013-05-15aRagexe
+#if PACKETVER >= 20130515
+// new packets
+ packet(0x09c0,11); // ZC_ACTION_MOVE
+ packet(0x09c1,11); // ZC_C_MARKERINFO
+// changed packet sizes
+ packet(0x09a8,16); // ZC_ACK_BANKING_DEPOSIT
+ packet(0x09aa,16); // ZC_ACK_BANKING_WITHDRAW
+#endif
+
+// 2013-05-29Ragexe
+#if PACKETVER >= 20130529
+// new packets
+ packet(0x09c3,8,clif->pDull/*,XXX*/); // CZ_REQ_COUNT_BARGAIN_SALE_ITEM
+// changed packet sizes
+#endif
+
+// 2013-06-05Ragexe
+#if PACKETVER >= 20130605
+// new packets
+ packet(0x09c4,8); // ZC_ACK_COUNT_BARGAIN_SALE_ITEM
+#endif
+
+// 2013-06-18aRagexe
+#if PACKETVER >= 20130618
+// new packets
+ packet(0x09ca,23); // ZC_SKILL_ENTRY5
+// changed packet sizes
+#endif
+
+// 2013-07-17cRagexe
+#if PACKETVER >= 20130717
+// new packets
+ packet(0x09cb,17); // ZC_USE_SKILL2
+ packet(0x09cc,-1); // ZC_SECRETSCAN_DATA
+// changed packet sizes
+ packet(0x09c1,10); // ZC_C_MARKERINFO
#endif
//2013-08-07Ragexe (Shakto)
@@ -2582,6 +2697,13 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x0436,4,clif->pDull); // CZ_GANGSI_RANK
#endif
+// 2013-08-07aRagexe
+#if PACKETVER >= 20130807
+// new packets
+ packet(0x09cd,8); // ZC_MSG_COLOR
+// changed packet sizes
+#endif
+
//2013-08-14aRagexe - Themon
#if PACKETVER >= 20130814
packet(0x0874,7,clif->pActionRequest,2,6);
@@ -2619,6 +2741,84 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x0896,8,clif->pDull); // CZ_JOIN_BATTLE_FIELD
#endif
+// 2013-08-14aRagexe
+#if PACKETVER >= 20130814
+// new packets
+ packet(0x09ce,102,clif->pGM_Monster_Item,2); // CZ_ITEM_CREATE_EX
+ packet(0x09cf,-1); // ZC_NPROTECTGAMEGUARDCSAUTH
+ packet(0x09d0,-1,clif->pDull/*,XXX*/); // CZ_NPROTECTGAMEGUARDCSAUTH
+// changed packet sizes
+#endif
+
+// 2013-08-21bRagexe
+#if PACKETVER >= 20130821
+// new packets
+ packet(0x09d1,14); // ZC_PROGRESS_ACTOR
+// changed packet sizes
+#endif
+
+// 2013-08-28bRagexe
+#if PACKETVER >= 20130828
+// new packets
+ packet(0x09d2,-1); // ZC_GUILDSTORAGE_ITEMLIST_NORMAL_V5
+ packet(0x09d3,-1); // ZC_GUILDSTORAGE_ITEMLIST_EQUIP_V5
+// changed packet sizes
+ packet(0x09ba,2,clif->pDull/*,XXX*/); // CZ_REQ_OPEN_GUILD_STORAGE
+ packet(0x09be,2,clif->pDull/*,XXX*/); // CZ_REQ_CLOSE_GUILD_STORAGE
+#endif
+
+// 2013-09-04aRagexe
+#if PACKETVER >= 20130904
+// new packets
+// changed packet sizes
+ packet(0x09ca,-1); // ZC_SKILL_ENTRY5
+#endif
+
+// 2013-09-11aRagexe
+#if PACKETVER >= 20130911
+// new packets
+ packet(0x09d4,2,clif->pNPCShopClosed); // CZ_NPC_TRADE_QUIT
+ packet(0x09d5,-1); // ZC_NPC_MARKET_OPEN
+ packet(0x09d6,-1,clif->pNPCMarketPurchase); // CZ_NPC_MARKET_PURCHASE
+ packet(0x09d7,-1); // ZC_NPC_MARKET_PURCHASE_RESULT
+ packet(0x09d8,2,clif->pNPCMarketClosed); // CZ_NPC_MARKET_CLOSE
+ packet(0x09d9,2,clif->pDull/*,XXX*/); // CZ_REQ_GUILDSTORAGE_LOG
+ packet(0x09da,2); // ZC_ACK_GUILDSTORAGE_LOG
+// changed packet sizes
+#endif
+
+// 2013-09-25aRagexe
+#if PACKETVER >= 20130925
+// new packets
+// changed packet sizes
+ packet(0x09da,10); // ZC_ACK_GUILDSTORAGE_LOG
+#endif
+
+// 2013-10-02aRagexe
+#if PACKETVER >= 20131002
+// new packets
+// changed packet sizes
+ packet(0x09d9,4,clif->pDull/*,XXX*/); // CZ_REQ_GUILDSTORAGE_LOG
+ packet(0x09da,-1); // ZC_ACK_GUILDSTORAGE_LOG
+#endif
+
+// 2013-10-16aRagexe
+#if PACKETVER >= 20131016
+// new packets
+// changed packet sizes
+ packet(0x09d9,6,clif->pDull/*,XXX*/); // CZ_REQ_GUILDSTORAGE_LOG
+#endif
+
+// 2013-10-23aRagexe
+#if PACKETVER >= 20131023
+// new packets
+ packet(0x09db,-1); // ZC_NOTIFY_MOVEENTRY10
+ packet(0x09dc,-1); // ZC_NOTIFY_NEWENTRY10
+ packet(0x09dd,-1); // ZC_NOTIFY_STANDENTRY10
+// changed packet sizes
+ packet(0x09d9,4,clif->pDull/*,XXX*/); // CZ_REQ_GUILDSTORAGE_LOG
+#endif
+
// 2013-10-30aRagexe
#if PACKETVER >= 20131030
// new packets
@@ -2627,6 +2827,43 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x09e0,-1); // SC_LOGIN_ANSWER_WITH_ID
#endif
+// 2013-11-06aRagexe
+#if PACKETVER >= 20131106
+// new packets
+ packet(0x09e1,8,clif->pDull/*,XXX*/); // CZ_MOVE_ITEM_FROM_BODY_TO_GUILDSTORAGE
+ packet(0x09e2,8,clif->pDull/*,XXX*/); // CZ_MOVE_ITEM_FROM_GUILDSTORAGE_TO_BODY
+ packet(0x09e3,8,clif->pDull/*,XXX*/); // CZ_MOVE_ITEM_FROM_CART_TO_GUILDSTORAGE
+ packet(0x09e4,8,clif->pDull/*,XXX*/); // CZ_MOVE_ITEM_FROM_GUILDSTORAGE_TO_CART
+// changed packet sizes
+#endif
+
+// 2013-11-20dRagexe
+#if PACKETVER >= 20131120
+// new packets
+ packet(0x09e5,14); // ZC_DELETEITEM_FROM_MCSTORE2
+ packet(0x09e6,18); // ZC_UPDATE_ITEM_FROM_BUYING_STORE2
+// changed packet sizes
+#endif
+
+// 2013-11-27bRagexe
+#if PACKETVER >= 20131127
+// new packets
+// changed packet sizes
+ packet(0x09e5,18); // ZC_DELETEITEM_FROM_MCSTORE2
+ packet(0x09e6,22); // ZC_UPDATE_ITEM_FROM_BUYING_STORE2
+#endif
+
+// 2013-12-11dRagexe
+#if PACKETVER >= 20131211
+// new packets
+ packet(0x09e7,2); // ZC_NOTIFY_UNREAD_RODEX
+ packet(0x09e8,18,clif->pDull/*,XXX*/); // CZ_OPEN_RODEXBOX
+ packet(0x09e9,2,clif->pDull/*,XXX*/); // CZ_CLOSE_RODEXBOX
+ packet(0x09ed,-1); // ZC_ACK_SEND_RODEX
+ packet(0x09ee,-1,clif->pDull/*,XXX*/); // CZ_REQ_NEXT_RODEX
+// changed packet sizes
+#endif
+
// 2013-12-18bRagexe - Yommy
#if PACKETVER >= 20131218
packet(0x0369,7,clif->pActionRequest,2,6);
@@ -2658,12 +2895,20 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x085C,36,clif->pStoragePassword,0);
packet(0x0363,8,clif->pDull); // CZ_JOIN_BATTLE_FIELD
packet(0x087b,4,clif->pDull); // CZ_GANGSI_RANK
- /* New */
- packet(0x09d4,2,clif->pNPCShopClosed);
- packet(0x09ce,102,clif->pGM_Monster_Item,2);
- /* NPC Market */
- packet(0x09d8,2,clif->pNPCMarketClosed);
- packet(0x09d6,-1,clif->pNPCMarketPurchase);
+#endif
+
+// 2013-12-18bRagexe
+#if PACKETVER >= 20131218
+// new packets
+ packet(0x09ea,10,clif->pDull/*,XXX*/); // CZ_REQ_READ_RODEX
+ packet(0x09eb,14); // ZC_ACK_READ_RODEX
+ packet(0x09ef,11,clif->pDull/*,XXX*/); // CZ_REQ_REFRESH_RODEX
+ packet(0x09f0,-1); // ZC_ACK_RODEX_LIST
+ packet(0x09f5,11,clif->pDull/*,XXX*/); // CZ_REQ_DELETE_RODEX
+ packet(0x09f6,11); // ZC_ACK_DELETE_RODEX
+// changed packet sizes
+ packet(0x09e8,10,clif->pDull/*,XXX*/); // CZ_OPEN_RODEXBOX
+ packet(0x09ee,11,clif->pDull/*,XXX*/); // CZ_REQ_NEXT_RODEX
#endif
// 2013-12-23cRagexe - Yommy
@@ -2697,7 +2942,14 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x08A4,36,clif->pStoragePassword,0);
packet(0x0363,8,clif->pDull); // CZ_JOIN_BATTLE_FIELD
packet(0x0436,4,clif->pDull); // CZ_GANGSI_RANK
- packet(0x09cb,17);
+#endif
+
+// 2013-12-23bRagexe
+#if PACKETVER >= 20131223
+// new packets
+// changed packet sizes
+ packet(0x09ea,11,clif->pDull/*,XXX*/); // CZ_REQ_READ_RODEX
+ packet(0x09eb,24); // ZC_ACK_READ_RODEX
#endif
// 2013-12-30aRagexe - Yommy
@@ -2733,6 +2985,16 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x093e,8,clif->pDull); // CZ_JOIN_BATTLE_FIELD
#endif
+// 2013-12-30aRagexe
+#if PACKETVER >= 20131230
+// new packets
+ packet(0x09ec,-1,clif->pDull/*,XXX*/); // CZ_REQ_SEND_RODEX
+ packet(0x09ed,3); // ZC_ACK_SEND_RODEX
+ packet(0x09f7,75); // ZC_PROPERTY_HOMUN_2
+// changed packet sizes
+ packet(0x09eb,23); // ZC_ACK_READ_RODEX
+#endif
+
// 2014 Packet Data
// 2014-01-15eRagexe
@@ -3213,8 +3475,6 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x0936,36,clif->pStoragePassword,0);
packet(0x0363,8,clif->pDull); // CZ_JOIN_BATTLE_FIELD
packet(0x0922,4,clif->pDull); // CZ_GANGSI_RANK
- packet(0x09e5,18); // ZC_DELETEITEM_FROM_MCSTORE2
- packet(0x09e6,22); // ZC_UPDATE_ITEM_FROM_BUYING_STORE2
#endif
// 2014-10-22bRagexe - YomRawr
@@ -3730,7 +3990,6 @@ packet(0x96e,-1,clif->ackmergeitems);
packet(0x0817,5,clif->pHomMenu,2,4);
packet(0x0923,36,clif->pStoragePassword,0);
packet(0x0a27,8); // ZC_RECOVERY2
- packet(0x09f7,75); // ZC_PROPERTY_HOMUN_2
#endif
// 2015-05-20aRagexeRE
diff --git a/src/map/pc.c b/src/map/pc.c
index c602ed4c0..2887942db 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -4841,11 +4841,7 @@ int pc_isUseitem(struct map_session_data *sd,int n)
switch( nameid ) { // TODO: Is there no better way to handle this, other than hardcoding item IDs?
case ITEMID_ANODYNE:
- if( map_flag_gvg2(sd->bl.m) )
- return 0;
- /* Fall through */
- case ITEMID_ALOEBERA:
- if( pc_issit(sd) )
+ if (map_flag_gvg2(sd->bl.m))
return 0;
break;
case ITEMID_WING_OF_FLY:
@@ -4922,17 +4918,6 @@ int pc_isUseitem(struct map_session_data *sd,int n)
if( nameid >= ITEMID_BOW_MERCENARY_SCROLL1 && nameid <= ITEMID_SPEARMERCENARY_SCROLL10 && sd->md != NULL ) // Mercenary Scrolls
return 0;
- /**
- * Only Rune Knights may use runes
- **/
- if (itemdb_is_rune(nameid) && (sd->job & MAPID_THIRDMASK) != MAPID_RUNE_KNIGHT)
- return 0;
- /**
- * Only GCross may use poisons
- **/
- else if (itemdb_is_poison(nameid) && (sd->job & MAPID_THIRDMASK) != MAPID_GUILLOTINE_CROSS)
- return 0;
-
if( item->package || item->group ) {
if (pc_is90overweight(sd)) {
clif->msgtable(sd, MSG_ITEM_CANT_OBTAIN_WEIGHT);
@@ -5079,15 +5064,22 @@ int pc_useitem(struct map_session_data *sd,int n) {
if( sd->inventory_data[n]->flag.delay_consume && ( sd->ud.skilltimer != INVALID_TIMER /*|| !status->check_skilluse(&sd->bl, &sd->bl, ALL_RESURRECTION, 0)*/ ) )
return 0;
- if( sd->inventory_data[n]->delay > 0 ) {
- ARR_FIND(0, MAX_ITEMDELAYS, i, sd->item_delay[i].nameid == nameid );
- if( i == MAX_ITEMDELAYS ) /* item not found. try first empty now */
- ARR_FIND(0, MAX_ITEMDELAYS, i, !sd->item_delay[i].nameid );
- if( i < MAX_ITEMDELAYS ) {
- if( sd->item_delay[i].nameid ) {// found
- if( DIFF_TICK(sd->item_delay[i].tick, tick) > 0 ) {
- int e_tick = (int)(DIFF_TICK(sd->item_delay[i].tick, tick)/1000);
- clif->msgtable_num(sd, MSG_SECONDS_UNTIL_USE, e_tick + 1); // [%d] seconds left until you can use
+ if (sd->inventory_data[n]->delay > 0) {
+ ARR_FIND(0, MAX_ITEMDELAYS, i, sd->item_delay[i].nameid == nameid);
+ if (i == MAX_ITEMDELAYS) /* item not found. try first empty now */
+ ARR_FIND(0, MAX_ITEMDELAYS, i, sd->item_delay[i].nameid == 0);
+ if (i < MAX_ITEMDELAYS) {
+ if (sd->item_delay[i].nameid != 0) {// found
+ if (DIFF_TICK(sd->item_delay[i].tick, tick) > 0) {
+ int delay_tick = (int)(DIFF_TICK(sd->item_delay[i].tick, tick) / 1000);
+#if PACKETVER >= 20101123
+ clif->msgtable_num(sd, MSG_SECONDS_UNTIL_USE, delay_tick + 1); // [%d] seconds left until you can use
+#else
+ char delay_msg[100];
+ clif->msgtable_num(sd, MSG_SECONDS_UNTIL_USE, delay_tick + 1); // [%d] seconds left until you can use
+ sprintf(delay_msg, msg_sd(sd, 26), delay_tick + 1);
+ clif->messagecolor_self(sd->fd, COLOR_YELLOW, delay_msg);
+#endif
return 0; // Delay has not expired yet
}
} else {// not yet used item (all slots are initially empty)
diff --git a/src/map/script.c b/src/map/script.c
index 8604b62f7..f63dd2097 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -17744,6 +17744,1601 @@ BUILDIN(getunittype) {
return true;
}
+/**
+ * Sets real-time unit data for a game object.
+ * Setunitdata <GUID>,<DataType>,<Val1>{,<Val2>,<Val3>}
+ * @param1 GUID GID of the unit.
+ * @param2 DataType Type of Data to be set for the unit.
+ * @param3 Value#1 Value to be passed as change in data.
+ * @param4 Value#2 Optional int value to be passed for certain data types.
+ * @param5 Value#3 Optional int value to be passed for certain data types.
+ * @return 1 on success, 0 on failure.
+ */
+BUILDIN(setunitdata)
+{
+ struct block_list *bl = NULL;
+ const char *mapname = NULL, *udtype = NULL;
+ int type = 0, val = 0, val2 = 0, val3 = 0;
+ struct map_session_data *tsd = NULL;
+
+ bl = map->id2bl(script_getnum(st, 2));
+
+ if (bl == NULL) {
+ ShowWarning("buildin_setunitdata: Error in finding object with given GID %d!\n", script_getnum(st, 2));
+ script_pushint(st, 0);
+ return false;
+ }
+
+ type = script_getnum(st, 3);
+
+ /* type bounds */
+ if (type < UDT_SIZE || type >= UDT_MAX) {
+ ShowError("buildin_setunitdata: Invalid unit data type %d provided.\n", type);
+ script_pushint(st, 0);
+ return false;
+ }
+
+ /* Mandatory Argument 3 */
+ if (type == UDT_MAPIDXY) {
+ if (!script_isstringtype(st, 4)) {
+ ShowError("buildin_setunitdata: Invalid data type for argument #3.\n");
+ script_pushint(st, 0);
+ return false;
+ }
+ mapname = script_getstr(st, 4);
+ } else {
+ if (script_isstringtype(st, 4)) {
+ ShowError("buildin_setunitdata: Invalid data type for argument #3.\n");
+ script_pushint(st, 0);
+ return false;
+ }
+ val = script_getnum(st, 4);
+ }
+/* checks if value is out of bounds. */
+#define setunitdata_check_bounds(arg, min, max) \
+ do { \
+ if (script_getnum(st, arg) < min || script_getnum(st, arg) > max) { \
+ ShowError("buildin_setunitdata: Invalid value %d for argument #%d. (min: %d, max: %d)\n", script_getnum(st, arg), arg-1, min, max); \
+ script_pushint(st, 0); \
+ return false; \
+ } \
+ } while(0);
+/* checks if value is out of bounds. */
+#define setunitdata_check_unsigned(arg, max) \
+ do { \
+ if (script_getnum(st, arg) < 0 || script_getnum(st, arg) > max) { \
+ ShowError("buildin_setunitdata: Invalid value %d for argument #%d. (min: 0, max: %u)\n", script_getnum(st, arg), arg-1, max); \
+ script_pushint(st, 0); \
+ return false; \
+ } \
+ } while(0);
+/* checks if uint64 value is out of bounds. */
+#define setunitdata_check_uint64(arg, min, max) \
+ do { \
+ if (script_getnum(st, arg) < min || script_getnum(st, arg) > max) { \
+ ShowError("buildin_setunitdata: Invalid value %d for argument #%d. (min: %d, max: %"PRIu64")\n", script_getnum(st, arg), arg-1, min, max); \
+ script_pushint(st, 0); \
+ return false; \
+ } \
+ } while(0);
+/* checks if the argument doesn't exist, if required.
+ * also checks if the argument exists, if not required. */
+#define setunitdata_assert_arg(arg, required) \
+ do { \
+ if (required && !script_hasdata(st, arg)) { \
+ ShowError("buildin_setunitdata: Type %d reqires argument #%d.\n", type, arg-1); \
+ script_pushint(st, 0); \
+ return false; \
+ } else if (!required && script_hasdata(st, arg)) { \
+ ShowError("buildin_setunitdata: Argument %d is not required for type %d.\n", arg-1, type); \
+ script_pushint(st, 0); \
+ return false; \
+ } \
+ } while (0);
+/* checks if the data is an integer. */
+#define setunitdata_check_int(arg) \
+ do { \
+ setunitdata_assert_arg(arg, true); \
+ if (script_isstringtype(st, arg)) { \
+ ShowError("buildin_setunitdata: Argument #%d expects integer, string given.\n", arg-1); \
+ script_pushint(st, 0); \
+ return false; \
+ } \
+ } while(0);
+/* checks if the data is a string. */
+#define setunitdata_check_string(arg) \
+ do { \
+ setunitdata_assert_arg(arg, true); \
+ if (script_isinttype(st, arg)) { \
+ ShowError("buildin_setunitdata: Argument #%d expects string, integer given.\n", arg-1); \
+ script_pushint(st, 0); \
+ return false; \
+ } \
+ } while(0);
+
+ if (type != UDT_MAPIDXY && type != UDT_WALKTOXY) {
+ setunitdata_assert_arg(5, false);
+ setunitdata_assert_arg(6, false);
+ }
+
+ switch (type)
+ {
+ case UDT_SIZE:
+ setunitdata_check_bounds(4, SZ_SMALL, SZ_BIG);
+ break;
+ case UDT_LEVEL:
+ case UDT_HP:
+ case UDT_MAXHP:
+ case UDT_SP:
+ case UDT_MAXSP:
+ case UDT_CLASS:
+ case UDT_HEADBOTTOM:
+ case UDT_HEADMIDDLE:
+ case UDT_HEADTOP:
+ case UDT_CLOTHCOLOR:
+ case UDT_SHIELD:
+ case UDT_WEAPON:
+ case UDT_INTIMACY:
+ case UDT_LIFETIME:
+ case UDT_MERC_KILLCOUNT:
+ setunitdata_check_unsigned(4, UINT_MAX);
+ break;
+ case UDT_MASTERAID:
+ setunitdata_check_unsigned(4, UINT_MAX);
+ tsd = map->id2sd(val);
+ if (tsd == NULL) {
+ ShowWarning("buildin_setunitdata: Account ID %d not found for master change!\n",val);
+ script_pushint(st, 0);
+ return false;
+ }
+ break;
+ case UDT_MASTERCID:
+ setunitdata_check_unsigned(4, UINT_MAX);
+ tsd = map->charid2sd((uint32) val);
+ if (tsd == NULL) {
+ ShowWarning("buildin_setunitdata: Character ID %d not found for master change!\n",val);
+ script_pushint(st, 0);
+ return false;
+ }
+ break;
+ case UDT_MAPIDXY:
+ if ((val = map->mapname2mapid(mapname)) == -1) {
+ ShowError("buildin_setunitdata: Non-existent map %s provided.\n", mapname);
+ return false;
+ }
+ setunitdata_check_int(5);
+ setunitdata_check_int(6);
+ setunitdata_check_bounds(5, 0, MAX_MAP_SIZE/2);
+ setunitdata_check_bounds(6, 0, MAX_MAP_SIZE/2);
+ val2 = script_getnum(st, 5);
+ val3 = script_getnum(st, 6);
+ break;
+ case UDT_WALKTOXY:
+ setunitdata_assert_arg(6, false);
+ setunitdata_check_int(5);
+ val2 = script_getnum(st, 5);
+ setunitdata_check_bounds(4, 0, MAX_MAP_SIZE/2);
+ setunitdata_check_bounds(5, 0, MAX_MAP_SIZE/2);
+ break;
+ case UDT_SPEED:
+ setunitdata_check_bounds(4, 0, MAX_WALK_SPEED);
+ break;
+ case UDT_MODE:
+ setunitdata_check_bounds(4, MD_NONE, MD_MASK);
+ break;
+ case UDT_AI:
+ setunitdata_check_bounds(4, AI_NONE, AI_MAX-1);
+ break;
+ case UDT_SCOPTION:
+ setunitdata_check_bounds(4, OPTION_NOTHING, OPTION_COSTUME);
+ break;
+ case UDT_SEX:
+ setunitdata_check_bounds(4, SEX_FEMALE, SEX_MALE);
+ break;
+ case UDT_HAIRSTYLE:
+ setunitdata_check_bounds(4, 0, battle->bc->max_hair_style);
+ break;
+ case UDT_HAIRCOLOR:
+ setunitdata_check_bounds(4, 0, battle->bc->max_hair_color);
+ break;
+ case UDT_LOOKDIR:
+ setunitdata_check_bounds(4, 0, 7);
+ break;
+ case UDT_CANMOVETICK:
+ setunitdata_check_uint64(4, 0, UINT64_MAX);
+ break;
+ case UDT_STR:
+ case UDT_AGI:
+ case UDT_VIT:
+ case UDT_INT:
+ case UDT_DEX:
+ case UDT_LUK:
+ case UDT_STATPOINT:
+ case UDT_ATKRANGE:
+ case UDT_ATKMIN:
+ case UDT_ATKMAX:
+ case UDT_MATKMIN:
+ case UDT_MATKMAX:
+ case UDT_AMOTION:
+ case UDT_ADELAY:
+ case UDT_DMOTION:
+ setunitdata_check_bounds(4, 0, USHRT_MAX);
+ break;
+ case UDT_DEF:
+ case UDT_MDEF:
+ case UDT_HIT:
+ case UDT_FLEE:
+ case UDT_PDODGE:
+ case UDT_CRIT:
+ setunitdata_check_bounds(4, 0, SHRT_MAX);
+ break;
+ case UDT_HUNGER:
+ setunitdata_check_bounds(4, 0, 99);
+ break;
+ case UDT_RACE:
+ case UDT_ELETYPE:
+ case UDT_ELELEVEL:
+ setunitdata_check_bounds(4, 0, CHAR_MAX);
+ break;
+ default:
+ break;
+ }
+
+#undef setunitdata_check_bounds
+#undef setunitdata_check_uint64
+#undef setunitdata_assert_arg
+#undef setunitdata_check_int
+#undef setunitdata_check_string
+
+ /* Set the values */
+ switch (bl->type) {
+ case BL_MOB:
+ {
+ struct mob_data *md = BL_UCAST(BL_MOB, bl);
+ nullpo_retr(false, md);
+
+ switch (type)
+ {
+ case UDT_SIZE:
+ md->status.size = (unsigned char) val;
+ break;
+ case UDT_LEVEL:
+ md->level = val;
+ break;
+ case UDT_HP:
+ status->set_hp(bl, (unsigned int) val, 0);
+ clif->charnameack(0, &md->bl);
+ break;
+ case UDT_MAXHP:
+ md->status.max_hp = (unsigned int) val;
+ clif->charnameack(0, &md->bl);
+ break;
+ case UDT_SP:
+ status->set_sp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXSP:
+ md->status.max_sp = (unsigned int) val;
+ break;
+ case UDT_MASTERAID:
+ md->master_id = val;
+ break;
+ case UDT_MAPIDXY:
+ unit->warp(bl, (short) val, (short) val2, (short) val3, CLR_TELEPORT);
+ break;
+ case UDT_WALKTOXY:
+ if (!unit->walktoxy(bl, (short) val, (short) val2, 2))
+ unit->movepos(bl, (short) val, (short) val2, 0, 0);
+ break;
+ case UDT_SPEED:
+ md->status.speed = (unsigned short) val;
+ status->calc_misc(bl, &md->status, md->level);
+ break;
+ case UDT_MODE:
+ md->status.mode = (enum e_mode) val;
+ break;
+ case UDT_AI:
+ md->special_state.ai = (enum ai) val;
+ break;
+ case UDT_SCOPTION:
+ md->sc.option = (char) val;
+ break;
+ case UDT_SEX:
+ md->vd->sex = (char) val;
+ break;
+ case UDT_CLASS:
+ mob->class_change(md, val);
+ break;
+ case UDT_HAIRSTYLE:
+ clif->changelook(bl, LOOK_HAIR, (unsigned short) val);
+ break;
+ case UDT_HAIRCOLOR:
+ clif->changelook(bl, LOOK_HAIR_COLOR, (unsigned short) val);
+ break;
+ case UDT_HEADBOTTOM:
+ clif->changelook(bl, LOOK_HEAD_BOTTOM, (unsigned short) val);
+ break;
+ case UDT_HEADMIDDLE:
+ clif->changelook(bl, LOOK_HEAD_MID, (unsigned short) val);
+ break;
+ case UDT_HEADTOP:
+ clif->changelook(bl, LOOK_HEAD_TOP, (unsigned short) val);
+ break;
+ case UDT_CLOTHCOLOR:
+ clif->changelook(bl, LOOK_CLOTHES_COLOR, (unsigned short) val);
+ break;
+ case UDT_SHIELD:
+ clif->changelook(bl, LOOK_SHIELD, (unsigned short) val);
+ break;
+ case UDT_WEAPON:
+ clif->changelook(bl, LOOK_WEAPON, (unsigned short) val);
+ break;
+ case UDT_LOOKDIR:
+ unit->setdir(bl, (uint8) val);
+ break;
+ case UDT_CANMOVETICK:
+ md->ud.canmove_tick = (int64) val;
+ break;
+ case UDT_STR:
+ md->status.str = (unsigned short) val;
+ status->calc_misc(bl, &md->status, md->level);
+ break;
+ case UDT_AGI:
+ md->status.agi = (unsigned short) val;
+ status->calc_misc(bl, &md->status, md->level);
+ break;
+ case UDT_VIT:
+ md->status.vit = (unsigned short) val;
+ status->calc_misc(bl, &md->status, md->level);
+ break;
+ case UDT_INT:
+ md->status.int_ = (unsigned short) val;
+ status->calc_misc(bl, &md->status, md->level);
+ break;
+ case UDT_DEX:
+ md->status.dex = (unsigned short) val;
+ status->calc_misc(bl, &md->status, md->level);
+ break;
+ case UDT_LUK:
+ md->status.luk = (unsigned short) val;
+ status->calc_misc(bl, &md->status, md->level);
+ break;
+ case UDT_ATKRANGE:
+ md->status.rhw.range = (unsigned short) val;
+ break;
+ case UDT_ATKMIN:
+ md->status.rhw.atk = (unsigned short) val;
+ break;
+ case UDT_ATKMAX:
+ md->status.rhw.atk2 = (unsigned short) val;
+ break;
+ case UDT_MATKMIN:
+ md->status.matk_min = (unsigned short) val;
+ break;
+ case UDT_MATKMAX:
+ md->status.matk_max = (unsigned short) val;
+ break;
+ case UDT_DEF:
+ md->status.def = (defType) val;
+ break;
+ case UDT_MDEF:
+ md->status.mdef = (defType) val;
+ break;
+ case UDT_HIT:
+ md->status.hit = (short) val;
+ break;
+ case UDT_FLEE:
+ md->status.flee = (short) val;
+ break;
+ case UDT_PDODGE:
+ md->status.flee2 = (short) val;
+ break;
+ case UDT_CRIT:
+ md->status.cri = (short) val;
+ break;
+ case UDT_RACE:
+ md->status.race = (unsigned char) val;
+ break;
+ case UDT_ELETYPE:
+ md->status.def_ele = (unsigned char) val;
+ break;
+ case UDT_ELELEVEL:
+ md->status.ele_lv = (unsigned char) val;
+ break;
+ case UDT_AMOTION:
+ md->status.amotion = (unsigned short) val;
+ break;
+ case UDT_ADELAY:
+ md->status.adelay = (unsigned short) val;
+ break;
+ case UDT_DMOTION:
+ md->status.dmotion = (unsigned short) val;
+ break;
+ default:
+ ShowWarning("buildin_setunitdata: Invalid data type '%s' for mob unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ }
+ break;
+ case BL_HOM:
+ {
+ struct homun_data *hd = BL_UCAST(BL_HOM, bl);
+
+ nullpo_retr(false, hd);
+
+ switch (type)
+ {
+ case UDT_SIZE:
+ hd->base_status.size = (unsigned char) val;
+ break;
+ case UDT_LEVEL:
+ hd->homunculus.level = (short) val;
+ break;
+ case UDT_HP:
+ status->set_hp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXHP:
+ hd->homunculus.max_hp = val;
+ break;
+ case UDT_SP:
+ status->set_sp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXSP:
+ hd->homunculus.max_sp = val;
+ break;
+ case UDT_MASTERCID:
+ hd->homunculus.char_id = val;
+ hd->master = tsd;
+ break;
+ case UDT_MAPIDXY:
+ unit->warp(bl, (short) val, (short) val2, (short) val3, CLR_TELEPORT);
+ break;
+ case UDT_WALKTOXY:
+ if (!unit->walktoxy(bl, (short) val, (short) val2, 2))
+ unit->movepos(bl, (short) val, (short) val2, 0, 0);
+ break;
+ case UDT_SPEED:
+ hd->base_status.speed = (unsigned short) val;
+ status->calc_misc(bl, &hd->base_status, hd->homunculus.level);
+ break;
+ case UDT_LOOKDIR:
+ unit->setdir(bl, (unsigned char) val);
+ break;
+ case UDT_CANMOVETICK:
+ hd->ud.canmove_tick = (int64) val;
+ break;
+ case UDT_STR:
+ hd->base_status.str = (unsigned short) val;
+ status->calc_misc(bl, &hd->base_status, hd->homunculus.level);
+ break;
+ case UDT_AGI:
+ hd->base_status.agi = (unsigned short) val;
+ status->calc_misc(bl, &hd->base_status, hd->homunculus.level);
+ break;
+ case UDT_VIT:
+ hd->base_status.vit = (unsigned short) val;
+ status->calc_misc(bl, &hd->base_status, hd->homunculus.level);
+ break;
+ case UDT_INT:
+ hd->base_status.int_ = (unsigned short) val;
+ status->calc_misc(bl, &hd->base_status, hd->homunculus.level);
+ break;
+ case UDT_DEX:
+ hd->base_status.dex = (unsigned short) val;
+ status->calc_misc(bl, &hd->base_status, hd->homunculus.level);
+ break;
+ case UDT_LUK:
+ hd->base_status.luk = (unsigned short) val;
+ status->calc_misc(bl, &hd->base_status, hd->homunculus.level);
+ break;
+ case UDT_ATKRANGE:
+ hd->base_status.rhw.range = (unsigned short) val;
+ break;
+ case UDT_ATKMIN:
+ hd->base_status.rhw.atk = (unsigned short) val;
+ break;
+ case UDT_ATKMAX:
+ hd->base_status.rhw.atk2 = (unsigned short) val;
+ break;
+ case UDT_MATKMIN:
+ hd->base_status.matk_min = (unsigned short) val;
+ break;
+ case UDT_MATKMAX:
+ hd->base_status.matk_max = (unsigned short) val;
+ break;
+ case UDT_DEF:
+ hd->base_status.def = (defType) val;
+ break;
+ case UDT_MDEF:
+ hd->base_status.mdef = (defType) val;
+ break;
+ case UDT_HIT:
+ hd->base_status.hit = (short) val;
+ break;
+ case UDT_FLEE:
+ hd->base_status.flee = (short) val;
+ break;
+ case UDT_PDODGE:
+ hd->base_status.flee2 = (short) val;
+ break;
+ case UDT_CRIT:
+ hd->base_status.cri = (short) val;
+ break;
+ case UDT_RACE:
+ hd->base_status.race = (unsigned char) val;
+ break;
+ case UDT_ELETYPE:
+ hd->base_status.def_ele = (unsigned char) val;
+ break;
+ case UDT_ELELEVEL:
+ hd->base_status.ele_lv = (unsigned char) val;
+ break;
+ case UDT_AMOTION:
+ hd->base_status.amotion = (unsigned short) val;
+ break;
+ case UDT_ADELAY:
+ hd->base_status.adelay = (unsigned short) val;
+ break;
+ case UDT_DMOTION:
+ hd->base_status.dmotion = (unsigned short) val;
+ break;
+ case UDT_HUNGER:
+ hd->homunculus.hunger = (short) val;
+ clif->send_homdata(hd->master, SP_HUNGRY, hd->homunculus.hunger);
+ break;
+ case UDT_INTIMACY:
+ homun->add_intimacy(hd, (unsigned int) val);
+ clif->send_homdata(hd->master, SP_INTIMATE, hd->homunculus.intimacy / 100);
+ break;
+ default:
+ ShowWarning("buildin_setunitdata: Invalid data type '%s' for homunculus unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+
+ clif->send_homdata(hd->master, SP_ACK, 0); // send homun data
+ }
+ break;
+ case BL_PET:
+ {
+ struct pet_data *pd = BL_UCAST(BL_PET, bl);
+
+ nullpo_retr(false, pd);
+
+ switch (type)
+ {
+ case UDT_SIZE:
+ pd->status.size = (unsigned char) val;
+ break;
+ case UDT_LEVEL:
+ pd->pet.level = (short) val;
+ break;
+ case UDT_HP:
+ status->set_hp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXHP:
+ pd->status.max_hp = (unsigned int) val;
+ break;
+ case UDT_SP:
+ status->set_sp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXSP:
+ pd->status.max_sp = (unsigned int) val;
+ break;
+ case UDT_MASTERAID:
+ pd->pet.account_id = (int) val;
+ pd->msd = tsd;
+ break;
+ case UDT_MAPIDXY:
+ unit->warp(bl, (short) val, (short) val2, (short) val3, CLR_TELEPORT);
+ break;
+ case UDT_WALKTOXY:
+ if (!unit->walktoxy(bl, (short) val, (short) val2, 2))
+ unit->movepos(bl, (short) val, (short) val2, 0, 0);
+ break;
+ case UDT_SPEED:
+ pd->status.speed = (unsigned short) val;
+ status->calc_misc(bl, &pd->status, pd->pet.level);
+ break;
+ case UDT_LOOKDIR:
+ unit->setdir(bl, (unsigned char) val);
+ break;
+ case UDT_CANMOVETICK:
+ pd->ud.canmove_tick = (int64) val;
+ break;
+ case UDT_STR:
+ pd->status.str = (unsigned short) val;
+ status->calc_misc(bl, &pd->status, pd->pet.level);
+ break;
+ case UDT_AGI:
+ pd->status.agi = (unsigned short) val;
+ status->calc_misc(bl, &pd->status, pd->pet.level);
+ break;
+ case UDT_VIT:
+ pd->status.vit = (unsigned short) val;
+ status->calc_misc(bl, &pd->status, pd->pet.level);
+ break;
+ case UDT_INT:
+ pd->status.int_ = (unsigned short) val;
+ status->calc_misc(bl, &pd->status, pd->pet.level);
+ break;
+ case UDT_DEX:
+ pd->status.dex = (unsigned short) val;
+ status->calc_misc(bl, &pd->status, pd->pet.level);
+ break;
+ case UDT_LUK:
+ pd->status.luk = (unsigned short) val;
+ status->calc_misc(bl, &pd->status, pd->pet.level);
+ break;
+ case UDT_ATKRANGE:
+ pd->status.rhw.range = (unsigned short) val;
+ break;
+ case UDT_ATKMIN:
+ pd->status.rhw.atk = (unsigned short) val;
+ break;
+ case UDT_ATKMAX:
+ pd->status.rhw.atk2 = (unsigned short) val;
+ break;
+ case UDT_MATKMIN:
+ pd->status.matk_min = (unsigned short) val;
+ break;
+ case UDT_MATKMAX:
+ pd->status.matk_max = (unsigned short) val;
+ break;
+ case UDT_DEF:
+ pd->status.def = (defType) val;
+ break;
+ case UDT_MDEF:
+ pd->status.mdef = (defType) val;
+ break;
+ case UDT_HIT:
+ pd->status.hit = (short) val;
+ break;
+ case UDT_FLEE:
+ pd->status.flee = (short) val;
+ break;
+ case UDT_PDODGE:
+ pd->status.flee2 = (short) val;
+ break;
+ case UDT_CRIT:
+ pd->status.cri = (short) val;
+ break;
+ case UDT_RACE:
+ pd->status.race = (unsigned char) val;
+ break;
+ case UDT_ELETYPE:
+ pd->status.def_ele = (unsigned char) val;
+ break;
+ case UDT_ELELEVEL:
+ pd->status.ele_lv = (unsigned char) val;
+ break;
+ case UDT_AMOTION:
+ pd->status.amotion = (unsigned short) val;
+ break;
+ case UDT_ADELAY:
+ pd->status.adelay = (unsigned short) val;
+ break;
+ case UDT_DMOTION:
+ pd->status.dmotion = (unsigned short) val;
+ break;
+ case UDT_INTIMACY:
+ pet->set_intimate(pd, val);
+ clif->send_petdata(pd->msd,pd,1,pd->pet.intimate);
+ break;
+ case UDT_HUNGER: pd->pet.hungry = (short) val;
+ break;
+ default:
+ ShowWarning("buildin_setunitdata: Invalid data type '%s' for pet unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ clif->send_petstatus(pd->msd); // send pet data
+ }
+ break;
+ case BL_MER:
+ {
+ struct mercenary_data *mc = BL_UCAST(BL_MER, bl);
+
+ nullpo_retr(false, mc);
+
+ switch (type)
+ {
+ case UDT_SIZE:
+ mc->base_status.size = (unsigned char) val;
+ break;
+ case UDT_HP:
+ status->set_hp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXHP:
+ mc->base_status.max_hp = (unsigned int) val;
+ break;
+ case UDT_SP:
+ status->set_sp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXSP:
+ mc->base_status.max_sp = (unsigned int) val;
+ break;
+ case UDT_MASTERCID:
+ mc->mercenary.char_id = (uint32) val;
+ break;
+ case UDT_MAPIDXY:
+ unit->warp(bl, (short) val, (short) val2, (short) val3, CLR_TELEPORT);
+ break;
+ case UDT_WALKTOXY:
+ if (!unit->walktoxy(bl, (short) val, (short) val2, 2))
+ unit->movepos(bl, (short) val, (short) val2, 0, 0);
+ break;
+ case UDT_SPEED:
+ mc->base_status.size = (unsigned char) val;
+ status->calc_misc(bl, &mc->base_status, mc->db->lv);
+ break;
+ case UDT_LOOKDIR:
+ unit->setdir(bl, (unsigned char) val);
+ break;
+ case UDT_CANMOVETICK:
+ mc->ud.canmove_tick = (int64) val;
+ break;
+ case UDT_STR:
+ mc->base_status.str = (unsigned short) val;
+ status->calc_misc(bl, &mc->base_status, mc->db->lv);
+ break;
+ case UDT_AGI:
+ mc->base_status.agi = (unsigned short) val;
+ status->calc_misc(bl, &mc->base_status, mc->db->lv);
+ break;
+ case UDT_VIT:
+ mc->base_status.vit = (unsigned short) val;
+ status->calc_misc(bl, &mc->base_status, mc->db->lv);
+ break;
+ case UDT_INT:
+ mc->base_status.int_ = (unsigned short) val;
+ status->calc_misc(bl, &mc->base_status, mc->db->lv);
+ break;
+ case UDT_DEX:
+ mc->base_status.dex = (unsigned short) val;
+ status->calc_misc(bl, &mc->base_status, mc->db->lv);
+ break;
+ case UDT_LUK:
+ mc->base_status.luk = (unsigned short) val;
+ status->calc_misc(bl, &mc->base_status, mc->db->lv);
+ break;
+ case UDT_ATKRANGE:
+ mc->base_status.rhw.range = (unsigned short) val;
+ break;
+ case UDT_ATKMIN:
+ mc->base_status.rhw.atk = (unsigned short) val;
+ break;
+ case UDT_ATKMAX:
+ mc->base_status.rhw.atk2 = (unsigned short) val;
+ break;
+ case UDT_MATKMIN:
+ mc->base_status.matk_min = (unsigned short) val;
+ break;
+ case UDT_MATKMAX:
+ mc->base_status.matk_max = (unsigned short) val;
+ break;
+ case UDT_DEF:
+ mc->base_status.def = (defType) val;
+ break;
+ case UDT_MDEF:
+ mc->base_status.mdef = (defType) val;
+ break;
+ case UDT_HIT:
+ mc->base_status.hit = (short) val;
+ break;
+ case UDT_FLEE:
+ mc->base_status.flee = (short) val;
+ break;
+ case UDT_PDODGE:
+ mc->base_status.flee2 = (short) val;
+ break;
+ case UDT_CRIT:
+ mc->base_status.cri = (short) val;
+ break;
+ case UDT_RACE:
+ mc->base_status.race = (unsigned char) val;
+ break;
+ case UDT_ELETYPE:
+ mc->base_status.def_ele = (unsigned char) val;
+ break;
+ case UDT_ELELEVEL:
+ mc->base_status.ele_lv = (unsigned char) val;
+ break;
+ case UDT_AMOTION:
+ mc->base_status.amotion = (unsigned short) val;
+ break;
+ case UDT_ADELAY:
+ mc->base_status.adelay = (unsigned short) val;
+ break;
+ case UDT_DMOTION:
+ mc->base_status.dmotion = (unsigned short) val;
+ break;
+ case UDT_MERC_KILLCOUNT:
+ mc->mercenary.kill_count = (unsigned int) val;
+ break;
+ case UDT_LIFETIME:
+ mc->mercenary.life_time = (unsigned int) val;
+ break;
+ default:
+ ShowWarning("buildin_setunitdata: Invalid data type '%s' for mercenary unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+
+ clif->mercenary_info(map->charid2sd(mc->mercenary.char_id));
+ clif->mercenary_skillblock(map->charid2sd(mc->mercenary.char_id));
+ }
+ break;
+ case BL_ELEM:
+ {
+ struct elemental_data *ed = BL_UCAST(BL_ELEM, bl);
+
+ nullpo_retr(false, ed);
+
+ switch (type)
+ {
+ case UDT_SIZE:
+ ed->base_status.size = (unsigned char) val;
+ break;
+ case UDT_HP:
+ status->set_hp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXHP:
+ ed->base_status.max_hp = (unsigned int) val;
+ break;
+ case UDT_SP:
+ status->set_sp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXSP:
+ ed->base_status.max_sp = (unsigned int) val;
+ break;
+ case UDT_MASTERCID:
+ ed->elemental.char_id = val;
+ break;
+ case UDT_MAPIDXY:
+ unit->warp(bl, (short) val, (short) val2, (short) val3, CLR_TELEPORT);
+ break;
+ case UDT_WALKTOXY:
+ if (!unit->walktoxy(bl, (short) val, (short) val2, 2))
+ unit->movepos(bl, (short) val, (short) val2, 0, 0);
+ break;
+ case UDT_SPEED:
+ ed->base_status.speed = (unsigned short) val;
+ status->calc_misc(bl, &ed->base_status, ed->db->lv);
+ break;
+ case UDT_LOOKDIR:
+ unit->setdir(bl, (unsigned char) val);
+ break;
+ case UDT_CANMOVETICK:
+ ed->ud.canmove_tick = (int64) val;
+ break;
+ case UDT_STR:
+ ed->base_status.str = (unsigned short) val;
+ status->calc_misc(bl, &ed->base_status, ed->db->lv);
+ break;
+ case UDT_AGI:
+ ed->base_status.agi = (unsigned short) val;
+ status->calc_misc(bl, &ed->base_status, ed->db->lv);
+ break;
+ case UDT_VIT:
+ ed->base_status.vit = (unsigned short) val;
+ status->calc_misc(bl, &ed->base_status, ed->db->lv);
+ break;
+ case UDT_INT:
+ ed->base_status.int_ = (unsigned short) val;
+ status->calc_misc(bl, &ed->base_status, ed->db->lv);
+ break;
+ case UDT_DEX:
+ ed->base_status.dex = (unsigned short) val;
+ status->calc_misc(bl, &ed->base_status, ed->db->lv);
+ break;
+ case UDT_LUK:
+ ed->base_status.luk = (unsigned short) val;
+ status->calc_misc(bl, &ed->base_status, ed->db->lv);
+ break;
+ case UDT_ATKRANGE:
+ ed->base_status.rhw.range = (unsigned short) val;
+ break;
+ case UDT_ATKMIN:
+ ed->base_status.rhw.atk = (unsigned short) val;
+ break;
+ case UDT_ATKMAX:
+ ed->base_status.rhw.atk2 = (unsigned short) val;
+ break;
+ case UDT_MATKMIN:
+ ed->base_status.matk_min = (unsigned short) val;
+ break;
+ case UDT_MATKMAX:
+ ed->base_status.matk_max = (unsigned short) val;
+ break;
+ case UDT_DEF:
+ ed->base_status.def = (defType) val;
+ break;
+ case UDT_MDEF:
+ ed->base_status.mdef = (defType) val;
+ break;
+ case UDT_HIT:
+ ed->base_status.hit = (short) val;
+ break;
+ case UDT_FLEE:
+ ed->base_status.flee = (short) val;
+ break;
+ case UDT_PDODGE:
+ ed->base_status.flee2 = (short) val;
+ break;
+ case UDT_CRIT:
+ ed->base_status.cri = (short) val;
+ break;
+ case UDT_RACE:
+ ed->base_status.race = (unsigned char) val;
+ break;
+ case UDT_ELETYPE:
+ ed->base_status.def_ele = (unsigned char) val;
+ break;
+ case UDT_ELELEVEL:
+ ed->base_status.ele_lv = (unsigned char) val;
+ break;
+ case UDT_AMOTION:
+ ed->base_status.amotion = (unsigned short) val;
+ break;
+ case UDT_ADELAY:
+ ed->base_status.adelay = (unsigned short) val;
+ break;
+ case UDT_DMOTION:
+ ed->base_status.dmotion = (unsigned short) val;
+ break;
+ case UDT_LIFETIME:
+ ed->elemental.life_time = (int) val;
+ break;
+ default:
+ ShowWarning("buildin_setunitdata: Invalid data type '%s' for elemental unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ clif->elemental_info(ed->master);
+ }
+ break;
+ case BL_NPC:
+ {
+ struct npc_data *nd = BL_UCAST(BL_NPC, bl);
+
+ nullpo_retr(false, nd);
+
+ switch (type)
+ {
+ case UDT_SIZE:
+ nd->status.size = (unsigned char) val;
+ break;
+ case UDT_LEVEL:
+ nd->level = (unsigned short) val;
+ break;
+ case UDT_HP:
+ status->set_hp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXHP:
+ nd->status.max_hp = (unsigned int) val;
+ break;
+ case UDT_SP:
+ status->set_sp(bl, (unsigned int) val, 0);
+ break;
+ case UDT_MAXSP:
+ nd->status.max_sp = (unsigned int) val;
+ break;
+ case UDT_MAPIDXY:
+ unit->warp(bl, (short) val, (short) val2, (short) val3, CLR_TELEPORT);
+ break;
+ case UDT_WALKTOXY:
+ if (!unit->walktoxy(bl, (short) val, (short) val2, 2))
+ unit->movepos(bl, (short) val, (short) val2, 0, 0);
+ break;
+ case UDT_CLASS:
+ npc->setclass(nd, (short) val);
+ break;
+ case UDT_SPEED:
+ nd->speed = (short) val;
+ status->calc_misc(bl, &nd->status, nd->level);
+ break;
+ case UDT_LOOKDIR:
+ unit->setdir(bl, (unsigned char) val);
+ break;
+ case UDT_STR:
+ nd->status.str = (unsigned short) val;
+ status->calc_misc(bl, &nd->status, nd->level);
+ break;
+ case UDT_AGI:
+ nd->status.agi = (unsigned short) val;
+ status->calc_misc(bl, &nd->status, nd->level);
+ break;
+ case UDT_VIT:
+ nd->status.vit = (unsigned short) val;
+ status->calc_misc(bl, &nd->status, nd->level);
+ break;
+ case UDT_INT:
+ nd->status.int_ = (unsigned short) val;
+ status->calc_misc(bl, &nd->status, nd->level);
+ break;
+ case UDT_DEX:
+ nd->status.dex = (unsigned short) val;
+ status->calc_misc(bl, &nd->status, nd->level);
+ break;
+ case UDT_LUK:
+ nd->status.luk = (unsigned short) val;
+ status->calc_misc(bl, &nd->status, nd->level);
+ break;
+ case UDT_STATPOINT:
+ nd->stat_point = (unsigned short) val;
+ break;
+ case UDT_ATKRANGE:
+ nd->status.rhw.range = (unsigned short) val;
+ break;
+ case UDT_ATKMIN:
+ nd->status.rhw.atk = (unsigned short) val;
+ break;
+ case UDT_ATKMAX:
+ nd->status.rhw.atk2 = (unsigned short) val;
+ break;
+ case UDT_MATKMIN:
+ nd->status.matk_min = (unsigned short) val;
+ break;
+ case UDT_MATKMAX:
+ nd->status.matk_max = (unsigned short) val;
+ break;
+ case UDT_DEF:
+ nd->status.def = (defType) val;
+ break;
+ case UDT_MDEF:
+ nd->status.mdef = (defType) val;
+ break;
+ case UDT_HIT:
+ nd->status.hit = (short) val;
+ break;
+ case UDT_FLEE:
+ nd->status.flee = (short) val;
+ break;
+ case UDT_PDODGE:
+ nd->status.flee2 = (short) val;
+ break;
+ case UDT_CRIT:
+ nd->status.cri = (short) val;
+ break;
+ case UDT_RACE:
+ nd->status.race = (unsigned char) val;
+ break;
+ case UDT_ELETYPE:
+ nd->status.def_ele = (unsigned char) val;
+ break;
+ case UDT_ELELEVEL:
+ nd->status.ele_lv = (unsigned char) val;
+ break;
+ case UDT_AMOTION:
+ nd->status.amotion = (unsigned short) val;
+ break;
+ case UDT_ADELAY:
+ nd->status.adelay = (unsigned short) val;
+ break;
+ case UDT_DMOTION:
+ nd->status.dmotion = (unsigned short) val;
+ break;
+ default:
+ ShowWarning("buildin_setunitdata: Invalid data type '%s' for NPC unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ }
+ break;
+ default:
+ ShowError("buildin_setunitdata: Unknown object!\n");
+ script_pushint(st, 0);
+ return false;
+ } // end of bl->type switch
+
+ script_pushint(st, 1);
+ return true;
+}
+
+/**
+ * Retrieves real-time data for a game object.
+ * Getunitdata <GUID>,<DataType>{,<Variable>}
+ * @param1 GUID Game object unique Id.
+ * @param2 DataType Type of Data to be set for the unit.
+ * @param3 Variable array reference to store data into. (used for UDT_MAPIDXY)
+ * @return 0 on failure, <value> on success
+ */
+BUILDIN(getunitdata)
+{
+ struct block_list *bl;
+ const char *udtype = NULL;
+ const struct map_session_data *sd = NULL;
+ int type = 0;
+ char* name = NULL;
+ struct script_data *data = script_hasdata(st,4)?script_getdata(st, 4):NULL;
+
+ bl = map->id2bl(script_getnum(st, 2));
+
+ if (bl == NULL) {
+ ShowWarning("buildin_getunitdata: Error in finding object with given GID %d!\n", script_getnum(st, 2));
+ script_pushint(st, 0);
+ return false;
+ }
+
+ type = script_getnum(st, 3);
+
+ /* Type check */
+ if (type < UDT_SIZE || type >= UDT_MAX) {
+ ShowError("buildin_getunitdata: Invalid unit data type %d provided.\n", type);
+ script_pushint(st, 0);
+ return false;
+ }
+
+ /* Argument checks */
+ if (type == UDT_MAPIDXY) {
+ if (data == NULL || !data_isreference(data)) {
+ ShowWarning("buildin_getunitdata: Error in argument 3. Please provide a reference variable to store values in.\n");
+ script_pushint(st, 0);
+ return false;
+ }
+
+ name = reference_getname(data);
+
+ if (not_server_variable(*name)) {
+ sd = script->rid2sd(st);
+ if (sd == NULL) {
+ ShowWarning("buildin_getunitdata: Player not attached! Cannot use player variable %s.\n",name);
+ script_pushint(st, 0);
+ return true;// no player attached
+ }
+ }
+ }
+
+#define getunitdata_sub(idx__,var__) script->setd_sub(st,NULL,name,(idx__),(void *)h64BPTRSIZE((int)(var__)),data->ref);
+
+ switch (bl->type) {
+ case BL_MOB:
+ {
+ const struct mob_data *md = BL_UCAST(BL_MOB, bl);
+
+ nullpo_retr(false, md);
+
+ switch (type)
+ {
+ case UDT_TYPE: script_pushint(st, BL_MOB); break;
+ case UDT_SIZE: script_pushint(st, md->status.size); break;
+ case UDT_LEVEL: script_pushint(st, md->level); break;
+ case UDT_HP: script_pushint(st, md->status.hp); break;
+ case UDT_MAXHP: script_pushint(st, md->status.max_hp); break;
+ case UDT_SP: script_pushint(st, md->status.sp); break;
+ case UDT_MAXSP: script_pushint(st, md->status.max_sp); break;
+ case UDT_MAPIDXY:
+ getunitdata_sub(0, md->bl.m);
+ getunitdata_sub(1, md->bl.x);
+ getunitdata_sub(2, md->bl.y);
+ break;
+ case UDT_SPEED: script_pushint(st, md->status.speed); break;
+ case UDT_MODE: script_pushint(st, md->status.mode); break;
+ case UDT_AI: script_pushint(st, md->special_state.ai); break;
+ case UDT_SCOPTION: script_pushint(st, md->sc.option); break;
+ case UDT_SEX: script_pushint(st, md->vd->sex); break;
+ case UDT_CLASS: script_pushint(st, md->vd->class); break;
+ case UDT_HAIRSTYLE: script_pushint(st, md->vd->hair_style); break;
+ case UDT_HAIRCOLOR: script_pushint(st, md->vd->hair_color); break;
+ case UDT_HEADBOTTOM: script_pushint(st, md->vd->head_bottom); break;
+ case UDT_HEADMIDDLE: script_pushint(st, md->vd->head_mid); break;
+ case UDT_HEADTOP: script_pushint(st, md->vd->head_top); break;
+ case UDT_CLOTHCOLOR: script_pushint(st, md->vd->cloth_color); break;
+ case UDT_SHIELD: script_pushint(st, md->vd->shield); break;
+ case UDT_WEAPON: script_pushint(st, md->vd->weapon); break;
+ case UDT_LOOKDIR: script_pushint(st, md->ud.dir); break;
+ case UDT_CANMOVETICK: script_pushint(st, md->ud.canmove_tick); break;
+ case UDT_STR: script_pushint(st, md->status.str); break;
+ case UDT_AGI: script_pushint(st, md->status.agi); break;
+ case UDT_VIT: script_pushint(st, md->status.vit); break;
+ case UDT_INT: script_pushint(st, md->status.int_); break;
+ case UDT_DEX: script_pushint(st, md->status.dex); break;
+ case UDT_LUK: script_pushint(st, md->status.luk); break;
+ case UDT_ATKRANGE: script_pushint(st, md->status.rhw.range); break;
+ case UDT_ATKMIN: script_pushint(st, md->status.rhw.atk); break;
+ case UDT_ATKMAX: script_pushint(st, md->status.rhw.atk2); break;
+ case UDT_MATKMIN: script_pushint(st, md->status.matk_min); break;
+ case UDT_MATKMAX: script_pushint(st, md->status.matk_max); break;
+ case UDT_DEF: script_pushint(st, md->status.def); break;
+ case UDT_MDEF: script_pushint(st, md->status.mdef); break;
+ case UDT_HIT: script_pushint(st, md->status.hit); break;
+ case UDT_FLEE: script_pushint(st, md->status.flee); break;
+ case UDT_PDODGE: script_pushint(st, md->status.flee2); break;
+ case UDT_CRIT: script_pushint(st, md->status.cri); break;
+ case UDT_RACE: script_pushint(st, md->status.race); break;
+ case UDT_ELETYPE: script_pushint(st, md->status.def_ele); break;
+ case UDT_ELELEVEL: script_pushint(st, md->status.ele_lv); break;
+ case UDT_AMOTION: script_pushint(st, md->status.amotion); break;
+ case UDT_ADELAY: script_pushint(st, md->status.adelay); break;
+ case UDT_DMOTION: script_pushint(st, md->status.dmotion); break;
+ default:
+ ShowWarning("buildin_getunitdata: Invalid data type '%s' for Mob unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ }
+ break;
+ case BL_HOM:
+ {
+ const struct homun_data *hd = BL_UCAST(BL_HOM, bl);
+
+ nullpo_retr(false, hd);
+
+ switch (type)
+ {
+ case UDT_TYPE: script_pushint(st, BL_HOM); break;
+ case UDT_SIZE: script_pushint(st, hd->base_status.size); break;
+ case UDT_LEVEL: script_pushint(st, hd->homunculus.level); break;
+ case UDT_HP: script_pushint(st, hd->base_status.hp); break;
+ case UDT_MAXHP: script_pushint(st, hd->base_status.max_hp); break;
+ case UDT_SP: script_pushint(st, hd->base_status.sp); break;
+ case UDT_MAXSP: script_pushint(st, hd->base_status.max_sp); break;
+ case UDT_MAPIDXY:
+ getunitdata_sub(0, hd->bl.m);
+ getunitdata_sub(1, hd->bl.x);
+ getunitdata_sub(2, hd->bl.y);
+ break;
+ case UDT_SPEED: script_pushint(st, hd->base_status.speed); break;
+ case UDT_LOOKDIR: script_pushint(st, hd->ud.dir); break;
+ case UDT_CANMOVETICK: script_pushint(st, hd->ud.canmove_tick); break;
+ case UDT_MODE: script_pushint(st, hd->base_status.mode); break;
+ case UDT_STR: script_pushint(st, hd->base_status.str); break;
+ case UDT_AGI: script_pushint(st, hd->base_status.agi); break;
+ case UDT_VIT: script_pushint(st, hd->base_status.vit); break;
+ case UDT_INT: script_pushint(st, hd->base_status.int_); break;
+ case UDT_DEX: script_pushint(st, hd->base_status.dex); break;
+ case UDT_LUK: script_pushint(st, hd->base_status.luk); break;
+ case UDT_ATKRANGE: script_pushint(st, hd->base_status.rhw.range); break;
+ case UDT_ATKMIN: script_pushint(st, hd->base_status.rhw.atk); break;
+ case UDT_ATKMAX: script_pushint(st, hd->base_status.rhw.atk2); break;
+ case UDT_MATKMIN: script_pushint(st, hd->base_status.matk_min); break;
+ case UDT_MATKMAX: script_pushint(st, hd->base_status.matk_max); break;
+ case UDT_DEF: script_pushint(st, hd->base_status.def); break;
+ case UDT_MDEF: script_pushint(st, hd->base_status.mdef); break;
+ case UDT_HIT: script_pushint(st, hd->base_status.hit); break;
+ case UDT_FLEE: script_pushint(st, hd->base_status.flee); break;
+ case UDT_PDODGE: script_pushint(st, hd->base_status.flee2); break;
+ case UDT_CRIT: script_pushint(st, hd->base_status.cri); break;
+ case UDT_RACE: script_pushint(st, hd->base_status.race); break;
+ case UDT_ELETYPE: script_pushint(st, hd->base_status.def_ele); break;
+ case UDT_ELELEVEL: script_pushint(st, hd->base_status.ele_lv); break;
+ case UDT_AMOTION: script_pushint(st, hd->base_status.amotion); break;
+ case UDT_ADELAY: script_pushint(st, hd->base_status.adelay); break;
+ case UDT_DMOTION: script_pushint(st, hd->base_status.dmotion); break;
+ case UDT_MASTERCID: script_pushint(st, hd->homunculus.char_id); break;
+ case UDT_HUNGER: script_pushint(st, hd->homunculus.hunger); break;
+ case UDT_INTIMACY: script_pushint(st, hd->homunculus.intimacy); break;
+ default:
+ ShowWarning("buildin_getunitdata: Invalid data type '%s' for Homunculus unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ }
+ break;
+ case BL_PET:
+ {
+ const struct pet_data *pd = BL_UCAST(BL_PET, bl);
+
+ nullpo_retr(false, pd);
+
+ switch (type)
+ {
+ case UDT_TYPE: script_pushint(st, BL_PET); break;
+ case UDT_SIZE: script_pushint(st, pd->status.size); break;
+ case UDT_LEVEL: script_pushint(st, pd->pet.level); break;
+ case UDT_HP: script_pushint(st, pd->status.hp); break;
+ case UDT_MAXHP: script_pushint(st, pd->status.max_hp); break;
+ case UDT_SP: script_pushint(st, pd->status.sp); break;
+ case UDT_MAXSP: script_pushint(st, pd->status.max_sp); break;
+ case UDT_MAPIDXY:
+ getunitdata_sub(0, pd->bl.m);
+ getunitdata_sub(1, pd->bl.x);
+ getunitdata_sub(2, pd->bl.y);
+ break;
+ case UDT_SPEED: script_pushint(st, pd->status.speed); break;
+ case UDT_LOOKDIR: script_pushint(st, pd->ud.dir); break;
+ case UDT_CANMOVETICK: script_pushint(st, pd->ud.canmove_tick); break;
+ case UDT_MODE: script_pushint(st, pd->status.mode); break;
+ case UDT_STR: script_pushint(st, pd->status.str); break;
+ case UDT_AGI: script_pushint(st, pd->status.agi); break;
+ case UDT_VIT: script_pushint(st, pd->status.vit); break;
+ case UDT_INT: script_pushint(st, pd->status.int_); break;
+ case UDT_DEX: script_pushint(st, pd->status.dex); break;
+ case UDT_LUK: script_pushint(st, pd->status.luk); break;
+ case UDT_ATKRANGE: script_pushint(st, pd->status.rhw.range); break;
+ case UDT_ATKMIN: script_pushint(st, pd->status.rhw.atk); break;
+ case UDT_ATKMAX: script_pushint(st, pd->status.rhw.atk2); break;
+ case UDT_MATKMIN: script_pushint(st, pd->status.matk_min); break;
+ case UDT_MATKMAX: script_pushint(st, pd->status.matk_max); break;
+ case UDT_DEF: script_pushint(st, pd->status.def); break;
+ case UDT_MDEF: script_pushint(st, pd->status.mdef); break;
+ case UDT_HIT: script_pushint(st, pd->status.hit); break;
+ case UDT_FLEE: script_pushint(st, pd->status.flee); break;
+ case UDT_PDODGE: script_pushint(st, pd->status.flee2); break;
+ case UDT_CRIT: script_pushint(st, pd->status.cri); break;
+ case UDT_RACE: script_pushint(st, pd->status.race); break;
+ case UDT_ELETYPE: script_pushint(st, pd->status.def_ele); break;
+ case UDT_ELELEVEL: script_pushint(st, pd->status.ele_lv); break;
+ case UDT_AMOTION: script_pushint(st, pd->status.amotion); break;
+ case UDT_ADELAY: script_pushint(st, pd->status.adelay); break;
+ case UDT_DMOTION: script_pushint(st, pd->status.dmotion); break;
+ case UDT_MASTERAID: script_pushint(st, pd->pet.account_id); break;
+ case UDT_HUNGER: script_pushint(st, pd->pet.hungry); break;
+ case UDT_INTIMACY: script_pushint(st, pd->pet.intimate); break;
+ default:
+ ShowWarning("buildin_getunitdata: Invalid data type '%s' for Pet unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ }
+ break;
+ case BL_MER:
+ {
+ const struct mercenary_data *mc = BL_UCAST(BL_MER, bl);
+
+ nullpo_retr(false, mc);
+
+ switch (type)
+ {
+ case UDT_TYPE: script_pushint(st, BL_MER); break;
+ case UDT_SIZE: script_pushint(st, mc->base_status.size); break;
+ case UDT_HP: script_pushint(st, mc->base_status.hp); break;
+ case UDT_MAXHP: script_pushint(st, mc->base_status.max_hp); break;
+ case UDT_SP: script_pushint(st, mc->base_status.sp); break;
+ case UDT_MAXSP: script_pushint(st, mc->base_status.max_sp); break;
+ case UDT_MAPIDXY:
+ getunitdata_sub(0, mc->bl.m);
+ getunitdata_sub(1, mc->bl.x);
+ getunitdata_sub(2, mc->bl.y);
+ break;
+ case UDT_SPEED: script_pushint(st, mc->base_status.speed); break;
+ case UDT_LOOKDIR: script_pushint(st, mc->ud.dir); break;
+ case UDT_CANMOVETICK: script_pushint(st, mc->ud.canmove_tick); break;
+ case UDT_MODE: script_pushint(st, mc->base_status.mode); break;
+ case UDT_STR: script_pushint(st, mc->base_status.str); break;
+ case UDT_AGI: script_pushint(st, mc->base_status.agi); break;
+ case UDT_VIT: script_pushint(st, mc->base_status.vit); break;
+ case UDT_INT: script_pushint(st, mc->base_status.int_); break;
+ case UDT_DEX: script_pushint(st, mc->base_status.dex); break;
+ case UDT_LUK: script_pushint(st, mc->base_status.luk); break;
+ case UDT_ATKRANGE: script_pushint(st, mc->base_status.rhw.range); break;
+ case UDT_ATKMIN: script_pushint(st, mc->base_status.rhw.atk); break;
+ case UDT_ATKMAX: script_pushint(st, mc->base_status.rhw.atk2); break;
+ case UDT_MATKMIN: script_pushint(st, mc->base_status.matk_min); break;
+ case UDT_MATKMAX: script_pushint(st, mc->base_status.matk_max); break;
+ case UDT_DEF: script_pushint(st, mc->base_status.def); break;
+ case UDT_MDEF: script_pushint(st, mc->base_status.mdef); break;
+ case UDT_HIT: script_pushint(st, mc->base_status.hit); break;
+ case UDT_FLEE: script_pushint(st, mc->base_status.flee); break;
+ case UDT_PDODGE: script_pushint(st, mc->base_status.flee2); break;
+ case UDT_CRIT: script_pushint(st, mc->base_status.cri); break;
+ case UDT_RACE: script_pushint(st, mc->base_status.race); break;
+ case UDT_ELETYPE: script_pushint(st, mc->base_status.def_ele); break;
+ case UDT_ELELEVEL: script_pushint(st, mc->base_status.ele_lv); break;
+ case UDT_AMOTION: script_pushint(st, mc->base_status.amotion); break;
+ case UDT_ADELAY: script_pushint(st, mc->base_status.adelay); break;
+ case UDT_DMOTION: script_pushint(st, mc->base_status.dmotion); break;
+ case UDT_MASTERCID: script_pushint(st, mc->mercenary.char_id); break;
+ case UDT_MERC_KILLCOUNT: script_pushint(st, mc->mercenary.kill_count); break;
+ case UDT_LIFETIME: script_pushint(st, mc->mercenary.life_time); break;
+ default:
+ ShowWarning("buildin_getunitdata: Invalid data type '%s' for Mercenary unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ }
+ break;
+ case BL_ELEM:
+ {
+ const struct elemental_data *ed = BL_UCAST(BL_ELEM, bl);
+
+ nullpo_retr(false, ed);
+
+ switch (type)
+ {
+ case UDT_TYPE: script_pushint(st, BL_ELEM); break;
+ case UDT_SIZE: script_pushint(st, ed->base_status.size); break;
+ case UDT_HP: script_pushint(st, ed->base_status.hp); break;
+ case UDT_MAXHP: script_pushint(st, ed->base_status.max_hp); break;
+ case UDT_SP: script_pushint(st, ed->base_status.sp); break;
+ case UDT_MAXSP: script_pushint(st, ed->base_status.max_sp); break;
+ case UDT_MAPIDXY:
+ getunitdata_sub(0, ed->bl.m);
+ getunitdata_sub(1, ed->bl.x);
+ getunitdata_sub(2, ed->bl.y);
+ break;
+ case UDT_SPEED: script_pushint(st, ed->base_status.speed); break;
+ case UDT_LOOKDIR: script_pushint(st, ed->ud.dir); break;
+ case UDT_CANMOVETICK: script_pushint(st, ed->ud.canmove_tick); break;
+ case UDT_MODE: script_pushint(st, ed->base_status.mode); break;
+ case UDT_STR: script_pushint(st, ed->base_status.str); break;
+ case UDT_AGI: script_pushint(st, ed->base_status.agi); break;
+ case UDT_VIT: script_pushint(st, ed->base_status.vit); break;
+ case UDT_INT: script_pushint(st, ed->base_status.int_); break;
+ case UDT_DEX: script_pushint(st, ed->base_status.dex); break;
+ case UDT_LUK: script_pushint(st, ed->base_status.luk); break;
+ case UDT_ATKRANGE: script_pushint(st, ed->base_status.rhw.range); break;
+ case UDT_ATKMIN: script_pushint(st, ed->base_status.rhw.atk); break;
+ case UDT_ATKMAX: script_pushint(st, ed->base_status.rhw.atk2); break;
+ case UDT_MATKMIN: script_pushint(st, ed->base_status.matk_min); break;
+ case UDT_MATKMAX: script_pushint(st, ed->base_status.matk_max); break;
+ case UDT_DEF: script_pushint(st, ed->base_status.def); break;
+ case UDT_MDEF: script_pushint(st, ed->base_status.mdef); break;
+ case UDT_HIT: script_pushint(st, ed->base_status.hit); break;
+ case UDT_FLEE: script_pushint(st, ed->base_status.flee); break;
+ case UDT_PDODGE: script_pushint(st, ed->base_status.flee2); break;
+ case UDT_CRIT: script_pushint(st, ed->base_status.cri); break;
+ case UDT_RACE: script_pushint(st, ed->base_status.race); break;
+ case UDT_ELETYPE: script_pushint(st, ed->base_status.def_ele); break;
+ case UDT_ELELEVEL: script_pushint(st, ed->base_status.ele_lv); break;
+ case UDT_AMOTION: script_pushint(st, ed->base_status.amotion); break;
+ case UDT_ADELAY: script_pushint(st, ed->base_status.adelay); break;
+ case UDT_DMOTION: script_pushint(st, ed->base_status.dmotion); break;
+ case UDT_MASTERCID: script_pushint(st, ed->elemental.char_id); break;
+ default:
+ ShowWarning("buildin_getunitdata: Invalid data type '%s' for Elemental unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ }
+ break;
+ case BL_NPC:
+ {
+ const struct npc_data *nd = BL_UCAST(BL_NPC, bl);
+
+ nullpo_retr(false, nd);
+
+ switch (type)
+ {
+ case UDT_TYPE: script_pushint(st, BL_NPC); break;
+ case UDT_SIZE: script_pushint(st, nd->status.size); break;
+ case UDT_HP: script_pushint(st, nd->status.hp); break;
+ case UDT_MAXHP: script_pushint(st, nd->status.max_hp); break;
+ case UDT_SP: script_pushint(st, nd->status.sp); break;
+ case UDT_MAXSP: script_pushint(st, nd->status.max_sp); break;
+ case UDT_MAPIDXY:
+ getunitdata_sub(0, bl->m);
+ getunitdata_sub(1, bl->x);
+ getunitdata_sub(2, bl->y);
+ break;
+ case UDT_SPEED: script_pushint(st, nd->status.speed); break;
+ case UDT_LOOKDIR: script_pushint(st, nd->ud->dir); break;
+ case UDT_CANMOVETICK: script_pushint(st, nd->ud->canmove_tick); break;
+ case UDT_MODE: script_pushint(st, nd->status.mode); break;
+ case UDT_STR: script_pushint(st, nd->status.str); break;
+ case UDT_AGI: script_pushint(st, nd->status.agi); break;
+ case UDT_VIT: script_pushint(st, nd->status.vit); break;
+ case UDT_INT: script_pushint(st, nd->status.int_); break;
+ case UDT_DEX: script_pushint(st, nd->status.dex); break;
+ case UDT_LUK: script_pushint(st, nd->status.luk); break;
+ case UDT_ATKRANGE: script_pushint(st, nd->status.rhw.range); break;
+ case UDT_ATKMIN: script_pushint(st, nd->status.rhw.atk); break;
+ case UDT_ATKMAX: script_pushint(st, nd->status.rhw.atk2); break;
+ case UDT_MATKMIN: script_pushint(st, nd->status.matk_min); break;
+ case UDT_MATKMAX: script_pushint(st, nd->status.matk_max); break;
+ case UDT_DEF: script_pushint(st, nd->status.def); break;
+ case UDT_MDEF: script_pushint(st, nd->status.mdef); break;
+ case UDT_HIT: script_pushint(st, nd->status.hit); break;
+ case UDT_FLEE: script_pushint(st, nd->status.flee); break;
+ case UDT_PDODGE: script_pushint(st, nd->status.flee2); break;
+ case UDT_CRIT: script_pushint(st, nd->status.cri); break;
+ case UDT_RACE: script_pushint(st, nd->status.race); break;
+ case UDT_ELETYPE: script_pushint(st, nd->status.def_ele); break;
+ case UDT_ELELEVEL: script_pushint(st, nd->status.ele_lv); break;
+ case UDT_AMOTION: script_pushint(st, nd->status.amotion); break;
+ case UDT_ADELAY: script_pushint(st, nd->status.adelay); break;
+ case UDT_DMOTION: script_pushint(st, nd->status.dmotion); break;
+ default:
+ ShowWarning("buildin_getunitdata: Invalid data type '%s' for NPC unit.\n", udtype);
+ script_pushint(st, 0);
+ return false;
+ }
+ }
+ break;
+ default:
+ ShowError("buildin_getunitdata: Unknown object!\n");
+ script_pushint(st, 0);
+ return false;
+ } // end of bl->type switch
+
+#undef getunitdata_sub
+
+ return false;
+}
+
+/**
+ * Gets the name of a Unit.
+ * Supported types are [MOB|HOM|PET|NPC].
+ * MER and ELEM don't support custom names.
+ *
+ * @command getunitname <GUID>;
+ * @param GUID Game Object Unique ID.
+ * @return boolean or Name of the game object.
+ */
+BUILDIN(getunitname)
+{
+ const struct block_list* bl = NULL;
+
+ bl = map->id2bl(script_getnum(st, 2));
+
+ if (bl == NULL) {
+ ShowWarning("buildin_getunitname: Error in finding object with given game ID %d!\n", script_getnum(st, 2));
+ script_pushconststr(st, "Unknown");
+ return false;
+ }
+
+ script_pushstrcopy(st, status->get_name(bl));
+
+ return true;
+}
+
+/**
+ * Changes the name of a bl.
+ * Supported types are [MOB|HOM|PET].
+ * For NPC see 'setnpcdisplay', MER and ELEM don't support custom names.
+ *
+ * @command setunitname <GUID>,<name>;
+ * @param GUID Game object unique ID.
+ * @param Name as string.
+ * @return boolean.
+ */
+BUILDIN(setunitname)
+{
+ struct block_list* bl = map->id2bl(script_getnum(st, 2));
+
+ if (bl == NULL) {
+ ShowWarning("buildin_setunitname: Game object with ID %d was not found!\n", script_getnum(st, 2));
+ script_pushint(st, 0);
+ return false;
+ }
+
+ switch (bl->type) {
+ case BL_MOB:
+ {
+ struct mob_data *md = BL_UCAST(BL_MOB, bl);
+ if (md == NULL) {
+ ShowWarning("buildin_setunitname: Error in finding object BL_MOB!\n");
+ script_pushint(st, 0);
+ return false;
+ }
+ safestrncpy(md->name, script_getstr(st, 3), NAME_LENGTH);
+ }
+ break;
+ case BL_HOM:
+ {
+ struct homun_data *hd = BL_UCAST(BL_HOM, bl);
+ if (hd == NULL) {
+ ShowWarning("buildin_setunitname: Error in finding object BL_HOM!\n");
+ script_pushint(st, 0);
+ return false;
+ }
+ safestrncpy(hd->homunculus.name, script_getstr(st, 3), NAME_LENGTH);
+ }
+ break;
+ case BL_PET:
+ {
+ struct pet_data *pd = BL_UCAST(BL_PET, bl);
+ if (pd == NULL) {
+ ShowWarning("buildin_setunitname: Error in finding object BL_PET!\n");
+ script_pushint(st, 0);
+ return false;
+ }
+ safestrncpy(pd->pet.name, script_getstr(st, 3), NAME_LENGTH);
+ }
+ break;
+ default:
+ script_pushint(st, 0);
+ ShowWarning("buildin_setunitname: Unknown object type!\n");
+ return false;
+ }
+
+ script_pushint(st, 1);
+ clif->charnameack(0, bl); // Send update to client.
+
+ return true;
+}
+
/// Makes the unit walk to target position or target id
/// Returns if it was successfull
///
@@ -21857,6 +23452,11 @@ void script_parse_builtin(void) {
// <--- [zBuffer] List of player cont commands
// [zBuffer] List of mob control commands --->
BUILDIN_DEF(getunittype,"i"),
+ /* Unit Data */
+ BUILDIN_DEF(setunitdata,"iiv??"),
+ BUILDIN_DEF(getunitdata,"ii?"),
+ BUILDIN_DEF(getunitname,"i"),
+ BUILDIN_DEF(setunitname,"is"),
BUILDIN_DEF(unitwalk,"ii?"),
BUILDIN_DEF(unitkill,"i"),
BUILDIN_DEF(unitwarp,"isii"),
diff --git a/src/map/script.h b/src/map/script.h
index 0c967a94e..8caec961a 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -350,6 +350,81 @@ enum navigation_service {
};
/**
+ * Unit Types for script handling.
+ */
+enum script_unit_types {
+ UNIT_PC = 0,
+ UNIT_NPC,
+ UNIT_PET,
+ UNIT_MOB,
+ UNIT_HOM,
+ UNIT_MER,
+ UNIT_ELEM,
+};
+
+/**
+ * Unit Data Types for script handling.
+ */
+enum script_unit_data_types {
+ UDT_TYPE = 0,
+ UDT_SIZE,
+ UDT_LEVEL,
+ UDT_HP,
+ UDT_MAXHP,
+ UDT_SP,
+ UDT_MAXSP,
+ UDT_MASTERAID,
+ UDT_MASTERCID,
+ UDT_MAPIDXY,
+ UDT_WALKTOXY,
+ UDT_SPEED,
+ UDT_MODE,
+ UDT_AI,
+ UDT_SCOPTION,
+ UDT_SEX,
+ UDT_CLASS,
+ UDT_HAIRSTYLE,
+ UDT_HAIRCOLOR,
+ UDT_HEADBOTTOM,
+ UDT_HEADMIDDLE,
+ UDT_HEADTOP,
+ UDT_CLOTHCOLOR,
+ UDT_SHIELD,
+ UDT_WEAPON,
+ UDT_LOOKDIR,
+ UDT_CANMOVETICK,
+ UDT_STR,
+ UDT_AGI,
+ UDT_VIT,
+ UDT_INT,
+ UDT_DEX,
+ UDT_LUK,
+ UDT_ATKRANGE,
+ UDT_ATKMIN,
+ UDT_ATKMAX,
+ UDT_MATKMIN,
+ UDT_MATKMAX,
+ UDT_DEF,
+ UDT_MDEF,
+ UDT_HIT,
+ UDT_FLEE,
+ UDT_PDODGE,
+ UDT_CRIT,
+ UDT_RACE,
+ UDT_ELETYPE,
+ UDT_ELELEVEL,
+ UDT_AMOTION,
+ UDT_ADELAY,
+ UDT_DMOTION,
+ UDT_HUNGER,
+ UDT_INTIMACY,
+ UDT_LIFETIME,
+ UDT_MERC_KILLCOUNT,
+ UDT_STATPOINT,
+ UDT_MAX
+};
+
+/**
* Structures
**/
diff --git a/src/map/status.h b/src/map/status.h
index 6f68c36c3..06e7e07b8 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -1759,10 +1759,10 @@ enum si_type {
//SI_HEALTHSTATE_HEAVYPOISON = 890,
//SI_HEALTHSTATE_FEAR = 891,
//SI_CHERRY_BLOSSOM_CAKE = 892,
- SI_SU_STOOP = 893,
- SI_CATNIPPOWDER = 894,
+ SI_SU_STOOP = 893,
+ SI_CATNIPPOWDER = 894,
SI_BLOSSOM_FLUTTERING = 895,
- SI_SV_ROOTTWIST = 896,
+ SI_SV_ROOTTWIST = 896,
//SI_ATTACK_PROPERTY_NOTHING = 897,
//SI_ATTACK_PROPERTY_WATER = 898,
//SI_ATTACK_PROPERTY_GROUND = 899,
@@ -1784,11 +1784,11 @@ enum si_type {
//SI_RESIST_PROPERTY_DARKNESS = 914,
//SI_RESIST_PROPERTY_TELEKINESIS = 915,
//SI_RESIST_PROPERTY_UNDEAD = 916,
- SI_BITESCAR = 917,
- SI_ARCLOUSEDASH = 918,
- SI_TUNAPARTY = 919,
- SI_SHRIMP = 920,
- SI_FRESHSHRIMP = 921,
+ SI_BITESCAR = 917,
+ SI_ARCLOUSEDASH = 918,
+ SI_TUNAPARTY = 919,
+ SI_SHRIMP = 920,
+ SI_FRESHSHRIMP = 921,
//SI_PERIOD_RECEIVEITEM = 922,
//SI_PERIOD_PLUSEXP = 923,
//SI_PERIOD_PLUSJOBEXP = 924,
@@ -1800,14 +1800,78 @@ enum si_type {
//SI_HELM_ISIA = 930,
//SI_HELM_ASIR = 931,
//SI_HELM_URJ = 932,
- SI_SUHIDE = 933,
+ SI_SUHIDE = 933,
//SI_ = 934,
//SI_DORAM_BUF_01 = 935,
//SI_DORAM_BUF_02 = 936,
- SI_SPRITEMABLE = 937,
+ SI_SPRITEMABLE = 937,
+ //SI_AID_PERIOD_RECEIVEITEM = 938,
+ //SI_AID_PERIOD_PLUSEXP = 939,
+ //SI_AID_PERIOD_PLUSJOBEXP = 940,
+ //SI_AID_PERIOD_DEADPENALTY = 941,
+ //SI_AID_PERIOD_ADDSTOREITEMCOUNT = 942,
+ //SI_ = 943,
+ //SI_ = 944,
+ //SI_ = 945,
+ //SI_ = 946,
+ //SI_ = 947,
+ //SI_ = 948,
+ //SI_ = 949,
+ //SI_HISS = 950,
+ //SI_ = 951,
+ //SI_NYANGGRASS = 952,
+ //SI_CHATTERING = 953,
+ //SI_ = 954,
+ //SI_ = 955,
+ //SI_ = 956,
+ //SI_ = 957,
+ //SI_ = 958,
+ //SI_ = 959,
+ //SI_ = 960,
+ //SI_GROOMING = 961,
+ //SI_PROTECTIONOFSHRIMP = 962,
//SI_EP16_2_BUFF_SS = 963,
//SI_EP16_2_BUFF_SC = 964,
//SI_EP16_2_BUFF_AC = 965,
+ //SI_GS_MAGICAL_BULLET = 966,
+ //SI_ = 967,
+ //SI_ = 968,
+ //SI_ = 969,
+ //SI_ = 970,
+ //SI_ = 971,
+ //SI_ = 972,
+ //SI_ = 973,
+ //SI_ = 974,
+ //SI_ = 975,
+ //SI_FALLEN_ANGEL = 976,
+ //SI_ = 977,
+ //SI_ = 978,
+ //SI_BLAZE_BEAD = 979,
+ //SI_FROZEN_BEAD = 980,
+ //SI_BREEZE_BEAD = 981,
+ //SI_ = 982,
+ //SI_AID_PERIOD_RECEIVEITEM_2ND = 983,
+ //SI_AID_PERIOD_PLUSEXP_2ND = 984,
+ //SI_AID_PERIOD_PLUSJOBEXP_2ND = 985,
+ //SI_PRONTERA_JP = 986,
+ //SI_ = 987,
+ //SI_GLOOM_CARD = 988,
+ //SI_PHARAOH_CARD = 989,
+ //SI_KIEL_CARD = 990,
+ //SI_ = 991,
+ //SI_CHEERUP = 992,
+ //SI_ = 993,
+ //SI_ = 994,
+ //SI_S_MANAPOTION = 995,
+ //SI_M_DEFSCROLL = 996,
+ //SI_ = 997,
+ //SI_ = 998,
+ //SI_ = 999,
+ //SI_AS_RAGGED_GOLEM_CARD = 1000,
+ //SI_LHZ_DUN_N1 = 1001,
+ //SI_LHZ_DUN_N2 = 1002,
+ //SI_LHZ_DUN_N3 = 1003,
+ //SI_LHZ_DUN_N4 = 1004,
#ifndef SI_MAX
SI_MAX,
#endif