Fix up SpellBuff struct

Please report any bugs you find. There shouldn't be unless I messed up the struct
for a client I didn't throughly test for
This commit is contained in:
Michael Cook (mackal)
2016-07-25 16:22:48 -04:00
parent a7fd9312d0
commit bda4fcfb26
22 changed files with 350 additions and 460 deletions
+17 -19
View File
@@ -488,30 +488,28 @@ struct SpawnAppearance_Struct
// this is used inside profile
struct SpellBuff_Struct
{
/*000*/ uint8 slotid; //badly named... seems to be 2 for a real buff, 0 otherwise
/*001*/ uint8 level;
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
/*001*/ uint8 level;
/*002*/ uint8 bard_modifier;
/*003*/ uint8 effect; //not real
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking? -- OSX client calls this "activated"
/*004*/ uint32 spellid;
/*008*/ int32 duration;
/*012*/ uint32 counters;
/*016*/ uint32 player_id; //'global' ID of the caster, for wearoff messages
/*020*/
/*008*/ int32 duration;
/*012*/ uint32 counters; // single book keeping value (counters, rune/vie)
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
// extra stuff for newer packets
/*020*/ uint32 num_hits;
/*024*/ float y; // referenced by SPA 441
/*028*/ float x; // unsure if all buffs get them
/*032*/ float z; // as valid data
/*036*/
};
struct SpellBuffFade_Struct {
struct SpellBuffPacket_Struct {
/*000*/ uint32 entityid;
/*004*/ uint8 slot;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown7;
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 num_hits;
/*020*/ uint32 unknown020; //prolly global player ID
/*024*/ uint32 slotid;
/*028*/ uint32 bufffade;
/*032*/
/*004*/ SpellBuff_Struct buff;
/*040*/ uint32 slotid;
/*044*/ uint32 bufffade;
/*048*/
};
// Underfoot & later struct.
+2 -2
View File
@@ -173,7 +173,7 @@ IN(OP_TradeAcceptClick, TradeAccept_Struct);
IN(OP_BoardBoat, EntityId_Struct); //not really the struct, just 4 bytes
INz(OP_LeaveBoat); //?
IN(OP_RandomReq, RandomReq_Struct);
IN(OP_Buff, SpellBuffFade_Struct);
IN(OP_Buff, SpellBuffPacket_Struct);
IN(OP_GMHideMe, SpawnAppearance_Struct);
IN(OP_GMNameChange, GMName_Struct);
IN(OP_GMKill, GMKill_Struct);
@@ -415,7 +415,7 @@ OUTv(OP_SendAATable, SendAA_Struct);
OUT(OP_AAAction, UseAA_Struct);
OUT(OP_Bazaar, BazaarReturnDone_Struct);
//alt:OUT(OP_Bazaar, BazaarWelcome_Struct);
OUT(OP_Buff, SpellBuffFade_Struct);
OUT(OP_Buff, SpellBuffPacket_Struct);
OUT(OP_ClickObject, ClickObject_Struct);
OUT(OP_ClientUpdate, PlayerPositionUpdateServer_Struct);
OUT(OP_SpawnPositionUpdate, SpawnPositionUpdate_Struct);
+40 -30
View File
@@ -405,22 +405,31 @@ namespace RoF
ENCODE(OP_Buff)
{
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Live);
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
OUT(entityid);
eq->unknown004 = 2;
//eq->level = 80;
//eq->effect = 0;
OUT(level);
OUT(effect);
eq->unknown007 = 0;
eq->unknown008 = 1.0f;
OUT(spellid);
OUT(duration);
eq->playerId = 0x7cde;
OUT(slotid);
OUT(num_hits);
OUT(buff.effect_type);
OUT(buff.level);
// just so we're 100% sure we get a 1.0f ...
eq->buff.bard_modifier = emu->buff.bard_modifier == 10 ? 1.0f : emu->buff.bard_modifier / 10.0f;
OUT(buff.spellid);
OUT(buff.duration);
OUT(buff.player_id);
OUT(buff.num_hits);
OUT(buff.y);
OUT(buff.x);
OUT(buff.z);
uint16 buffslot = emu->slotid;
// Not sure if this is needs amending for RoF yet.
if (buffslot >= 25)
{
buffslot += 17;
}
// TODO: implement slot_data stuff
eq->slotid = buffslot;
if (emu->bufffade == 1)
eq->bufffade = 1;
else
@@ -432,10 +441,10 @@ namespace RoF
{
outapp = new EQApplicationPacket(OP_BuffCreate, 29);
outapp->WriteUInt32(emu->entityid);
outapp->WriteUInt32(0x0271); // Unk
outapp->WriteUInt32(0); // tic timer
outapp->WriteUInt8(0); // Type of OP_BuffCreate packet ?
outapp->WriteUInt16(1); // 1 buff in this packet
outapp->WriteUInt32(emu->slotid);
outapp->WriteUInt32(buffslot);
outapp->WriteUInt32(0xffffffff); // SpellID (0xffff to remove)
outapp->WriteUInt32(0); // Duration
outapp->WriteUInt32(0); // ?
@@ -2274,31 +2283,32 @@ namespace RoF
for (uint32 r = 0; r < BUFF_COUNT; r++)
{
float instrument_mod = 0.0f;
uint8 slotid = emu->buffs[r].slotid;
uint8 effect_type = emu->buffs[r].effect_type;
uint32 player_id = emu->buffs[r].player_id;;
if (emu->buffs[r].spellid != 0xFFFF && emu->buffs[r].spellid != 0)
{
instrument_mod = 1.0f + (emu->buffs[r].bard_modifier - 10) / 10.0f;
slotid = 2;
effect_type = 2;
player_id = 0x000717fd;
}
else
{
slotid = 0;
effect_type = 0;
}
outapp->WriteUInt8(0); // Had this as slot, but always appears to be 0 on live.
// this is different than the client struct for some reason :P
// missing a few things, shuffled around
outapp->WriteUInt8(0); // this is an unknown
outapp->WriteFloat(instrument_mod);
outapp->WriteUInt32(player_id);
outapp->WriteUInt8(0);
outapp->WriteUInt32(emu->buffs[r].counters);
//outapp->WriteUInt8(emu->buffs[r].bard_modifier);
outapp->WriteUInt32(emu->buffs[r].duration);
outapp->WriteUInt8(emu->buffs[r].level);
outapp->WriteUInt32(emu->buffs[r].spellid);
outapp->WriteUInt32(slotid); // Only ever seen 2
outapp->WriteUInt8(effect_type); // Only ever seen 2
outapp->WriteUInt32(emu->buffs[r].num_hits);
outapp->WriteUInt32(0);
outapp->WriteUInt8(0);
outapp->WriteUInt32(emu->buffs[r].counters); // Appears twice ?
for (uint32 j = 0; j < 44; ++j)
@@ -4290,15 +4300,15 @@ namespace RoF
DECODE(OP_Buff)
{
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct_Live);
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Live);
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
IN(entityid);
//IN(slot);
IN(level);
IN(effect);
IN(spellid);
IN(duration);
IN(buff.effect_type);
IN(buff.level);
IN(buff.unknown003);
IN(buff.spellid);
IN(buff.duration);
IN(slotid);
IN(bufffade);
+44 -30
View File
@@ -474,22 +474,34 @@ namespace RoF2
ENCODE(OP_Buff)
{
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Live);
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
OUT(entityid);
eq->unknown004 = 2;
//eq->level = 80;
//eq->effect = 0;
OUT(level);
OUT(effect);
eq->unknown007 = 0;
eq->unknown008 = 1.0f;
OUT(spellid);
OUT(duration);
eq->playerId = 0x7cde;
OUT(slotid);
OUT(num_hits);
OUT(buff.effect_type);
OUT(buff.level);
// just so we're 100% sure we get a 1.0f ...
eq->buff.bard_modifier = emu->buff.bard_modifier == 10 ? 1.0f : emu->buff.bard_modifier / 10.0f;
OUT(buff.spellid);
OUT(buff.duration);
OUT(buff.player_id);
OUT(buff.num_hits);
OUT(buff.y);
OUT(buff.x);
OUT(buff.z);
uint16 buffslot = emu->slotid;
// Not sure if this is needs amending for RoF2 yet.
if (buffslot >= 25)
{
buffslot += 17;
}
// TODO: We should really just deal with these "server side"
// so we can have clients not limited to other clients.
// This fixes discs, songs were changed to 20
if (buffslot == 54)
buffslot = 62;
eq->slotid = buffslot;
// TODO: implement slot_data stuff
if (emu->bufffade == 1)
eq->bufffade = 1;
else
@@ -501,10 +513,10 @@ namespace RoF2
{
outapp = new EQApplicationPacket(OP_BuffCreate, 29);
outapp->WriteUInt32(emu->entityid);
outapp->WriteUInt32(0x0271); // Unk
outapp->WriteUInt32(0); // tic timer
outapp->WriteUInt8(0); // Type of OP_BuffCreate packet ?
outapp->WriteUInt16(1); // 1 buff in this packet
outapp->WriteUInt32(emu->slotid);
outapp->WriteUInt32(buffslot);
outapp->WriteUInt32(0xffffffff); // SpellID (0xffff to remove)
outapp->WriteUInt32(0); // Duration
outapp->WriteUInt32(0); // ?
@@ -2358,31 +2370,33 @@ namespace RoF2
for (uint32 r = 0; r < BUFF_COUNT; r++)
{
float instrument_mod = 0.0f;
uint8 slotid = emu->buffs[r].slotid;
uint8 effect_type = emu->buffs[r].effect_type;
uint32 player_id = emu->buffs[r].player_id;;
if (emu->buffs[r].spellid != 0xFFFF && emu->buffs[r].spellid != 0)
{
instrument_mod = 1.0f + (emu->buffs[r].bard_modifier - 10) / 10.0f;
slotid = 2;
effect_type = 2;
player_id = 0x000717fd;
}
else
{
slotid = 0;
effect_type = 0;
}
outapp->WriteUInt8(0); // Had this as slot, but always appears to be 0 on live.
// this is different than the client struct for some reason :P
// missing a few things, shuffled around
outapp->WriteUInt8(0); // this is an unknown
outapp->WriteFloat(instrument_mod);
outapp->WriteUInt32(player_id);
outapp->WriteUInt8(0);
outapp->WriteUInt32(emu->buffs[r].counters);
//outapp->WriteUInt8(emu->buffs[r].bard_modifier);
outapp->WriteUInt32(emu->buffs[r].duration);
outapp->WriteUInt8(emu->buffs[r].level);
outapp->WriteUInt32(emu->buffs[r].spellid);
outapp->WriteUInt32(slotid); // Only ever seen 2
outapp->WriteUInt8(effect_type); // Only ever seen 2
outapp->WriteUInt32(emu->buffs[r].num_hits);
outapp->WriteUInt32(0);
outapp->WriteUInt8(0);
outapp->WriteUInt32(emu->buffs[r].counters); // Appears twice ?
for (uint32 j = 0; j < 44; ++j)
@@ -4526,15 +4540,15 @@ namespace RoF2
DECODE(OP_Buff)
{
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct_Live);
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Live);
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
IN(entityid);
//IN(slot);
IN(level);
IN(effect);
IN(spellid);
IN(duration);
IN(buff.effect_type);
IN(buff.level);
IN(buff.unknown003);
IN(buff.spellid);
IN(buff.duration);
IN(slotid);
IN(bufffade);
+17 -55
View File
@@ -719,69 +719,31 @@ struct SpawnAppearance_Struct
struct SpellBuff_Struct
{
/*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
/*001*/ float unknown004; // Seen 1 for no buff
/*005*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
/*009*/ uint32 unknown016;
/*013*/ uint8 bard_modifier;
/*014*/ int32 duration;
/*018*/ uint8 level;
/*019*/ uint32 spellid;
/*023*/ uint32 counters;
/*027*/ uint8 unknown0028[53];
/*080*/
};
struct SpellBuff_Struct_Old
{
/*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
/*001*/ uint8 level;
/*002*/ uint8 bard_modifier;
/*003*/ uint8 effect; // not real
/*004*/ float unknown004; // Seen 1 for no buff
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 unknown016;
/*020*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
/*024*/ uint32 counters;
/*028*/ uint8 unknown0028[60];
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
/*001*/ uint8 level; // Seen 1 for no buff
/*002*/ uint8 unknown002; //pretty sure padding now
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
/*004*/ float bard_modifier;
/*008*/ uint32 spellid;
/*012*/ uint32 duration;
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
/*020*/ uint32 num_hits;
/*024*/ float y; // referenced by SPA 441
/*028*/ float x; // unsure if all buffs get them
/*032*/ float z; // as valid data
/*036*/ uint32 unknown036;
/*040*/ int32 slot_data[12]; // book keeping stuff per slot (counters, rune/vie)
/*088*/
};
// Not functional yet, but this is what the packet looks like on Live
struct SpellBuffFade_Struct_Live {
/*000*/ uint32 entityid; // Player id who cast the buff
/*004*/ uint8 unknown004;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown007;
/*008*/ float unknown008;
/*012*/ uint32 spellid;
/*016*/ int32 duration;
/*020*/ uint32 playerId; // Global player ID?
/*024*/ uint32 num_hits;
/*028*/ uint8 unknown0028[64];
struct SpellBuffPacket_Struct {
/*000*/ uint32 entityid; // Player id who cast the buff
/*004*/ SpellBuff_Struct buff;
/*092*/ uint32 slotid;
/*096*/ uint32 bufffade;
/*100*/
};
struct SpellBuffFade_Struct {
/*000*/ uint32 entityid;
/*004*/ uint8 slot;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown7;
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 num_hits;
/*020*/ uint32 unknown020; // Global player ID?
/*024*/ uint32 playerId; // Player id who cast the buff
/*028*/ uint32 slotid;
/*032*/ uint32 bufffade;
/*036*/
};
struct BuffRemoveRequest_Struct
{
/*00*/ uint32 SlotID;
+17 -55
View File
@@ -708,69 +708,31 @@ struct SpawnAppearance_Struct
struct SpellBuff_Struct
{
/*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
/*001*/ float unknown004; // Seen 1 for no buff
/*005*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
/*009*/ uint32 unknown016;
/*013*/ uint8 bard_modifier;
/*014*/ int32 duration;
/*018*/ uint8 level;
/*019*/ uint32 spellid;
/*023*/ uint32 counters;
/*027*/ uint8 unknown0028[53];
/*080*/
};
struct SpellBuff_Struct_Old
{
/*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
/*001*/ uint8 level;
/*002*/ uint8 bard_modifier;
/*003*/ uint8 effect; // not real
/*004*/ float unknown004; // Seen 1 for no buff
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 unknown016;
/*020*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
/*024*/ uint32 counters;
/*028*/ uint8 unknown0028[60];
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
/*001*/ uint8 level; // Seen 1 for no buff
/*002*/ uint8 unknown002; //pretty sure padding now
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
/*004*/ float bard_modifier;
/*008*/ uint32 spellid;
/*012*/ uint32 duration;
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
/*020*/ uint32 num_hits;
/*024*/ float y; // referenced by SPA 441
/*028*/ float x; // unsure if all buffs get them
/*032*/ float z; // as valid data
/*036*/ uint32 unknown036;
/*040*/ int32 slot_data[12]; // book keeping stuff per slot (counters, rune/vie)
/*088*/
};
// Not functional yet, but this is what the packet looks like on Live
struct SpellBuffFade_Struct_Live {
/*000*/ uint32 entityid; // Player id who cast the buff
/*004*/ uint8 unknown004;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown007;
/*008*/ float unknown008;
/*012*/ uint32 spellid;
/*016*/ int32 duration;
/*020*/ uint32 playerId; // Global player ID?
/*024*/ uint32 num_hits;
/*028*/ uint8 unknown0028[64];
struct SpellBuffPacket_Struct {
/*000*/ uint32 entityid; // Player id who cast the buff
/*004*/ SpellBuff_Struct buff;
/*092*/ uint32 slotid;
/*096*/ uint32 bufffade;
/*100*/
};
struct SpellBuffFade_Struct {
/*000*/ uint32 entityid;
/*004*/ uint8 slot;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown7;
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 num_hits;
/*020*/ uint32 unknown020; // Global player ID?
/*024*/ uint32 playerId; // Player id who cast the buff
/*028*/ uint32 slotid;
/*032*/ uint32 bufffade;
/*036*/
};
struct BuffRemoveRequest_Struct
{
/*00*/ uint32 SlotID;
+19 -17
View File
@@ -301,16 +301,17 @@ namespace SoD
ENCODE(OP_Buff)
{
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct);
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
OUT(entityid);
OUT(slot);
OUT(level);
OUT(effect);
//eq->unknown7 = 10;
OUT(spellid);
OUT(duration);
OUT(buff.effect_type);
OUT(buff.level);
OUT(buff.bard_modifier);
OUT(buff.spellid);
OUT(buff.duration);
OUT(buff.counters);
OUT(buff.player_id);
OUT(slotid);
OUT(bufffade);
@@ -1602,10 +1603,10 @@ namespace SoD
OUT(thirst_level);
OUT(hunger_level);
for (r = 0; r < structs::BUFF_COUNT; r++) {
OUT(buffs[r].slotid);
OUT(buffs[r].effect_type);
OUT(buffs[r].level);
OUT(buffs[r].bard_modifier);
OUT(buffs[r].effect);
OUT(buffs[r].unknown003);
OUT(buffs[r].spellid);
OUT(buffs[r].duration);
OUT(buffs[r].counters);
@@ -2907,15 +2908,16 @@ namespace SoD
DECODE(OP_Buff)
{
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct);
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct);
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
IN(entityid);
IN(slot);
IN(level);
IN(effect);
IN(spellid);
IN(duration);
IN(buff.effect_type);
IN(buff.level);
IN(buff.bard_modifier);
IN(buff.spellid);
IN(buff.duration);
IN(buff.counters)
IN(slotid);
IN(bufffade);
+11 -21
View File
@@ -563,32 +563,22 @@ struct SpawnAppearance_Struct
// this is used inside profile
struct SpellBuff_Struct
{
/*000*/ uint8 slotid; //badly named... seems to be 2 for a real buff, 0 otherwise
/*001*/ uint8 level;
/*002*/ uint8 bard_modifier;
/*003*/ uint8 effect; //not real
/*004*/ uint32 spellid;
/*008*/ int32 duration;
/*012*/ uint32 counters;
/*016*/ uint32 unknown004; //Might need to be swapped with player_id
/*020*/ uint32 player_id; //'global' ID of the caster, for wearoff messages
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
/*001*/ uint8 level; // Seen 1 for no buff
/*002*/ uint8 bard_modifier;
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
/*004*/ uint32 spellid;
/*008*/ uint32 duration;
/*012*/ uint32 counters;
/*016*/ uint32 unknown016;
/*020*/ uint32 player_id; // caster ID, pretty sure just zone ID
/*024*/
};
struct SpellBuffFade_Struct {
struct SpellBuffPacket_Struct {
/*000*/ uint32 entityid;
/*004*/ uint8 slot;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown7;
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 unknown016;
/*020*/ uint32 unknown020; //prolly global player ID
/*024*/ uint32 playerId; // Player id who cast the buff
/*004*/ SpellBuff_Struct buff;
/*028*/ uint32 slotid;
/*032*/ uint32 bufffade;
/*036*/
+20 -17
View File
@@ -283,16 +283,17 @@ namespace SoF
ENCODE(OP_Buff)
{
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct);
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
OUT(entityid);
OUT(slot);
OUT(level);
OUT(effect);
//eq->unknown7 = 10;
OUT(spellid);
OUT(duration);
OUT(buff.effect_type);
OUT(buff.level);
OUT(buff.bard_modifier);
OUT(buff.spellid);
OUT(buff.duration);
OUT(buff.counters);
OUT(buff.player_id);
OUT(slotid);
OUT(bufffade);
@@ -1258,10 +1259,10 @@ namespace SoF
OUT(thirst_level);
OUT(hunger_level);
for (r = 0; r < structs::BUFF_COUNT; r++) {
OUT(buffs[r].slotid);
OUT(buffs[r].effect_type);
OUT(buffs[r].level);
OUT(buffs[r].bard_modifier);
OUT(buffs[r].effect);
OUT(buffs[r].unknown003);
OUT(buffs[r].spellid);
OUT(buffs[r].duration);
OUT(buffs[r].counters);
@@ -2343,15 +2344,17 @@ namespace SoF
DECODE(OP_Buff)
{
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct);
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct);
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
IN(entityid);
IN(slot);
IN(level);
IN(effect);
IN(spellid);
IN(duration);
IN(buff.effect_type);
IN(buff.level);
IN(buff.bard_modifier);
IN(buff.spellid);
IN(buff.duration);
IN(buff.counters);
IN(buff.player_id);
IN(slotid);
IN(bufffade);
+12 -21
View File
@@ -542,32 +542,23 @@ struct SpawnAppearance_Struct
// this is used inside profile
struct SpellBuff_Struct
{
/*000*/ uint8 slotid; //badly named... seems to be 2 for a real buff, 0 otherwise
/*001*/ uint8 level;
/*002*/ uint8 bard_modifier;
/*003*/ uint8 effect; //not real
/*004*/ uint32 spellid;
/*008*/ int32 duration;
/*012*/ uint32 counters;
/*016*/ uint32 unknown004; //Might need to be swapped with player_id
/*020*/ uint32 player_id; //'global' ID of the caster, for wearoff messages
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
/*001*/ uint8 level; // Seen 1 for no buff
/*002*/ uint8 bard_modifier;
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
/*004*/ uint32 spellid;
/*008*/ uint32 duration;
/*012*/ uint32 counters;
/*016*/ uint32 unknown016;
/*020*/ uint32 player_id; // caster ID, pretty sure just zone ID
/*024*/
};
struct SpellBuffFade_Struct {
struct SpellBuffPacket_Struct {
/*000*/ uint32 entityid;
/*004*/ uint8 slot;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown7;
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 unknown016;
/*020*/ uint32 unknown020; //prolly global player ID
/*024*/ uint32 playerId; // Player id who cast the buff
/*004*/ SpellBuff_Struct buff;
/*028*/ uint32 slotid;
/*032*/ uint32 bufffade;
/*036*/
+40 -2
View File
@@ -254,6 +254,25 @@ namespace Titanium
FINISH_ENCODE();
}
ENCODE(OP_Buff)
{
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
OUT(entityid);
OUT(buff.effect_type);
OUT(buff.level);
OUT(buff.bard_modifier);
OUT(buff.spellid);
OUT(buff.duration);
OUT(buff.counters);
OUT(buff.player_id);
OUT(slotid);
OUT(bufffade);
FINISH_ENCODE();
}
ENCODE(OP_ChannelMessage)
{
EQApplicationPacket *in = *p;
@@ -945,10 +964,10 @@ namespace Titanium
OUT(thirst_level);
OUT(hunger_level);
for (r = 0; r < structs::BUFF_COUNT; r++) {
OUT(buffs[r].slotid);
OUT(buffs[r].effect_type);
OUT(buffs[r].level);
OUT(buffs[r].bard_modifier);
OUT(buffs[r].effect);
OUT(buffs[r].unknown003);
OUT(buffs[r].spellid);
OUT(buffs[r].duration);
OUT(buffs[r].counters);
@@ -1688,6 +1707,25 @@ namespace Titanium
FINISH_DIRECT_DECODE();
}
DECODE(OP_Buff)
{
DECODE_LENGTH_EXACT(SpellBuffPacket_Struct);
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
IN(entityid);
IN(buff.effect_type);
IN(buff.level);
IN(buff.bard_modifier);
IN(buff.spellid);
IN(buff.duration);
IN(buff.counters);
IN(buff.player_id);
IN(slotid);
IN(bufffade);
FINISH_DIRECT_DECODE();
}
DECODE(OP_CastSpell)
{
DECODE_LENGTH_EXACT(structs::CastSpell_Struct);
+2
View File
@@ -24,6 +24,7 @@ E(OP_AdventureMerchantSell)
E(OP_ApplyPoison)
E(OP_BazaarSearch)
E(OP_BecomeTrader)
E(OP_Buff)
E(OP_ChannelMessage)
E(OP_CharInventory)
E(OP_Damage)
@@ -74,6 +75,7 @@ E(OP_ZoneSpawns)
D(OP_AdventureMerchantSell)
D(OP_ApplyPoison)
D(OP_AugmentItem)
D(OP_Buff)
D(OP_CastSpell)
D(OP_ChannelMessage)
D(OP_CharacterCreate)
+6 -13
View File
@@ -473,26 +473,19 @@ struct SpawnAppearance_Struct
// this is used inside profile
struct SpellBuff_Struct
{
/*000*/ uint8 slotid; //badly named... seems to be 2 for a real buff, 0 otherwise
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
/*001*/ uint8 level;
/*002*/ uint8 bard_modifier;
/*003*/ uint8 effect; //not real
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
/*004*/ uint32 spellid;
/*008*/ int32 duration;
/*012*/ uint32 counters;
/*016*/ uint32 player_id; //'global' ID of the caster, for wearoff messages
/*012*/ uint32 counters; // single book keeping value (counters, rune/vie)
/*016*/ uint32 player_id; // caster ID, pretty sure just zone ID
};
struct SpellBuffFade_Struct {
struct SpellBuffPacket_Struct {
/*000*/ uint32 entityid;
/*004*/ uint8 slot;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown7;
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 unknown016;
/*020*/ uint32 unknown020; //prolly global player ID
/*004*/ SpellBuff_Struct buff;
/*024*/ uint32 slotid;
/*028*/ uint32 bufffade;
/*032*/
+35 -26
View File
@@ -363,20 +363,29 @@ namespace UF
ENCODE(OP_Buff)
{
ENCODE_LENGTH_EXACT(SpellBuffFade_Struct);
SETUP_DIRECT_ENCODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Underfoot);
ENCODE_LENGTH_EXACT(SpellBuffPacket_Struct);
SETUP_DIRECT_ENCODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
OUT(entityid);
OUT(slot);
OUT(level);
OUT(effect);
//eq->unknown7 = 10;
OUT(spellid);
OUT(duration);
OUT(slotid);
OUT(buff.effect_type);
OUT(buff.level);
// just so we're 100% sure we get a 1.0f ...
eq->buff.bard_modifier = emu->buff.bard_modifier == 10 ? 1.0f : emu->buff.bard_modifier / 10.0f;
OUT(buff.spellid);
OUT(buff.duration);
OUT(buff.num_hits);
uint16 buffslot = emu->slotid;
if (buffslot >= 25 && buffslot < 37)
{
buffslot += 5;
}
else if (buffslot >= 37)
{
buffslot += 14;
}
// TODO: implement slot_data stuff
eq->slotid = buffslot;
OUT(bufffade); // Live (October 2011) sends a 2 rather than 0 when a buff is created, but it doesn't seem to matter.
OUT(num_hits);
eq->unknown008 = 1.0f;
FINISH_ENCODE();
}
@@ -1862,22 +1871,22 @@ namespace UF
{
if (emu->buffs[r].spellid != 0xFFFF && emu->buffs[r].spellid != 0)
{
eq->buffs[r].unknown004 = 0x3f800000;
eq->buffs[r].slotid = 2;
eq->buffs[r].bard_modifier = 1.0f;
eq->buffs[r].effect_type= 2;
eq->buffs[r].player_id = 0x000717fd;
}
else
{
eq->buffs[r].slotid = 0;
eq->buffs[r].effect_type = 0;
}
//OUT(buffs[r].slotid);
OUT(buffs[r].effect_type);
OUT(buffs[r].level);
//OUT(buffs[r].bard_modifier);
//OUT(buffs[r].effect);
OUT(buffs[r].bard_modifier);
OUT(buffs[r].unknown003);
OUT(buffs[r].spellid);
OUT(buffs[r].duration);
OUT(buffs[r].counters);
//OUT(buffs[r].player_id);
OUT(buffs[r].num_hits);
OUT(buffs[r].player_id);
}
for (r = 0; r < MAX_PP_DISCIPLINES; r++) {
OUT(disciplines.values[r]);
@@ -3216,15 +3225,15 @@ namespace UF
DECODE(OP_Buff)
{
DECODE_LENGTH_EXACT(structs::SpellBuffFade_Struct_Underfoot);
SETUP_DIRECT_DECODE(SpellBuffFade_Struct, structs::SpellBuffFade_Struct_Underfoot);
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
SETUP_DIRECT_DECODE(SpellBuffPacket_Struct, structs::SpellBuffPacket_Struct);
IN(entityid);
IN(slot);
IN(level);
IN(effect);
IN(spellid);
IN(duration);
IN(buff.effect_type);
IN(buff.level);
IN(buff.unknown003);
IN(buff.spellid);
IN(buff.duration);
IN(slotid);
IN(bufffade);
+13 -40
View File
@@ -566,55 +566,28 @@ struct SpawnAppearance_Struct
// Size 76 (was 24)
struct SpellBuff_Struct
{
/*000*/ uint8 slotid; // badly named... seems to be 2 for a real buff, 0 otherwise
/*001*/ uint8 level;
/*002*/ uint8 bard_modifier;
/*003*/ uint8 effect; // not real
/*004*/ uint32 unknown004; // Seen 1 for no buff
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 unknown016;
/*020*/ uint32 player_id; // 'global' ID of the caster, for wearoff messages
/*024*/ uint32 counters;
/*028*/ uint8 unknown0028[48];
/*076*/
/*000*/ uint8 effect_type; // 0 = no buff, 2 = buff, 4 = inverse affects of buff
/*001*/ uint8 level; // Seen 1 for no buff
/*002*/ uint8 unknown002; //pretty sure padding now
/*003*/ uint8 unknown003; // MQ2 used to call this "damage shield" -- don't see client referencing it, so maybe server side DS type tracking?
/*004*/ float bard_modifier;
/*008*/ uint32 spellid;
/*012*/ uint32 duration;
/*016*/ uint32 num_hits;
/*020*/ uint32 player_id; // caster ID, pretty sure just zone ID
/*024*/ uint32 unknown036;
/*028*/ int32 slot_data[12]; // book keeping stuff per slot (counters, rune/vie)
};
// Not functional yet, but this is what the packet looks like on Underfoot
struct SpellBuffFade_Struct_Underfoot {
struct SpellBuffPacket_Struct {
/*000*/ uint32 entityid; // Player id who cast the buff
/*004*/ uint8 slot;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown7;
/*008*/ float unknown008;
/*012*/ uint32 spellid;
/*016*/ int32 duration;
/*020*/ uint32 num_hits;
/*024*/ uint32 playerId; // Global player ID?
/*028*/ uint32 unknown020;
/*032*/ uint8 unknown0028[48];
/*004*/ SpellBuff_Struct buff;
/*080*/ uint32 slotid;
/*084*/ uint32 bufffade;
/*088*/
};
struct SpellBuffFade_Struct {
/*000*/ uint32 entityid;
/*004*/ uint8 slot;
/*005*/ uint8 level;
/*006*/ uint8 effect;
/*007*/ uint8 unknown7;
/*008*/ uint32 spellid;
/*012*/ int32 duration;
/*016*/ uint32 unknown016;
/*020*/ uint32 unknown020; // Global player ID?
/*024*/ uint32 playerId; // Player id who cast the buff
/*028*/ uint32 slotid;
/*032*/ uint32 bufffade;
/*036*/
};
#if 0
struct BuffIconEntry_Struct {
/*000*/ uint32 buff_slot;