diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Groups/Group.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Groups/Group.h | 4 | ||||
-rw-r--r-- | src/server/game/Handlers/GroupHandler.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PartyPackets.cpp | 414 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PartyPackets.h | 121 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
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; |