void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacket *data) { uint32 mask = player->GetGroupUpdateFlag(); if (mask == GROUP_UPDATE_FLAG_NONE) return; if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); uint32 byteCount = 0; for (int i = 1; i < GROUP_UPDATE_FLAGS_COUNT; ++i) if (mask & (1 << i)) byteCount += GroupUpdateLength[i]; data->Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount); data->append(player->GetPackGUID()); *data << (uint32) mask; if (mask & GROUP_UPDATE_FLAG_STATUS) { if (player) { if (player->IsPvP()) *data << (uint16) (MEMBER_STATUS_ONLINE | MEMBER_STATUS_PVP); else *data << (uint16) MEMBER_STATUS_ONLINE; } else *data << (uint16) MEMBER_STATUS_OFFLINE; } if (mask & GROUP_UPDATE_FLAG_CUR_HP) *data << (uint32) player->GetHealth(); if (mask & GROUP_UPDATE_FLAG_MAX_HP) *data << (uint32) player->GetMaxHealth(); Powers powerType = player->getPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) *data << (uint8) powerType; if (mask & GROUP_UPDATE_FLAG_CUR_POWER) *data << (uint16) player->GetPower(powerType); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) *data << (uint16) player->GetMaxPower(powerType); if (mask & GROUP_UPDATE_FLAG_LEVEL) *data << (uint16) player->getLevel(); if (mask & GROUP_UPDATE_FLAG_ZONE) *data << (uint16) player->GetZoneId(); if (mask & GROUP_UPDATE_FLAG_POSITION) *data << (uint16) player->GetPositionX() << (uint16) player->GetPositionY(); if (mask & GROUP_UPDATE_FLAG_AURAS) { const uint64& auramask = player->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const * aurApp = player->GetVisibleAura(i); *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0); *data << uint8(1); } } } Pet *pet = player->GetPet(); if (mask & GROUP_UPDATE_FLAG_PET_GUID) { if (pet) *data << (uint64) pet->GetGUID(); else *data << (uint64) 0; } if (mask & GROUP_UPDATE_FLAG_PET_NAME) { if (pet) *data << pet->GetName(); else *data << (uint8) 0; } if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) { if (pet) *data << (uint16) pet->GetDisplayId(); else *data << (uint16) 0; } if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) { if (pet) *data << (uint32) pet->GetHealth(); else *data << (uint32) 0; } if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) { if (pet) *data << (uint32) pet->GetMaxHealth(); else *data << (uint32) 0; } if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) { if (pet) *data << (uint8) pet->getPowerType(); else *data << (uint8) 0; } if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) { if (pet) *data << (uint16) pet->GetPower(pet->getPowerType()); else *data << (uint16) 0; } if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) { if (pet) *data << (uint16) pet->GetMaxPower(pet->getPowerType()); else *data << (uint16) 0; } if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) { if (player->GetVehicle()){ Vehicle* vv=player->GetVehicle(); *data << (uint32) vv->GetVehicleInfo()->m_seatID[player->m_movementInfo.t_seat]; } } if (mask & GROUP_UPDATE_FLAG_PET_AURAS) { if (pet) { const uint64& auramask = pet->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const * aurApp = player->GetVisibleAura(i); *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0); *data << uint8(1); } } } else *data << (uint64) 0; } }
void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket* data) { uint32 mask = player->GetGroupUpdateFlag(); if (mask == GROUP_UPDATE_FLAG_NONE) return; if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); data->Initialize(SMSG_PARTY_MEMBER_STATS, 80); // average value data->append(player->GetPackGUID()); *data << uint32(mask); if (mask & GROUP_UPDATE_FLAG_STATUS) { if (player) { uint16 playerStatus = MEMBER_STATUS_ONLINE; if (player->IsPvP()) playerStatus |= MEMBER_STATUS_PVP; if (!player->IsAlive()) { if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) playerStatus |= MEMBER_STATUS_GHOST; else playerStatus |= MEMBER_STATUS_DEAD; } if (player->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP)) playerStatus |= MEMBER_STATUS_PVP_FFA; if (player->isAFK()) playerStatus |= MEMBER_STATUS_AFK; if (player->isDND()) playerStatus |= MEMBER_STATUS_DND; *data << uint16(playerStatus); } else *data << uint16(MEMBER_STATUS_OFFLINE); } if (mask & GROUP_UPDATE_FLAG_CUR_HP) *data << uint32(player->GetHealth()); if (mask & GROUP_UPDATE_FLAG_MAX_HP) *data << uint32(player->GetMaxHealth()); Powers powerType = player->getPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) *data << uint8(powerType); if (mask & GROUP_UPDATE_FLAG_CUR_POWER) *data << uint16(player->GetPower(powerType)); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) *data << uint16(player->GetMaxPower(powerType)); if (mask & GROUP_UPDATE_FLAG_LEVEL) *data << uint16(player->getLevel()); if (mask & GROUP_UPDATE_FLAG_ZONE) *data << uint16(player->GetZoneId()); if (mask & GROUP_UPDATE_FLAG_UNK100) *data << uint16(0); if (mask & GROUP_UPDATE_FLAG_POSITION) { *data << uint16(player->GetPositionX()); *data << uint16(player->GetPositionY()); *data << uint16(player->GetPositionZ()); } if (mask & GROUP_UPDATE_FLAG_AURAS) { *data << uint8(0); uint64 auramask = player->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); *data << uint32(MAX_AURAS); // count for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const* aurApp = player->GetVisibleAura(i); if (!aurApp) { *data << uint32(0); *data << uint16(0); continue; } *data << uint32(aurApp->GetBase()->GetId()); *data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) *data << int32(eff->GetAmount()); else *data << int32(0); } } } } } Pet* pet = player->GetPet(); if (mask & GROUP_UPDATE_FLAG_PET_GUID) { if (pet) *data << uint64(pet->GetGUID()); else *data << uint64(0); } if (mask & GROUP_UPDATE_FLAG_PET_NAME) { if (pet) *data << pet->GetName(); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) { if (pet) *data << uint16(pet->GetDisplayId()); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) { if (pet) *data << uint32(pet->GetHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) { if (pet) *data << uint32(pet->GetMaxHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) { if (pet) *data << uint8(pet->getPowerType()); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) { if (pet) *data << uint16(pet->GetPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) { if (pet) *data << uint16(pet->GetMaxPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_AURAS) { if (pet) { *data << uint8(0); uint64 auramask = pet->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); *data << uint32(MAX_AURAS); // count for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const* aurApp = pet->GetVisibleAura(i); if (!aurApp) { *data << uint32(0); *data << uint16(0); continue; } *data << uint32(aurApp->GetBase()->GetId()); *data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) *data << int32(eff->GetAmount()); else *data << int32(0); } } } } } else { *data << uint8(0); *data << uint64(0); } } if (mask & GROUP_UPDATE_FLAG_PHASE) { *data << uint32(8); // either 0 or 8, same unk found in SMSG_PHASESHIFT *data << uint32(0); // count // for (count) *data << uint16(phaseId) } if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) { if (Vehicle* veh = player->GetVehicle()) *data << uint32(veh->GetVehicleInfo()->m_seatID[player->m_movementInfo.transport.seat]); else *data << uint32(0); } }
void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket* data) { uint32 mask = player->GetGroupUpdateFlag(); if (mask == GROUP_UPDATE_FLAG_NONE) return; if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); uint32 byteCount = 0; for (int i = 1; i < GROUP_UPDATE_FLAGS_COUNT; ++i) if (mask & (1 << i)) byteCount += GroupUpdateLength[i]; data->Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount); data->append(player->GetPackGUID()); *data << uint32(mask); if (mask & GROUP_UPDATE_FLAG_STATUS) { if (player) { if (player->IsPvP()) *data << uint16(MEMBER_STATUS_ONLINE | MEMBER_STATUS_PVP); else *data << uint16(MEMBER_STATUS_ONLINE); } else *data << uint16(MEMBER_STATUS_OFFLINE); } if (mask & GROUP_UPDATE_FLAG_CUR_HP) *data << uint32(player->GetHealth()); if (mask & GROUP_UPDATE_FLAG_MAX_HP) *data << uint32(player->GetMaxHealth()); Powers powerType = player->getPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) *data << uint8(powerType); if (mask & GROUP_UPDATE_FLAG_CUR_POWER) *data << uint16(player->GetPower(powerType)); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) *data << uint16(player->GetMaxPower(powerType)); if (mask & GROUP_UPDATE_FLAG_LEVEL) *data << uint16(player->getLevel()); if (mask & GROUP_UPDATE_FLAG_ZONE) *data << uint16(player->GetZoneId()); if (mask & GROUP_UPDATE_FLAG_POSITION) *data << uint16(player->GetPositionX()) << uint16(player->GetPositionY()); if (mask & GROUP_UPDATE_FLAG_AURAS) { uint64 auramask = player->GetAuraUpdateMaskForRaid(); // if true client clears auras that are not covered by auramask // TODO: looks like now client requires all active auras to be in the beginning of the auramask // e.g. if you have holes in the aura mask the values after are ignored. *data << uint8(0); *data << uint64(auramask); *data << uint32(MAX_AURAS); // client reads (64) Bits from auramask for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const* aurApp = player->GetVisibleAura(i); if (!aurApp) { *data << uint32(0); *data << uint16(0); continue; } *data << uint32(aurApp->GetBase()->GetId()); *data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) *data << int32(eff->GetAmount()); else *data << int32(0); } } } } } Pet* pet = player->GetPet(); if (mask & GROUP_UPDATE_FLAG_PET_GUID) { if (pet) *data << uint64(pet->GetGUID()); else *data << uint64(0); } if (mask & GROUP_UPDATE_FLAG_PET_NAME) { if (pet) *data << pet->GetName(); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) { if (pet) *data << uint16(pet->GetDisplayId()); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) { if (pet) *data << uint32(pet->GetHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) { if (pet) *data << uint32(pet->GetMaxHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) { if (pet) *data << uint8(pet->getPowerType()); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) { if (pet) *data << uint16(pet->GetPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) { if (pet) *data << uint16(pet->GetMaxPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) { if (Vehicle* veh = player->GetVehicle()) *data << uint32(veh->GetVehicleInfo()->m_seatID[player->_movementInfo.t_seat]); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_AURAS) { if (pet) { *data << uint8(0); // if true client clears auras that are not covered by auramask uint64 auramask = pet->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); *data << uint32(MAX_AURAS); // client reads (64) Bits from auramask for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const* aurApp = pet->GetVisibleAura(i); if (!aurApp) { *data << uint32(0); *data << uint16(0); continue; } *data << uint32(aurApp->GetBase()->GetId()); *data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) *data << int32(eff->GetAmount()); else *data << int32(0); } } } } } else *data << uint8(1) << uint64(0) << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PHASE) // 4.0.6 unk { *data << uint32(0); // either 0 or 8, same unk found in SMSG_PHASESHIFT *data << uint32(0); // count // String for (count) *data << uint16(phaseId) } }
void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket* data) { uint32 mask = player->GetGroupUpdateFlag(); if (mask == GROUP_UPDATE_FLAG_NONE) return; if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); uint32 byteCount = 0; for (int i = 1; i < GROUP_UPDATE_FLAGS_COUNT; ++i) if (mask & (1 << i)) byteCount += GroupUpdateLength[i]; data->Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount); *data << player->GetPackGUID(); *data << uint32(mask); if (mask & GROUP_UPDATE_FLAG_STATUS) { uint16 playerStatus = MEMBER_STATUS_ONLINE; if (player->IsPvP()) playerStatus |= MEMBER_STATUS_PVP; if (!player->IsAlive()) { if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) playerStatus |= MEMBER_STATUS_GHOST; else playerStatus |= MEMBER_STATUS_DEAD; } if (player->IsFFAPvP()) playerStatus |= MEMBER_STATUS_PVP_FFA; if (player->isAFK()) playerStatus |= MEMBER_STATUS_AFK; if (player->isDND()) playerStatus |= MEMBER_STATUS_DND; *data << uint16(playerStatus); } if (mask & GROUP_UPDATE_FLAG_CUR_HP) *data << uint32(player->GetHealth()); if (mask & GROUP_UPDATE_FLAG_MAX_HP) *data << uint32(player->GetMaxHealth()); Powers powerType = player->getPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) *data << uint8(powerType); if (mask & GROUP_UPDATE_FLAG_CUR_POWER) *data << uint16(player->GetPower(powerType)); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) *data << uint16(player->GetMaxPower(powerType)); if (mask & GROUP_UPDATE_FLAG_LEVEL) *data << uint16(player->getLevel()); if (mask & GROUP_UPDATE_FLAG_ZONE) *data << uint16(player->GetZoneId()); if (mask & GROUP_UPDATE_FLAG_POSITION) { *data << uint16(player->GetPositionX()); *data << uint16(player->GetPositionY()); } if (mask & GROUP_UPDATE_FLAG_AURAS) { uint64 auramask = player->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const* aurApp = player->GetVisibleAura(i); *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0); *data << uint8(1); } } } Pet* pet = player->GetPet(); if (mask & GROUP_UPDATE_FLAG_PET_GUID) { if (pet) *data << (uint64) pet->GetGUID(); else *data << (uint64) 0; } if (mask & GROUP_UPDATE_FLAG_PET_NAME) { if (pet) *data << pet->GetName(); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) { if (pet) *data << uint16(pet->GetDisplayId()); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) { if (pet) *data << uint32(pet->GetHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) { if (pet) *data << uint32(pet->GetMaxHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) { if (pet) *data << uint8(pet->getPowerType()); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) { if (pet) *data << uint16(pet->GetPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) { if (pet) *data << uint16(pet->GetMaxPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_AURAS) { if (pet) { uint64 auramask = pet->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const* aurApp = pet->GetVisibleAura(i); *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0); *data << uint8(aurApp ? aurApp->GetFlags() : 0); } } } else *data << uint64(0); } if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) { if (Vehicle* veh = player->GetVehicle()) *data << uint32(veh->GetVehicleInfo()->m_seatID[player->m_movementInfo.transport.seat]); else *data << uint32(0); } }
void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacket *data) { uint32 mask = player->GetGroupUpdateFlag(); if (mask == GROUP_UPDATE_FLAG_NONE) return; if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); uint32 byteCount = 0; for (int i = 1; i < GROUP_UPDATE_FLAGS_COUNT; ++i) if (mask & (1 << i)) byteCount += GroupUpdateLength[i]; data->Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount); data->append(player->GetPackGUID()); *data << (uint32) mask; if (mask & GROUP_UPDATE_FLAG_STATUS) { if (player) { if (player->IsPvP()) *data << (uint16) (MEMBER_STATUS_ONLINE | MEMBER_STATUS_PVP); else *data << (uint16) MEMBER_STATUS_ONLINE; } else *data << (uint16) MEMBER_STATUS_OFFLINE; } if (mask & GROUP_UPDATE_FLAG_CUR_HP) *data << (uint32) player->GetHealth(); if (mask & GROUP_UPDATE_FLAG_MAX_HP) *data << (uint32) player->GetMaxHealth(); Powers powerType = player->getPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) *data << (uint8) powerType; if (mask & GROUP_UPDATE_FLAG_CUR_POWER) *data << (uint16) player->GetPower(powerType); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) *data << (uint16) player->GetMaxPower(powerType); if (mask & GROUP_UPDATE_FLAG_LEVEL) *data << (uint16) player->getLevel(); if (mask & GROUP_UPDATE_FLAG_ZONE) *data << (uint16) player->GetZoneId(); if (mask & GROUP_UPDATE_FLAG_POSITION) *data << (uint16) player->GetPositionX() << (uint16) player->GetPositionY(); if (mask & GROUP_UPDATE_FLAG_AURAS) { const uint64& auramask = player->GetAuraUpdateMaskForRaid(); *data << uint8(0); // if true client clears auras that are not covered by auramask // TODO: looks like now client requires all active auras to be in the beginning of the auramask // e.g. if you have holes in the aura mask the values after are ignored. *data << uint64(auramask); *data << uint32(64); // how many bits client reads from auramask for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const * aurApp = player->GetVisibleAura(i); *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0); *data << uint8(1); } } } Pet *pet = player->GetPet(); if (mask & GROUP_UPDATE_FLAG_PET_GUID) { if (pet) *data << (uint64) pet->GetGUID(); else *data << (uint64) 0; } if (mask & GROUP_UPDATE_FLAG_PET_NAME) { if (pet) *data << pet->GetName(); else *data << (uint8) 0; } if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) { if (pet) *data << (uint16) pet->GetDisplayId(); else *data << (uint16) 0; } if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) { if (pet) *data << (uint32) pet->GetHealth(); else *data << (uint32) 0; } if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) { if (pet) *data << (uint32) pet->GetMaxHealth(); else *data << (uint32) 0; } if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) { if (pet) *data << (uint8) pet->getPowerType(); else *data << (uint8) 0; } if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) { if (pet) *data << (uint16) pet->GetPower(pet->getPowerType()); else *data << (uint16) 0; } if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) { if (pet) *data << (uint16) pet->GetMaxPower(pet->getPowerType()); else *data << (uint16) 0; } if (mask & GROUP_UPDATE_FLAG_PET_AURAS) { if (pet) { *data << uint8(0); // if true client clears auras that are not covered by auramask const uint64& auramask = pet->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); *data << uint32(64); // how many bits client reads from auramask for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const * aurApp = player->GetVisibleAura(i); *data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0); *data << uint8(1); } } } else *data << uint8(1) << (uint64) 0 << uint32(0); } if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) { if (player->GetVehicle()) { Vehicle* vv=player->GetVehicle(); *data << (uint32) vv->GetVehicleInfo()->m_seatID[player->m_movementInfo.t_seat]; } } if (mask & GROUP_UPDATE_FLAG_PHASE) // 4.0.6 unk { *data << (uint32) 0; *data << (uint32) 0; // string } }
void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket* data) { uint32 mask = player->GetGroupUpdateFlag(); if (mask == GROUP_UPDATE_FLAG_NONE) return; mask = mask &~ (GROUP_UPDATE_FLAG_AURAS | GROUP_UPDATE_FLAG_PET_AURAS); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); data->Initialize(SMSG_PARTY_MEMBER_STATS, 80); // average value data->append(player->GetPackGUID()); *data << uint32(mask); if (mask & GROUP_UPDATE_FLAG_STATUS) { if (player) { if (player->IsPvP()) *data << uint16(MEMBER_STATUS_ONLINE | MEMBER_STATUS_PVP); else *data << uint16(MEMBER_STATUS_ONLINE); } else *data << uint16(MEMBER_STATUS_OFFLINE); } if (mask & GROUP_UPDATE_FLAG_CUR_HP) *data << uint32(player->GetHealth()); if (mask & GROUP_UPDATE_FLAG_MAX_HP) *data << uint32(player->GetMaxHealth()); Powers powerType = player->getPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) *data << uint8(powerType); if (mask & GROUP_UPDATE_FLAG_CUR_POWER) *data << uint16(player->GetPower(powerType)); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) *data << uint16(player->GetMaxPower(powerType)); if (mask & GROUP_UPDATE_FLAG_LEVEL) *data << uint16(player->getLevel()); if (mask & GROUP_UPDATE_FLAG_ZONE) *data << uint16(player->GetZoneId()); if (mask & GROUP_UPDATE_FLAG_UNK100) *data << uint16(0); if (mask & GROUP_UPDATE_FLAG_POSITION) *data << uint16(player->GetPositionX()) << uint16(player->GetPositionY()) << uint16(player->GetPositionZ()); if (mask & GROUP_UPDATE_FLAG_AURAS) { *data << uint8(0); uint64 auramask = player->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); *data << uint32(MAX_AURAS); // count for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const* aurApp = player->GetVisibleAura(i); if (!aurApp) { *data << uint32(0); *data << uint16(0); continue; } *data << uint32(aurApp->GetBase()->GetId()); *data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { size_t pos = data->wpos(); uint8 count = 0; *data << uint8(0); for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (constAuraEffectPtr eff = aurApp->GetBase()->GetEffect(i)) // NULL if effect flag not set { *data << float(eff->GetAmount()); count++; } } data->put(pos, count); } } } } Pet* pet = player->GetPet(); if (mask & GROUP_UPDATE_FLAG_PET_GUID) { if (pet) *data << uint64(pet->GetGUID()); else *data << uint64(0); } if (mask & GROUP_UPDATE_FLAG_PET_NAME) { if (pet) *data << pet->GetName(); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) { if (pet) *data << uint16(pet->GetDisplayId()); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) { if (pet) *data << uint32(pet->GetHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) { if (pet) *data << uint32(pet->GetMaxHealth()); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) { if (pet) *data << uint8(pet->getPowerType()); else *data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) { if (pet) *data << uint16(pet->GetPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) { if (pet) *data << uint16(pet->GetMaxPower(pet->getPowerType())); else *data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) { if (Vehicle* veh = player->GetVehicle()) *data << uint32(veh->GetVehicleInfo()->m_seatID[player->m_movementInfo.t_seat]); else *data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_AURAS) { if (pet) { *data << uint8(0); uint64 auramask = pet->GetAuraUpdateMaskForRaid(); *data << uint64(auramask); *data << uint32(MAX_AURAS); // count for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { AuraApplication const* aurApp = pet->GetVisibleAura(i); if (!aurApp) { *data << uint32(0); *data << uint16(0); continue; } *data << uint32(aurApp->GetBase()->GetId()); *data << uint16(aurApp->GetFlags()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { size_t pos = data->wpos(); uint8 count = 0; *data << uint8(0); for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (constAuraEffectPtr eff = aurApp->GetBase()->GetEffect(i)) // NULL if effect flag not set { *data << float(eff->GetAmount()); count++; } } data->put(pos, count); } } } } else { *data << uint8(0); *data << uint64(0); } } if (mask & GROUP_UPDATE_FLAG_PHASE) { *data << uint32(8); // either 0 or 8, same unk found in SMSG_PHASESHIFT *data << uint32(0); // count // for (count) *data << uint16(phaseId) } }
void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket* data, uint32 mask, ObjectGuid guid, bool full /*= false*/) { // Prevent sending an empty packet if (mask == GROUP_UPDATE_FLAG_NONE) return; std::set<uint32> phases; if (player) player->GetPhaseMgr().GetActivePhases(phases); ByteBuffer dataBuffer; if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); Pet* pet = NULL; if (!player) mask &= ~GROUP_UPDATE_FULL; else if (!(pet = player->GetPet())) mask &= ~GROUP_UPDATE_PET; mask |= GROUP_UPDATE_FLAG_STATUS; //if (player && (mask & GROUP_UPDATE_FLAG_STATUS)) // mask |= GROUP_UPDATE_PLAYER_BASE; data->Initialize(SMSG_PARTY_MEMBER_STATS, 200); // average value data->WriteBit(guid[5]); data->WriteBit(guid[2]); data->WriteBit(false); data->WriteBit(guid[6]); data->WriteBit(guid[4]); data->WriteBit(guid[7]); data->WriteBit(guid[3]); data->WriteBit(false); data->WriteBit(guid[0]); data->WriteBit(guid[1]); data->FlushBits(); data->WriteByteSeq(guid[4]); data->WriteByteSeq(guid[6]); if (mask & GROUP_UPDATE_FLAG_STATUS) { uint16 status = MEMBER_STATUS_OFFLINE; if (player) { status |= MEMBER_STATUS_ONLINE; if (player->IsPvP()) status |= MEMBER_STATUS_PVP; if (player->isDead()) status |= MEMBER_STATUS_DEAD; if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) status |= MEMBER_STATUS_GHOST; if (player->IsFFAPvP()) status |= MEMBER_STATUS_PVP_FFA; if (player->isAFK()) status |= MEMBER_STATUS_AFK; if (player->isDND()) status |= MEMBER_STATUS_DND; } dataBuffer << uint16(status); } if (mask & GROUP_UPDATE_FLAG_MOP_UNK) { dataBuffer << uint8(1); // Same realms ? dataBuffer << uint8(0); // in lfg } if (mask & GROUP_UPDATE_FLAG_CUR_HP) dataBuffer << uint32(player->GetHealth()); if (mask & GROUP_UPDATE_FLAG_MAX_HP) dataBuffer << uint32(player->GetMaxHealth()); Powers powerType = POWER_MANA; if (player) powerType = player->getPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) dataBuffer << uint8(powerType); if (mask & GROUP_UPDATE_FLAG_UNK_20) dataBuffer << uint16(0); if (mask & GROUP_UPDATE_FLAG_CUR_POWER) dataBuffer << uint16(player->GetPower(powerType)); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) dataBuffer << uint16(player->GetMaxPower(powerType)); if (mask & GROUP_UPDATE_FLAG_LEVEL) dataBuffer << uint16(player->getLevel()); if (mask & GROUP_UPDATE_FLAG_ZONE) dataBuffer << uint16(player->GetZoneId()); if (mask & GROUP_UPDATE_FLAG_UNK400) dataBuffer << uint16(player->GetAreaId()); if (mask & GROUP_UPDATE_FLAG_POSITION) dataBuffer << uint16(player->GetPositionX()) << uint16(player->GetPositionY()) << uint16(player->GetPositionZ()); if (mask & GROUP_UPDATE_FLAG_AURAS) { uint64 auramask = player->GetAuraUpdateMaskForRaid(); dataBuffer << uint8(1); dataBuffer << uint64(auramask); dataBuffer << uint32(MAX_AURAS); for (uint32 i = 0; i < MAX_AURAS; ++i) { if (!(auramask & (UI64LIT(1) << i))) continue; AuraApplication const* aurApp = player->GetVisibleAura(i); if (!aurApp) { dataBuffer << uint32(0); dataBuffer << uint8(0); dataBuffer << uint32(0); continue; } dataBuffer << uint32(aurApp->GetBase()->GetId()); dataBuffer << uint8(aurApp->GetFlags()); dataBuffer << uint32(aurApp->GetBase()->GetEffectMask()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { uint32 auraEffectMask = aurApp->GetBase()->GetEffectMask(); size_t pos = dataBuffer.wpos(); uint8 amount_count = 0; dataBuffer << uint8(0); for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) { if (!(auraEffectMask & (1 << j))) continue; if (constAuraEffectPtr eff = aurApp->GetBase()->GetEffect(j)) // NULL if effect flag not set dataBuffer << float(eff->GetAmount()); else dataBuffer << float(0.0f); ++amount_count; } dataBuffer.put(pos, amount_count); } } } if (mask & GROUP_UPDATE_FLAG_PET_GUID) { if (pet) dataBuffer << uint64(pet->GetGUID()); else dataBuffer << uint64(0); } if (mask & GROUP_UPDATE_FLAG_PET_NAME) { if (pet) dataBuffer << pet->GetName(); else dataBuffer << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) { if (pet) dataBuffer << uint16(pet->GetDisplayId()); else dataBuffer << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) { if (pet) dataBuffer << uint32(pet->GetHealth()); else dataBuffer << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) { if (pet) dataBuffer << uint32(pet->GetMaxHealth()); else dataBuffer << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) { if (pet) dataBuffer << uint8(pet->getPowerType()); else dataBuffer << uint8(0); } if (mask & GROUP_UPDATE_FLAG_MOP_UNK_2) dataBuffer << uint16(0); // Unk if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) { if (pet) dataBuffer << uint16(pet->GetPower(pet->getPowerType())); else dataBuffer << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) { if (pet) dataBuffer << uint16(pet->GetMaxPower(pet->getPowerType())); else dataBuffer << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_AURAS) { if (pet) { uint64 auramask = pet->GetAuraUpdateMaskForRaid(); dataBuffer << uint8(1); dataBuffer << uint64(auramask); dataBuffer << uint32(MAX_AURAS); for (uint32 i = 0; i < MAX_AURAS; ++i) { if (!(auramask & (UI64LIT(1) << i))) continue; AuraApplication const* aurApp = pet->GetVisibleAura(i); if (!aurApp) { dataBuffer << uint32(0); dataBuffer << uint8(0); dataBuffer << uint32(0); continue; } dataBuffer << uint32(aurApp->GetBase()->GetId()); dataBuffer << uint8(aurApp->GetFlags()); dataBuffer << uint32(aurApp->GetBase()->GetEffectMask()); if (aurApp->GetFlags() & AFLAG_ANY_EFFECT_AMOUNT_SENT) { uint32 auraEffectMask = aurApp->GetBase()->GetEffectMask(); size_t pos = dataBuffer.wpos(); uint8 count = 0; dataBuffer << uint8(0); for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) { if (!(auraEffectMask & (1 << j))) continue; if (constAuraEffectPtr eff = aurApp->GetBase()->GetEffect(j)) // NULL if effect flag not set dataBuffer << float(eff->GetAmount()); else dataBuffer << float(0.0f); ++count; } dataBuffer.put(pos, count); } } } else { dataBuffer << uint8(0); dataBuffer << uint64(0); dataBuffer << uint32(0); } } if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) { if (Vehicle* veh = player->GetVehicle()) dataBuffer << uint32(veh->GetVehicleInfo()->m_seatID[player->m_movementInfo.t_seat]); else dataBuffer << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PHASE) { dataBuffer << uint32(phases.empty() ? 0x8 : 0x10); // Same as found in SMSG_SET_PHASE_SHIFT. dataBuffer.WriteBits(phases.size(), 23); // Phases Count. dataBuffer.FlushBits(); for (std::set<uint32>::const_iterator itr = phases.begin(); itr != phases.end(); ++itr) *data << uint16(*itr); } if (mask & GROUP_UPDATE_FLAG_UNK_2000000) dataBuffer << uint16(0); if (mask & GROUP_UPDATE_FLAG_UNK_4000000) dataBuffer << uint32(0); /* this flags are not handled by client */ /*if (mask & GROUP_UPDATE_FLAG_UNK_8000000) dataBuffer << uint8(0); if (mask & GROUP_UPDATE_FLAG_UNK_10000000) dataBuffer << uint8(0); if (mask & GROUP_UPDATE_FLAG_UNK_20000000) dataBuffer << uint8(253); if (mask & GROUP_UPDATE_FLAG_UNK_40000000) dataBuffer << uint8(0);*/ *data << uint32(dataBuffer.size()); data->append(dataBuffer); data->WriteByteSeq(guid[3]); data->WriteByteSeq(guid[5]); *data << uint32(mask); data->WriteByteSeq(guid[0]); data->WriteByteSeq(guid[1]); data->WriteByteSeq(guid[2]); data->WriteByteSeq(guid[7]); }