mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-22 12:18:27 +00:00
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:
+17
-19
@@ -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.
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user