From 18cfca291bbeec9042964572feadb7bdd2d564e1 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sun, 10 Jan 2021 17:09:16 +0100 Subject: [PATCH] Core/Packets: converted SMSG_REQUEST_CEMETERY_LIST_RESPONSE and SMSG_RAID_GROUP_ONLY to packet class --- src/server/game/Entities/Player/Player.cpp | 23 ++++++++++--------- src/server/game/Entities/Player/Player.h | 1 + src/server/game/Handlers/MiscHandler.cpp | 21 ++++++++--------- src/server/game/Miscellaneous/SharedDefines.h | 10 ++++++++ .../game/Server/Packets/InstancePackets.cpp | 8 +++++++ .../game/Server/Packets/InstancePackets.h | 11 +++++++++ .../game/Server/Packets/MiscPackets.cpp | 12 ++++++++++ src/server/game/Server/Packets/MiscPackets.h | 11 +++++++++ 8 files changed, 74 insertions(+), 23 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index ee523f4304a..a68b0ff9fff 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22495,13 +22495,8 @@ void Player::UpdateHomebindTime(uint32 time) if (m_InstanceValid || IsGameMaster()) { if (m_HomebindTimer) // instance valid, but timer not reset - { - // hide reminder - WorldPacket data(SMSG_RAID_GROUP_ONLY, 4+4); - data << uint32(0); - data << uint32(0); - SendDirectMessage(&data); - } + SendRaidGroupOnlyMessage(RAID_GROUP_ERR_NONE, 0); + // instance is valid, reset homebind timer m_HomebindTimer = 0; } @@ -22520,10 +22515,7 @@ void Player::UpdateHomebindTime(uint32 time) // instance is invalid, start homebind timer m_HomebindTimer = 60000; // send message to player - WorldPacket data(SMSG_RAID_GROUP_ONLY, 4+4); - data << uint32(m_HomebindTimer); - data << uint32(1); - SendDirectMessage(&data); + SendRaidGroupOnlyMessage(RAID_GROUP_ERR_REQUIREMENTS_UNMATCH, m_HomebindTimer); TC_LOG_DEBUG("maps", "Player::UpdateHomebindTime: Player '%s' (%s) will be teleported to homebind in 60 seconds", GetName().c_str(), GetGUID().ToString().c_str()); } @@ -28231,6 +28223,15 @@ void Player::SendSpellCategoryCooldowns() const SendDirectMessage(cooldowns.Write()); } +void Player::SendRaidGroupOnlyMessage(RaidGroupReason reason, int32 delay) const +{ + WorldPackets::Instance::RaidGroupOnly raidGroupOnly; + raidGroupOnly.Delay = delay; + raidGroupOnly.Reason = reason; + + SendDirectMessage(raidGroupOnly.Write()); +} + void Player::SetRestFlag(RestFlag restFlag, uint32 triggerId /*= 0*/) { uint32 oldRestMask = _restFlagMask; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ceba0f10fac..6f4da8208ec 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1614,6 +1614,7 @@ class TC_GAME_API Player : public Unit, public GridObject uint32 GetReputation(uint32 factionentry) const; std::string GetGuildName() const; void SendSpellCategoryCooldowns() const; + void SendRaidGroupOnlyMessage(RaidGroupReason reason, int32 delay) const; // Talents uint32 GetFreeTalentPoints() const { return _talentMgr->FreeTalentPoints; } diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index c8ba4e5db4f..5dca63e7f48 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -474,14 +474,14 @@ void WorldSession::HandleRequestCemeteryList(WorldPacket& /*recvPacket*/) return; } - WorldPacket data(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, 4 + 4 * graveyardIds.size()); - data.WriteBit(0); // Is MicroDungeon (WorldMapFrame.lua) + WorldPackets::Misc::RequestCemeteryListResponse packet; + packet.IsGossipTriggered = false; + packet.CemeteryID.reserve(graveyardIds.size()); - data.WriteBits(graveyardIds.size(), 24); for (uint32 id : graveyardIds) - data << id; + packet.CemeteryID.push_back(id); - SendPacket(&data); + SendPacket(packet.Write()); } void WorldSession::HandleSetSelectionOpcode(WorldPacket& recvData) @@ -718,11 +718,8 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recvData) break; case Map::CANNOT_ENTER_NOT_IN_RAID: { - WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4); - data << uint32(0); - data << uint32(2); // You must be in a raid group to enter this instance. - player->SendDirectMessage(&data); TC_LOG_DEBUG("maps", "MAP: Player '%s' must be in a raid group to enter instance map %d", player->GetName().c_str(), at->target_mapId); + player->SendRaidGroupOnlyMessage(RAID_GROUP_ERR_ONLY, 0); reviveAtTrigger = true; break; } @@ -988,13 +985,13 @@ void WorldSession::HandleSetActionBarToggles(WorldPacket& recvData) void WorldSession::HandlePlayedTime(WorldPacket& recvData) { - uint8 unk1; - recvData >> unk1; // 0 or 1 expected + uint8 TriggerScriptEvent; + recvData >> TriggerScriptEvent; // 0 or 1 expected WorldPackets::Character::PlayedTime packet; packet.TotalTime = _player->GetTotalPlayedTime(); packet.LevelTime = _player->GetLevelPlayedTime(); - packet.TriggerEvent = bool(unk1); // 0 - will not show in chat frame + packet.TriggerEvent = bool(TriggerScriptEvent); // 0 - will not show in chat frame SendPacket(packet.Write()); } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 2b2b31d1a3c..4d46909b3ce 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -4337,6 +4337,16 @@ enum class PursuingType : uint8 Max = 3 }; + +enum RaidGroupReason +{ + RAID_GROUP_ERR_NONE = 0, + RAID_GROUP_ERR_LOWLEVEL = 1, // "You are too low level to enter this instance." + RAID_GROUP_ERR_ONLY = 2, // "You must be in a raid group to enter this instance." + RAID_GROUP_ERR_FULL = 3, // "The instance is full." + RAID_GROUP_ERR_REQUIREMENTS_UNMATCH = 4 // "You do not meet the requirements to enter this instance." +}; + #define MAX_CREATURE_SPELL_DATA_SLOT 4 #endif diff --git a/src/server/game/Server/Packets/InstancePackets.cpp b/src/server/game/Server/Packets/InstancePackets.cpp index aba50bb0663..860e052fd1f 100644 --- a/src/server/game/Server/Packets/InstancePackets.cpp +++ b/src/server/game/Server/Packets/InstancePackets.cpp @@ -88,3 +88,11 @@ WorldPacket const* WorldPackets::Instance::InstanceSaveCreated::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Instance::RaidGroupOnly::Write() +{ + _worldPacket << int32(Delay); + _worldPacket << uint32(Reason); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/InstancePackets.h b/src/server/game/Server/Packets/InstancePackets.h index 071836cf9f2..0a10be20c93 100644 --- a/src/server/game/Server/Packets/InstancePackets.h +++ b/src/server/game/Server/Packets/InstancePackets.h @@ -105,6 +105,17 @@ namespace WorldPackets bool Gm = false; }; + + class RaidGroupOnly final : public ServerPacket + { + public: + RaidGroupOnly() : ServerPacket(SMSG_RAID_GROUP_ONLY, 4 + 4) { } + + WorldPacket const* Write() override; + + uint32 Reason = 0; + int32 Delay = 0; + }; } } diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index a74e3f3e9c6..09a57fc599a 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -465,3 +465,15 @@ WorldPacket const* WorldPackets::Misc::BinderConfirm::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Misc::RequestCemeteryListResponse::Write() +{ + _worldPacket.WriteBit(IsGossipTriggered); + _worldPacket.WriteBits(CemeteryID.size(), 24); + _worldPacket.FlushBits(); + + for (uint32 cemetery : CemeteryID) + _worldPacket << cemetery; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 06162aa1f3c..64af41732ff 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -497,6 +497,17 @@ namespace WorldPackets ObjectGuid Unit; }; + + class RequestCemeteryListResponse final : public ServerPacket + { + public: + RequestCemeteryListResponse() : ServerPacket(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, 1) { } + + WorldPacket const* Write() override; + + bool IsGossipTriggered = false; + std::vector CemeteryID; + }; } }