diff options
| author | Shauren <shauren.trinity@gmail.com> | 2019-05-18 22:21:17 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-06-08 17:03:15 +0200 |
| commit | 31fda79556e55375962a3c9e46f6dbdbf6e90d18 (patch) | |
| tree | 36ee91cb16772fa58e0a1eac973f82b437306af9 /src/server/game/Server/Packets | |
| parent | 9685c9346dfe06ad1d248ff4e128e0d0b8dbfcea (diff) | |
Core/PacketIO: Updated packet structures to 8.1.5
Diffstat (limited to 'src/server/game/Server/Packets')
46 files changed, 314 insertions, 214 deletions
diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index 37d63a5e939..f4cd72123db 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -21,6 +21,7 @@ WorldPacket const* WorldPackets::Battleground::PVPSeason::Write() { _worldPacket << uint32(CurrentSeason); _worldPacket << uint32(PreviousSeason); + _worldPacket << uint32(PvpSeasonID); return &_worldPacket; } @@ -125,10 +126,11 @@ WorldPacket const* WorldPackets::Battleground::PVPLogData::Write() void WorldPackets::Battleground::BattlemasterJoin::Read() { - _worldPacket >> QueueID; + QueueIDs.resize(_worldPacket.read<uint32>()); _worldPacket >> Roles; _worldPacket >> BlacklistMap[0] >> BlacklistMap[1]; - JoinAsGroup = _worldPacket.ReadBit(); + for (uint64& queueId : QueueIDs) + _worldPacket >> queueId; } void WorldPackets::Battleground::BattlemasterJoinArena::Read() diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index 60d1d5ee210..c470ad7bbf6 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -22,6 +22,7 @@ #include "LFGPacketsCommon.h" #include "ObjectGuid.h" #include "Optional.h" +#include "PacketUtilities.h" #include "Position.h" namespace WorldPackets @@ -37,6 +38,7 @@ namespace WorldPackets uint32 PreviousSeason = 0; uint32 CurrentSeason = 0; + uint32 PvpSeasonID = 0; }; class AreaSpiritHealerQuery final : public ClientPacket @@ -220,9 +222,8 @@ namespace WorldPackets void Read() override; - bool JoinAsGroup = false; + Array<uint64, 1> QueueIDs; uint8 Roles = 0; - uint64 QueueID = 0; int32 BlacklistMap[2] = { }; }; diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index afd7b7bb87c..1739ef13eb9 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -117,7 +117,7 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(Class, fields[29].GetUInt8())) SpecID = spec->ID; - LastLoginBuild = fields[30].GetUInt32(); + LastLoginVersion = fields[30].GetUInt32(); for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { @@ -172,7 +172,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters data << uint32(charInfo.LastPlayedTime); data << uint16(charInfo.SpecID); data << uint32(charInfo.Unknown703); - data << uint32(charInfo.LastLoginBuild); + data << uint32(charInfo.LastLoginVersion); data << uint32(charInfo.Flags4); data.WriteBits(charInfo.Name.length(), 6); data.WriteBit(charInfo.FirstLogin); @@ -196,6 +196,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::UnlockedConditionalAppearance const& unlockedConditionalAppearance) +{ + data << int32(unlockedConditionalAppearance.AchievementID); + data << int32(unlockedConditionalAppearance.Unused); + + return data; +} + WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() { _worldPacket.reserve(9 + Characters.size() * sizeof(CharacterInfo) + RaceUnlockData.size() * sizeof(RaceUnlock)); @@ -210,10 +218,14 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() _worldPacket << uint32(Characters.size()); _worldPacket << int32(MaxCharacterLevel); _worldPacket << uint32(RaceUnlockData.size()); + _worldPacket << uint32(UnlockedConditionalAppearances.size()); if (DisabledClassesMask) _worldPacket << uint32(*DisabledClassesMask); + for (UnlockedConditionalAppearance const& unlockedConditionalAppearance : UnlockedConditionalAppearances) + _worldPacket << unlockedConditionalAppearance; + for (CharacterInfo const& charInfo : Characters) _worldPacket << charInfo; diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index d21c38b2afc..90f460b298d 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -148,7 +148,7 @@ namespace WorldPackets uint32 LastPlayedTime = 0; uint16 SpecID = 0; uint32 Unknown703 = 0; - uint32 LastLoginBuild = 0; + uint32 LastLoginVersion = 0; struct PetInfo { @@ -178,6 +178,12 @@ namespace WorldPackets bool HasHeritageArmor = false; }; + struct UnlockedConditionalAppearance + { + int32 AchievementID = 0; + int32 Unused = 0; + }; + EnumCharactersResult() : ServerPacket(SMSG_ENUM_CHARACTERS_RESULT) { } WorldPacket const* Write() override; @@ -194,6 +200,7 @@ namespace WorldPackets std::vector<CharacterInfo> Characters; ///< all characters on the list std::vector<RaceUnlock> RaceUnlockData; ///< + std::vector<UnlockedConditionalAppearance> UnlockedConditionalAppearances; }; class CreateCharacter final : public ClientPacket diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp index 8b9a1a05c76..4bfc5d5062f 100644 --- a/src/server/game/Server/Packets/ChatPackets.cpp +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -242,7 +242,7 @@ WorldPacket const* WorldPackets::Chat::ChatPlayerNotfound::Write() WorldPacket const* WorldPackets::Chat::ChatServerMessage::Write() { - _worldPacket << MessageID; + _worldPacket << int32(MessageID); _worldPacket.WriteBits(StringParam.length(), 11); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp index 86c999ddd83..fbc37cf5bf1 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp @@ -68,6 +68,7 @@ namespace WorldPackets Type = TYPE_CREATURE_TO_PLAYER_DAMAGE; PlayerLevelDelta = target->GetInt32Value(ACTIVE_PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA); PlayerItemLevel = target->GetAverageItemLevel(); + TargetItemLevel = 0; ScalingHealthItemLevelCurveID = target->GetUInt32Value(UNIT_FIELD_SCALING_HEALTH_ITEM_LEVEL_CURVE_ID); TargetLevel = target->getLevel(); Expansion = creatureTemplate->RequiredExpansion; @@ -85,6 +86,7 @@ namespace WorldPackets Type = TYPE_PLAYER_TO_CREATURE_DAMAGE; PlayerLevelDelta = attacker->GetInt32Value(ACTIVE_PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA); PlayerItemLevel = attacker->GetAverageItemLevel(); + TargetItemLevel = 0; ScalingHealthItemLevelCurveID = target->GetUInt32Value(UNIT_FIELD_SCALING_HEALTH_ITEM_LEVEL_CURVE_ID); TargetLevel = target->getLevel(); Expansion = creatureTemplate->RequiredExpansion; @@ -171,6 +173,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ContentTuningPara { data << int16(contentTuningParams.PlayerLevelDelta); data << uint16(contentTuningParams.PlayerItemLevel); + data << uint16(contentTuningParams.TargetItemLevel); data << uint16(contentTuningParams.ScalingHealthItemLevelCurveID); data << uint8(contentTuningParams.TargetLevel); data << uint8(contentTuningParams.Expansion); diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.h b/src/server/game/Server/Packets/CombatLogPacketsCommon.h index 40d317e7e02..10fcf040b09 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.h +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.h @@ -62,6 +62,7 @@ namespace WorldPackets uint32 Type = 0; int16 PlayerLevelDelta = 0; uint16 PlayerItemLevel = 0; + uint16 TargetItemLevel = 0; uint16 ScalingHealthItemLevelCurveID = 0; uint8 TargetLevel = 0; uint8 Expansion = 0; diff --git a/src/server/game/Server/Packets/DuelPackets.cpp b/src/server/game/Server/Packets/DuelPackets.cpp index 7d2602c4e41..dd358c8cee8 100644 --- a/src/server/game/Server/Packets/DuelPackets.cpp +++ b/src/server/game/Server/Packets/DuelPackets.cpp @@ -41,7 +41,7 @@ WorldPacket const* WorldPackets::Duel::DuelComplete::Write() WorldPacket const* WorldPackets::Duel::DuelCountdown::Write() { - _worldPacket << Countdown; + _worldPacket << uint32(Countdown); return &_worldPacket; } @@ -67,8 +67,8 @@ WorldPacket const* WorldPackets::Duel::DuelWinner::Write() _worldPacket.WriteBits(BeatenName.size(), 6); _worldPacket.WriteBits(WinnerName.size(), 6); _worldPacket.WriteBit(Fled); - _worldPacket << BeatenVirtualRealmAddress; - _worldPacket << WinnerVirtualRealmAddress; + _worldPacket << uint32(BeatenVirtualRealmAddress); + _worldPacket << uint32(WinnerVirtualRealmAddress); _worldPacket.WriteString(BeatenName); _worldPacket.WriteString(WinnerName); diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 48732b43aba..ec37ad28893 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -110,7 +110,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMissionAreaBonus const& areaBonus) +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMissionBonusAbility const& areaBonus) { data << uint32(areaBonus.GarrMssnBonusAbilityID); data << uint32(areaBonus.StartTime); @@ -169,7 +169,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonInfo co data << missionRewardItem; } - for (WorldPackets::Garrison::GarrisonMissionAreaBonus const* areaBonus : garrison.MissionAreaBonuses) + for (WorldPackets::Garrison::GarrisonMissionBonusAbility const* areaBonus : garrison.MissionAreaBonuses) data << *areaBonus; for (WorldPackets::Garrison::GarrisonTalent const& talent : garrison.Talents) diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index 7ec0b01c3e6..7eddbb46cf9 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -122,7 +122,7 @@ namespace WorldPackets int32 Unknown = 0; }; - struct GarrisonMissionAreaBonus + struct GarrisonMissionBonusAbility { uint32 GarrMssnBonusAbilityID = 0; time_t StartTime = time_t(0); @@ -148,7 +148,7 @@ namespace WorldPackets std::vector<GarrisonMission const*> Missions; std::vector<std::vector<GarrisonMissionReward>> MissionRewards; std::vector<std::vector<GarrisonMissionReward>> MissionOvermaxRewards; - std::vector<GarrisonMissionAreaBonus const*> MissionAreaBonuses; + std::vector<GarrisonMissionBonusAbility const*> MissionAreaBonuses; std::vector<GarrisonTalent> Talents; std::vector<bool> CanStartMission; std::vector<int32> ArchivedMissions; @@ -353,7 +353,7 @@ namespace WorldPackets class GarrisonRemoveFollowerResult final : public ServerPacket { public: - GarrisonRemoveFollowerResult() : ServerPacket(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, 8 + 4) { } + GarrisonRemoveFollowerResult() : ServerPacket(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, 8 + 4 + 4) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 0a2868685af..56768fafe8f 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -29,6 +29,7 @@ WorldPackets::Guild::QueryGuildInfoResponse::QueryGuildInfoResponse() WorldPacket const* WorldPackets::Guild::QueryGuildInfoResponse::Write() { _worldPacket << GuildGuid; + _worldPacket << PlayerGuid; _worldPacket.WriteBit(Info.is_initialized()); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 919fed8a88b..b72d4857d48 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -78,6 +78,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid GuildGuid; + ObjectGuid PlayerGuid; Optional<GuildInfo> Info; }; @@ -883,7 +884,7 @@ namespace WorldPackets class GuildBankTextQueryResult : public ServerPacket { public: - GuildBankTextQueryResult() : ServerPacket(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, 5) { } + GuildBankTextQueryResult() : ServerPacket(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, 4 + 2) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/HotfixPackets.cpp b/src/server/game/Server/Packets/HotfixPackets.cpp index aee733ab4db..cf147b91031 100644 --- a/src/server/game/Server/Packets/HotfixPackets.cpp +++ b/src/server/game/Server/Packets/HotfixPackets.cpp @@ -47,36 +47,64 @@ WorldPacket const* WorldPackets::Hotfix::DBReply::Write() WorldPacket const* WorldPackets::Hotfix::AvailableHotfixes::Write() { _worldPacket << int32(HotfixCacheVersion); - _worldPacket << uint32(Hotfixes.size()); + _worldPacket << uint32(HotfixCount); for (auto const& hotfixEntry : Hotfixes) - _worldPacket << uint64(hotfixEntry.first); + { + for (auto const& tableRecord : hotfixEntry.second) + { + _worldPacket << uint32(tableRecord.first); + _worldPacket << int32(tableRecord.second); + _worldPacket << int32(hotfixEntry.first); + } + } return &_worldPacket; } +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Hotfix::HotfixRecord& hotfixRecord) +{ + data >> hotfixRecord.TableHash; + data >> hotfixRecord.RecordID; + data >> hotfixRecord.HotfixID; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixRecord const& hotfixRecord) +{ + data << uint32(hotfixRecord.TableHash); + data << int32(hotfixRecord.RecordID); + data << int32(hotfixRecord.HotfixID); + return data; +} + void WorldPackets::Hotfix::HotfixRequest::Read() { + _worldPacket >> ClientBuild; + _worldPacket >> DataBuild; + uint32 hotfixCount = _worldPacket.read<uint32>(); - if (hotfixCount > sDB2Manager.GetHotfixData().size()) - throw PacketArrayMaxCapacityException(hotfixCount, sDB2Manager.GetHotfixData().size()); + if (hotfixCount > sDB2Manager.GetHotfixCount()) + throw PacketArrayMaxCapacityException(hotfixCount, sDB2Manager.GetHotfixCount()); Hotfixes.resize(hotfixCount); - for (uint64& hotfixId : Hotfixes) - _worldPacket >> hotfixId; + for (HotfixRecord& hotfixRecord : Hotfixes) + _worldPacket >> hotfixRecord; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixResponse::HotfixData const& hotfixData) { - data << uint64(hotfixData.ID); - data << int32(hotfixData.RecordID); - data.WriteBit(hotfixData.Data.is_initialized()); - if (hotfixData.Data) + data << hotfixData.Record; + if (hotfixData.Size) { - data << uint32(hotfixData.Data->size()); - data.append(*hotfixData.Data); + data << uint32(*hotfixData.Size); + data.WriteBit(true); } else + { data << uint32(0); + data.WriteBit(false); + } + data.FlushBits(); return data; } @@ -87,5 +115,8 @@ WorldPacket const* WorldPackets::Hotfix::HotfixResponse::Write() for (HotfixData const& hotfix : Hotfixes) _worldPacket << hotfix; + _worldPacket << uint32(HotfixContent.size()); + _worldPacket.append(HotfixContent); + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/HotfixPackets.h b/src/server/game/Server/Packets/HotfixPackets.h index 9f0a4a1176f..100b51a5fb2 100644 --- a/src/server/game/Server/Packets/HotfixPackets.h +++ b/src/server/game/Server/Packets/HotfixPackets.h @@ -62,13 +62,21 @@ namespace WorldPackets class AvailableHotfixes final : public ServerPacket { public: - AvailableHotfixes(int32 hotfixCacheVersion, std::map<uint64, int32> const& hotfixes) - : ServerPacket(SMSG_AVAILABLE_HOTFIXES), HotfixCacheVersion(hotfixCacheVersion), Hotfixes(hotfixes) { } + AvailableHotfixes(int32 hotfixCacheVersion, uint32 hotfixCount, DB2Manager::HotfixContainer const& hotfixes) + : ServerPacket(SMSG_AVAILABLE_HOTFIXES), HotfixCacheVersion(hotfixCacheVersion), HotfixCount(hotfixCount), Hotfixes(hotfixes) { } WorldPacket const* Write() override; int32 HotfixCacheVersion; - std::map<uint64, int32> const& Hotfixes; + uint32 HotfixCount; + DB2Manager::HotfixContainer const& Hotfixes; + }; + + struct HotfixRecord + { + uint32 TableHash = 0; + int32 RecordID = 0; + int32 HotfixID = 0; }; class HotfixRequest final : public ClientPacket @@ -78,7 +86,9 @@ namespace WorldPackets void Read() override; - std::vector<uint64> Hotfixes; + uint32 ClientBuild = 0; + uint32 DataBuild = 0; + std::vector<HotfixRecord> Hotfixes; }; class HotfixResponse final : public ServerPacket @@ -86,9 +96,8 @@ namespace WorldPackets public: struct HotfixData { - uint64 ID = 0; - int32 RecordID = 0; - Optional<ByteBuffer> Data; + HotfixRecord Record; + Optional<uint32> Size; }; HotfixResponse() : ServerPacket(SMSG_HOTFIX_RESPONSE) { } @@ -96,6 +105,7 @@ namespace WorldPackets WorldPacket const* Write() override; std::vector<HotfixData> Hotfixes; + ByteBuffer HotfixContent; }; } } diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index 415aedaa56a..8a36270bec2 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -63,6 +63,24 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectGuildData return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData const& bracket) +{ + data << uint8(bracket.Bracket); + data << int32(bracket.Rating); + data << int32(bracket.Rank); + data << int32(bracket.WeeklyPlayed); + data << int32(bracket.WeeklyWon); + data << int32(bracket.SeasonPlayed); + data << int32(bracket.SeasonWon); + data << int32(bracket.WeeklyBestRating); + data << int32(bracket.Unk710); + data << int32(bracket.Unk801_1); + data.WriteBit(bracket.Unk801_2); + data.FlushBits(); + + return data; +} + WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint8 index) { CreatorGUID = item->GetGuidValue(ITEM_FIELD_CREATOR); @@ -100,6 +118,11 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write() _worldPacket << int32(ClassID); _worldPacket << int32(SpecializationID); _worldPacket << int32(GenderID); + _worldPacket << uint8(LifetimeMaxRank); + _worldPacket << uint16(TodayHK); + _worldPacket << uint16(YesterdayHK); + _worldPacket << uint32(LifetimeHK); + _worldPacket << uint32(HonorLevel); if (!Glyphs.empty()) _worldPacket.append(Glyphs.data(), Glyphs.size()); if (!Talents.empty()) @@ -111,8 +134,8 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write() _worldPacket.WriteBit(AzeriteLevel.is_initialized()); _worldPacket.FlushBits(); - for (size_t i = 0; i < Items.size(); ++i) - _worldPacket << Items[i]; + for (PVPBracketData const& bracket : Bracket) + _worldPacket << bracket; if (GuildData) _worldPacket << *GuildData; @@ -120,58 +143,8 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write() if (AzeriteLevel) _worldPacket << int32(*AzeriteLevel); - return &_worldPacket; -} - -void WorldPackets::Inspect::RequestHonorStats::Read() -{ - _worldPacket >> TargetGUID; -} - -WorldPacket const* WorldPackets::Inspect::InspectHonorStats::Write() -{ - _worldPacket << PlayerGUID; - _worldPacket << uint8(LifetimeMaxRank); - _worldPacket << uint16(YesterdayHK); /// @todo: confirm order - _worldPacket << uint16(TodayHK); /// @todo: confirm order - _worldPacket << uint32(LifetimeHK); - - return &_worldPacket; -} - -void WorldPackets::Inspect::InspectPVPRequest::Read() -{ - _worldPacket >> InspectTarget; - _worldPacket >> InspectRealmAddress; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData const& bracket) -{ - data << uint8(bracket.Bracket); - data << int32(bracket.Rating); - data << int32(bracket.Rank); - data << int32(bracket.WeeklyPlayed); - data << int32(bracket.WeeklyWon); - data << int32(bracket.SeasonPlayed); - data << int32(bracket.SeasonWon); - data << int32(bracket.WeeklyBestRating); - data << int32(bracket.Unk710); - data << int32(bracket.Unk801_1); - data.WriteBit(bracket.Unk801_2); - data.FlushBits(); - - return data; -} - -WorldPacket const* WorldPackets::Inspect::InspectPVPResponse::Write() -{ - _worldPacket << ClientGUID; - - _worldPacket.WriteBits(Bracket.size(), 3); - _worldPacket.FlushBits(); - - for (size_t i = 0; i < Bracket.size(); ++i) - _worldPacket << Bracket[i]; + for (InspectItemData const& item : Items) + _worldPacket << item; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h index e16507904b9..51b1248e286 100644 --- a/src/server/game/Server/Packets/InspectPackets.h +++ b/src/server/game/Server/Packets/InspectPackets.h @@ -67,6 +67,21 @@ namespace WorldPackets int32 AchievementPoints = 0; }; + struct PVPBracketData + { + int32 Rating = 0; + int32 Rank = 0; + int32 WeeklyPlayed = 0; + int32 WeeklyWon = 0; + int32 SeasonPlayed = 0; + int32 SeasonWon = 0; + int32 WeeklyBestRating = 0; + int32 Unk710 = 0; + int32 Unk801_1 = 0; + uint8 Bracket = 0; + bool Unk801_2 = false; + }; + class InspectResult final : public ServerPacket { public: @@ -85,71 +100,16 @@ namespace WorldPackets int32 ClassID = CLASS_NONE; int32 GenderID = GENDER_NONE; Optional<InspectGuildData> GuildData; + std::array<PVPBracketData, 6> Bracket; int32 SpecializationID = 0; Optional<int32> AzeriteLevel; - }; - - class RequestHonorStats final : public ClientPacket - { - public: - RequestHonorStats(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_HONOR_STATS, std::move(packet)) { } - - void Read() override; - - ObjectGuid TargetGUID; - }; - - class InspectHonorStats final : public ServerPacket - { - public: - InspectHonorStats() : ServerPacket(SMSG_INSPECT_HONOR_STATS, 25) { } - - WorldPacket const* Write() override; - - ObjectGuid PlayerGUID; - uint32 LifetimeHK = 0; - uint16 YesterdayHK = 0; - uint16 TodayHK = 0; + uint32 LifetimeHK = 0; + uint32 HonorLevel = 0; + uint16 TodayHK = 0; + uint16 YesterdayHK = 0; uint8 LifetimeMaxRank = 0; }; - class InspectPVPRequest final : public ClientPacket - { - public: - InspectPVPRequest(WorldPacket&& packet) : ClientPacket(CMSG_INSPECT_PVP, std::move(packet)) { } - - void Read() override; - - ObjectGuid InspectTarget; - uint32 InspectRealmAddress = 0; - }; - - struct PVPBracketData - { - int32 Rating = 0; - int32 Rank = 0; - int32 WeeklyPlayed = 0; - int32 WeeklyWon = 0; - int32 SeasonPlayed = 0; - int32 SeasonWon = 0; - int32 WeeklyBestRating = 0; - int32 Unk710 = 0; - int32 Unk801_1 = 0; - uint8 Bracket = 0; - bool Unk801_2 = false; - }; - - class InspectPVPResponse final : public ServerPacket - { - public: - InspectPVPResponse() : ServerPacket(SMSG_INSPECT_PVP, 17) { } - - WorldPacket const* Write() override; - - std::vector<PVPBracketData> Bracket; - ObjectGuid ClientGUID; - }; - class QueryInspectAchievements final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/InstancePackets.h b/src/server/game/Server/Packets/InstancePackets.h index d6724f42286..311b1b14e65 100644 --- a/src/server/game/Server/Packets/InstancePackets.h +++ b/src/server/game/Server/Packets/InstancePackets.h @@ -229,7 +229,7 @@ namespace WorldPackets class InstanceEncounterGainCombatResurrectionCharge final : public ServerPacket { public: - InstanceEncounterGainCombatResurrectionCharge() : ServerPacket(SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE, 0) { } + InstanceEncounterGainCombatResurrectionCharge() : ServerPacket(SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE, 4 + 4) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.cpp b/src/server/game/Server/Packets/ItemPacketsCommon.cpp index aafdaa831b4..0803b3f044b 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.cpp +++ b/src/server/game/Server/Packets/ItemPacketsCommon.cpp @@ -33,8 +33,6 @@ bool WorldPackets::Item::ItemBonusInstanceData::operator==(ItemBonusInstanceData void WorldPackets::Item::ItemInstance::Initialize(::Item const* item) { ItemID = item->GetEntry(); - RandomPropertiesSeed = item->GetItemSuffixFactor(); - RandomPropertiesID = item->GetItemRandomPropertyId(); std::vector<uint32> const& bonusListIds = item->GetDynamicValues(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS); if (!bonusListIds.empty()) { @@ -70,9 +68,6 @@ void WorldPackets::Item::ItemInstance::Initialize(::ItemDynamicFieldGems const* void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) { ItemID = lootItem.itemid; - RandomPropertiesSeed = lootItem.randomSuffix; - if (lootItem.randomPropertyId.Type != ItemRandomEnchantmentType::BonusList) - RandomPropertiesID = lootItem.randomPropertyId.Id; if (!lootItem.BonusListIDs.empty()) { @@ -91,9 +86,6 @@ void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidItem) { ItemID = voidItem->ItemEntry; - RandomPropertiesSeed = voidItem->ItemSuffixFactor; - if (voidItem->ItemRandomPropertyId.Type != ItemRandomEnchantmentType::BonusList) - RandomPropertiesID = voidItem->ItemRandomPropertyId.Id; if (voidItem->ItemUpgradeId || voidItem->FixedScalingLevel || voidItem->ArtifactKnowledgeLevel) { @@ -116,7 +108,7 @@ void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidI bool WorldPackets::Item::ItemInstance::operator==(ItemInstance const& r) const { - if (ItemID != r.ItemID || RandomPropertiesID != r.RandomPropertiesID || RandomPropertiesSeed != r.RandomPropertiesSeed) + if (ItemID != r.ItemID) return false; if (ItemBonus.is_initialized() != r.ItemBonus.is_initialized() || Modifications.is_initialized() != r.Modifications.is_initialized()) @@ -161,8 +153,6 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceDa ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance) { data << int32(itemInstance.ItemID); - data << int32(itemInstance.RandomPropertiesSeed); - data << int32(itemInstance.RandomPropertiesID); data.WriteBit(itemInstance.ItemBonus.is_initialized()); data.WriteBit(itemInstance.Modifications.is_initialized()); @@ -180,8 +170,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance) { data >> itemInstance.ItemID; - data >> itemInstance.RandomPropertiesSeed; - data >> itemInstance.RandomPropertiesID; bool hasItemBonus = data.ReadBit(); bool hasModifications = data.ReadBit(); diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.h b/src/server/game/Server/Packets/ItemPacketsCommon.h index af7f06920b8..1c01447630e 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.h +++ b/src/server/game/Server/Packets/ItemPacketsCommon.h @@ -50,8 +50,6 @@ namespace WorldPackets void Initialize(::VoidStorageItem const* voidItem); uint32 ItemID = 0; - uint32 RandomPropertiesSeed = 0; - uint32 RandomPropertiesID = 0; Optional<ItemBonusInstanceData> ItemBonus; Optional<CompactArray<int32>> Modifications; diff --git a/src/server/game/Server/Packets/LFGPackets.cpp b/src/server/game/Server/Packets/LFGPackets.cpp index 91edfa54981..2a7707d06d0 100644 --- a/src/server/game/Server/Packets/LFGPackets.cpp +++ b/src/server/game/Server/Packets/LFGPackets.cpp @@ -241,13 +241,16 @@ WorldPacket const* WorldPackets::LFG::LFGRoleCheckUpdate::Write() _worldPacket << uint8(PartyIndex); _worldPacket << uint8(RoleCheckStatus); _worldPacket << uint32(JoinSlots.size()); - _worldPacket << uint64(BgQueueID); + _worldPacket << uint32(BgQueueIDs.size()); _worldPacket << int32(GroupFinderActivityID); _worldPacket << uint32(Members.size()); for (uint32 slot : JoinSlots) _worldPacket << uint32(slot); + for (uint64 bgQueueID : BgQueueIDs) + _worldPacket << uint64(bgQueueID); + _worldPacket.WriteBit(IsBeginning); _worldPacket.WriteBit(IsRequeue); _worldPacket.FlushBits(); @@ -285,10 +288,18 @@ WorldPacket const* WorldPackets::LFG::LFGJoinResult::Write() _worldPacket << uint8(Result); _worldPacket << uint8(ResultDetail); _worldPacket << uint32(BlackList.size()); + _worldPacket << uint32(BlackListNames.size()); for (LFGJoinBlackList const& blackList : BlackList) _worldPacket << blackList; + for (std::string const* str : BlackListNames) + _worldPacket.WriteBits(str->length() + 1, 24); + + for (std::string const* str : BlackListNames) + if (!str->empty()) + _worldPacket << *str; + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/LFGPackets.h b/src/server/game/Server/Packets/LFGPackets.h index aa081a98dda..b98f1d66334 100644 --- a/src/server/game/Server/Packets/LFGPackets.h +++ b/src/server/game/Server/Packets/LFGPackets.h @@ -269,7 +269,7 @@ namespace WorldPackets uint8 PartyIndex = 0; uint8 RoleCheckStatus = 0; std::vector<uint32> JoinSlots; - uint64 BgQueueID = 0; + std::vector<uint64> BgQueueIDs; int32 GroupFinderActivityID = 0; std::vector<LFGRoleCheckUpdateMember> Members; bool IsBeginning = false; @@ -305,6 +305,7 @@ namespace WorldPackets uint8 Result = 0; uint8 ResultDetail = 0; std::vector<LFGJoinBlackList> BlackList; + std::vector<std::string const*> BlackListNames; }; class LFGQueueStatus final : public ServerPacket diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp index 86b3484c6c0..ff787c11b02 100644 --- a/src/server/game/Server/Packets/LootPackets.cpp +++ b/src/server/game/Server/Packets/LootPackets.cpp @@ -94,7 +94,8 @@ void WorldPackets::Loot::LootRelease::Read() WorldPacket const* WorldPackets::Loot::LootMoneyNotify::Write() { - _worldPacket << Money; + _worldPacket << uint64(Money); + _worldPacket << uint64(MoneyMod); _worldPacket.WriteBit(SoleLooter); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h index f65e54d780f..adacd5c0fb7 100644 --- a/src/server/game/Server/Packets/LootPackets.h +++ b/src/server/game/Server/Packets/LootPackets.h @@ -129,7 +129,8 @@ namespace WorldPackets WorldPacket const* Write() override; - uint32 Money = 0; + uint64 Money = 0; + uint64 MoneyMod = 0; bool SoleLooter = false; }; diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp index 6ca0a994b0a..294698728ff 100644 --- a/src/server/game/Server/Packets/MailPackets.cpp +++ b/src/server/game/Server/Packets/MailPackets.cpp @@ -272,7 +272,7 @@ WorldPacket const* WorldPackets::Mail::MailQueryNextTimeResult::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Mail::NotifyRecievedMail::Write() +WorldPacket const* WorldPackets::Mail::NotifyReceivedMail::Write() { _worldPacket << float(Delay); diff --git a/src/server/game/Server/Packets/MailPackets.h b/src/server/game/Server/Packets/MailPackets.h index ce6a7933af5..e7851b7dccd 100644 --- a/src/server/game/Server/Packets/MailPackets.h +++ b/src/server/game/Server/Packets/MailPackets.h @@ -227,10 +227,10 @@ namespace WorldPackets std::vector<MailNextTimeEntry> Next; }; - class NotifyRecievedMail : ServerPacket + class NotifyReceivedMail : ServerPacket { public: - NotifyRecievedMail() : ServerPacket(SMSG_NOTIFY_RECEIVED_MAIL, 4) { } + NotifyReceivedMail() : ServerPacket(SMSG_NOTIFY_RECEIVED_MAIL, 4) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 3f9bf709082..4039bd9e7b6 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -54,6 +54,9 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write() _worldPacket.WriteBit(TrackedQuantity.is_initialized()); _worldPacket.WriteBit(MaxQuantity.is_initialized()); _worldPacket.WriteBit(SuppressChatLog); + _worldPacket.WriteBit(QuantityChange.is_initialized()); + _worldPacket.WriteBit(QuantityGainSource.is_initialized()); + _worldPacket.WriteBit(QuantityLostSource.is_initialized()); _worldPacket.FlushBits(); if (WeeklyQuantity) @@ -65,6 +68,15 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write() if (MaxQuantity) _worldPacket << int32(*MaxQuantity); + if (QuantityChange) + _worldPacket << int32(*QuantityChange); + + if (QuantityGainSource) + _worldPacket << int32(*QuantityGainSource); + + if (QuantityLostSource) + _worldPacket << int32(*QuantityLostSource); + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 20ab3ac02ea..1c88f229a8c 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -109,6 +109,9 @@ namespace WorldPackets Optional<int32> WeeklyQuantity; Optional<int32> TrackedQuantity; Optional<int32> MaxQuantity; + Optional<int32> QuantityChange; + Optional<int32> QuantityGainSource; + Optional<int32> QuantityLostSource; bool SuppressChatLog = false; }; diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index c913637ad34..8276fb8d819 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -840,7 +840,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompound data.WriteBit(stateChange.VehicleRecID.is_initialized()); data.WriteBit(stateChange.CollisionHeight.is_initialized()); data.WriteBit(stateChange.MovementForce_.is_initialized()); - data.WriteBit(stateChange.Unknown.is_initialized()); + data.WriteBit(stateChange.MovementForceGUID.is_initialized()); data.FlushBits(); if (stateChange.CollisionHeight) @@ -864,8 +864,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompound if (stateChange.VehicleRecID) data << int32(*stateChange.VehicleRecID); - if (stateChange.Unknown) - data << *stateChange.Unknown; + if (stateChange.MovementForceGUID) + data << *stateChange.MovementForceGUID; if (stateChange.MovementForce_) data << *stateChange.MovementForce_; diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 52999613fe3..f806551c24c 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -592,7 +592,7 @@ namespace WorldPackets Optional<int32> VehicleRecID; Optional<CollisionHeightInfo> CollisionHeight; Optional<MovementForce> MovementForce_; - Optional<ObjectGuid> Unknown; + Optional<ObjectGuid> MovementForceGUID; }; MoveSetCompoundState() : ServerPacket(SMSG_MOVE_SET_COMPOUND_STATE, 4 + 1) { } diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index 16da5d654a5..7e52b5d549a 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -64,7 +64,6 @@ WorldPacket const* WorldPackets::NPC::GossipMessage::Write() return &_worldPacket; } - ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::NPC::VendorItem const &item) { data << uint32(item.MuID); @@ -77,6 +76,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::NPC::VendorItem const &it data << int32(item.PlayerConditionFailed); data << item.Item; data.WriteBit(item.DoNotFilterOnVendor); + data.WriteBit(item.Refundable); data.FlushBits(); return data; diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index a9d9207351b..39a25e25b7b 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -114,6 +114,7 @@ namespace WorldPackets int32 ExtendedCostID = 0; int32 PlayerConditionFailed = 0; bool DoNotFilterOnVendor = false; + bool Refundable = false; }; class VendorInventory final : public ServerPacket diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 93961d15c9c..1cd4ab95dad 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -418,7 +418,7 @@ WorldPacket const* WorldPackets::Party::GroupNewLeader::Write() ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyPlayerInfo const& playerInfo) { data.WriteBits(playerInfo.Name.size(), 6); - data.WriteBits(playerInfo.VoiceStateID.size(), 6); + data.WriteBits(playerInfo.VoiceStateID.size() + 1, 6); data.WriteBit(playerInfo.FromSocialQueue); data.WriteBit(playerInfo.VoiceChatSilenced); data << playerInfo.GUID; @@ -428,7 +428,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyPlayerInfo co data << uint8(playerInfo.RolesAssigned); data << uint8(playerInfo.Class); data.WriteString(playerInfo.Name); - data.WriteString(playerInfo.VoiceStateID); + if (!playerInfo.VoiceStateID.empty()) + data << playerInfo.VoiceStateID; return data; } @@ -531,7 +532,7 @@ WorldPacket const* WorldPackets::Party::RaidMarkersChanged::Write() _worldPacket.WriteBits(RaidMarkers.size(), 4); _worldPacket.FlushBits(); - for (RaidMarker* raidMarker : RaidMarkers) + for (RaidMarker const* raidMarker : RaidMarkers) { _worldPacket << raidMarker->TransportGUID; _worldPacket << raidMarker->Location.GetMapId(); diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 4290656c16e..3e784c10706 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -124,6 +124,14 @@ namespace WorldPackets std::string Name; }; + class GroupUninvite final : public ServerPacket + { + public: + GroupUninvite() : ServerPacket(SMSG_GROUP_UNINVITE, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + class RequestPartyMemberStats final : public ClientPacket { public: @@ -603,7 +611,7 @@ namespace WorldPackets uint8 PartyIndex = 0; uint32 ActiveMarkers = 0u; - std::vector<RaidMarker*> RaidMarkers; + std::vector<RaidMarker const*> RaidMarkers; }; class PartyKillLog final : public ServerPacket diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 338839e993d..8f651aeea7e 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -79,6 +79,9 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write() _worldPacket << int32(Stats.RequiredExpansion); _worldPacket << int32(Stats.VignetteID); _worldPacket << int32(Stats.Class); + _worldPacket << float(Stats.FadeRegionRadius); + _worldPacket << int32(Stats.WidgetSetID); + _worldPacket << int32(Stats.WidgetSetUnitConditionID); if (!Stats.Title.empty()) _worldPacket << Stats.Title; diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index a262b2bcc2f..4331df38c85 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -82,6 +82,9 @@ namespace WorldPackets uint32 RequiredExpansion = 0; uint32 VignetteID = 0; int32 Class = 0; + float FadeRegionRadius = 0.0f; + int32 WidgetSetID = 0; + int32 WidgetSetUnitConditionID = 0; std::array<uint32, 2> Flags; std::array<uint32, 2> ProxyCreatureID; std::array<std::string, 4> Name; diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 246a45992a5..0078bb8910d 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -146,6 +146,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << uint64(Info.AllowableRaces); _worldPacket << int32(Info.TreasurePickerID); _worldPacket << int32(Info.Expansion); + _worldPacket << int32(Info.ManagedWorldStateID); _worldPacket.WriteBits(Info.LogTitle.size(), 9); _worldPacket.WriteBits(Info.LogDescription.size(), 12); @@ -649,12 +650,17 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceRespon data << int32(playerChoiceResponse.ChoiceArtFileID); data << int32(playerChoiceResponse.Flags); data << uint32(playerChoiceResponse.WidgetSetID); + data << uint32(playerChoiceResponse.UiTextureAtlasElementID); + data << uint32(playerChoiceResponse.SoundKitID); data << uint8(playerChoiceResponse.GroupID); data.WriteBits(playerChoiceResponse.Answer.length(), 9); data.WriteBits(playerChoiceResponse.Header.length(), 9); + data.WriteBits(playerChoiceResponse.SubHeader.length() , 7); + data.WriteBits(playerChoiceResponse.ButtonTooltip.length(), 9); data.WriteBits(playerChoiceResponse.Description.length(), 11); data.WriteBits(playerChoiceResponse.Confirmation.length(), 7); + data.WriteBit(playerChoiceResponse.RewardQuestID.is_initialized()); data.WriteBit(playerChoiceResponse.Reward.is_initialized()); data.FlushBits(); @@ -663,8 +669,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceRespon data.WriteString(playerChoiceResponse.Answer); data.WriteString(playerChoiceResponse.Header); + data.WriteString(playerChoiceResponse.SubHeader); + data.WriteString(playerChoiceResponse.ButtonTooltip); data.WriteString(playerChoiceResponse.Description); data.WriteString(playerChoiceResponse.Confirmation); + + if (playerChoiceResponse.RewardQuestID) + data << uint32(*playerChoiceResponse.RewardQuestID); + return data; } @@ -674,6 +686,7 @@ WorldPacket const* WorldPackets::Quest::DisplayPlayerChoice::Write() _worldPacket << uint32(Responses.size()); _worldPacket << SenderGUID; _worldPacket << int32(UiTextureKitID); + _worldPacket << uint32(SoundKitID); _worldPacket.WriteBits(Question.length(), 8); _worldPacket.WriteBit(CloseChoiceFrame); _worldPacket.WriteBit(HideWarboardHeader); diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index aa449d93883..fd9ac659cae 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -162,6 +162,7 @@ namespace WorldPackets int32 TimeAllowed = 0; int32 TreasurePickerID = 0; int32 Expansion = 0; + int32 ManagedWorldStateID = 0; std::vector<QuestObjective> Objectives; int32 RewardItems[QUEST_REWARD_ITEM_COUNT] = { }; int32 RewardAmount[QUEST_REWARD_ITEM_COUNT] = { }; @@ -670,12 +671,17 @@ namespace WorldPackets int32 ChoiceArtFileID = 0; int32 Flags = 0; uint32 WidgetSetID = 0; + uint32 UiTextureAtlasElementID = 0; + uint32 SoundKitID = 0; uint8 GroupID = 0; std::string Answer; std::string Header; + std::string SubHeader; + std::string ButtonTooltip; std::string Description; std::string Confirmation; Optional<PlayerChoiceResponseReward> Reward; + Optional<uint32> RewardQuestID; }; class DisplayPlayerChoice final : public ServerPacket @@ -688,6 +694,7 @@ namespace WorldPackets ObjectGuid SenderGUID; int32 ChoiceID = 0; int32 UiTextureKitID = 0; + uint32 SoundKitID = 0; std::string Question; std::vector<PlayerChoiceResponse> Responses; bool CloseChoiceFrame = false; diff --git a/src/server/game/Server/Packets/ReputationPackets.h b/src/server/game/Server/Packets/ReputationPackets.h index 3cd07e55845..9ad7efafc27 100644 --- a/src/server/game/Server/Packets/ReputationPackets.h +++ b/src/server/game/Server/Packets/ReputationPackets.h @@ -25,7 +25,7 @@ namespace WorldPackets { namespace Reputation { - static uint16 const FactionCount = 300; + static uint16 const FactionCount = 350; class InitializeFactions final : public ServerPacket { diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 9469e675876..3e434f4899b 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -171,7 +171,7 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellTargetData { buffer.ResetBitPos(); - targetData.Flags = buffer.ReadBits(25); + targetData.Flags = buffer.ReadBits(26); bool hasSrcLocation = buffer.ReadBit(); bool hasDstLocation = buffer.ReadBit(); bool hasOrientation = buffer.ReadBit(); @@ -274,7 +274,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::TargetLocation co ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData const& spellTargetData) { - data.WriteBits(spellTargetData.Flags, 25); + data.WriteBits(spellTargetData.Flags, 26); data.WriteBit(spellTargetData.SrcLocation.is_initialized()); data.WriteBit(spellTargetData.DstLocation.is_initialized()); data.WriteBit(spellTargetData.Orientation.is_initialized()); @@ -312,6 +312,12 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellMissStatus c return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHitStatus const& spellHitStatus) +{ + data << uint8(spellHitStatus.Reason); + return data; +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellPowerData const& spellPowerData) { data << int32(spellPowerData.Cost); @@ -377,22 +383,26 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con data << spellCastData.Predict; data.WriteBits(spellCastData.HitTargets.size(), 16); data.WriteBits(spellCastData.MissTargets.size(), 16); + data.WriteBits(spellCastData.HitStatus.size(), 16); data.WriteBits(spellCastData.MissStatus.size(), 16); data.WriteBits(spellCastData.RemainingPower.size(), 9); data.WriteBit(spellCastData.RemainingRunes.is_initialized()); data.WriteBits(spellCastData.TargetPoints.size(), 16); data.FlushBits(); - for (WorldPackets::Spells::SpellMissStatus const& status : spellCastData.MissStatus) - data << status; + for (WorldPackets::Spells::SpellMissStatus const& missStatus : spellCastData.MissStatus) + data << missStatus; data << spellCastData.Target; - for (ObjectGuid const& target : spellCastData.HitTargets) - data << target; + for (ObjectGuid const& hitTarget : spellCastData.HitTargets) + data << hitTarget; + + for (ObjectGuid const& missTarget : spellCastData.MissTargets) + data << missTarget; - for (ObjectGuid const& target : spellCastData.MissTargets) - data << target; + for (WorldPackets::Spells::SpellHitStatus const& hitStatus : spellCastData.HitStatus) + data << hitStatus; for (WorldPackets::Spells::SpellPowerData const& power : spellCastData.RemainingPower) data << power; @@ -717,8 +727,8 @@ WorldPacket const* WorldPackets::Spells::PlayOrphanSpellVisual::Write() _worldPacket << Target; _worldPacket << int32(SpellVisualID); _worldPacket << float(TravelSpeed); - _worldPacket << float(UnkZero); - _worldPacket << float(Unk801); + _worldPacket << float(LaunchDelay); + _worldPacket << float(MinDuration); _worldPacket.WriteBit(SpeedAsTime); _worldPacket.FlushBits(); @@ -729,14 +739,15 @@ WorldPacket const* WorldPackets::Spells::PlaySpellVisual::Write() { _worldPacket << Source; _worldPacket << Target; - _worldPacket << Unk801_1; + _worldPacket << Transport; _worldPacket << TargetPosition; _worldPacket << uint32(SpellVisualID); _worldPacket << float(TravelSpeed); + _worldPacket << uint16(HitReason); _worldPacket << uint16(MissReason); _worldPacket << uint16(ReflectStatus); - _worldPacket << float(Orientation); - _worldPacket << float(Unk801_2); + _worldPacket << float(LaunchDelay); + _worldPacket << float(MinDuration); _worldPacket.WriteBit(SpeedAsTime); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 919666c9b53..8e1d46cc3da 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -297,8 +297,19 @@ namespace WorldPackets ObjectGuid ServerCastID; }; + struct SpellHitStatus + { + SpellHitStatus() { } + SpellHitStatus(uint8 reason) : Reason(reason) { } + + uint8 Reason; + }; + struct SpellMissStatus { + SpellMissStatus() { } + SpellMissStatus(uint8 reason, uint8 reflectStatus) : Reason(reason), ReflectStatus(reflectStatus) { } + uint8 Reason = 0; uint8 ReflectStatus = 0; }; @@ -354,6 +365,7 @@ namespace WorldPackets uint32 CastTime = 0; std::vector<ObjectGuid> HitTargets; std::vector<ObjectGuid> MissTargets; + std::vector<SpellHitStatus> HitStatus; std::vector<SpellMissStatus> MissStatus; SpellTargetData Target; std::vector<SpellPowerData> RemainingPower; @@ -699,8 +711,8 @@ namespace WorldPackets int32 SpellVisualID = 0; bool SpeedAsTime = false; float TravelSpeed = 0.0f; - float UnkZero = 0.0f; // Always zero - float Unk801 = 0.0f; + float LaunchDelay = 0.0f; + float MinDuration = 0.0f; TaggedPosition<Position::XYZ> SourceRotation; // Vector of rotations, Orientation is z TaggedPosition<Position::XYZ> TargetLocation; // Exclusive with Target }; @@ -714,15 +726,16 @@ namespace WorldPackets ObjectGuid Source; ObjectGuid Target; // Exclusive with TargetPosition - ObjectGuid Unk801_1; - uint16 MissReason = 0; + ObjectGuid Transport; // Used when Target = Empty && (SpellVisual::Flags & 0x400) == 0 + TaggedPosition<Position::XYZ> TargetPosition; // Exclusive with Target uint32 SpellVisualID = 0; - bool SpeedAsTime = false; - uint16 ReflectStatus = 0; float TravelSpeed = 0.0f; - TaggedPosition<Position::XYZ> TargetPosition; // Exclusive with Target - float Orientation = 0.0f; - float Unk801_2 = 0.0f; + uint16 HitReason = 0; + uint16 MissReason = 0; + uint16 ReflectStatus = 0; + float LaunchDelay = 0.0f; + float MinDuration = 0.0f; + bool SpeedAsTime = false; }; class PlaySpellVisualKit final : public ServerPacket diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index 76ce613b611..5e4d8b362fb 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -38,6 +38,7 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket << uint32(BpayStoreProductDeliveryDelay); _worldPacket << uint32(ClubsPresenceUpdateTimer); + _worldPacket << uint32(HiddenUIClubsPresenceUpdateTimer); _worldPacket.WriteBit(VoiceEnabled); _worldPacket.WriteBit(EuropaTicketSystemStatus.is_initialized()); @@ -65,6 +66,7 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket.WriteBit(ClubsEnabled); _worldPacket.WriteBit(ClubsBattleNetClubTypeAllowed); _worldPacket.WriteBit(ClubsCharacterClubTypeAllowed); + _worldPacket.WriteBit(ClubsPresenceUpdateEnabled); _worldPacket.WriteBit(VoiceChatDisabledByParentalControl); _worldPacket.WriteBit(VoiceChatMutedByParentalControl); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index ee1704a0dac..17b404032dc 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -112,6 +112,7 @@ namespace WorldPackets int64 TokenBalanceAmount = 0; uint32 BpayStoreProductDeliveryDelay = 0; uint32 ClubsPresenceUpdateTimer = 0; + uint32 HiddenUIClubsPresenceUpdateTimer = 0; ///< Timer for updating club presence when communities ui frame is hidden bool ItemRestorationButtonEnabled = false; bool CharUndeleteEnabled = false; ///< Implemented bool BpayStoreDisabledByParentalControls = false; @@ -129,6 +130,7 @@ namespace WorldPackets bool ClubsEnabled = false; bool ClubsBattleNetClubTypeAllowed = false; bool ClubsCharacterClubTypeAllowed = false; + bool ClubsPresenceUpdateEnabled = false; bool VoiceChatDisabledByParentalControl = false; bool VoiceChatMutedByParentalControl = false; diff --git a/src/server/game/Server/Packets/TokenPackets.cpp b/src/server/game/Server/Packets/TokenPackets.cpp index 2f5b40e3fd9..8100f139604 100644 --- a/src/server/game/Server/Packets/TokenPackets.cpp +++ b/src/server/game/Server/Packets/TokenPackets.cpp @@ -49,7 +49,7 @@ WorldPacket const* WorldPackets::Token::WowTokenMarketPriceResponse::Write() _worldPacket << CurrentMarketPrice; _worldPacket << UnkInt; _worldPacket << Result; - _worldPacket << UnkInt2; + _worldPacket << AuctionDuration; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/TokenPackets.h b/src/server/game/Server/Packets/TokenPackets.h index 21d8c2855cf..c7dd085c9b2 100644 --- a/src/server/game/Server/Packets/TokenPackets.h +++ b/src/server/game/Server/Packets/TokenPackets.h @@ -75,7 +75,7 @@ namespace WorldPackets uint64 CurrentMarketPrice = 0; uint32 UnkInt = 0; // send CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE uint32 Result = 0; - uint32 UnkInt2 = 0; + uint32 AuctionDuration = 0; // preset auction duration enum }; } } diff --git a/src/server/game/Server/Packets/ToyPackets.cpp b/src/server/game/Server/Packets/ToyPackets.cpp index a6a8d9706e9..111993db16d 100644 --- a/src/server/game/Server/Packets/ToyPackets.cpp +++ b/src/server/game/Server/Packets/ToyPackets.cpp @@ -32,17 +32,26 @@ WorldPacket const* WorldPackets::Toy::AccountToysUpdate::Write() _worldPacket.WriteBit(IsFullUpdate); _worldPacket.FlushBits(); - // both lists have to have the same size - _worldPacket << int32(Toys->size()); - _worldPacket << int32(Toys->size()); + // all lists have to have the same size + _worldPacket << int32(Toys->size()); // ids + _worldPacket << int32(Toys->size()); // favorites + _worldPacket << int32(Toys->size()); // fanfare - for (auto const& item : *Toys) - _worldPacket << uint32(item.first); + for (auto const& toy : *Toys) + _worldPacket << uint32(toy.first); - for (auto const& favourite : *Toys) - _worldPacket.WriteBit(favourite.second); + for (auto const& toy : *Toys) + _worldPacket.WriteBit(toy.second.HasFlag(ToyFlags::Favorite)); + + for (auto const& toy : *Toys) + _worldPacket.WriteBit(toy.second.HasFlag(ToyFlags::HasFanfare)); _worldPacket.FlushBits(); return &_worldPacket; } + +void WorldPackets::Toy::ToyClearFanfare::Read() +{ + _worldPacket >> ItemID; +} diff --git a/src/server/game/Server/Packets/ToyPackets.h b/src/server/game/Server/Packets/ToyPackets.h index a0157b6fab8..bc5699cf5ca 100644 --- a/src/server/game/Server/Packets/ToyPackets.h +++ b/src/server/game/Server/Packets/ToyPackets.h @@ -55,6 +55,16 @@ namespace WorldPackets bool IsFullUpdate = false; ToyBoxContainer const* Toys = nullptr; }; + + class ToyClearFanfare final : public ClientPacket + { + public: + ToyClearFanfare(WorldPacket&& packet) : ClientPacket(CMSG_TOY_CLEAR_FANFARE, std::move(packet)) { } + + void Read() override; + + uint32 ItemID = 0; + }; } } |
