From 06d22fa009b313a51511c2c54a99006627fb91c4 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Wed, 28 Feb 2018 19:21:03 -0500 Subject: [PATCH] Identify the rest of Action/CombatDamage structs --- common/eq_packet_structs.h | 33 ++++++++-------- common/patches/rof.cpp | 31 ++++++++------- common/patches/rof2.cpp | 31 ++++++++------- common/patches/rof2_structs.h | 52 +++++++++++------------- common/patches/rof_structs.h | 52 +++++++++++------------- common/patches/sod.cpp | 15 ++++--- common/patches/sod_structs.h | 65 ++++++++++++++---------------- common/patches/sof.cpp | 15 ++++--- common/patches/sof_structs.h | 66 +++++++++++++++---------------- common/patches/titanium.cpp | 11 ++++-- common/patches/titanium_structs.h | 28 ++++++------- common/patches/uf.cpp | 39 +++++++----------- common/patches/uf_structs.h | 59 +++++++++++++-------------- zone/attack.cpp | 6 +-- zone/spell_effects.cpp | 18 ++++----- zone/spells.cpp | 28 ++++++------- zone/trap.cpp | 2 +- 17 files changed, 261 insertions(+), 290 deletions(-) diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index cc06ecf15..fd09f4d56 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -1253,21 +1253,22 @@ struct Action_Struct { /* 00 */ uint16 target; // id of target /* 02 */ uint16 source; // id of caster - /* 04 */ uint16 level; // level of caster - /* 06 */ uint16 instrument_mod; - /* 08 */ uint32 bard_focus_id; - /* 12 */ uint16 unknown16; -// some kind of sequence that's the same in both actions -// as well as the combat damage, to tie em together? - /* 14 */ uint32 sequence; - /* 18 */ uint32 unknown18; - /* 22 */ uint8 type; // 231 (0xE7) for spells - /* 23 */ uint32 unknown23; + /* 04 */ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level + /* 06 */ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients) + /* 10 */ float force; + /* 14 */ float hit_heading; + /* 18 */ float hit_pitch; + /* 22 */ uint8 type; // 231 (0xE7) for spells, skill + /* 23 */ uint16 unknown23; // OSX says min_damage + /* 25 */ uint16 unknown25; // OSX says tohit /* 27 */ uint16 spell; // spell id being cast - /* 29 */ uint8 unknown29; + /* 29 */ uint8 spell_level; // this field seems to be some sort of success flag, if it's 4 - /* 30 */ uint8 buff_unknown; // if this is 4, a buff icon is made - /* 31 */ + /* 30 */ uint8 effect_flag; // if this is 4, a buff icon is made +// newer clients have some data for setting LaunchSpellData when effect_flag & 4 +// /* 31 */ uint8 spell_gem; +// /* 32 */ uint32 inventory_slot; +// /* 36 */ uint32 item_cast_type; }; // this is what prints the You have been struck. and the regular @@ -1277,12 +1278,12 @@ struct CombatDamage_Struct { /* 00 */ uint16 target; /* 02 */ uint16 source; -/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells +/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells, skill /* 05 */ uint16 spellid; /* 07 */ uint32 damage; /* 11 */ float force; -/* 15 */ float meleepush_xy; // see above notes in Action_Struct -/* 19 */ float meleepush_z; +/* 15 */ float hit_heading; // see above notes in Action_Struct +/* 19 */ float hit_pitch; /* 23 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage }; diff --git a/common/patches/rof.cpp b/common/patches/rof.cpp index 24fecb2ca..62ef6751a 100644 --- a/common/patches/rof.cpp +++ b/common/patches/rof.cpp @@ -163,22 +163,23 @@ namespace RoF OUT(level); eq->unknown06 = 0; eq->instrument_mod = 1.0f + (emu->instrument_mod - 10) / 10.0f; - eq->bard_focus_id = emu->bard_focus_id; - eq->knockback_angle = emu->sequence; - eq->unknown22 = 0; + OUT(force); + OUT(hit_heading); + OUT(hit_pitch); OUT(type); eq->damage = 0; eq->unknown31 = 0; OUT(spell); - eq->level2 = eq->level; - eq->effect_flag = emu->buff_unknown; - eq->unknown39 = 14; - eq->unknown43 = 0; - eq->unknown44 = 17; - eq->unknown45 = 0; - eq->unknown46 = -1; - eq->unknown50 = 0; - eq->unknown54 = 0; + OUT(spell_level); + OUT(effect_flag); + eq->spell_gem = 0; + eq->slot.Type = INVALID_INDEX; + eq->slot.Unknown02 = 0; + eq->slot.Slot = INVALID_INDEX; + eq->slot.SubIndex = INVALID_INDEX; + eq->slot.AugIndex = INVALID_INDEX; + eq->slot.Unknown01 = 0; + eq->item_cast_type = 0; FINISH_ENCODE(); } @@ -659,8 +660,8 @@ namespace RoF OUT(spellid); OUT(damage); OUT(force); - OUT(meleepush_xy); - OUT(meleepush_z); + OUT(hit_heading); + OUT(hit_pitch); OUT(special); FINISH_ENCODE(); @@ -4466,7 +4467,7 @@ namespace RoF IN(type); IN(spellid); IN(damage); - IN(meleepush_xy); + IN(hit_heading); FINISH_DIRECT_DECODE(); } diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index 7e5d79bb6..5a30c1695 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -232,22 +232,23 @@ namespace RoF2 OUT(level); eq->unknown06 = 0; eq->instrument_mod = 1.0f + (emu->instrument_mod - 10) / 10.0f; - eq->bard_focus_id = emu->bard_focus_id; - eq->knockback_angle = emu->sequence; - eq->unknown22 = 0; + OUT(force); + OUT(hit_heading); + OUT(hit_pitch); OUT(type); eq->damage = 0; eq->unknown31 = 0; OUT(spell); - eq->level2 = eq->level; - eq->effect_flag = emu->buff_unknown; - eq->unknown39 = 14; - eq->unknown43 = 0; - eq->unknown44 = 17; - eq->unknown45 = 0; - eq->unknown46 = -1; - eq->unknown50 = 0; - eq->unknown54 = 0; + OUT(spell_level); + OUT(effect_flag); + eq->spell_gem = 0; + eq->slot.Type = INVALID_INDEX; + eq->slot.Unknown02 = 0; + eq->slot.Slot = INVALID_INDEX; + eq->slot.SubIndex = INVALID_INDEX; + eq->slot.AugIndex = INVALID_INDEX; + eq->slot.Unknown01 = 0; + eq->item_cast_type = 0; FINISH_ENCODE(); } @@ -727,8 +728,8 @@ namespace RoF2 OUT(spellid); OUT(damage); OUT(force); - OUT(meleepush_xy); - OUT(meleepush_z); + OUT(hit_heading); + OUT(hit_pitch); OUT(special); FINISH_ENCODE(); @@ -4706,7 +4707,7 @@ namespace RoF2 IN(type); IN(spellid); IN(damage); - IN(meleepush_xy); + IN(hit_heading); FINISH_DIRECT_DECODE(); } diff --git a/common/patches/rof2_structs.h b/common/patches/rof2_structs.h index bd18a13c0..5be96e071 100644 --- a/common/patches/rof2_structs.h +++ b/common/patches/rof2_structs.h @@ -1462,17 +1462,17 @@ struct Action_Struct { /*00*/ uint16 target; // id of target /*02*/ uint16 source; // id of caster -/*04*/ uint16 level; // level of caster - Seen 0 -/*06*/ uint32 unknown06; +/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level +/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :( /*10*/ float instrument_mod; -/*14*/ uint32 bard_focus_id; // seen 0 -/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again -/*22*/ uint32 unknown22; -/*26*/ uint8 type; -/*27*/ uint32 damage; -/*31*/ uint16 unknown31; +/*14*/ float force; +/*18*/ float hit_heading; +/*22*/ float hit_pitch; +/*26*/ uint8 type; // 231 (0xE7) for spells, skill +/*27*/ uint32 damage; // OSX says min_damage +/*31*/ uint16 unknown31; // OSX says tohit /*33*/ uint32 spell; // spell id being cast -/*37*/ uint8 level2; // level of caster again? Or maybe the castee +/*37*/ uint8 spell_level; // level of caster again? Or maybe the castee /*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time? /*39*/ }; @@ -1484,25 +1484,21 @@ struct ActionAlt_Struct { /*00*/ uint16 target; // id of target /*02*/ uint16 source; // id of caster -/*04*/ uint16 level; // level of caster - Seen 0 -/*06*/ uint32 unknown06; +/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level +/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :( /*10*/ float instrument_mod; -/*14*/ uint32 bard_focus_id; // seen 0 -/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again -/*22*/ uint32 unknown22; -/*26*/ uint8 type; -/*27*/ uint32 damage; -/*31*/ uint16 unknown31; +/*14*/ float force; +/*18*/ float hit_heading; +/*22*/ float hit_pitch; +/*26*/ uint8 type; // 231 (0xE7) for spells, skill +/*27*/ uint32 damage; // OSX says min_damage +/*31*/ uint16 unknown31; // OSX says tohit /*33*/ uint32 spell; // spell id being cast -/*37*/ uint8 level2; // level of caster again? Or maybe the castee +/*37*/ uint8 spell_level; // level of caster again? Or maybe the castee /*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time? -/*39*/ uint32 unknown39; // New field to Underfoot - Seen 14 -/*43*/ uint8 unknown43; // New field to Underfoot - Seen 0 -/*44*/ uint8 unknown44; // New field to Underfoot - Seen 17 -/*45*/ uint8 unknown45; // New field to Underfoot - Seen 0 -/*46*/ int32 unknown46; // New field to Underfoot - Seen -1 -/*50*/ uint32 unknown50; // New field to Underfoot - Seen 0 -/*54*/ uint16 unknown54; // New field to Underfoot - Seen 0 +/*39*/ uint8 spell_gem; +/*40*/ InventorySlot_Struct slot; +/*52*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2 /*56*/ }; @@ -1517,9 +1513,9 @@ struct CombatDamage_Struct /* 05 */ uint32 spellid; /* 09 */ int32 damage; /* 13 */ float force; // cd cc cc 3d -/* 17 */ float meleepush_xy; // see above notes in Action_Struct -/* 21 */ float meleepush_z; -/* 25 */ uint8 unknown25; // was [9] +/* 17 */ float hit_heading; // see above notes in Action_Struct +/* 21 */ float hit_pitch; +/* 25 */ uint8 secondary; // 0 for primary hand, 1 for secondary /* 26 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage /* 30 */ }; diff --git a/common/patches/rof_structs.h b/common/patches/rof_structs.h index d38d5c6bb..08e3647be 100644 --- a/common/patches/rof_structs.h +++ b/common/patches/rof_structs.h @@ -1450,17 +1450,17 @@ struct Action_Struct { /*00*/ uint16 target; // id of target /*02*/ uint16 source; // id of caster -/*04*/ uint16 level; // level of caster - Seen 0 -/*06*/ uint32 unknown06; +/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level +/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :( /*10*/ float instrument_mod; -/*14*/ uint32 bard_focus_id; // seen 0 -/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again -/*22*/ uint32 unknown22; -/*26*/ uint8 type; -/*27*/ uint32 damage; -/*31*/ uint16 unknown31; +/*14*/ float force; +/*18*/ float hit_heading; +/*22*/ float hit_pitch; +/*26*/ uint8 type; // 231 (0xE7) for spells, skill +/*27*/ uint32 damage; // OSX says min_damage +/*31*/ uint16 unknown31; // OSX says tohit /*33*/ uint32 spell; // spell id being cast -/*37*/ uint8 level2; // level of caster again? Or maybe the castee +/*37*/ uint8 spell_level; // level of caster again? Or maybe the castee /*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time? /*39*/ }; @@ -1472,25 +1472,21 @@ struct ActionAlt_Struct { /*00*/ uint16 target; // id of target /*02*/ uint16 source; // id of caster -/*04*/ uint16 level; // level of caster - Seen 0 -/*06*/ uint32 unknown06; +/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level +/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :( /*10*/ float instrument_mod; -/*14*/ uint32 bard_focus_id; // seen 0 -/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again -/*22*/ uint32 unknown22; -/*26*/ uint8 type; -/*27*/ uint32 damage; -/*31*/ uint16 unknown31; +/*14*/ float force; +/*18*/ float hit_heading; +/*22*/ float hit_pitch; +/*26*/ uint8 type; // 231 (0xE7) for spells, skill +/*27*/ uint32 damage; // OSX says min_damage +/*31*/ uint16 unknown31; // OSX says tohit /*33*/ uint32 spell; // spell id being cast -/*37*/ uint8 level2; // level of caster again? Or maybe the castee +/*37*/ uint8 spell_level; // level of caster again? Or maybe the castee /*38*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time? -/*39*/ uint32 unknown39; // New field to Underfoot - Seen 14 -/*43*/ uint8 unknown43; // New field to Underfoot - Seen 0 -/*44*/ uint8 unknown44; // New field to Underfoot - Seen 17 -/*45*/ uint8 unknown45; // New field to Underfoot - Seen 0 -/*46*/ int32 unknown46; // New field to Underfoot - Seen -1 -/*50*/ uint32 unknown50; // New field to Underfoot - Seen 0 -/*54*/ uint16 unknown54; // New field to Underfoot - Seen 0 +/*39*/ uint8 spell_gem; +/*40*/ InventorySlot_Struct slot; +/*52*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2 /*56*/ }; @@ -1505,9 +1501,9 @@ struct CombatDamage_Struct /* 05 */ uint32 spellid; /* 09 */ int32 damage; /* 13 */ float force; // cd cc cc 3d -/* 17 */ float meleepush_xy; // see above notes in Action_Struct -/* 21 */ float meleepush_z; -/* 25 */ uint8 unknown25; // was [9] +/* 17 */ float hit_heading; // see above notes in Action_Struct +/* 21 */ float hit_pitch; +/* 25 */ uint8 secondary; // 0 for primary hand, 1 for secondary /* 26 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage /* 30 */ }; diff --git a/common/patches/sod.cpp b/common/patches/sod.cpp index 9e1479188..560151bfa 100644 --- a/common/patches/sod.cpp +++ b/common/patches/sod.cpp @@ -161,15 +161,14 @@ namespace SoD OUT(source); OUT(level); OUT(instrument_mod); - eq->sequence = emu->sequence; + OUT(force); + OUT(hit_heading); + OUT(hit_pitch); OUT(type); //OUT(damage); OUT(spell); - eq->level2 = emu->level; - OUT(buff_unknown); // if this is 4, a buff icon is made - //eq->unknown0036 = -1; - //eq->unknown0040 = -1; - //eq->unknown0044 = -1; + OUT(spell_level); + OUT(effect_flag); // if this is 4, a buff icon is made FINISH_ENCODE(); } @@ -458,8 +457,8 @@ namespace SoD OUT(spellid); OUT(damage); OUT(force); - OUT(meleepush_xy); - OUT(meleepush_z); + OUT(hit_heading); + OUT(hit_pitch); OUT(special); FINISH_ENCODE(); diff --git a/common/patches/sod_structs.h b/common/patches/sod_structs.h index 866418b54..6b5c2f72c 100644 --- a/common/patches/sod_structs.h +++ b/common/patches/sod_structs.h @@ -1215,20 +1215,18 @@ struct Action_Struct { /* 00 */ uint16 target; // id of target /* 02 */ uint16 source; // id of caster - /* 04 */ uint16 level; // level of caster - /* 06 */ uint16 instrument_mod; // seems to be fixed to 0x0A - /* 08 */ uint32 unknown08; - /* 12 */ uint16 unknown16; -// some kind of sequence that's the same in both actions -// as well as the combat damage, to tie em together? - /* 14 */ float sequence; // was uint32 - /* 18 */ uint32 unknown18; - /* 22 */ uint8 type; // 231 (0xE7) for spells - /* 23 */ uint32 unknown23; + /* 04 */ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level + /* 06 */ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients) + /* 10 */ float force; + /* 14 */ float hit_heading; + /* 18 */ float hit_pitch; + /* 22 */ uint8 type; // 231 (0xE7) for spells, skill + /* 23 */ uint16 unknown23; // OSX says min_damage + /* 25 */ uint16 unknown25; // OSX says tohit /* 27 */ uint16 spell; // spell id being cast - /* 29 */ uint8 level2; // level of caster again? Or maybe the castee + /* 29 */ uint8 spell_level; // level of caster again? Or maybe the castee // this field seems to be some sort of success flag, if it's 4 - /* 30 */ uint8 buff_unknown; // if this is 4, a buff icon is made + /* 30 */ uint8 effect_flag; // if this is 4, a buff icon is made /* 31 */ }; @@ -1237,26 +1235,23 @@ struct Action_Struct // has to do with buff blocking?? struct ActionAlt_Struct // ActionAlt_Struct - Size: 56 bytes { -/*0000*/ uint16 target; // Target ID -/*0002*/ uint16 source; // SourceID -/*0004*/ uint16 level; // level of caster -/*0006*/ uint16 instrument_mod; // seems to be fixed to 0x0A -/*0008*/ uint32 unknown08; -/*0012*/ uint16 unknown16; -/*0014*/ uint32 sequence; -/*0018*/ uint32 unknown18; -/*0022*/ uint8 type; // Casts, Falls, Bashes, etc... -/*0023*/ uint32 damage; // Amount of Damage -/*0027*/ uint16 spell; // SpellID -/*0029*/ uint8 unknown29; -/*0030*/ uint8 buff_unknown; // if this is 4, a buff icon is made -/*0031*/ uint32 unknown0031; // seen 00 00 00 00 -/*0035*/ uint8 unknown0035; // seen 00 -/*0036*/ uint32 unknown0036; // seen ff ff ff ff -/*0040*/ uint32 unknown0040; // seen ff ff ff ff -/*0044*/ uint32 unknown0044; // seen ff ff ff ff -/*0048*/ uint32 unknown0048; // seen 00 00 00 00 -/*0052*/ uint32 unknown0052; // seen 00 00 00 00 +/*0000*/ uint16 target; // id of target +/*0002*/ uint16 source; // id of caster +/*0004*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level +/*0006*/ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients) +/*0010*/ float force; +/*0014*/ float hit_heading; +/*0018*/ float hit_pitch; +/*0022*/ uint8 type; // 231 (0xE7) for spells, skill +/*0023*/ uint16 unknown23; // OSX says min_damage +/*0025*/ uint16 unknown25; // OSX says tohit +/*0027*/ uint16 spell; // spell id being cast +/*0029*/ uint8 spell_level; // level of caster again? Or maybe the castee +// this field seems to be some sort of success flag, if it's 4 +/*0030*/ uint8 effect_flag; // if this is 4, a buff icon is made +/*0031*/ uint8 spell_slot; +/*0032*/ uint32 slot[5]; +/*0052*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2 /*0056*/ }; @@ -1271,9 +1266,9 @@ struct CombatDamage_Struct /* 05 */ uint16 spellid; /* 07 */ int32 damage; /* 11 */ float force; // cd cc cc 3d -/* 15 */ float meleepush_xy; // see above notes in Action_Struct -/* 19 */ float meleepush_z; -/* 23 */ uint8 unknown23; // was [9] +/* 15 */ float hit_heading; // see above notes in Action_Struct +/* 19 */ float hit_pitch; +/* 23 */ uint8 secondary; // 0 for primary hand, 1 for secondary /* 24 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage /* 28 */ }; diff --git a/common/patches/sof.cpp b/common/patches/sof.cpp index 063d99ca4..c16bed086 100644 --- a/common/patches/sof.cpp +++ b/common/patches/sof.cpp @@ -161,15 +161,14 @@ namespace SoF OUT(source); OUT(level); OUT(instrument_mod); - eq->sequence = emu->sequence; + OUT(force); + OUT(hit_heading); + OUT(hit_pitch); OUT(type); //OUT(damage); OUT(spell); - eq->level2 = emu->level; - OUT(buff_unknown); // if this is 4, a buff icon is made - //eq->unknown0036 = -1; - //eq->unknown0040 = -1; - //eq->unknown0044 = -1; + OUT(spell_level); + OUT(effect_flag); // if this is 4, a buff icon is made FINISH_ENCODE(); } @@ -440,8 +439,8 @@ namespace SoF OUT(spellid); OUT(damage); OUT(force); - OUT(meleepush_xy); - OUT(meleepush_z); + OUT(hit_heading); + OUT(hit_pitch); FINISH_ENCODE(); } diff --git a/common/patches/sof_structs.h b/common/patches/sof_structs.h index 168dfb123..29272a7a6 100644 --- a/common/patches/sof_structs.h +++ b/common/patches/sof_structs.h @@ -1215,20 +1215,18 @@ struct Action_Struct { /* 00 */ uint16 target; // id of target /* 02 */ uint16 source; // id of caster - /* 04 */ uint16 level; // level of caster - /* 06 */ uint16 instrument_mod; // seems to be fixed to 0x0A - /* 08 */ uint32 unknown08; - /* 12 */ uint16 unknown16; -// some kind of sequence that's the same in both actions -// as well as the combat damage, to tie em together? - /* 14 */ float sequence; // was uint32 - /* 18 */ uint32 unknown18; - /* 22 */ uint8 type; // 231 (0xE7) for spells - /* 23 */ uint32 unknown23; + /* 04 */ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level + /* 06 */ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients) + /* 10 */ float force; + /* 14 */ float hit_heading; + /* 18 */ float hit_pitch; + /* 22 */ uint8 type; // 231 (0xE7) for spells, skill + /* 23 */ uint16 unknown23; // OSX says min_damage + /* 25 */ uint16 unknown25; // OSX says tohit /* 27 */ uint16 spell; // spell id being cast - /* 29 */ uint8 level2; // level of caster again? Or maybe the castee + /* 29 */ uint8 spell_level; // level of caster again? Or maybe the castee // this field seems to be some sort of success flag, if it's 4 - /* 30 */ uint8 buff_unknown; // if this is 4, a buff icon is made + /* 30 */ uint8 effect_flag; // if this is 4, a buff icon is made /* 31 */ }; @@ -1237,26 +1235,23 @@ struct Action_Struct // has to do with buff blocking?? struct ActionAlt_Struct // ActionAlt_Struct - Size: 56 bytes { -/*0000*/ uint16 target; // Target ID -/*0002*/ uint16 source; // SourceID -/*0004*/ uint16 level; // level of caster -/*0006*/ uint16 instrument_mod; // seems to be fixed to 0x0A -/*0008*/ uint32 unknown08; -/*0012*/ uint16 unknown16; -/*0014*/ uint32 sequence; -/*0018*/ uint32 unknown18; -/*0022*/ uint8 type; // Casts, Falls, Bashes, etc... -/*0023*/ uint32 damage; // Amount of Damage -/*0027*/ uint16 spell; // SpellID -/*0029*/ uint8 unknown29; -/*0030*/ uint8 buff_unknown; // if this is 4, a buff icon is made -/*0031*/ uint32 unknown0031; // seen 00 00 00 00 -/*0035*/ uint8 unknown0035; // seen 00 -/*0036*/ uint32 unknown0036; // seen ff ff ff ff -/*0040*/ uint32 unknown0040; // seen ff ff ff ff -/*0044*/ uint32 unknown0044; // seen ff ff ff ff -/*0048*/ uint32 unknown0048; // seen 00 00 00 00 -/*0052*/ uint32 unknown0052; // seen 00 00 00 00 +/*0000*/ uint16 target; // id of target +/*0002*/ uint16 source; // id of caster +/*0004*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level +/*0006*/ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients) +/*0010*/ float force; +/*0014*/ float hit_heading; +/*0018*/ float hit_pitch; +/*0022*/ uint8 type; // 231 (0xE7) for spells, skill +/*0023*/ uint16 unknown23; // OSX says min_damage +/*0025*/ uint16 unknown25; // OSX says tohit +/*0027*/ uint16 spell; // spell id being cast +/*0029*/ uint8 spell_level; // level of caster again? Or maybe the castee +// this field seems to be some sort of success flag, if it's 4 +/*0030*/ uint8 effect_flag; // if this is 4, a buff icon is made +/*0031*/ uint8 spell_slot; +/*0032*/ uint32 slot[5]; +/*0052*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2 /*0056*/ }; @@ -1271,9 +1266,10 @@ struct CombatDamage_Struct /* 05 */ uint16 spellid; /* 07 */ int32 damage; /* 11 */ float force; // cd cc cc 3d -/* 15 */ float meleepush_xy; // see above notes in Action_Struct -/* 19 */ float meleepush_z; -/* 23 */ uint8 unknown23[5]; // was [9] this appears unrelated to the stuff the other clients do here? +/* 15 */ float hit_heading; // see above notes in Action_Struct +/* 19 */ float hit_pitch; +/* 23 */ uint8 secondary; // 0 for primary hand, 1 for secondary +/* 24 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage, Report function doesn't seem to check this :P /* 28 */ }; diff --git a/common/patches/titanium.cpp b/common/patches/titanium.cpp index afff0cea2..bf3c3d359 100644 --- a/common/patches/titanium.cpp +++ b/common/patches/titanium.cpp @@ -164,11 +164,14 @@ namespace Titanium OUT(source); OUT(level); OUT(instrument_mod); - OUT(sequence); + OUT(force); + OUT(hit_heading); + OUT(hit_pitch); OUT(type); //OUT(damage); OUT(spell); - OUT(buff_unknown); // if this is 4, a buff icon is made + OUT(spell_level); + OUT(effect_flag); // if this is 4, a buff icon is made FINISH_ENCODE(); } @@ -358,8 +361,8 @@ namespace Titanium OUT(spellid); OUT(damage); OUT(force); - OUT(meleepush_xy); - OUT(meleepush_z); + OUT(hit_heading); + OUT(hit_pitch); FINISH_ENCODE(); } diff --git a/common/patches/titanium_structs.h b/common/patches/titanium_structs.h index ea698acf0..9f2d9423d 100644 --- a/common/patches/titanium_structs.h +++ b/common/patches/titanium_structs.h @@ -1119,20 +1119,18 @@ struct Action_Struct { /* 00 */ uint16 target; // id of target /* 02 */ uint16 source; // id of caster - /* 04 */ uint16 level; // level of caster - /* 06 */ uint16 instrument_mod; - /* 08 */ uint32 unknown08; - /* 12 */ uint16 unknown16; -// some kind of sequence that's the same in both actions -// as well as the combat damage, to tie em together? - /* 14 */ uint32 sequence; - /* 18 */ uint32 unknown18; - /* 22 */ uint8 type; // 231 (0xE7) for spells - /* 23 */ uint32 unknown23; + /* 04 */ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level + /* 06 */ uint32 instrument_mod; // OSX dump says base damage, spells use it for bard song (different from newer clients) + /* 10 */ float force; + /* 14 */ float hit_heading; + /* 18 */ float hit_pitch; + /* 22 */ uint8 type; // 231 (0xE7) for spells, skill + /* 23 */ uint16 unknown23; // OSX says min_damage + /* 25 */ uint16 unknown25; // OSX says tohit /* 27 */ uint16 spell; // spell id being cast - /* 29 */ uint8 unknown29; + /* 29 */ uint8 spell_level; // this field seems to be some sort of success flag, if it's 4 - /* 30 */ uint8 buff_unknown; // if this is 4, a buff icon is made + /* 30 */ uint8 effect_flag; // if this is 4, a buff icon is made /* 31 */ }; @@ -1143,12 +1141,12 @@ struct CombatDamage_Struct { /* 00 */ uint16 target; /* 02 */ uint16 source; -/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells +/* 04 */ uint8 type; //slashing, etc. 231 (0xE7) for spells, skill /* 05 */ uint16 spellid; /* 07 */ uint32 damage; /* 11 */ float force; -/* 15 */ float meleepush_xy; // see above notes in Action_Struct -/* 19 */ float meleepush_z; +/* 15 */ float hit_heading; // see above notes in Action_Struct +/* 19 */ float hit_pitch; /* 23 */ }; diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index 176e737b7..79fdca333 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -161,29 +161,20 @@ namespace UF OUT(source); OUT(level); eq->instrument_mod = 1.0f + (emu->instrument_mod - 10) / 10.0f; - eq->knockback_angle = emu->sequence; + OUT(force); + OUT(hit_heading); + OUT(hit_pitch); OUT(type); OUT(spell); - eq->level2 = eq->level; - eq->effect_flag = emu->buff_unknown; - eq->unknown37 = 0x01; - eq->unknown44 = 0xFFFFFFFF; - eq->unknown48 = 0xFFFFFFFF; - eq->unknown52 = 0xFFFFFFFF; - - /*OUT(target); - OUT(source); - OUT(level); - OUT(instrument_mod); - eq->sequence = emu->sequence; - OUT(type); - //OUT(damage); - OUT(spell); - eq->level2 = emu->level; - OUT(buff_unknown); // if this is 4, a buff icon is made - //eq->unknown0036 = -1; - //eq->unknown0040 = -1; - //eq->unknown0044 = -1;*/ + OUT(spell_level); + OUT(effect_flag); + eq->spell_gem = 0; + eq->slot[0] = -1; // type + eq->slot[1] = -1; // slot + eq->slot[2] = -1; // sub index + eq->slot[3] = -1; // aug index + eq->slot[4] = -1; // unknown + eq->item_cast_type = 0; FINISH_ENCODE(); } @@ -586,8 +577,8 @@ namespace UF OUT(spellid); OUT(damage); OUT(force); - OUT(meleepush_xy); - OUT(meleepush_z); + OUT(hit_heading); + OUT(hit_pitch); OUT(special); FINISH_ENCODE(); @@ -3398,7 +3389,7 @@ namespace UF IN(type); IN(spellid); IN(damage); - IN(meleepush_xy); + IN(hit_heading); FINISH_DIRECT_DECODE(); } diff --git a/common/patches/uf_structs.h b/common/patches/uf_structs.h index 8a03144c9..dc66afd43 100644 --- a/common/patches/uf_structs.h +++ b/common/patches/uf_structs.h @@ -1252,19 +1252,19 @@ struct Action_Struct { /*00*/ uint16 target; // id of target /*02*/ uint16 source; // id of caster -/*04*/ uint16 level; // level of caster - Seen 0 -/*06*/ uint32 unknown06; -/*10*/ uint16 instrument_focus; -/*12*/ uint16 unknown12; // seems to always be set to something and it doesn't change between casts except in special cases like changing instrument mods -/*14*/ uint32 unknown14; // seen 0 -/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again -/*22*/ uint32 unknown22; -/*26*/ uint8 type; -/*27*/ uint32 damage; -/*31*/ uint16 unknown31; +/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level +/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :( +/*10*/ float instrument_mod; +/*14*/ float force; +/*18*/ float hit_heading; +/*22*/ float hit_pitch; +/*26*/ uint8 type; // 231 (0xE7) for spells, skill +/*27*/ uint32 damage; // OSX says min_damage +/*31*/ uint16 unknown31; // OSX says tohit /*33*/ uint16 spell; // spell id being cast -/*35*/ uint8 level2; // level of caster again? Or maybe the castee +/*35*/ uint8 spell_level; // level of caster again? Or maybe the castee /*36*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time? +/*37*/ }; @@ -1276,27 +1276,22 @@ struct ActionAlt_Struct { /*00*/ uint16 target; // id of target /*02*/ uint16 source; // id of caster -/*04*/ uint16 level; // level of caster - Seen 0 -/*06*/ uint32 unknown06; +/*04*/ uint16 level; // level of caster for spells, OSX dump says attack rating, guess spells use it for level +/*06*/ uint32 unknown06; // OSX dump says base_damage, was used for bard mod too, this is 0'd :( /*10*/ float instrument_mod; -/*14*/ uint32 unknown14; // seen 0 -/*18*/ float knockback_angle; //seems to go from 0-512 then it rolls over again -/*22*/ uint32 unknown22; -/*26*/ uint8 type; -/*27*/ uint32 damage; -/*31*/ uint16 unknown31; +/*14*/ float force; +/*18*/ float hit_heading; +/*22*/ float hit_pitch; +/*26*/ uint8 type; // 231 (0xE7) for spells, skill +/*27*/ uint32 damage; // OSX says min_damage +/*31*/ uint16 unknown31; // OSX says tohit /*33*/ uint16 spell; // spell id being cast -/*35*/ uint8 level2; // level of caster again? Or maybe the castee +/*35*/ uint8 spell_level; // level of caster again? Or maybe the castee /*36*/ uint8 effect_flag; // if this is 4, the effect is valid: or if two are sent at the same time? -/*37*/ uint32 unknown37; // New field to Underfoot - Seen 14 -/*41*/ uint8 unknown41; // New field to Underfoot - Seen 0 -/*42*/ uint8 unknown42; // New field to Underfoot - Seen 0 -/*43*/ uint8 unknown43; // New field to Underfoot - Seen 0 -/*44*/ uint32 unknown44; // New field to Underfoot - Seen 23 -/*48*/ uint32 unknown48; // New field to Underfoot - Seen -1 -/*52*/ uint32 unknown52; // New field to Underfoot - Seen -1 -/*56*/ uint32 unknown56; // New field to Underfoot - Seen 0 -/*60*/ uint32 unknown60; // New field to Underfoot - Seen 0 +/*37*/ uint8 spell_gem; +/*38*/ uint8 padding38[2]; +/*40*/ uint32 slot[5]; +/*60*/ uint32 item_cast_type; // ItemSpellTypes enum from MQ2 /*64*/ }; @@ -1311,9 +1306,9 @@ struct CombatDamage_Struct /* 05 */ uint16 spellid; /* 07 */ int32 damage; /* 11 */ float force; // cd cc cc 3d -/* 15 */ float meleepush_xy; // see above notes in Action_Struct -/* 19 */ float meleepush_z; -/* 23 */ uint8 unknown23; // was [9] +/* 15 */ float hit_heading; // see above notes in Action_Struct +/* 19 */ float hit_pitch; +/* 23 */ uint8 secondary; // 0 for primary hand, 1 for secondary /* 24 */ uint32 special; // 2 = Rampage, 1 = Wild Rampage /* 28 */ }; diff --git a/zone/attack.cpp b/zone/attack.cpp index 8fcf508c3..0979a705e 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -3611,15 +3611,15 @@ void Mob::CommonDamage(Mob* attacker, int &damage, const uint16 spell_id, const a->special = 2; else a->special = 0; - a->meleepush_xy = attacker ? attacker->GetHeading() : 0.0f; + a->hit_heading = attacker ? attacker->GetHeading() : 0.0f; if (RuleB(Combat, MeleePush) && damage > 0 && !IsRooted() && (IsClient() || zone->random.Roll(RuleI(Combat, MeleePushChance)))) { a->force = EQEmu::skills::GetSkillMeleePushForce(skill_used); if (IsNPC()) a->force *= 0.10f; // force against NPCs is divided by 10 I guess? ex bash is 0.3, parsed 0.03 against an NPC // update NPC stuff - auto new_pos = glm::vec3(m_Position.x + (a->force * std::cos(a->meleepush_xy) + m_Delta.x), - m_Position.y + (a->force * std::sin(a->meleepush_xy) + m_Delta.y), m_Position.z); + auto new_pos = glm::vec3(m_Position.x + (a->force * std::cos(a->hit_heading) + m_Delta.x), + m_Position.y + (a->force * std::sin(a->hit_heading) + m_Delta.y), m_Position.z); if (zone->zonemap && zone->zonemap->CheckLoS(glm::vec3(m_Position), new_pos)) { // If we have LoS on the new loc it should be reachable. if (IsNPC()) { // Is this adequate? diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 480479b2f..f55c091d6 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -913,16 +913,16 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove action->source = caster ? caster->GetID() : GetID(); action->level = 65; action->instrument_mod = 10; - action->sequence = static_cast((GetHeading() * 12345 / 2)); + action->hit_heading = GetHeading(); action->type = 231; action->spell = spell_id; - action->buff_unknown = 4; + action->effect_flag = 4; cd->target = action->target; cd->source = action->source; cd->type = action->type; cd->spellid = action->spell; - cd->meleepush_xy = action->sequence; + cd->hit_heading = action->hit_heading; CastToClient()->QueuePacket(action_packet); if(caster && caster->IsClient() && caster != this) @@ -964,16 +964,16 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove action->source = caster ? caster->GetID() : GetID(); action->level = 65; action->instrument_mod = 10; - action->sequence = static_cast((GetHeading() * 12345 / 2)); + action->hit_heading = GetHeading(); action->type = 231; action->spell = spell_id; - action->buff_unknown = 4; + action->effect_flag = 4; cd->target = action->target; cd->source = action->source; cd->type = action->type; cd->spellid = action->spell; - cd->meleepush_xy = action->sequence; + cd->hit_heading = action->hit_heading; CastToClient()->QueuePacket(action_packet); if(caster->IsClient() && caster != this) @@ -1002,16 +1002,16 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove action->source = caster ? caster->GetID() : GetID(); action->level = 65; action->instrument_mod = 10; - action->sequence = static_cast((GetHeading() * 12345 / 2)); + action->hit_heading = GetHeading(); action->type = 231; action->spell = spell_id; - action->buff_unknown = 4; + action->effect_flag = 4; cd->target = action->target; cd->source = action->source; cd->type = action->type; cd->spellid = action->spell; - cd->meleepush_xy = action->sequence; + cd->hit_heading = action->hit_heading; CastToClient()->QueuePacket(action_packet); if(caster->IsClient() && caster != this) diff --git a/zone/spells.cpp b/zone/spells.cpp index e66a41fa8..002f996b6 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -2652,18 +2652,18 @@ void Mob::BardPulse(uint16 spell_id, Mob *caster) { action->source = caster->GetID(); action->target = GetID(); action->spell = spell_id; - action->sequence = (uint32) (GetHeading()); // just some random number + action->hit_heading = GetHeading(); action->instrument_mod = caster->GetInstrumentMod(spell_id); - action->buff_unknown = 0; - action->level = buffs[buffs_i].casterlevel; + action->effect_flag = 0; + action->spell_level = action->level = buffs[buffs_i].casterlevel; action->type = DamageTypeSpell; entity_list.QueueCloseClients(this, packet, false, RuleI(Range, SongMessages), 0, true, IsClient() ? FilterPCSpells : FilterNPCSpells); - action->buff_unknown = 4; + action->effect_flag = 4; if(IsEffectInSpell(spell_id, SE_TossUp)) { - action->buff_unknown = 0; + action->effect_flag = 0; } else if(spells[spell_id].pushback > 0 || spells[spell_id].pushup > 0) { @@ -2673,7 +2673,7 @@ void Mob::BardPulse(uint16 spell_id, Mob *caster) { { CastToClient()->SetKnockBackExemption(true); - action->buff_unknown = 0; + action->effect_flag = 0; auto outapp_push = new EQApplicationPacket( OP_ClientUpdate, sizeof(PlayerPositionUpdateServer_Struct)); PlayerPositionUpdateServer_Struct* spu = (PlayerPositionUpdateServer_Struct*)outapp_push->pBuffer; @@ -2725,7 +2725,7 @@ void Mob::BardPulse(uint16 spell_id, Mob *caster) { cd->source = action->source; cd->type = DamageTypeSpell; cd->spellid = action->spell; - cd->meleepush_xy = action->sequence; + cd->hit_heading = action->hit_heading; cd->damage = 0; if(!IsEffectInSpell(spell_id, SE_BindAffinity)) { @@ -3536,9 +3536,9 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r action->level = caster_level; // caster level, for animation only action->type = 231; // 231 means a spell action->spell = spell_id; - action->sequence = (uint32) (GetHeading()); // just some random number + action->hit_heading = GetHeading(); action->instrument_mod = GetInstrumentMod(spell_id); - action->buff_unknown = 0; + action->effect_flag = 0; if(spelltar != this && spelltar->IsClient()) // send to target spelltar->CastToClient()->QueuePacket(action_packet); @@ -3965,11 +3965,11 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r // NOTE: this is what causes the buff icon to appear on the client, if // this is a buff - but it sortof relies on the first packet. // the complete sequence is 2 actions and 1 damage message - action->buff_unknown = 0x04; // this is a success flag + action->effect_flag = 0x04; // this is a success flag if(IsEffectInSpell(spell_id, SE_TossUp)) { - action->buff_unknown = 0; + action->effect_flag = 0; } else if(spells[spell_id].pushback > 0 || spells[spell_id].pushup > 0) { @@ -3979,7 +3979,7 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r { spelltar->CastToClient()->SetKnockBackExemption(true); - action->buff_unknown = 0; + action->effect_flag = 0; auto outapp_push = new EQApplicationPacket(OP_ClientUpdate, sizeof(PlayerPositionUpdateServer_Struct)); PlayerPositionUpdateServer_Struct* spu = (PlayerPositionUpdateServer_Struct*)outapp_push->pBuffer; @@ -4039,7 +4039,7 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r cd->source = action->source; cd->type = action->type; cd->spellid = action->spell; - cd->meleepush_xy = action->sequence; + cd->hit_heading = action->hit_heading; cd->damage = 0; if(!IsEffectInSpell(spell_id, SE_BindAffinity)){ entity_list.QueueCloseClients( @@ -5722,7 +5722,7 @@ void Client::SendSpellAnim(uint16 targetid, uint16 spell_id) a->source = this->GetID(); a->type = 231; a->spell = spell_id; - a->sequence = 231; + a->hit_heading = GetHeading(); app.priority = 1; entity_list.QueueCloseClients(this, &app, false, RuleI(Range, SpellParticles)); diff --git a/zone/trap.cpp b/zone/trap.cpp index 91e11c012..687d3ded3 100644 --- a/zone/trap.cpp +++ b/zone/trap.cpp @@ -216,7 +216,7 @@ void Trap::Trigger(Mob* trigger) int dmg = zone->random.Int(effectvalue, effectvalue2); trigger->SetHP(trigger->GetHP() - dmg); a->damage = dmg; - a->meleepush_xy = zone->random.Int(0, 1234567); + a->hit_heading = 0.0f; a->source = GetHiddenTrigger()!=nullptr ? GetHiddenTrigger()->GetID() : trigger->GetID(); a->spellid = 0; a->target = trigger->GetID();