aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp230
1 files changed, 149 insertions, 81 deletions
diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
index 89f77e784b9..02933dcc3d9 100644
--- a/src/server/game/Handlers/GroupHandler.cpp
+++ b/src/server/game/Handlers/GroupHandler.cpp
@@ -725,45 +725,66 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
data->Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount);
data->append(player->GetPackGUID());
- *data << (uint32) mask;
+ *data << uint32(mask);
if (mask & GROUP_UPDATE_FLAG_STATUS)
{
if (player)
{
+ uint16 playerStatus = MEMBER_STATUS_ONLINE;
if (player->IsPvP())
- *data << (uint16) (MEMBER_STATUS_ONLINE | MEMBER_STATUS_PVP);
- else
- *data << (uint16) MEMBER_STATUS_ONLINE;
+ 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;
+ *data << uint16(MEMBER_STATUS_OFFLINE);
}
if (mask & GROUP_UPDATE_FLAG_CUR_HP)
- *data << (uint32) player->GetHealth();
+ *data << uint32(player->GetHealth());
if (mask & GROUP_UPDATE_FLAG_MAX_HP)
- *data << (uint32) player->GetMaxHealth();
+ *data << uint32(player->GetMaxHealth());
Powers powerType = player->getPowerType();
if (mask & GROUP_UPDATE_FLAG_POWER_TYPE)
- *data << (uint8) powerType;
+ *data << uint8(powerType);
if (mask & GROUP_UPDATE_FLAG_CUR_POWER)
- *data << (uint16) player->GetPower(powerType);
+ *data << uint16(player->GetPower(powerType));
if (mask & GROUP_UPDATE_FLAG_MAX_POWER)
- *data << (uint16) player->GetMaxPower(powerType);
+ *data << uint16(player->GetMaxPower(powerType));
if (mask & GROUP_UPDATE_FLAG_LEVEL)
- *data << (uint16) player->getLevel();
+ *data << uint16(player->getLevel());
if (mask & GROUP_UPDATE_FLAG_ZONE)
- *data << (uint16) player->GetZoneId();
+ *data << uint16(player->GetZoneId());
if (mask & GROUP_UPDATE_FLAG_POSITION)
- *data << (uint16) player->GetPositionX() << (uint16) player->GetPositionY();
+ {
+ *data << uint16(player->GetPositionX());
+ *data << uint16(player->GetPositionY());
+ }
if (mask & GROUP_UPDATE_FLAG_AURAS)
{
@@ -794,61 +815,55 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
if (pet)
*data << pet->GetName();
else
- *data << (uint8) 0;
+ *data << uint8(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID)
{
if (pet)
- *data << (uint16) pet->GetDisplayId();
+ *data << uint16(pet->GetDisplayId());
else
- *data << (uint16) 0;
+ *data << uint16(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP)
{
if (pet)
- *data << (uint32) pet->GetHealth();
+ *data << uint32(pet->GetHealth());
else
- *data << (uint32) 0;
+ *data << uint32(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP)
{
if (pet)
- *data << (uint32) pet->GetMaxHealth();
+ *data << uint32(pet->GetMaxHealth());
else
- *data << (uint32) 0;
+ *data << uint32(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE)
{
if (pet)
- *data << (uint8) pet->getPowerType();
+ *data << uint8(pet->getPowerType());
else
- *data << (uint8) 0;
+ *data << uint8(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER)
{
if (pet)
- *data << (uint16) pet->GetPower(pet->getPowerType());
+ *data << uint16(pet->GetPower(pet->getPowerType()));
else
- *data << (uint16) 0;
+ *data << uint16(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER)
{
if (pet)
- *data << (uint16) pet->GetMaxPower(pet->getPowerType());
+ *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];
+ *data << uint16(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_AURAS)
@@ -863,12 +878,20 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
{
AuraApplication const* aurApp = pet->GetVisibleAura(i);
*data << uint32(aurApp ? aurApp->GetBase()->GetId() : 0);
- *data << uint8(1);
+ *data << uint8(aurApp ? aurApp->GetFlags() : 0);
}
}
}
else
- *data << (uint64) 0;
+ *data << uint64(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);
}
}
@@ -885,81 +908,126 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket &recvData)
WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2);
data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related
data.appendPackGUID(Guid);
- data << (uint32) GROUP_UPDATE_FLAG_STATUS;
- data << (uint16) MEMBER_STATUS_OFFLINE;
+ data << uint32(GROUP_UPDATE_FLAG_STATUS);
+ data << uint16(MEMBER_STATUS_OFFLINE);
SendPacket(&data);
return;
}
Pet* pet = player->GetPet();
+ Powers powerType = player->getPowerType();
WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8);
data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related
data.append(player->GetPackGUID());
- uint32 mask1 = 0x00040BFF; // common mask, real flags used 0x000040BFF
+ uint32 updateFlags = GROUP_UPDATE_FLAG_STATUS | GROUP_UPDATE_FLAG_CUR_HP | GROUP_UPDATE_FLAG_MAX_HP
+ | GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER | GROUP_UPDATE_FLAG_LEVEL
+ | GROUP_UPDATE_FLAG_ZONE | GROUP_UPDATE_FLAG_POSITION | GROUP_UPDATE_FLAG_AURAS
+ | GROUP_UPDATE_FLAG_PET_NAME | GROUP_UPDATE_FLAG_PET_MODEL_ID | GROUP_UPDATE_FLAG_PET_AURAS;
+
+ if (powerType != POWER_MANA)
+ updateFlags |= GROUP_UPDATE_FLAG_POWER_TYPE;
+
if (pet)
- mask1 = 0x7FFFFFFF; // for hunters and other classes with pets
+ updateFlags |= GROUP_UPDATE_FLAG_PET_GUID | GROUP_UPDATE_FLAG_PET_CUR_HP | GROUP_UPDATE_FLAG_PET_MAX_HP
+ | GROUP_UPDATE_FLAG_PET_POWER_TYPE | GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER;
- Powers powerType = player->getPowerType();
- data << (uint32) mask1; // group update mask
- data << (uint16) MEMBER_STATUS_ONLINE; // member's online status
- data << (uint32) player->GetHealth(); // GROUP_UPDATE_FLAG_CUR_HP
- data << (uint32) player->GetMaxHealth(); // GROUP_UPDATE_FLAG_MAX_HP
- data << (uint8) powerType; // GROUP_UPDATE_FLAG_POWER_TYPE
- data << (uint16) player->GetPower(powerType); // GROUP_UPDATE_FLAG_CUR_POWER
- data << (uint16) player->GetMaxPower(powerType); // GROUP_UPDATE_FLAG_MAX_POWER
- data << (uint16) player->getLevel(); // GROUP_UPDATE_FLAG_LEVEL
- data << (uint16) player->GetZoneId(); // GROUP_UPDATE_FLAG_ZONE
- data << (uint16) player->GetPositionX(); // GROUP_UPDATE_FLAG_POSITION
- data << (uint16) player->GetPositionY(); // GROUP_UPDATE_FLAG_POSITION
-
- uint64 auramask = 0;
+ if (player->GetVehicle())
+ updateFlags |= GROUP_UPDATE_FLAG_VEHICLE_SEAT;
+
+ 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 << uint32(updateFlags);
+ data << uint16(playerStatus); // GROUP_UPDATE_FLAG_STATUS
+ data << uint32(player->GetHealth()); // GROUP_UPDATE_FLAG_CUR_HP
+ data << uint32(player->GetMaxHealth()); // GROUP_UPDATE_FLAG_MAX_HP
+ if (updateFlags & GROUP_UPDATE_FLAG_POWER_TYPE)
+ data << uint8(powerType);
+
+ data << uint16(player->GetPower(powerType)); // GROUP_UPDATE_FLAG_CUR_POWER
+ data << uint16(player->GetMaxPower(powerType)); // GROUP_UPDATE_FLAG_MAX_POWER
+ data << uint16(player->getLevel()); // GROUP_UPDATE_FLAG_LEVEL
+ data << uint16(player->GetZoneId()); // GROUP_UPDATE_FLAG_ZONE
+ data << uint16(player->GetPositionX()); // GROUP_UPDATE_FLAG_POSITION
+ data << uint16(player->GetPositionY()); // GROUP_UPDATE_FLAG_POSITION
+
+ uint64 auraMask = 0;
size_t maskPos = data.wpos();
- data << (uint64) auramask; // placeholder
+ data << uint64(auraMask); // placeholder
for (uint8 i = 0; i < MAX_AURAS; ++i)
{
- if (AuraApplication * aurApp = player->GetVisibleAura(i))
+ if (AuraApplication const* aurApp = player->GetVisibleAura(i))
{
- auramask |= (uint64(1) << i);
- data << (uint32) aurApp->GetBase()->GetId();
- data << (uint8) 1;
+ auraMask |= uint64(1) << i;
+ data << uint32(aurApp->GetBase()->GetId());
+ data << uint8(aurApp->GetFlags());
}
}
- data.put<uint64>(maskPos, auramask); // GROUP_UPDATE_FLAG_AURAS
+ data.put<uint64>(maskPos, auraMask); // GROUP_UPDATE_FLAG_AURAS
+
+ if (updateFlags & GROUP_UPDATE_FLAG_PET_GUID)
+ data << uint64(pet->GetGUID());
+
+ data << std::string(pet ? pet->GetName() : ""); // GROUP_UPDATE_FLAG_PET_NAME
+ data << uint16(pet ? pet->GetDisplayId() : 0); // GROUP_UPDATE_FLAG_PET_MODEL_ID
+
+ if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_HP)
+ data << uint32(pet->GetHealth());
+
+ if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_HP)
+ data << uint32(pet->GetMaxHealth());
+
+ if (updateFlags & GROUP_UPDATE_FLAG_PET_POWER_TYPE)
+ data << (uint8)pet->getPowerType();
+
+ if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_POWER)
+ data << uint16(pet->GetPower(pet->getPowerType()));
+
+ if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_POWER)
+ data << uint16(pet->GetMaxPower(pet->getPowerType()));
+
+ uint64 petAuraMask = 0;
+ maskPos = data.wpos();
+ data << uint64(petAuraMask); // placeholder
if (pet)
{
- Powers petpowertype = pet->getPowerType();
- data << (uint64) pet->GetGUID(); // GROUP_UPDATE_FLAG_PET_GUID
- data << pet->GetName(); // GROUP_UPDATE_FLAG_PET_NAME
- data << (uint16) pet->GetDisplayId(); // GROUP_UPDATE_FLAG_PET_MODEL_ID
- data << (uint32) pet->GetHealth(); // GROUP_UPDATE_FLAG_PET_CUR_HP
- data << (uint32) pet->GetMaxHealth(); // GROUP_UPDATE_FLAG_PET_MAX_HP
- data << (uint8) petpowertype; // GROUP_UPDATE_FLAG_PET_POWER_TYPE
- data << (uint16) pet->GetPower(petpowertype); // GROUP_UPDATE_FLAG_PET_CUR_POWER
- data << (uint16) pet->GetMaxPower(petpowertype); // GROUP_UPDATE_FLAG_PET_MAX_POWER
-
- uint64 petauramask = 0;
- size_t petMaskPos = data.wpos();
- data << (uint64) petauramask; // placeholder
for (uint8 i = 0; i < MAX_AURAS; ++i)
{
- if (AuraApplication * auraApp = pet->GetVisibleAura(i))
+ if (AuraApplication const* aurApp = pet->GetVisibleAura(i))
{
- petauramask |= (uint64(1) << i);
- data << (uint32) auraApp->GetBase()->GetId();
- data << (uint8) 1;
+ petAuraMask |= uint64(1) << i;
+ data << uint32(aurApp->GetBase()->GetId());
+ data << uint8(aurApp->GetFlags());
}
}
- data.put<uint64>(petMaskPos, petauramask); // GROUP_UPDATE_FLAG_PET_AURAS
- }
- else
- {
- data << (uint8) 0; // GROUP_UPDATE_FLAG_PET_NAME
- data << (uint64) 0; // GROUP_UPDATE_FLAG_PET_AURAS
}
+ data.put<uint64>(maskPos, petAuraMask); // GROUP_UPDATE_FLAG_PET_AURAS
+
+ if (updateFlags & GROUP_UPDATE_FLAG_VEHICLE_SEAT)
+ data << uint32(player->GetVehicle()->GetVehicleInfo()->m_seatID[player->m_movementInfo.t_seat]);
+
SendPacket(&data);
}