diff options
| author | Shauren <shauren.trinity@gmail.com> | 2021-08-05 19:37:53 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-08-08 00:18:05 +0200 |
| commit | cd5357dc185f95c6ef78089c5ab8bd2b885dd89f (patch) | |
| tree | 0937cc060467205336311a3ba3bd04f5d334c34b /src/server/game/Server/Packets | |
| parent | 07f51437fc9ddba2810c090caa76ab294bcf777b (diff) | |
Core/PacketIO: 9.1.0 opcodes and packet structures
Diffstat (limited to 'src/server/game/Server/Packets')
38 files changed, 377 insertions, 33 deletions
diff --git a/src/server/game/Server/Packets/AuctionHousePackets.cpp b/src/server/game/Server/Packets/AuctionHousePackets.cpp index 0bf1acec836..a9d9ad0dafd 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.cpp +++ b/src/server/game/Server/Packets/AuctionHousePackets.cpp @@ -195,6 +195,7 @@ ByteBuffer& operator<<(ByteBuffer& data, AuctionItem const& auctionItem) data.WriteBit(auctionItem.CensorServerSideInfo); data.WriteBit(auctionItem.CensorBidInfo); data.WriteBit(auctionItem.AuctionBucketKey.is_initialized()); + data.WriteBit(auctionItem.Creator.is_initialized()); if (!auctionItem.CensorBidInfo) { data.WriteBit(auctionItem.Bidder.is_initialized()); @@ -236,6 +237,9 @@ ByteBuffer& operator<<(ByteBuffer& data, AuctionItem const& auctionItem) data << int32(auctionItem.EndTime); } + if (auctionItem.Creator) + data << *auctionItem.Creator; + if (!auctionItem.CensorBidInfo) { if (auctionItem.Bidder) diff --git a/src/server/game/Server/Packets/AuctionHousePackets.h b/src/server/game/Server/Packets/AuctionHousePackets.h index 0e30f6f53f7..07b5e9b9260 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.h +++ b/src/server/game/Server/Packets/AuctionHousePackets.h @@ -130,6 +130,7 @@ namespace WorldPackets Optional<uint64> BidAmount; std::vector<Item::ItemGemData> Gems; Optional<WorldPackets::AuctionHouse::AuctionBucketKey> AuctionBucketKey; + Optional<ObjectGuid> Creator; }; struct AuctionBidderNotification diff --git a/src/server/game/Server/Packets/BattlePetPackets.cpp b/src/server/game/Server/Packets/BattlePetPackets.cpp index 4568103d7de..f664e92ea0f 100644 --- a/src/server/game/Server/Packets/BattlePetPackets.cpp +++ b/src/server/game/Server/Packets/BattlePetPackets.cpp @@ -65,7 +65,6 @@ WorldPacket const* WorldPackets::BattlePet::BattlePetJournal::Write() _worldPacket << uint16(Trap); _worldPacket << uint32(Slots.size()); _worldPacket << uint32(Pets.size()); - _worldPacket << int32(MaxPets); _worldPacket.WriteBit(HasJournalLock); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/BattlePetPackets.h b/src/server/game/Server/Packets/BattlePetPackets.h index cce3bd49675..2cc13908abc 100644 --- a/src/server/game/Server/Packets/BattlePetPackets.h +++ b/src/server/game/Server/Packets/BattlePetPackets.h @@ -72,7 +72,6 @@ namespace WorldPackets bool HasJournalLock = true; std::vector<std::reference_wrapper<BattlePetSlot>> Slots; std::vector<std::reference_wrapper<BattlePet>> Pets; - int32 MaxPets = 1000; }; class BattlePetJournalLockAcquired final : public ServerPacket diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index 5ee8725465c..70a09262cdb 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -325,6 +325,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::RatedPvpInf data << int32(bracketInfo.BestSeasonRating); data << int32(bracketInfo.PvpTierID); data << int32(bracketInfo.Unused3); + data << int32(bracketInfo.WeeklyBestWinPvpTierID); data.WriteBit(bracketInfo.Disqualified); data.FlushBits(); diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index b145cfbe47c..65281fce20b 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -448,6 +448,7 @@ namespace WorldPackets int32 BestSeasonRating = 0; int32 PvpTierID = 0; int32 Unused3 = 0; + int32 WeeklyBestWinPvpTierID = 0; bool Disqualified = false; } Bracket[6]; }; diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp index 752b6b144c4..41fd5249b11 100644 --- a/src/server/game/Server/Packets/ChatPackets.cpp +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -41,6 +41,7 @@ void WorldPackets::Chat::ChatMessageWhisper::Read() void WorldPackets::Chat::ChatMessageChannel::Read() { _worldPacket >> Language; + _worldPacket >> ChannelGUID; uint32 targetLen = _worldPacket.ReadBits(9); uint32 textLen = _worldPacket.ReadBits(9); Target = _worldPacket.ReadString(targetLen); @@ -70,6 +71,7 @@ void WorldPackets::Chat::ChatAddonMessageTargeted::Read() _worldPacket.ResetBitPos(); _worldPacket >> Params; + _worldPacket >> *ChannelGUID; Target = _worldPacket.ReadString(targetLen); } @@ -180,6 +182,7 @@ WorldPacket const* WorldPackets::Chat::Chat::Write() _worldPacket.WriteBit(HideChatLog); _worldPacket.WriteBit(FakeSenderName); _worldPacket.WriteBit(Unused_801.is_initialized()); + _worldPacket.WriteBit(ChannelGUID.is_initialized()); _worldPacket.FlushBits(); _worldPacket.WriteString(SenderName); @@ -191,6 +194,9 @@ WorldPacket const* WorldPackets::Chat::Chat::Write() if (Unused_801) _worldPacket << uint32(*Unused_801); + if (ChannelGUID) + _worldPacket << *ChannelGUID; + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h index ad6fc825bf7..cb161ef3169 100644 --- a/src/server/game/Server/Packets/ChatPackets.h +++ b/src/server/game/Server/Packets/ChatPackets.h @@ -72,6 +72,7 @@ namespace WorldPackets void Read() override; int32 Language = LANG_UNIVERSAL; + ObjectGuid ChannelGUID; std::string Text; std::string Target; }; @@ -99,12 +100,16 @@ namespace WorldPackets class ChatAddonMessageTargeted final : public ClientPacket { public: - ChatAddonMessageTargeted(WorldPacket&& packet) : ClientPacket(CMSG_CHAT_ADDON_MESSAGE_TARGETED, std::move(packet)) { } + ChatAddonMessageTargeted(WorldPacket&& packet) : ClientPacket(CMSG_CHAT_ADDON_MESSAGE_TARGETED, std::move(packet)) + { + ChannelGUID.emplace(); + } void Read() override; std::string Target; ChatAddonMessageParams Params; + Optional<ObjectGuid> ChannelGUID; // not optional in the packet. Optional for api reasons }; class ChatMessageDND final : public ClientPacket @@ -144,7 +149,8 @@ namespace WorldPackets Chat() : ServerPacket(SMSG_CHAT, 100) { } Chat(Chat const& chat); - void Initialize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, uint32 achievementId = 0, std::string channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string addonPrefix = ""); + void Initialize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, uint32 achievementId = 0, + std::string channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string addonPrefix = ""); void SetSender(WorldObject const* sender, LocaleConstant locale); void SetReceiver(WorldObject const* receiver, LocaleConstant locale); @@ -170,6 +176,7 @@ namespace WorldPackets Optional<uint32> Unused_801; bool HideChatLog = false; bool FakeSenderName = false; + Optional<ObjectGuid> ChannelGUID; }; class Emote final : public ServerPacket diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index e6a81be2bc1..7aafcfdd870 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -345,14 +345,14 @@ WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write() attackRoundInfo << uint8(ContentTuning.Type); attackRoundInfo << uint8(ContentTuning.TargetLevel); attackRoundInfo << uint8(ContentTuning.Expansion); - attackRoundInfo << uint8(ContentTuning.TargetMinScalingLevel); - attackRoundInfo << uint8(ContentTuning.TargetMaxScalingLevel); attackRoundInfo << int16(ContentTuning.PlayerLevelDelta); attackRoundInfo << int8(ContentTuning.TargetScalingLevelDelta); attackRoundInfo << float(ContentTuning.PlayerItemLevel); attackRoundInfo << float(ContentTuning.TargetItemLevel); attackRoundInfo << uint16(ContentTuning.ScalingHealthItemLevelCurveID); attackRoundInfo << uint32(ContentTuning.Flags); + attackRoundInfo << int32(ContentTuning.PlayerContentTuningID); + attackRoundInfo << int32(ContentTuning.TargetContentTuningID); WriteLogDataBit(); FlushBits(); diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp index 47d806aef30..c03f304a215 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp @@ -74,9 +74,8 @@ bool ContentTuningParams::GenerateDataForUnits<Creature, Player>(Creature* attac ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID; TargetLevel = target->getLevel(); Expansion = creatureTemplate->HealthScalingExpansion; - TargetMinScalingLevel = uint8(creatureScaling->MinLevel); - TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel); TargetScalingLevelDelta = int8(attacker->m_unitData->ScalingLevelDelta); + TargetContentTuningID = creatureScaling->ContentTuningID; return true; } @@ -93,9 +92,8 @@ bool ContentTuningParams::GenerateDataForUnits<Player, Creature>(Player* attacke ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID; TargetLevel = target->getLevel(); Expansion = creatureTemplate->HealthScalingExpansion; - TargetMinScalingLevel = uint8(creatureScaling->MinLevel); - TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel); TargetScalingLevelDelta = int8(target->m_unitData->ScalingLevelDelta); + TargetContentTuningID = creatureScaling->ContentTuningID; return true; } @@ -111,9 +109,8 @@ bool ContentTuningParams::GenerateDataForUnits<Creature, Creature>(Creature* att PlayerItemLevel = 0; TargetLevel = target->getLevel(); Expansion = creatureTemplate->HealthScalingExpansion; - TargetMinScalingLevel = uint8(creatureScaling->MinLevel); - TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel); TargetScalingLevelDelta = int8(accessor->m_unitData->ScalingLevelDelta); + TargetContentTuningID = creatureScaling->ContentTuningID; return true; } @@ -174,10 +171,10 @@ ByteBuffer& operator<<(ByteBuffer& data, ContentTuningParams const& contentTunin data << uint16(contentTuningParams.ScalingHealthItemLevelCurveID); data << uint8(contentTuningParams.TargetLevel); data << uint8(contentTuningParams.Expansion); - data << uint8(contentTuningParams.TargetMinScalingLevel); - data << uint8(contentTuningParams.TargetMaxScalingLevel); data << int8(contentTuningParams.TargetScalingLevelDelta); data << uint32(contentTuningParams.Flags); + data << int32(contentTuningParams.PlayerContentTuningID); + data << int32(contentTuningParams.TargetContentTuningID); data.WriteBits(contentTuningParams.Type, 4); data.FlushBits(); return data; diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.h b/src/server/game/Server/Packets/CombatLogPacketsCommon.h index c08298b0f58..1a1413c58e1 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.h +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.h @@ -72,10 +72,10 @@ namespace WorldPackets uint16 ScalingHealthItemLevelCurveID = 0; uint8 TargetLevel = 0; uint8 Expansion = 0; - uint8 TargetMinScalingLevel = 0; - uint8 TargetMaxScalingLevel = 0; int8 TargetScalingLevelDelta = 0; uint32 Flags = NO_LEVEL_SCALING | NO_ITEM_LEVEL_SCALING; + int32 PlayerContentTuningID = 0; + int32 TargetContentTuningID = 0; template<class T, class U> bool GenerateDataForUnits(T* attacker, U* target); diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.cpp b/src/server/game/Server/Packets/EquipmentSetPackets.cpp index ff47852e429..45442f9db31 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.cpp +++ b/src/server/game/Server/Packets/EquipmentSetPackets.cpp @@ -45,8 +45,10 @@ WorldPacket const* WorldPackets::EquipmentSet::LoadEquipmentSet::Write() _worldPacket.append(equipSet->Enchants.data(), equipSet->Enchants.size()); - _worldPacket << int32(equipSet->Unknown901_1); - _worldPacket << int32(equipSet->Unknown901_2); + _worldPacket << int32(equipSet->SecondaryShoulderApparanceID); + _worldPacket << int32(equipSet->SecondaryShoulderSlot); + _worldPacket << int32(equipSet->SecondaryWeaponAppearanceID); + _worldPacket << int32(equipSet->SecondaryWeaponSlot); _worldPacket.WriteBit(equipSet->AssignedSpecIndex != -1); _worldPacket.WriteBits(equipSet->SetName.length(), 8); @@ -79,8 +81,10 @@ void WorldPackets::EquipmentSet::SaveEquipmentSet::Read() _worldPacket >> Set.Enchants[0]; _worldPacket >> Set.Enchants[1]; - _worldPacket >> Set.Unknown901_1; - _worldPacket >> Set.Unknown901_2; + _worldPacket >> Set.SecondaryShoulderApparanceID; + _worldPacket >> Set.SecondaryShoulderSlot; + _worldPacket >> Set.SecondaryWeaponAppearanceID; + _worldPacket >> Set.SecondaryWeaponSlot; bool hasSpecIndex = _worldPacket.ReadBit(); diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 87e4cf56fa3..d226b521a47 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -190,6 +190,14 @@ ByteBuffer& operator<<(ByteBuffer& data, GarrisonEventList const& eventList) return data; } +ByteBuffer& operator<<(ByteBuffer& data, GarrisonSpecGroup const& specGroup) +{ + data << int32(specGroup.ChrSpecializationID); + data << int32(specGroup.SoulbindID); + + return data; +} + ByteBuffer& operator<<(ByteBuffer& data, GarrisonInfo const& garrison) { ASSERT(garrison.Missions.size() == garrison.MissionRewards.size()); @@ -210,6 +218,7 @@ ByteBuffer& operator<<(ByteBuffer& data, GarrisonInfo const& garrison) data << uint32(garrison.Talents.size()); data << uint32(garrison.Collections.size()); data << uint32(garrison.EventLists.size()); + data << uint32(garrison.SpecGroups.size()); data << uint32(garrison.CanStartMission.size()); data << uint32(garrison.ArchivedMissions.size()); data << int32(garrison.NumFollowerActivationsRemaining); @@ -237,6 +246,9 @@ ByteBuffer& operator<<(ByteBuffer& data, GarrisonInfo const& garrison) for (GarrisonEventList const& eventList : garrison.EventLists) data << eventList; + for (GarrisonSpecGroup const& specGroup : garrison.SpecGroups) + data << specGroup; + if (!garrison.ArchivedMissions.empty()) data.append(garrison.ArchivedMissions.data(), garrison.ArchivedMissions.size()); diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index 27dc258aaf0..08e56820c10 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -174,6 +174,12 @@ namespace WorldPackets std::vector<GarrisonEventEntry> Events; }; + struct GarrisonSpecGroup + { + int32 ChrSpecializationID = 0; + int32 SoulbindID = 0; + }; + struct GarrisonInfo { int32 GarrTypeID = 0; @@ -193,6 +199,7 @@ namespace WorldPackets std::vector<GarrisonTalent> Talents; std::vector<GarrisonCollection> Collections; std::vector<GarrisonEventList> EventLists; + std::vector<GarrisonSpecGroup> SpecGroups; std::vector<bool> CanStartMission; std::vector<int32> ArchivedMissions; }; diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 5ae849a0102..ca72da516d3 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -118,7 +118,13 @@ void WorldPackets::Guild::DeclineGuildInvites::Read() void WorldPackets::Guild::GuildInviteByName::Read() { uint32 nameLen = _worldPacket.ReadBits(9); + if (_worldPacket.ReadBit()) + Unused910.emplace(); + Name = _worldPacket.ReadString(nameLen); + + if (Unused910) + _worldPacket >> *Unused910; } WorldPacket const* WorldPackets::Guild::GuildInvite::Write() @@ -181,6 +187,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterMemberD data.WriteBit(rosterMemberData.SorEligible); data.FlushBits(); + data << rosterMemberData.DungeonScore; + data.WriteString(rosterMemberData.Name); data.WriteString(rosterMemberData.Note); data.WriteString(rosterMemberData.OfficerNote); diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 536e68fed75..6aadb7d4a0f 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -21,6 +21,7 @@ #include "Packet.h" #include "ItemPacketsCommon.h" #include "Guild.h" +#include "MythicPlusPacketsCommon.h" #include "ObjectGuid.h" #include "PacketUtilities.h" @@ -120,6 +121,7 @@ namespace WorldPackets bool Authenticated = false; bool SorEligible = false; GuildRosterProfessionData Profession[2]; + MythicPlus::DungeonScoreSummary DungeonScore; }; class GuildRoster final : public ServerPacket @@ -203,6 +205,7 @@ namespace WorldPackets void Read() override; std::string Name; + Optional<int32> Unused910; }; class GuildInvite final : public ServerPacket diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index 0a2746dc44d..35055ebe414 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -131,6 +131,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData c data << int32(bracket.WeeklyBestRating); data << int32(bracket.SeasonBestRating); data << int32(bracket.PvpTierID); + data << int32(bracket.WeeklyBestWinPvpTierID); data.WriteBit(bracket.Disqualified); data.FlushBits(); diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h index 78676959094..c472920ea14 100644 --- a/src/server/game/Server/Packets/InspectPackets.h +++ b/src/server/game/Server/Packets/InspectPackets.h @@ -104,6 +104,7 @@ namespace WorldPackets int32 WeeklyBestRating = 0; int32 SeasonBestRating = 0; int32 PvpTierID = 0; + int32 WeeklyBestWinPvpTierID = 0; uint8 Bracket = 0; bool Disqualified = false; }; diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp index b0bb17e64f0..bb8e6ac87d5 100644 --- a/src/server/game/Server/Packets/MailPackets.cpp +++ b/src/server/game/Server/Packets/MailPackets.cpp @@ -213,7 +213,6 @@ void WorldPackets::Mail::MailMarkAsRead::Read() { _worldPacket >> Mailbox; _worldPacket >> MailID; - BiReceipt = _worldPacket.ReadBit(); } void WorldPackets::Mail::MailDelete::Read() diff --git a/src/server/game/Server/Packets/MailPackets.h b/src/server/game/Server/Packets/MailPackets.h index 2218bd8367e..c7cb29bf4c0 100644 --- a/src/server/game/Server/Packets/MailPackets.h +++ b/src/server/game/Server/Packets/MailPackets.h @@ -159,7 +159,6 @@ namespace WorldPackets ObjectGuid Mailbox; int32 MailID = 0; - bool BiReceipt = false; }; class MailDelete final : public ClientPacket diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 2c44b01bb7c..52460632213 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -469,7 +469,11 @@ void WorldPackets::Movement::CommonMovement::WriteMovementForceWithDirection(Mov data << uint32(movementForce.TransportID); data << float(movementForce.Magnitude); data.WriteBits(movementForce.Type, 2); + data.WriteBit(movementForce.Unused910 != 0); data.FlushBits(); + + if (movementForce.Unused910) + data << int32(movementForce.Unused910); } void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveSpline const& moveSpline) @@ -693,6 +697,9 @@ ByteBuffer& operator>>(ByteBuffer& data, MovementForce& movementForce) data >> movementForce.TransportID; data >> movementForce.Magnitude; movementForce.Type = data.ReadBits(2); + bool has910 = data.ReadBit(); + if (has910) + data >> movementForce.Unused910; return data; } diff --git a/src/server/game/Server/Packets/MythicPlusPacketsCommon.cpp b/src/server/game/Server/Packets/MythicPlusPacketsCommon.cpp new file mode 100644 index 00000000000..91206bbb847 --- /dev/null +++ b/src/server/game/Server/Packets/MythicPlusPacketsCommon.cpp @@ -0,0 +1,124 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "MythicPlusPacketsCommon.h" + +namespace WorldPackets +{ +namespace MythicPlus +{ +ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreMapSummary const& dungeonScoreMapSummary) +{ + data << int32(dungeonScoreMapSummary.ChallengeModeID); + data << int32(dungeonScoreMapSummary.MapScore); + data << int32(dungeonScoreMapSummary.BestRunLevel); + data << int32(dungeonScoreMapSummary.BestRunDurationMS); + data.WriteBit(dungeonScoreMapSummary.FinishedSuccess); + data.FlushBits(); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreSummary const& dungeonScoreSummary) +{ + data << int32(dungeonScoreSummary.CurrentSeasonScore); + data << uint32(dungeonScoreSummary.Runs.size()); + for (DungeonScoreMapSummary const& dungeonScoreMapSummary : dungeonScoreSummary.Runs) + data << dungeonScoreMapSummary; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, MythicPlusMember const& mythicPlusMember) +{ + data << mythicPlusMember.BnetAccountGUID; + data << uint64(mythicPlusMember.GuildClubMemberID); + data << mythicPlusMember.GUID; + data << mythicPlusMember.GuildGUID; + data << uint32(mythicPlusMember.NativeRealmAddress); + data << uint32(mythicPlusMember.VirtualRealmAddress); + data << int16(mythicPlusMember.ChrSpecializationID); + data << int16(mythicPlusMember.RaceID); + data << int32(mythicPlusMember.ItemLevel); + data << int32(mythicPlusMember.CovenantID); + data << int32(mythicPlusMember.SoulbindID); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, MythicPlusRun const& mythicPlusRun) +{ + data << int32(mythicPlusRun.MapChallengeModeID); + data << uint32(mythicPlusRun.Level); + data << int32(mythicPlusRun.DurationMs); + data << mythicPlusRun.StartDate; + data << mythicPlusRun.CompletionDate; + data << int32(mythicPlusRun.Season); + data.append(mythicPlusRun.KeystoneAffixIDs.data(), mythicPlusRun.KeystoneAffixIDs.size()); + data << uint32(mythicPlusRun.Members.size()); + data << int32(mythicPlusRun.RunScore); + for (MythicPlusMember const& member : mythicPlusRun.Members) + data << member; + + data.WriteBit(mythicPlusRun.Completed); + data.FlushBits(); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreBestRunForAffix const& dungeonScoreBestRunForAffix) +{ + data << int32(dungeonScoreBestRunForAffix.KeystoneAffixID); + data << int32(dungeonScoreBestRunForAffix.Score); + data << dungeonScoreBestRunForAffix.Run; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreMapData const& dungeonScoreMapData) +{ + data << int32(dungeonScoreMapData.MapChallengeModeID); + data << uint32(dungeonScoreMapData.BestRuns.size()); + data << int32(dungeonScoreMapData.OverAllScore); + for (DungeonScoreBestRunForAffix const& bestRun : dungeonScoreMapData.BestRuns) + data << bestRun; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreSeasonData const& dungeonScoreSeasonData) +{ + data << int32(dungeonScoreSeasonData.Season); + data << uint32(dungeonScoreSeasonData.Maps.size()); + data << int32(dungeonScoreSeasonData.SeasonScore); + for (DungeonScoreMapData const& map : dungeonScoreSeasonData.Maps) + data << map; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreData const& dungeonScoreData) +{ + data << uint32(dungeonScoreData.Seasons.size()); + data << int32(dungeonScoreData.TotalRuns); + for (DungeonScoreSeasonData const& season : dungeonScoreData.Seasons) + data << season; + + return data; +} +} +} diff --git a/src/server/game/Server/Packets/MythicPlusPacketsCommon.h b/src/server/game/Server/Packets/MythicPlusPacketsCommon.h new file mode 100644 index 00000000000..dc48360aea7 --- /dev/null +++ b/src/server/game/Server/Packets/MythicPlusPacketsCommon.h @@ -0,0 +1,106 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef MythicPlusPacketsCommon_h__ +#define MythicPlusPacketsCommon_h__ + +#include "Packet.h" +#include "ObjectGuid.h" +#include "PacketUtilities.h" + +namespace WorldPackets +{ + namespace MythicPlus + { + struct DungeonScoreMapSummary + { + int32 ChallengeModeID = 0; + int32 MapScore = 0; + int32 BestRunLevel = 0; + int32 BestRunDurationMS = 0; + bool FinishedSuccess = false; + }; + + struct DungeonScoreSummary + { + int32 CurrentSeasonScore = 0; + std::vector<DungeonScoreMapSummary> Runs; + }; + + struct MythicPlusMember + { + ObjectGuid BnetAccountGUID; + uint64 GuildClubMemberID = 0; + ObjectGuid GUID; + ObjectGuid GuildGUID; + uint32 NativeRealmAddress = 0; + uint32 VirtualRealmAddress = 0; + int16 ChrSpecializationID = 0; + int16 RaceID = 0; + int32 ItemLevel = 0; + int32 CovenantID = 0; + int32 SoulbindID = 0; + }; + + struct MythicPlusRun + { + int32 MapChallengeModeID = 0; + bool Completed = false; + uint32 Level = 0; + int32 DurationMs = 0; + Timestamp<> StartDate; + Timestamp<> CompletionDate; + int32 Season; + std::vector<MythicPlusMember> Members; + int32 RunScore; + std::array<int32, 4> KeystoneAffixIDs; + }; + + struct DungeonScoreBestRunForAffix + { + int32 KeystoneAffixID = 0; + MythicPlusRun Run; + int32 Score = 0; + }; + + struct DungeonScoreMapData + { + int32 MapChallengeModeID = 0; + std::vector<DungeonScoreBestRunForAffix> BestRuns; + int32 OverAllScore = 0; + + }; + + struct DungeonScoreSeasonData + { + int32 Season = 0; + std::vector<DungeonScoreMapData> Maps; + int32 SeasonScore = 0; + }; + + struct DungeonScoreData + { + std::vector<DungeonScoreSeasonData> Seasons; + int32 TotalRuns = 0; + }; + + ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreSummary const& dungeonScoreSummary); + ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreData const& dungeonScoreData); + } +} + +#endif // MythicPlusPacketsCommon_h__ diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index 3bfa84438b3..a925b606cc3 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -203,7 +203,7 @@ namespace WorldPackets int32 ID = 0; uint32 Flags = 0; - TaggedPosition<Position::XY> Pos; + TaggedPosition<Position::XYZ> Pos; int32 Icon = 0; int32 Importance = 0; int32 Unknown905 = 0; diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 74a73352086..e4bda90f24c 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -223,6 +223,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberStats c data.WriteBit(memberStats.PetStats.is_initialized()); data.FlushBits(); + data << memberStats.DungeonScore; + if (memberStats.PetStats.is_initialized()) data << *memberStats.PetStats; diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 17d42c620a9..0e350e01c70 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -22,6 +22,7 @@ #include "AuthenticationPackets.h" #include "ObjectGuid.h" #include "Group.h" +#include "MythicPlusPacketsCommon.h" #include "Optional.h" namespace WorldPackets @@ -208,9 +209,11 @@ namespace WorldPackets uint16 SpecID = 0; uint16 WmoGroupID = 0; uint32 WmoDoodadPlacementID = 0; - int8 PartyType[2]; + int8 PartyType[2] = { }; CTROptions ChromieTime; + + MythicPlus::DungeonScoreSummary DungeonScore; }; class PartyMemberFullState final : public ServerPacket diff --git a/src/server/game/Server/Packets/PetitionPackets.cpp b/src/server/game/Server/Packets/PetitionPackets.cpp index c60f4822fe5..9f42c3807bb 100644 --- a/src/server/game/Server/Packets/PetitionPackets.cpp +++ b/src/server/game/Server/Packets/PetitionPackets.cpp @@ -88,6 +88,7 @@ void WorldPackets::Petition::PetitionBuy::Read() uint32 titleLen = _worldPacket.ReadBits(7); _worldPacket >> Unit; + _worldPacket >> Unused910; Title = _worldPacket.ReadString(titleLen); } diff --git a/src/server/game/Server/Packets/PetitionPackets.h b/src/server/game/Server/Packets/PetitionPackets.h index 0967be2a0fc..e5f0a2e80ce 100644 --- a/src/server/game/Server/Packets/PetitionPackets.h +++ b/src/server/game/Server/Packets/PetitionPackets.h @@ -101,6 +101,7 @@ namespace WorldPackets ObjectGuid Unit; std::string Title; + uint32 Unused910 = 0; }; class PetitionShowSignatures final : public ClientPacket diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 32544e7dab5..9a9f7233376 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -80,6 +80,7 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write() _worldPacket << int32(Stats.RequiredExpansion); _worldPacket << int32(Stats.VignetteID); _worldPacket << int32(Stats.Class); + _worldPacket << int32(Stats.CreatureDifficultyID); _worldPacket << int32(Stats.WidgetSetID); _worldPacket << int32(Stats.WidgetSetUnitConditionID); diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index d4148eb6b38..693000219b3 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -83,6 +83,7 @@ namespace WorldPackets uint32 RequiredExpansion = 0; uint32 VignetteID = 0; int32 Class = 0; + int32 CreatureDifficultyID = 0; int32 WidgetSetID = 0; int32 WidgetSetUnitConditionID = 0; std::array<uint32, 2> Flags; diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 2672ab3ddf3..d15eed8dc0d 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -128,6 +128,7 @@ WorldPacket const* QueryQuestInfoResponse::Write() _worldPacket << int32(Info.PortraitGiver); _worldPacket << int32(Info.PortraitGiverMount); + _worldPacket << int32(Info.PortraitGiverModelSceneID); _worldPacket << int32(Info.PortraitTurnIn); for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i) @@ -337,6 +338,7 @@ WorldPacket const* QuestGiverOfferRewardMessage::Write() _worldPacket << int32(QuestPackageID); _worldPacket << int32(PortraitGiver); _worldPacket << int32(PortraitGiverMount); + _worldPacket << int32(PortraitGiverModelSceneID); _worldPacket << int32(PortraitTurnIn); _worldPacket.WriteBits(QuestTitle.size(), 9); @@ -401,6 +403,7 @@ WorldPacket const* QuestGiverQuestDetails::Write() _worldPacket << int32(QuestPackageID); _worldPacket << int32(PortraitGiver); _worldPacket << int32(PortraitGiverMount); + _worldPacket << int32(PortraitGiverModelSceneID); _worldPacket << int32(PortraitTurnIn); _worldPacket << uint32(QuestFlags[0]); // Flags _worldPacket << uint32(QuestFlags[1]); // FlagsEx @@ -733,6 +736,7 @@ WorldPacket const* DisplayPlayerChoice::Write() _worldPacket << SenderGUID; _worldPacket << int32(UiTextureKitID); _worldPacket << uint32(SoundKitID); + _worldPacket << uint8(NumRerolls); _worldPacket.WriteBits(Question.length(), 8); _worldPacket.WriteBit(CloseChoiceFrame); _worldPacket.WriteBit(HideWarboardHeader); @@ -750,6 +754,7 @@ void ChoiceResponse::Read() { _worldPacket >> ChoiceID; _worldPacket >> ResponseID; + IsReroll = _worldPacket.ReadBit(); } } } diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 5d0fd7d553c..1b049cc0703 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -155,6 +155,7 @@ namespace WorldPackets int32 RewardNumSkillUps = 0; // reward skill points int32 PortraitGiver = 0; // quest giver entry ? int32 PortraitGiverMount = 0; + int32 PortraitGiverModelSceneID = 0; int32 PortraitTurnIn = 0; // quest turn in entry ? std::string PortraitGiverText; std::string PortraitGiverName; @@ -299,6 +300,7 @@ namespace WorldPackets int32 PortraitTurnIn = 0; int32 PortraitGiver = 0; int32 PortraitGiverMount = 0; + int32 PortraitGiverModelSceneID = 0; std::string QuestTitle; std::string RewardText; std::string PortraitGiverText; @@ -390,6 +392,7 @@ namespace WorldPackets int32 PortraitTurnIn = 0; int32 PortraitGiver = 0; int32 PortraitGiverMount = 0; + int32 PortraitGiverModelSceneID = 0; int32 QuestStartItemID = 0; int32 QuestSessionBonus = 0; std::string PortraitGiverText; @@ -714,6 +717,7 @@ namespace WorldPackets int32 ChoiceID = 0; int32 UiTextureKitID = 0; uint32 SoundKitID = 0; + uint8 NumRerolls = 0; std::string Question; std::vector<PlayerChoiceResponse> Responses; bool CloseChoiceFrame = false; @@ -730,6 +734,7 @@ namespace WorldPackets int32 ChoiceID = 0; int32 ResponseID = 0; + bool IsReroll = false; }; } } diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index d31647bb122..52b5056310d 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -209,7 +209,6 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Spells::SpellOptionalReag { data >> optionalReagent.ItemID; data >> optionalReagent.Slot; - data >> optionalReagent.Count; return data; } diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 97775684a08..22b23c388da 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -244,7 +244,6 @@ namespace WorldPackets { int32 ItemID = 0; int32 Slot = 0; - int32 Count = 0; }; struct SpellExtraCurrencyCost diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index ca8be7045e7..b72a40c7da8 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -150,6 +150,15 @@ WorldPacket const* FeatureSystemStatus::Write() return &_worldPacket; } +WorldPacket const* FeatureSystemStatus2::Write() +{ + _worldPacket.WriteBit(TextToSpeechFeatureEnabled); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + + WorldPacket const* FeatureSystemStatusGlueScreen::Write() { _worldPacket.WriteBit(BpayStoreEnabled); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index 34d9aabfda0..dec27f1017c 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -98,7 +98,7 @@ namespace WorldPackets uint32 DaysInCycle = 0; }; - FeatureSystemStatus() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS, 48) { } + FeatureSystemStatus() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS, 200) { } WorldPacket const* Write() override; @@ -152,10 +152,20 @@ namespace WorldPackets RafSystemFeatureInfo RAFSystem; }; + class FeatureSystemStatus2 final : ServerPacket + { + public: + FeatureSystemStatus2() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS2, 1) { } + + WorldPacket const* Write() override; + + bool TextToSpeechFeatureEnabled = false; + }; + class FeatureSystemStatusGlueScreen final : public ServerPacket { public: - FeatureSystemStatusGlueScreen() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, 1) { } + FeatureSystemStatusGlueScreen() : ServerPacket(SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN, 64) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp index c453750f3fd..dd595eac2d7 100644 --- a/src/server/game/Server/Packets/TicketPackets.cpp +++ b/src/server/game/Server/Packets/TicketPackets.cpp @@ -250,6 +250,17 @@ ByteBuffer& operator>>(ByteBuffer& data, Optional<WorldPackets::Ticket::SupportT return data; } +ByteBuffer& operator>>(ByteBuffer& data, Optional<WorldPackets::Ticket::SupportTicketSubmitComplaint::SupportTicketUnused910>& unused) +{ + unused = boost::in_place(); + + uint32 field_0Length = data.ReadBits(7); + data >> unused->field_104; + unused->field_0 = data.ReadString(field_0Length); + + return data; +} + void WorldPackets::Ticket::SupportTicketSubmitComplaint::Read() { _worldPacket >> Header; @@ -266,6 +277,7 @@ void WorldPackets::Ticket::SupportTicketSubmitComplaint::Read() bool hasLFGListApplicant = _worldPacket.ReadBit(); bool hasClubMessage = _worldPacket.ReadBit(); bool hasClubFinderResult = _worldPacket.ReadBit(); + bool hasUnk910 = _worldPacket.ReadBit(); _worldPacket.ResetBitPos(); @@ -300,6 +312,9 @@ void WorldPackets::Ticket::SupportTicketSubmitComplaint::Read() if (hasClubFinderResult) _worldPacket >> ClubFinderResult; + + if (hasUnk910) + _worldPacket >> Unused910; } ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Ticket::Complaint::ComplaintOffender& complaintOffender) diff --git a/src/server/game/Server/Packets/TicketPackets.h b/src/server/game/Server/Packets/TicketPackets.h index 5f281df684a..9982d60da6c 100644 --- a/src/server/game/Server/Packets/TicketPackets.h +++ b/src/server/game/Server/Packets/TicketPackets.h @@ -89,7 +89,7 @@ namespace WorldPackets void Read() override; - int32 CaseID; + int32 CaseID = 0; }; class SubmitUserFeedback final : public ClientPacket @@ -156,8 +156,8 @@ namespace WorldPackets struct SupportTicketCalendarEventInfo { - uint64 EventID; - uint64 InviteID; + uint64 EventID = 0; + uint64 InviteID = 0; std::string EventTitle; }; @@ -200,12 +200,18 @@ namespace WorldPackets struct SupportTicketClubFinderResult { - uint64 ClubFinderPostingID; - uint64 ClubID; + uint64 ClubFinderPostingID = 0; + uint64 ClubID = 0; ObjectGuid ClubFinderGUID; std::string ClubName; }; + struct SupportTicketUnused910 + { + std::string field_0; + ObjectGuid field_104; + }; + SupportTicketSubmitComplaint(WorldPacket&& packet) : ClientPacket(CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT, std::move(packet)) { } void Read() override; @@ -224,6 +230,7 @@ namespace WorldPackets Optional<SupportTicketLFGListApplicant> LFGListApplicant; Optional<SupportTicketCommunityMessage> CommunityMessage; Optional<SupportTicketClubFinderResult> ClubFinderResult; + Optional<SupportTicketUnused910> Unused910; }; class Complaint final : public ClientPacket |
