diff options
-rw-r--r-- | conf/messages.conf | 3 | ||||
-rw-r--r-- | db/constants.conf | 113 | ||||
-rw-r--r-- | db/pre-re/item_db.conf | 152 | ||||
-rw-r--r-- | db/pre-re/skill_db.conf | 1 | ||||
-rw-r--r-- | db/re/item_db.conf | 131 | ||||
-rw-r--r-- | db/re/skill_db.conf | 1 | ||||
-rw-r--r-- | doc/constants.md | 44 | ||||
-rw-r--r-- | doc/script_commands.txt | 146 | ||||
-rw-r--r-- | sql-files/item_db.sql | 50 | ||||
-rw-r--r-- | sql-files/item_db_re.sql | 50 | ||||
-rw-r--r-- | src/map/clif.c | 29 | ||||
-rw-r--r-- | src/map/clif.h | 1 | ||||
-rw-r--r-- | src/map/itemdb.h | 50 | ||||
-rw-r--r-- | src/map/npc.h | 3 | ||||
-rw-r--r-- | src/map/packets.h | 311 | ||||
-rw-r--r-- | src/map/pc.c | 42 | ||||
-rw-r--r-- | src/map/script.c | 1600 | ||||
-rw-r--r-- | src/map/script.h | 75 | ||||
-rw-r--r-- | src/map/status.h | 84 |
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 |