Core/Groups: defined some unknown group update flags seen in sniff packets and send pet group update packets only if the player actually has a pet

* corrected some data types for group update packets to reflect wpp fields
This commit is contained in:
Ovahlord
2019-08-22 20:24:55 +02:00
parent c6f6861dbf
commit 3e4568d68a
4 changed files with 37 additions and 23 deletions

View File

@@ -485,6 +485,9 @@ bool Group::AddMember(Player* player)
}
}
player->SetGroupUpdateFlag(GROUP_UPDATE_FULL);
if (player->GetPet())
player->SetGroupUpdateFlag(GROUP_UPDATE_PET);
UpdatePlayerOutOfRange(player);
// quest related GO state dependent from raid membership

View File

@@ -120,14 +120,26 @@ enum GroupUpdateFlags
GROUP_UPDATE_FLAG_PET_AURAS = 0x00080000, // [see GROUP_UPDATE_FLAG_AURAS]
GROUP_UPDATE_FLAG_VEHICLE_SEAT = 0x00100000, // int32 (vehicle seat id)
GROUP_UPDATE_FLAG_PHASE = 0x00200000, // int32 (unk), uint32 (phase count), for (count) uint16(phaseId)
GROUP_UPDATE_FLAG_UNK400000 = 0x00400000,
GROUP_UPDATE_FLAG_UNK800000 = 0x00800000,
GROUP_UPDATE_FLAG_UNK1000000 = 0x01000000,
GROUP_UPDATE_FLAG_UNK2000000 = 0x02000000,
GROUP_UPDATE_FLAG_UNK4000000 = 0x04000000,
GROUP_UPDATE_FLAG_UNK8000000 = 0x08000000,
GROUP_UPDATE_FLAG_UNK10000000 = 0x10000000,
GROUP_UPDATE_FLAG_UNK20000000 = 0x20000000,
GROUP_UPDATE_FLAG_UNK40000000 = 0x40000000,
GROUP_UPDATE_FLAG_UNK80000000 = 0x80000000,
GROUP_UPDATE_PET = GROUP_UPDATE_FLAG_PET_GUID | GROUP_UPDATE_FLAG_PET_NAME | GROUP_UPDATE_FLAG_PET_MODEL_ID |
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 | GROUP_UPDATE_FLAG_PET_AURAS, // all pet flags
GROUP_UPDATE_FULL = GROUP_UPDATE_FLAG_STATUS | GROUP_UPDATE_FLAG_CUR_HP | GROUP_UPDATE_FLAG_MAX_HP |
GROUP_UPDATE_FLAG_POWER_TYPE | 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_PET | GROUP_UPDATE_FLAG_PHASE // all known flags, except UNK100 and VEHICLE_SEAT
GROUP_UPDATE_FLAG_LEVEL | GROUP_UPDATE_FLAG_ZONE | GROUP_UPDATE_FLAG_UNK100 |GROUP_UPDATE_FLAG_POSITION |
GROUP_UPDATE_FLAG_AURAS | GROUP_UPDATE_FLAG_PHASE | GROUP_UPDATE_FLAG_UNK400000 | GROUP_UPDATE_FLAG_UNK800000 |
GROUP_UPDATE_FLAG_UNK1000000 | GROUP_UPDATE_FLAG_UNK2000000 | GROUP_UPDATE_FLAG_UNK4000000 |
GROUP_UPDATE_FLAG_UNK8000000 | GROUP_UPDATE_FLAG_UNK10000000 | GROUP_UPDATE_FLAG_UNK20000000 | GROUP_UPDATE_FLAG_UNK40000000
};
class Roll : public LootValidatorRef

View File

@@ -1026,26 +1026,26 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
}
if (mask & GROUP_UPDATE_FLAG_CUR_HP)
*data << uint32(player->GetHealth());
*data << int32(player->GetHealth());
if (mask & GROUP_UPDATE_FLAG_MAX_HP)
*data << uint32(player->GetMaxHealth());
*data << int32(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));
*data << int16(player->GetPower(powerType));
if (mask & GROUP_UPDATE_FLAG_MAX_POWER)
*data << uint16(player->GetMaxPower(powerType));
*data << int16(player->GetMaxPower(powerType));
if (mask & GROUP_UPDATE_FLAG_LEVEL)
*data << uint16(player->getLevel());
*data << int16(player->getLevel());
if (mask & GROUP_UPDATE_FLAG_ZONE)
*data << uint16(player->GetZoneId());
*data << int16(player->GetZoneId());
if (mask & GROUP_UPDATE_FLAG_UNK100)
*data << uint16(0);
@@ -1112,7 +1112,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID)
{
if (pet)
*data << uint16(pet->GetDisplayId());
*data << int16(pet->GetDisplayId());
else
*data << uint16(0);
}
@@ -1120,17 +1120,17 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP)
{
if (pet)
*data << uint32(pet->GetHealth());
*data << int32(pet->GetHealth());
else
*data << uint32(0);
*data << int32(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP)
{
if (pet)
*data << uint32(pet->GetMaxHealth());
*data << int32(pet->GetMaxHealth());
else
*data << uint32(0);
*data << int32(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE)
@@ -1144,17 +1144,17 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER)
{
if (pet)
*data << uint16(pet->GetPower(pet->getPowerType()));
*data << int16(pet->GetPower(pet->getPowerType()));
else
*data << uint16(0);
*data << int16(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER)
{
if (pet)
*data << uint16(pet->GetMaxPower(pet->getPowerType()));
*data << int16(pet->GetMaxPower(pet->getPowerType()));
else
*data << uint16(0);
*data << int16(0);
}
if (mask & GROUP_UPDATE_FLAG_PET_AURAS)
@@ -1204,10 +1204,9 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT)
{
if (Vehicle* veh = player->GetVehicle())
*data << uint32(veh->GetVehicleInfo()->m_seatID[player->m_movementInfo.transport.seat]);
*data << int32(veh->GetVehicleInfo()->m_seatID[player->m_movementInfo.transport.seat]);
else
*data << uint32(0);
*data << int32(0);
}
if (mask & GROUP_UPDATE_FLAG_PHASE)

View File

@@ -447,10 +447,10 @@ void PhasingHandler::SendToPlayer(Player const* player)
void PhasingHandler::FillPartyMemberPhase(WorldPacket* data, PhaseShift const& phaseShift)
{
*data << uint32(phaseShift.Flags.AsUnderlyingType());
*data << uint32(phaseShift.Phases.size());
*data << int32(phaseShift.Flags.AsUnderlyingType());
*data << int32(phaseShift.Phases.size());
for (auto itr = phaseShift.Phases.begin(); itr != phaseShift.Phases.end(); ++itr)
*data << uint16(itr->Id);
*data << int16(itr->Id);
}
PhaseShift const& PhasingHandler::GetEmptyPhaseShift()