diff options
| author | Shauren <shauren.trinity@gmail.com> | 2020-05-31 16:49:18 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2020-05-31 16:49:18 +0200 |
| commit | bf8714b8705c3fccc77083c6dc8665767430d346 (patch) | |
| tree | 7abe8a79f1849b7d5299dd784b8ace6d78f6311e /src/server/game/Server | |
| parent | 161944b7643c62f9e7705c64e42d42e5d07f1959 (diff) | |
Core/Battlegrounds: Queue updates
* Fixed battleground queues for battlegrounds with id higher than 255
* Fixed queue display ingame after entering bg
* Fixed ingame display after leaving bg queue
* Fixed bg scoreboard
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/BattlegroundPackets.cpp | 53 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/BattlegroundPackets.h | 53 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 6 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 3 |
5 files changed, 98 insertions, 21 deletions
diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index 1b974829633..0d0325644ba 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -114,19 +114,26 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData: return data; } -WorldPacket const* WorldPackets::Battleground::PVPLogData::Write() +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData const& pvpLogData) { - _worldPacket.reserve(Statistics.size() * sizeof(PVPMatchPlayerStatistics) + sizeof(PVPLogData)); + data.WriteBit(pvpLogData.Ratings.is_initialized()); + data << uint32(pvpLogData.Statistics.size()); + data.append(pvpLogData.PlayerCount.data(), pvpLogData.PlayerCount.size()); - _worldPacket.WriteBit(Ratings.is_initialized()); - _worldPacket << uint32(Statistics.size()); - _worldPacket.append(PlayerCount.data(), PlayerCount.size()); + if (pvpLogData.Ratings.is_initialized()) + data << *pvpLogData.Ratings; - if (Ratings.is_initialized()) - _worldPacket << *Ratings; + for (WorldPackets::Battleground::PVPLogData::PVPMatchPlayerStatistics const& player : pvpLogData.Statistics) + data << player; - for (PVPMatchPlayerStatistics const& player : Statistics) - _worldPacket << player; + return data; +} + +WorldPacket const* WorldPackets::Battleground::PVPLogDataMessage::Write() +{ + _worldPacket.reserve(Data.Statistics.size() * sizeof(PVPLogData::PVPMatchPlayerStatistics) + sizeof(PVPLogData)); + + _worldPacket << Data; return &_worldPacket; } @@ -299,3 +306,31 @@ WorldPacket const* WorldPackets::Battleground::DestroyArenaUnit::Write() _worldPacket << Guid; return &_worldPacket; } + +WorldPacket const* WorldPackets::Battleground::PVPMatchInit::Write() +{ + _worldPacket << uint32(MapID); + _worldPacket << uint8(State); + _worldPacket << int32(StartTime); + _worldPacket << int32(Duration); + _worldPacket << uint8(ArenaFaction); + _worldPacket << uint32(BattlemasterListID); + _worldPacket.WriteBit(Registered); + _worldPacket.WriteBit(AffectsRating); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::PVPMatchEnd::Write() +{ + _worldPacket << uint8(Winner); + _worldPacket << int32(Duration); + _worldPacket.WriteBit(LogData.is_initialized()); + _worldPacket.FlushBits(); + + if (LogData) + _worldPacket << *LogData; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index 6914dfef818..59c49dcc8b9 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -90,13 +90,8 @@ namespace WorldPackets void Read() override { } }; - class PVPLogData final : public ServerPacket + struct PVPLogData { - public: - PVPLogData() : ServerPacket(SMSG_PVP_LOG_DATA, 0) { } - - WorldPacket const* Write() override; - struct RatingData { int32 Prematch[2] = { }; @@ -147,6 +142,16 @@ namespace WorldPackets std::array<int8, 2> PlayerCount = { }; }; + class PVPLogDataMessage final : public ServerPacket + { + public: + PVPLogDataMessage() : ServerPacket(SMSG_PVP_LOG_DATA, 0) { } + + WorldPacket const* Write() override; + + PVPLogData Data; + }; + struct BattlefieldStatusHeader { WorldPackets::LFG::RideTicket Ticket; @@ -418,6 +423,42 @@ namespace WorldPackets void Read() override { } }; + + class PVPMatchInit final : public ServerPacket + { + public: + PVPMatchInit() : ServerPacket(SMSG_PVP_MATCH_INIT, 4 + 1 + 4 + 4 + 1 + 4 + 1) { } + + WorldPacket const* Write() override; + + enum MatchState : uint8 + { + InProgress = 1, + Complete = 3, + Inactive = 4 + }; + + uint32 MapID = 0; + MatchState State = Inactive; + time_t StartTime = time_t(0); + int32 Duration = 0; + uint8 ArenaFaction = 0; + uint32 BattlemasterListID = 0; + bool Registered = false; + bool AffectsRating = false; + }; + + class PVPMatchEnd final : public ServerPacket + { + public: + PVPMatchEnd() : ServerPacket(SMSG_PVP_MATCH_END) { } + + WorldPacket const* Write() override; + + uint8 Winner = 0; + int32 Duration = 0; + Optional<PVPLogData> LogData; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index a8f0be7874e..521ba8a8407 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -925,8 +925,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_CROWD_CONTROL_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_MATCH_END, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_MATCH_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_FORGE_OPENED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_RESPEC_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1637,6 +1635,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PUSH_SPELL_TO_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_MATCH_END, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_MATCH_INIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_MATCH_START, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 2c90b66c0db..8b73a6fc26a 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -825,8 +825,6 @@ enum OpcodeServer : uint16 SMSG_AREA_TRIGGER_RE_PATH = 0x263F, SMSG_AREA_TRIGGER_RE_SHAPE = 0x2644, SMSG_ARENA_CROWD_CONTROL_SPELLS = 0x2652, - SMSG_ARENA_MATCH_END = 0x28A7, - SMSG_ARENA_MATCH_START = 0x28A6, SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2668, SMSG_ARTIFACT_FORGE_OPENED = 0x27E8, SMSG_ARTIFACT_RESPEC_CONFIRM = 0x27EB, @@ -1543,7 +1541,9 @@ enum OpcodeServer : uint16 SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C51, SMSG_PVP_CREDIT = 0x271F, SMSG_PVP_LOG_DATA = 0x25B4, - SMSG_PVP_MATCH_START = 0x28AC, + SMSG_PVP_MATCH_END = 0x28A7, + SMSG_PVP_MATCH_INIT = 0x28AC, + SMSG_PVP_MATCH_START = 0x28A6, SMSG_PVP_OPTIONS_ENABLED = 0x25B7, SMSG_PVP_SEASON = 0x25D4, SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x270E, diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 0b7c1583faf..1618267d420 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -541,7 +541,8 @@ void WorldSession::LogoutPlayer(bool save) for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { - if (BattlegroundQueueTypeId bgQueueTypeId = _player->GetBattlegroundQueueTypeId(i)) + BattlegroundQueueTypeId bgQueueTypeId = _player->GetBattlegroundQueueTypeId(i); + if (bgQueueTypeId != BATTLEGROUND_QUEUE_NONE) { _player->RemoveBattlegroundQueueId(bgQueueTypeId); BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); |
