aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Groups/Group.cpp4
-rw-r--r--src/server/game/Groups/Group.h4
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp4
-rw-r--r--src/server/game/Server/Packets/PartyPackets.cpp414
-rw-r--r--src/server/game/Server/Packets/PartyPackets.h121
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp12
-rw-r--r--src/server/game/Server/WorldSession.h2
7 files changed, 252 insertions, 309 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 7883a445ebd..594284d8fc8 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1608,7 +1608,7 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot)
Player* member = ObjectAccessor::FindConnectedPlayer(citr->guid);
- WorldPackets::Party::GroupPlayerInfos playerInfos;
+ WorldPackets::Party::PartyPlayerInfo playerInfos;
playerInfos.GUID = citr->guid;
playerInfos.Name = citr->name;
@@ -1668,7 +1668,7 @@ void Group::UpdatePlayerOutOfRange(Player* player)
if (!player || !player->IsInWorld())
return;
- WorldPackets::Party::PartyMemberStats packet;
+ WorldPackets::Party::PartyMemberState packet;
packet.Initialize(player);
Player* member;
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index 3c75bf6739f..a417138a2b2 100644
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -68,7 +68,9 @@ enum GroupMemberOnlineStatus
MEMBER_STATUS_PVP_FFA = 0x0010, // Lua_UnitIsPVPFreeForAll
MEMBER_STATUS_UNK3 = 0x0020, // used in calls from Lua_GetPlayerMapPosition/Lua_GetBattlefieldFlagPosition
MEMBER_STATUS_AFK = 0x0040, // Lua_UnitIsAFK
- MEMBER_STATUS_DND = 0x0080 // Lua_UnitIsDND
+ MEMBER_STATUS_DND = 0x0080, // Lua_UnitIsDND
+ MEMBER_STATUS_RAF = 0x0100,
+ MEMBER_STATUS_VEHICLE = 0x0200, // Lua_UnitInVehicle
};
enum GroupMemberFlags
diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
index 097a1979400..89c41496827 100644
--- a/src/server/game/Handlers/GroupHandler.cpp
+++ b/src/server/game/Handlers/GroupHandler.cpp
@@ -561,12 +561,12 @@ void WorldSession::HandleReadyCheckResponseOpcode(WorldPackets::Party::ReadyChec
void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPackets::Party::RequestPartyMemberStats& packet)
{
- WorldPackets::Party::PartyMemberStats partyMemberStats;
+ WorldPackets::Party::PartyMemberState partyMemberStats;
Player* player = ObjectAccessor::FindConnectedPlayer(packet.TargetGUID);
if (!player)
{
- partyMemberStats.MemberStats.GUID = packet.TargetGUID;
+ partyMemberStats.MemberGuid = packet.TargetGUID;
partyMemberStats.MemberStats.Status = MEMBER_STATUS_OFFLINE;
}
else
diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp
index c4803ba7c6d..91b6ca4e18d 100644
--- a/src/server/game/Server/Packets/PartyPackets.cpp
+++ b/src/server/game/Server/Packets/PartyPackets.cpp
@@ -58,30 +58,25 @@ void WorldPackets::Party::PartyInviteClient::Read()
WorldPacket const* WorldPackets::Party::PartyInvite::Write()
{
- // Order guessed
_worldPacket.WriteBit(CanAccept);
_worldPacket.WriteBit(MightCRZYou);
+ _worldPacket.WriteBit(IsXRealm);
_worldPacket.WriteBit(MustBeBNetFriend);
_worldPacket.WriteBit(AllowMultipleRoles);
- _worldPacket.WriteBit(IsXRealm);
-
- _worldPacket.WriteBits(InviterName.size(), 6);
-
- _worldPacket << InviterGUID;
- _worldPacket << InviterBNetAccountId;
+ _worldPacket.WriteBits(InviterName.length(), 6);
_worldPacket << InviterVirtualRealmAddress;
- _worldPacket << Unk1;
-
_worldPacket.WriteBit(IsLocal);
_worldPacket.WriteBit(Unk2);
-
_worldPacket.WriteBits(InviterRealmNameActual.size(), 8);
_worldPacket.WriteBits(InviterRealmNameNormalized.size(), 8);
_worldPacket.WriteString(InviterRealmNameActual);
_worldPacket.WriteString(InviterRealmNameNormalized);
- _worldPacket << ProposedRoles;
+ _worldPacket << InviterGUID;
+ _worldPacket << InviterBNetAccountId;
+ _worldPacket << uint16(Unk1);
+ _worldPacket << uint32(ProposedRoles);
_worldPacket << int32(LfgSlots.size());
_worldPacket << LfgCompletedMask;
@@ -146,11 +141,97 @@ void WorldPackets::Party::RequestPartyMemberStats::Read()
_worldPacket >> TargetGUID;
}
-WorldPacket const* WorldPackets::Party::PartyMemberStats::Write()
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberPhase const& phase)
+{
+ data << uint16(phase.Flags);
+ data << uint16(phase.Id);
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberPhaseStates const& phases)
+{
+ data << uint32(phases.PhaseShiftFlags);
+ data << uint32(phases.List.size());
+ data << phases.PersonalGUID;
+
+ for (WorldPackets::Party::PartyMemberPhase const& phase : phases.List)
+ data << phase;
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberAuraStates const& aura)
+{
+ data << int32(aura.SpellID);
+ data << uint8(aura.Flags);
+ data << uint32(aura.ActiveFlags);
+ data << int32(aura.Points.size());
+ for (float points : aura.Points)
+ data << float(points);
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberPetStats const& petStats)
+{
+ data << petStats.GUID;
+ data << int32(petStats.ModelId);
+ data << int32(petStats.CurrentHealth);
+ data << int32(petStats.MaxHealth);
+ data << uint32(petStats.Auras.size());
+ for (WorldPackets::Party::PartyMemberAuraStates const& aura : petStats.Auras)
+ data << aura;
+
+ data.WriteBits(petStats.Name.size(), 8);
+ data.FlushBits();
+ data.WriteString(petStats.Name);
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberStats const& memberStats)
+{
+ for (uint32 i = 0; i < 2; i++)
+ data << uint8(memberStats.PartyType[i]);
+
+ data << uint16(memberStats.Status);
+ data << uint8(memberStats.PowerType);
+ data << uint16(memberStats.PowerDisplayID);
+ data << int32(memberStats.CurrentHealth);
+ data << int32(memberStats.MaxHealth);
+ data << uint16(memberStats.CurrentPower);
+ data << uint16(memberStats.MaxPower);
+ data << uint16(memberStats.Level);
+ data << uint16(memberStats.SpecID);
+ data << uint16(memberStats.ZoneID);
+ data << uint16(memberStats.WmoGroupID);
+ data << uint32(memberStats.WmoDoodadPlacementID);
+ data << int16(memberStats.PositionX);
+ data << int16(memberStats.PositionY);
+ data << int16(memberStats.PositionZ);
+ data << int32(memberStats.VehicleSeat);
+ data << int32(memberStats.Auras.size());
+ data << memberStats.Phases;
+
+ for (WorldPackets::Party::PartyMemberAuraStates const& aura : memberStats.Auras)
+ data << aura;
+
+ data.WriteBit(memberStats.PetStats.is_initialized());
+ data.FlushBits();
+
+ if (memberStats.PetStats.is_initialized())
+ data << *memberStats.PetStats;
+
+ return data;
+}
+
+WorldPacket const* WorldPackets::Party::PartyMemberState::Write()
{
_worldPacket.WriteBit(ForEnemy);
_worldPacket << MemberStats;
+ _worldPacket << MemberGuid;
return &_worldPacket;
}
@@ -335,27 +416,72 @@ WorldPacket const* WorldPackets::Party::GroupNewLeader::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Party::PartyUpdate::Write()
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyPlayerInfo const& playerInfo)
{
- _worldPacket << PartyType;
- _worldPacket << PartyIndex;
- _worldPacket << PartyFlags;
+ data.WriteBits(playerInfo.Name.size(), 6);
+ data << playerInfo.GUID;
+ data << uint8(playerInfo.Status);
+ data << uint8(playerInfo.Subgroup);
+ data << uint8(playerInfo.Flags);
+ data << uint8(playerInfo.RolesAssigned);
+ data << uint8(playerInfo.Class);
+ data.WriteString(playerInfo.Name);
- _worldPacket << MyIndex;
- _worldPacket << PartyGUID;
- _worldPacket << SequenceNum;
- _worldPacket << LeaderGUID;
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyLFGInfo const& lfgInfos)
+{
+ data << uint8(lfgInfos.MyFlags);
+ data << uint32(lfgInfos.Slot);
+ data << uint32(lfgInfos.MyRandomSlot);
+ data << uint8(lfgInfos.MyPartialClear);
+ data << float(lfgInfos.MyGearDiff);
+ data << uint8(lfgInfos.MyStrangerCount);
+ data << uint8(lfgInfos.MyKickVoteCount);
+ data << uint8(lfgInfos.BootCount);
+ data.WriteBit(lfgInfos.Aborted);
+ data.WriteBit(lfgInfos.MyFirstReward);
+ data.FlushBits();
+
+ return data;
+}
- _worldPacket << PlayerList;
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyLootSettings const& lootSettings)
+{
+ data << uint8(lootSettings.Method);
+ data << lootSettings.LootMaster;
+ data << uint8(lootSettings.Threshold);
+
+ return data;
+}
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyDifficultySettings const& difficultySettings)
+{
+ data << uint32(difficultySettings.DungeonDifficultyID);
+ data << uint32(difficultySettings.RaidDifficultyID);
+ data << uint32(difficultySettings.LegacyRaidDifficultyID);
+
+ return data;
+}
+
+WorldPacket const* WorldPackets::Party::PartyUpdate::Write()
+{
+ _worldPacket << uint16(PartyFlags);
+ _worldPacket << uint8(PartyIndex);
+ _worldPacket << uint8(PartyType);
+ _worldPacket << int32(MyIndex);
+ _worldPacket << PartyGUID;
+ _worldPacket << uint32(SequenceNum);
+ _worldPacket << LeaderGUID;
+ _worldPacket << uint32(PlayerList.size());
_worldPacket.WriteBit(LfgInfos.is_initialized());
_worldPacket.WriteBit(LootSettings.is_initialized());
_worldPacket.WriteBit(DifficultySettings.is_initialized());
-
_worldPacket.FlushBits();
- if (LfgInfos.is_initialized())
- _worldPacket << *LfgInfos;
+ for (WorldPackets::Party::PartyPlayerInfo const& playerInfos : PlayerList)
+ _worldPacket << playerInfos;
if (LootSettings.is_initialized())
_worldPacket << *LootSettings;
@@ -363,6 +489,9 @@ WorldPacket const* WorldPackets::Party::PartyUpdate::Write()
if (DifficultySettings.is_initialized())
_worldPacket << *DifficultySettings;
+ if (LfgInfos.is_initialized())
+ _worldPacket << *LfgInfos;
+
return &_worldPacket;
}
@@ -409,11 +538,11 @@ WorldPacket const* WorldPackets::Party::RaidMarkersChanged::Write()
return &_worldPacket;
}
-void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player)
+void WorldPackets::Party::PartyMemberState::Initialize(Player const* player)
{
ForEnemy = false;
- MemberStats.GUID = player->GetGUID();
+ MemberGuid = player->GetGUID();
// Status
MemberStats.Status = MEMBER_STATUS_ONLINE;
@@ -438,6 +567,9 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player)
if (player->isDND())
MemberStats.Status |= MEMBER_STATUS_DND;
+ if (player->GetVehicle())
+ MemberStats.Status |= MEMBER_STATUS_VEHICLE;
+
// Level
MemberStats.Level = player->getLevel();
@@ -447,6 +579,7 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player)
// Power
MemberStats.PowerType = player->getPowerType();
+ MemberStats.PowerDisplayID = 0;
MemberStats.CurrentPower = player->GetPower(player->getPowerType());
MemberStats.MaxPower = player->GetMaxPower(player->getPowerType());
@@ -456,14 +589,11 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player)
MemberStats.PositionY = int16(player->GetPositionY());
MemberStats.PositionZ = int16(player->GetPositionZ());
- // Unk
- MemberStats.Unk322 = 0; // Always 0
- MemberStats.Unk704[0] = 1; // Always 1
- MemberStats.Unk704[1] = 0; // Always 0
- MemberStats.Unk200000 = 0; // Always 0
-
- MemberStats.Unk2000000 = 0;
- MemberStats.Unk4000000 = 0;
+ MemberStats.SpecID = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID);
+ MemberStats.PartyType[0] = player->GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_PARTY_TYPE) & 0xF;
+ MemberStats.PartyType[1] = player->GetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_PARTY_TYPE) >> 4;
+ MemberStats.WmoGroupID = 0;
+ MemberStats.WmoDoodadPlacementID = 0;
// Vehicle
if (player->GetVehicle() && player->GetVehicle()->GetVehicleInfo())
@@ -474,24 +604,25 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player)
{
if (AuraApplication const* aurApp = player->GetVisibleAura(i))
{
- WorldPackets::Party::GroupAura aura;
+ WorldPackets::Party::PartyMemberAuraStates aura;
- aura.SpellId = aurApp->GetBase()->GetId();
- aura.EffectMask = aurApp->GetEffectMask();
- aura.Scalings = aurApp->GetFlags(); // ??
+ aura.SpellID = aurApp->GetBase()->GetId();
+ aura.ActiveFlags = aurApp->GetEffectMask();
+ aura.Flags = aurApp->GetFlags();
if (aurApp->GetFlags() & AFLAG_SCALABLE)
{
- for (uint32 e = 0; e < MAX_SPELL_EFFECTS; ++e)
+ for (AuraEffect const* aurEff : aurApp->GetBase()->GetAuraEffects())
{
- float scale = 0.0f;
- if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(e))
- scale = float(eff->GetAmount());
- aura.EffectScales.push_back(scale);
+ if (!aurEff)
+ continue;
+
+ if (aurApp->HasEffect(aurEff->GetEffIndex()))
+ aura.Points.push_back(float(aurEff->GetAmount()));
}
}
- MemberStats.AuraList.push_back(aura);
+ MemberStats.Auras.push_back(aura);
}
}
@@ -501,7 +632,7 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player)
MemberStats.Phases.PersonalGUID = ObjectGuid::Empty;
for (uint32 phaseId : phases)
{
- WorldPackets::Party::GroupPhase phase;
+ WorldPackets::Party::PartyMemberPhase phase;
phase.Id = phaseId;
phase.Flags = 1;
MemberStats.Phases.List.push_back(phase);
@@ -525,24 +656,25 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player)
{
if (AuraApplication const* aurApp = pet->GetVisibleAura(i))
{
- WorldPackets::Party::GroupAura aura;
+ WorldPackets::Party::PartyMemberAuraStates aura;
- aura.SpellId = aurApp->GetBase()->GetId();
- aura.EffectMask = aurApp->GetEffectMask();
- aura.Scalings = aurApp->GetFlags(); // ??
+ aura.SpellID = aurApp->GetBase()->GetId();
+ aura.ActiveFlags = aurApp->GetEffectMask();
+ aura.Flags = aurApp->GetFlags();
if (aurApp->GetFlags() & AFLAG_SCALABLE)
{
- for (uint32 e = 0; e < MAX_SPELL_EFFECTS; ++e)
+ for (AuraEffect const* aurEff : aurApp->GetBase()->GetAuraEffects())
{
- float scale = 0.0f;
- if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(e))
- scale = float(eff->GetAmount());
- aura.EffectScales.push_back(scale);
+ if (!aurEff)
+ continue;
+
+ if (aurApp->HasEffect(aurEff->GetEffIndex()))
+ aura.Points.push_back(float(aurEff->GetAmount()));
}
}
- MemberStats.PetStats->AuraList.push_back(aura);
+ MemberStats.PetStats->Auras.push_back(aura);
}
}
}
@@ -556,175 +688,3 @@ WorldPacket const* WorldPackets::Party::PartyKillLog::Write()
return &_worldPacket;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPhase const& phase)
-{
- data << phase.Flags;
- data << phase.Id;
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPhases const& phases)
-{
- data << phases.PhaseShiftFlags;
- data << int32(phases.List.size());
- data << phases.PersonalGUID;
-
- for (WorldPackets::Party::GroupPhase const& phase : phases.List)
- data << phase;
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupAura const& aura)
-{
- data << aura.SpellId;
- data << aura.Scalings;
- data << aura.EffectMask;
-
- data << int32(aura.EffectScales.size());
- for (float scale : aura.EffectScales)
- data << scale;
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, std::vector<WorldPackets::Party::GroupAura> const& auraList)
-{
- data << int32(auraList.size());
- for (WorldPackets::Party::GroupAura const& aura : auraList)
- data << aura;
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPetStats const& petStats)
-{
- data << petStats.GUID;
-
- data << petStats.ModelId;
-
- data << petStats.CurrentHealth;
- data << petStats.MaxHealth;
-
- data << petStats.AuraList;
-
- data.WriteBits(petStats.Name.size(), 8);
- data.FlushBits();
- data.WriteString(petStats.Name);
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupMemberStats const& memberStats)
-{
- data << memberStats.GUID;
-
- for (uint8 i = 0; i < 2; i++)
- data << memberStats.Unk704[i];
-
- data << memberStats.Status;
-
- data << memberStats.PowerType;
-
- data << memberStats.Unk322;
-
- data << memberStats.CurrentHealth;
- data << memberStats.MaxHealth;
-
- data << memberStats.CurrentPower;
- data << memberStats.MaxPower;
-
- data << memberStats.Level;
-
- data << memberStats.Unk200000;
-
- data << memberStats.ZoneID;
-
- data << memberStats.Unk2000000;
- data << memberStats.Unk4000000;
-
- data << memberStats.PositionX;
- data << memberStats.PositionY;
- data << memberStats.PositionZ;
-
- data << memberStats.VehicleSeat;
-
- data << int32(memberStats.AuraList.size());
-
- data << memberStats.Phases;
-
- for (WorldPackets::Party::GroupAura const& aura : memberStats.AuraList)
- data << aura;
-
- data.WriteBit(memberStats.PetStats.is_initialized());
- data.FlushBits();
-
- if (memberStats.PetStats.is_initialized())
- data << *memberStats.PetStats;
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, std::vector<WorldPackets::Party::GroupPlayerInfos> const& playerList)
-{
- data << int32(playerList.size());
-
- for (WorldPackets::Party::GroupPlayerInfos const& playerInfos : playerList)
- data << playerInfos;
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPlayerInfos const& playerInfos)
-{
- data.WriteBits(playerInfos.Name.size(), 6);
- data.FlushBits();
-
- data << playerInfos.GUID;
- data << playerInfos.Status;
- data << playerInfos.Subgroup;
- data << playerInfos.Flags;
- data << playerInfos.RolesAssigned;
- data << playerInfos.Class;
-
- data.WriteString(playerInfos.Name);
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupLfgInfos const& lfgInfos)
-{
- data << lfgInfos.MyFlags;
- data << lfgInfos.Slot;
- data << lfgInfos.MyRandomSlot;
- data << lfgInfos.MyPartialClear;
- data << lfgInfos.MyGearDiff;
- data << lfgInfos.MyStrangerCount;
- data << lfgInfos.MyKickVoteCount;
- data << lfgInfos.BootCount;
-
- data.WriteBit(lfgInfos.Aborted);
- data.WriteBit(lfgInfos.MyFirstReward);
- data.FlushBits();
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupLootSettings const& lootSettings)
-{
- data << lootSettings.Method;
- data << lootSettings.LootMaster;
- data << lootSettings.Threshold;
-
- return data;
-}
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupDifficultySettings const& difficultySettings)
-{
- data << difficultySettings.DungeonDifficultyID;
- data << difficultySettings.RaidDifficultyID;
- data << difficultySettings.LegacyRaidDifficultyID;
-
- return data;
-}
diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h
index 388be459eb5..d1d2773d66e 100644
--- a/src/server/game/Server/Packets/PartyPackets.h
+++ b/src/server/game/Server/Packets/PartyPackets.h
@@ -61,13 +61,14 @@ namespace WorldPackets
PartyInvite() : ServerPacket(SMSG_PARTY_INVITE, 55) { }
WorldPacket const* Write() override;
+
void Initialize(Player* const inviter, int32 proposedRoles, bool canAccept);
bool MightCRZYou = false;
bool MustBeBNetFriend = false;
bool AllowMultipleRoles = false;
bool Unk2 = false;
- int16 Unk1 = 0;
+ uint16 Unk1 = 0;
bool CanAccept = false;
@@ -134,28 +135,28 @@ namespace WorldPackets
ObjectGuid TargetGUID;
};
- struct GroupPhase
+ struct PartyMemberPhase
{
uint16 Flags = 0u;
uint16 Id = 0u;
};
- struct GroupPhases
+ struct PartyMemberPhaseStates
{
- int32 PhaseShiftFlags = 0;
+ uint32 PhaseShiftFlags = 0;
ObjectGuid PersonalGUID;
- std::vector<GroupPhase> List;
+ std::vector<PartyMemberPhase> List;
};
- struct GroupAura
+ struct PartyMemberAuraStates
{
- uint32 SpellId = 0u;
- uint8 Scalings = 0;
- uint32 EffectMask = 0u;
- std::vector<float> EffectScales;
+ int32 SpellID = 0;
+ uint8 Flags = 0;
+ uint32 ActiveFlags = 0u;
+ std::vector<float> Points;
};
- struct GroupPetStats
+ struct PartyMemberPetStats
{
ObjectGuid GUID;
std::string Name;
@@ -164,50 +165,50 @@ namespace WorldPackets
int32 CurrentHealth = 0;
int32 MaxHealth = 0;
- std::vector<GroupAura> AuraList;
+ std::vector<PartyMemberAuraStates> Auras;
};
- struct GroupMemberStats
+ struct PartyMemberStats
{
- ObjectGuid GUID;
- int16 Level = 0;
- int16 Status = 0;
+ uint16 Level = 0;
+ uint16 Status = 0;
int32 CurrentHealth = 0;
- int32 MaxHealth;
+ int32 MaxHealth = 0;
uint8 PowerType = 0u;
- int16 CurrentPower = 0;
- int16 MaxPower = 0;
+ uint16 CurrentPower = 0;
+ uint16 MaxPower = 0;
- int16 ZoneID = 0;
+ uint16 ZoneID = 0;
int16 PositionX = 0;
int16 PositionY = 0;
int16 PositionZ = 0;
int32 VehicleSeat = 0;
- GroupPhases Phases;
- std::vector<GroupAura> AuraList;
- Optional<GroupPetStats> PetStats;
+ PartyMemberPhaseStates Phases;
+ std::vector<PartyMemberAuraStates> Auras;
+ Optional<PartyMemberPetStats> PetStats;
- int16 Unk322 = 0;
- int16 Unk200000 = 0;
- int16 Unk2000000 = 0;
- int32 Unk4000000 = 0;
- int8 Unk704[2];
+ uint16 PowerDisplayID = 0;
+ uint16 SpecID = 0;
+ uint16 WmoGroupID = 0;
+ uint32 WmoDoodadPlacementID = 0;
+ int8 PartyType[2];
};
- class PartyMemberStats final : public ServerPacket
+ class PartyMemberState final : public ServerPacket
{
public:
- PartyMemberStats() : ServerPacket(SMSG_PARTY_MEMBER_STATE, 80) { }
+ PartyMemberState() : ServerPacket(SMSG_PARTY_MEMBER_STATE, 80) { }
WorldPacket const* Write() override;
void Initialize(Player const* player);
- GroupMemberStats MemberStats;
bool ForEnemy = false;
+ ObjectGuid MemberGuid;
+ PartyMemberStats MemberStats;
};
class SetPartyLeader final : public ClientPacket
@@ -481,7 +482,7 @@ namespace WorldPackets
std::string Name;
};
- struct GroupPlayerInfos
+ struct PartyPlayerInfo
{
ObjectGuid GUID;
std::string Name;
@@ -493,32 +494,28 @@ namespace WorldPackets
uint8 RolesAssigned = 0u;
};
- struct GroupLfgInfos
+ struct PartyLFGInfo
{
- int32 Slot = 0u;
- int8 BootCount = 0;
-
+ uint8 MyFlags = 0;
+ uint32 Slot = 0;
+ uint8 BootCount = 0;
+ uint32 MyRandomSlot = 0;
bool Aborted = false;
-
- int32 MyRandomSlot = 0;
- uint8 MyFlags = 0u;
- uint8 MyPartialClear = 0u;
- float MyGearDiff = 0.f;
-
- int8 MyStrangerCount = 0;
- int8 MyKickVoteCount = 0;
-
+ uint8 MyPartialClear = 0;
+ float MyGearDiff = 0.0f;
+ uint8 MyStrangerCount = 0;
+ uint8 MyKickVoteCount = 0;
bool MyFirstReward = false;
};
- struct GroupLootSettings
+ struct PartyLootSettings
{
uint8 Method = 0u;
ObjectGuid LootMaster;
uint8 Threshold = 0u;
};
- struct GroupDifficultySettings
+ struct PartyDifficultySettings
{
uint32 DungeonDifficultyID = 0u;
uint32 RaidDifficultyID = 0u;
@@ -532,9 +529,9 @@ namespace WorldPackets
WorldPacket const* Write() override;
- int8 PartyFlags = 0;
- int8 PartyIndex = 0;
- int8 PartyType = 0;
+ uint16 PartyFlags = 0;
+ uint8 PartyIndex = 0;
+ uint8 PartyType = 0;
ObjectGuid PartyGUID;
ObjectGuid LeaderGUID;
@@ -542,11 +539,11 @@ namespace WorldPackets
int32 MyIndex = 0;
int32 SequenceNum = 0;
- std::vector<GroupPlayerInfos> PlayerList;
+ std::vector<PartyPlayerInfo> PlayerList;
- Optional<GroupLfgInfos> LfgInfos;
- Optional<GroupLootSettings> LootSettings;
- Optional<GroupDifficultySettings> DifficultySettings;
+ Optional<PartyLFGInfo> LfgInfos;
+ Optional<PartyLootSettings> LootSettings;
+ Optional<PartyDifficultySettings> DifficultySettings;
};
class SetEveryoneIsAssistant final : public ClientPacket
@@ -620,20 +617,4 @@ namespace WorldPackets
}
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPhase const& phase);
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPhases const& phases);
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupAura const& aura);
-ByteBuffer& operator<<(ByteBuffer& data, std::vector<WorldPackets::Party::GroupAura> const& auraList);
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPetStats const& petStats);
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupMemberStats const& memberStats);
-
-ByteBuffer& operator<<(ByteBuffer& data, std::vector<WorldPackets::Party::GroupPlayerInfos> const& playerList);
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPlayerInfos const& playerInfos);
-
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupLfgInfos const& lfgInfos);
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupLootSettings const& lootSettings);
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupDifficultySettings const& difficultySettings);
-
#endif // PartyPackets_h__
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 1a2d3f2ae0c..3273987d75c 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -233,7 +233,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CHANGE_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ChangeSubGroup, &WorldSession::HandleChangeSubGroupOpcode);
+ DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::ChangeSubGroup, &WorldSession::HandleChangeSubGroupOpcode);
DEFINE_HANDLER(CMSG_CHARACTER_RENAME_REQUEST, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharacterRenameRequest, &WorldSession::HandleCharRenameOpcode);
DEFINE_HANDLER(CMSG_CHAR_CUSTOMIZE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharCustomize, &WorldSession::HandleCharCustomizeOpcode);
DEFINE_HANDLER(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharDelete, &WorldSession::HandleCharDeleteOpcode);
@@ -565,7 +565,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_OPEN_SHIPMENT_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_OPEN_TRADESKILL_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_OPT_OUT_OF_LOOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::OptOutOfLoot, &WorldSession::HandleOptOutOfLootOpcode);
- DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteClient, &WorldSession::HandlePartyInviteOpcode);
+ DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteClient, &WorldSession::HandlePartyInviteOpcode);
DEFINE_HANDLER(CMSG_PARTY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteResponse, &WorldSession::HandlePartyInviteResponseOpcode);
DEFINE_HANDLER(CMSG_PARTY_UNINVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyUninvite, &WorldSession::HandlePartyUninviteOpcode);
DEFINE_HANDLER(CMSG_PETITION_BUY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionBuy, &WorldSession::HandlePetitionBuy);
@@ -752,7 +752,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::SuspendTokenResponse, &WorldSession::HandleSuspendTokenResponse);
DEFINE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapInvItem, &WorldSession::HandleSwapInvItemOpcode);
DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapItem, &WorldSession::HandleSwapItem);
- DEFINE_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SwapSubGroups, &WorldSession::HandleSwapSubGroupsOpcode);
+ DEFINE_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::SwapSubGroups, &WorldSession::HandleSwapSubGroupsOpcode);
DEFINE_HANDLER(CMSG_SWAP_VOID_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::SwapVoidItem, &WorldSession::HandleVoidSwapItem);
DEFINE_HANDLER(CMSG_TABARD_VENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTabardVendorActivateOpcode);
DEFINE_HANDLER(CMSG_TALK_TO_GOSSIP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode);
@@ -1431,10 +1431,10 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OVERRIDE_LIGHT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_KILL_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAUSE_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PENDING_RAID_LOCK, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_ALREADY_SIGNED, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 3093b05163c..5f155420ff4 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -460,7 +460,7 @@ namespace WorldPackets
class PartyUninvite;
class GroupDecline;
class RequestPartyMemberStats;
- class PartyMemberStats;
+ class PartyMemberState;
class SetPartyLeader;
class SetPartyAssignment;
class SetRole;