/* * 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 . */ #include "BattlegroundPackets.h" #include "PacketOperators.h" namespace WorldPackets::Battleground { WorldPacket const* SeasonInfo::Write() { _worldPacket << int32(MythicPlusDisplaySeasonID); _worldPacket << int32(MythicPlusMilestoneSeasonID); _worldPacket << int32(CurrentArenaSeason); _worldPacket << int32(PreviousArenaSeason); _worldPacket << int32(ConquestWeeklyProgressCurrencyID); _worldPacket << int32(PvpSeasonID); _worldPacket << int32(Unknown1027_1); _worldPacket << Bits<1>(WeeklyRewardChestsEnabled); _worldPacket << Bits<1>(CurrentArenaSeasonUsesTeams); _worldPacket << Bits<1>(PreviousArenaSeasonUsesTeams); _worldPacket.FlushBits(); return &_worldPacket; } void AreaSpiritHealerQuery::Read() { _worldPacket >> HealerGuid; } void AreaSpiritHealerQueue::Read() { _worldPacket >> HealerGuid; } WorldPacket const* AreaSpiritHealerTime::Write() { _worldPacket << HealerGuid; _worldPacket << int32(TimeLeft); return &_worldPacket; } ByteBuffer& operator<<(ByteBuffer& data, PVPMatchStatistics::RatingData const& ratingData) { for (std::size_t i = 0; i < 2; ++i) { data << int32(ratingData.Prematch[i]); data << int32(ratingData.Postmatch[i]); data << int32(ratingData.PrematchMMR[i]); } return data; } ByteBuffer& operator<<(ByteBuffer& data, PVPMatchStatistics::HonorData const& honorData) { data << uint32(honorData.HonorKills); data << uint32(honorData.Deaths); data << uint32(honorData.ContributionPoints); return data; } ByteBuffer& operator<<(ByteBuffer& data, PVPMatchStatistics::PVPMatchPlayerPVPStat const& pvpStat) { data << int32(pvpStat.PvpStatID); data << int32(pvpStat.PvpStatValue); return data; } ByteBuffer& operator<<(ByteBuffer& data, PVPMatchStatistics::PVPMatchPlayerStatistics const& playerData) { data << playerData.PlayerGUID; data << uint32(playerData.Kills); data << int32(playerData.Faction); data << uint32(playerData.DamageDone); data << uint32(playerData.HealingDone); data << Size(playerData.Stats); data << int32(playerData.PrimaryTalentTree); data << int8(playerData.Sex); data << int8(playerData.Race); data << int8(playerData.Class); data << int32(playerData.CreatureID); data << int32(playerData.HonorLevel); data << int32(playerData.Role); for (PVPMatchStatistics::PVPMatchPlayerPVPStat const& pvpStat : playerData.Stats) data << pvpStat; data << Bits<1>(playerData.IsInWorld); data << OptionalInit(playerData.Honor); data << OptionalInit(playerData.PreMatchRating); data << OptionalInit(playerData.RatingChange); data << OptionalInit(playerData.PreMatchMMR); data << OptionalInit(playerData.MmrChange); data << OptionalInit(playerData.PostMatchMMR); data.FlushBits(); if (playerData.Honor) data << *playerData.Honor; if (playerData.PreMatchRating) data << uint32(*playerData.PreMatchRating); if (playerData.RatingChange) data << int32(*playerData.RatingChange); if (playerData.PreMatchMMR) data << uint32(*playerData.PreMatchMMR); if (playerData.MmrChange) data << int32(*playerData.MmrChange); if (playerData.PostMatchMMR) data << uint32(*playerData.PostMatchMMR); return data; } ByteBuffer& operator<<(ByteBuffer& data, PVPMatchStatistics const& pvpLogData) { data << OptionalInit(pvpLogData.Ratings); data << Size(pvpLogData.Statistics); data.append(pvpLogData.PlayerCount.data(), pvpLogData.PlayerCount.size()); if (pvpLogData.Ratings) data << *pvpLogData.Ratings; for (PVPMatchStatistics::PVPMatchPlayerStatistics const& player : pvpLogData.Statistics) data << player; return data; } WorldPacket const* PVPMatchStatisticsMessage::Write() { _worldPacket.reserve(Data.Statistics.size() * sizeof(PVPMatchStatistics::PVPMatchPlayerStatistics) + sizeof(PVPMatchStatistics)); _worldPacket << Data; return &_worldPacket; } void BattlemasterJoin::Read() { _worldPacket >> Size(QueueIDs); _worldPacket >> Roles; for (int32& blacklistMap : BlacklistMap) _worldPacket >> blacklistMap; for (uint64& queueId : QueueIDs) _worldPacket >> queueId; } void BattlemasterJoinArena::Read() { _worldPacket >> TeamSizeIndex; _worldPacket >> Roles; } ByteBuffer& operator<<(ByteBuffer& data, BattlefieldStatusHeader const& header) { data << header.Ticket; data << Size(header.QueueID); data << uint8(header.RangeMin); data << uint8(header.RangeMax); data << uint8(header.TeamSize); data << uint32(header.InstanceID); for (uint64 queueID : header.QueueID) data << uint64(queueID); data << Bits<1>(header.RegisteredMatch); data << Bits<1>(header.TournamentRules); data.FlushBits(); return data; } WorldPacket const* BattlefieldStatusNone::Write() { _worldPacket << Ticket; return &_worldPacket; } WorldPacket const* BattlefieldStatusNeedConfirmation::Write() { _worldPacket << Hdr; _worldPacket << uint32(Mapid); _worldPacket << uint32(Timeout); _worldPacket << uint8(Role); return &_worldPacket; } WorldPacket const* BattlefieldStatusActive::Write() { _worldPacket << Hdr; _worldPacket << uint32(Mapid); _worldPacket << uint32(ShutdownTimer); _worldPacket << uint32(StartTimer); _worldPacket << int8(ArenaFaction); _worldPacket << Bits<1>(LeftEarly); _worldPacket << Bits<1>(Brawl); _worldPacket.FlushBits(); return &_worldPacket; } WorldPacket const* BattlefieldStatusQueued::Write() { _worldPacket << Hdr; _worldPacket << uint32(AverageWaitTime); _worldPacket << uint32(WaitTime); _worldPacket << int32(SpecSelected); _worldPacket << Bits<1>(AsGroup); _worldPacket << Bits<1>(EligibleForMatchmaking); _worldPacket << Bits<1>(SuspendedQueue); _worldPacket.FlushBits(); return &_worldPacket; } WorldPacket const* BattlefieldStatusFailed::Write() { _worldPacket << Ticket; _worldPacket << uint64(QueueID); _worldPacket << uint32(Reason); _worldPacket << ClientID; return &_worldPacket; } void BattlefieldPort::Read() { _worldPacket >> Ticket; _worldPacket >> Bits<1>(AcceptedInvite); } void BattlefieldListRequest::Read() { _worldPacket >> ListID; } WorldPacket const* BattlefieldList::Write() { _worldPacket << BattlemasterGuid; _worldPacket << int32(BattlemasterListID); _worldPacket << uint8(MinLevel); _worldPacket << uint8(MaxLevel); _worldPacket << Size(Battlefields); if (!Battlefields.empty()) _worldPacket.append(Battlefields.data(), Battlefields.size()); _worldPacket << Bits<1>(PvpAnywhere); _worldPacket << Bits<1>(HasRandomWinToday); _worldPacket.FlushBits(); return &_worldPacket; } WorldPacket const* PVPOptionsEnabled::Write() { _worldPacket << Bits<1>(RatedBattlegrounds); _worldPacket << Bits<1>(PugBattlegrounds); _worldPacket << Bits<1>(WargameBattlegrounds); _worldPacket << Bits<1>(WargameArenas); _worldPacket << Bits<1>(RatedArenas); _worldPacket << Bits<1>(ArenaSkirmish); _worldPacket << Bits<1>(SoloShuffle); _worldPacket << Bits<1>(RatedSoloShuffle); _worldPacket << Bits<1>(BattlegroundBlitz); _worldPacket << Bits<1>(RatedBattlegroundBlitz); _worldPacket.FlushBits(); return &_worldPacket; } void ReportPvPPlayerAFK::Read() { _worldPacket >> Offender; } WorldPacket const* ReportPvPPlayerAFKResult::Write() { _worldPacket << Offender; _worldPacket << uint8(Result); _worldPacket << uint8(NumBlackMarksOnOffender); _worldPacket << uint8(NumPlayersIHaveReported); return &_worldPacket; } ByteBuffer& operator<<(ByteBuffer& data, BattlegroundPlayerPosition const& playerPosition) { data << playerPosition.Guid; data << playerPosition.Pos; data << int8(playerPosition.IconID); data << int8(playerPosition.ArenaSlot); return data; } WorldPacket const* BattlegroundPlayerPositions::Write() { _worldPacket << Size(FlagCarriers); for (BattlegroundPlayerPosition const& pos : FlagCarriers) _worldPacket << pos; return &_worldPacket; } WorldPacket const* BattlegroundPlayerJoined::Write() { _worldPacket << Guid; return &_worldPacket; } WorldPacket const* BattlegroundPlayerLeft::Write() { _worldPacket << Guid; return &_worldPacket; } WorldPacket const* DestroyArenaUnit::Write() { _worldPacket << Guid; return &_worldPacket; } ByteBuffer& operator<<(ByteBuffer& data, RatedPvpInfo::BracketInfo const& bracketInfo) { data << int32(bracketInfo.PersonalRating); data << int32(bracketInfo.Ranking); data << int32(bracketInfo.SeasonPlayed); data << int32(bracketInfo.SeasonWon); data << int32(bracketInfo.SeasonFactionPlayed); data << int32(bracketInfo.SeasonFactionWon); data << int32(bracketInfo.WeeklyPlayed); data << int32(bracketInfo.WeeklyWon); data << int32(bracketInfo.RoundsSeasonPlayed); data << int32(bracketInfo.RoundsSeasonWon); data << int32(bracketInfo.RoundsWeeklyPlayed); data << int32(bracketInfo.RoundsWeeklyWon); data << int32(bracketInfo.BestWeeklyRating); data << int32(bracketInfo.LastWeeksBestRating); data << int32(bracketInfo.BestSeasonRating); data << int32(bracketInfo.PvpTierID); data << int32(bracketInfo.SeasonPvpTier); data << int32(bracketInfo.BestWeeklyPvpTier); data << uint8(bracketInfo.BestSeasonPvpTierEnum); data << Bits<1>(bracketInfo.Disqualified); data.FlushBits(); return data; } WorldPacket const* RatedPvpInfo::Write() { for (BracketInfo const& bracket : Bracket) _worldPacket << bracket; return &_worldPacket; } ByteBuffer& operator<<(ByteBuffer& data, RatedMatchDeserterPenalty const& ratedMatchDeserterPenalty) { data << int32(ratedMatchDeserterPenalty.PersonalRatingChange); data << int32(ratedMatchDeserterPenalty.QueuePenaltySpellID); data << ratedMatchDeserterPenalty.QueuePenaltyDuration; return data; } WorldPacket const* PVPMatchInitialize::Write() { _worldPacket << uint32(MapID); _worldPacket << uint8(State); _worldPacket << StartTime; _worldPacket << Duration; _worldPacket << uint8(ArenaFaction); _worldPacket << uint32(BattlemasterListID); _worldPacket << Bits<1>(Registered); _worldPacket << Bits<1>(AffectsRating); _worldPacket << OptionalInit(DeserterPenalty); _worldPacket.FlushBits(); if (DeserterPenalty) _worldPacket << *DeserterPenalty; return &_worldPacket; } WorldPacket const* PVPMatchSetState::Write() { _worldPacket << uint8(State); return &_worldPacket; } WorldPacket const* PVPMatchComplete::Write() { _worldPacket << int32(Winner); _worldPacket << Duration; _worldPacket << OptionalInit(LogData); _worldPacket << Bits<2>(SoloShuffleStatus); _worldPacket.FlushBits(); if (LogData) _worldPacket << *LogData; return &_worldPacket; } ByteBuffer& operator<<(ByteBuffer& data, BattlegroundCapturePointInfo const& battlegroundCapturePointInfo) { data << battlegroundCapturePointInfo.Guid; data << battlegroundCapturePointInfo.Pos; data << int8(battlegroundCapturePointInfo.State); if (battlegroundCapturePointInfo.State == BattlegroundCapturePointState::ContestedHorde || battlegroundCapturePointInfo.State == BattlegroundCapturePointState::ContestedAlliance) { data << battlegroundCapturePointInfo.CaptureTime; data << battlegroundCapturePointInfo.CaptureTotalDuration; } return data; } WorldPacket const* UpdateCapturePoint::Write() { _worldPacket << CapturePointInfo; return &_worldPacket; } WorldPacket const* CapturePointRemoved::Write() { _worldPacket << CapturePointGUID; return &_worldPacket; } }