diff options
author | NoName <322016+Faq@users.noreply.github.com> | 2020-07-15 00:15:33 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-14 23:15:33 +0200 |
commit | 9fe6756cf26e916d69673879c31e09ee57ef6470 (patch) | |
tree | 9b7e519990e2c6e5f72e1e60162570b9083977b8 | |
parent | 0072fa922db1642d720c545ccc2ac095c140f0ca (diff) |
Core/PacketIO: Updated corpse related packet structures (#24922)
# Conflicts:
# src/server/game/Entities/Player/Player.cpp
# src/server/game/Handlers/MiscHandler.cpp
# src/server/game/Handlers/QueryHandler.cpp
# src/server/game/Maps/MapManager.cpp
# src/server/game/Server/Packets/MiscPackets.cpp
# src/server/game/Server/Packets/QueryPackets.h
# src/server/game/Server/Protocol/Opcodes.cpp
# src/server/game/Server/Protocol/Opcodes.h
# src/server/game/Server/WorldSession.h
* + For SMSG_DEATH_RELEASE_LOC
G3D::Vector3 -> TaggedPosition<Position::XYZ>
+ removed non 3.3.5 packets
Co-authored-by: Peter Keresztes Schmidt <carbenium@outlook.com>
Co-authored-by: Mogadischu <cgnad@live.de>
Co-authored-by: Shauren <shauren.trinity@gmail.com>
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 31 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 38 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 62 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 9 |
6 files changed, 128 insertions, 38 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 24a48ddce22..dc3c615f2b7 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1379,7 +1379,7 @@ void Player::setDeathState(DeathState s) ClearResurrectRequestData(); - //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DEAD) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD) + //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DEAD) to HandleRepopRequest and define pet unsummon here with (s == DEAD) RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true); // save value before aura remove in Unit::setDeathState @@ -4511,9 +4511,9 @@ void Player::SetMovement(PlayerMovementType pType) */ void Player::BuildPlayerRepop() { - WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size()); - data << GetPackGUID(); - SendDirectMessage(&data); + WorldPackets::Misc::PreRessurect packet; + packet.PlayerGUID = GetGUID(); + GetSession()->SendPacket(packet.Write()); if (GetRace() == RACE_NIGHTELF) CastSpell(this, 20584, true); @@ -4569,12 +4569,9 @@ void Player::BuildPlayerRepop() void Player::ResurrectPlayer(float restore_percent, bool applySickness) { - WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4*4); // remove spirit healer position - data << uint32(-1); - data << float(0); - data << float(0); - data << float(0); - SendDirectMessage(&data); + WorldPackets::Misc::DeathReleaseLoc packet; + packet.MapID = -1; + GetSession()->SendPacket(packet.Write()); // speed change, land walk @@ -5033,10 +5030,10 @@ void Player::RepopAtGraveyard() TeleportTo(ClosestGrave->Continent, ClosestGrave->Loc.X, ClosestGrave->Loc.Y, ClosestGrave->Loc.Z, GetOrientation(), shouldResurrect ? TELE_REVIVE_AT_TELEPORT : 0); if (isDead()) // not send if alive, because it used in TeleportTo() { - WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4*4); // show spirit healer position on minimap - data << ClosestGrave->Continent; - data << TaggedPosition<Position::XYZ>(ClosestGrave->Loc.X, ClosestGrave->Loc.Y, ClosestGrave->Loc.Z); - SendDirectMessage(&data); + WorldPackets::Misc::DeathReleaseLoc packet; + packet.MapID = ClosestGrave->Continent; + packet.Loc = Position(ClosestGrave->Loc.X, ClosestGrave->Loc.Y, ClosestGrave->Loc.Z); + GetSession()->SendPacket(packet.Write()); } } else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY())) @@ -24173,9 +24170,9 @@ int32 Player::CalculateCorpseReclaimDelay(bool load) const void Player::SendCorpseReclaimDelay(uint32 delay) const { - WorldPacket data(SMSG_CORPSE_RECLAIM_DELAY, 4); - data << uint32(delay); - SendDirectMessage(&data); + WorldPackets::Misc::CorpseReclaimDelay packet; + packet.Remaining = delay; + GetSession()->SendPacket(packet.Write()); } Player* Player::GetNextRandomRaidMember(float radius) diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 324d5701939..d3c14538c58 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -55,12 +55,10 @@ #include <cstdarg> #include <zlib.h> -void WorldSession::HandleRepopRequestOpcode(WorldPacket& recvData) +void WorldSession::HandleRepopRequest(WorldPackets::Misc::RepopRequest& /*packet*/) { TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_REPOP_REQUEST Message"); - recvData.read_skip<uint8>(); - if (GetPlayer()->IsAlive() || GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) return; @@ -521,13 +519,10 @@ void WorldSession::HandleBugOpcode(WorldPacket& recvData) CharacterDatabase.Execute(stmt); } -void WorldSession::HandleReclaimCorpseOpcode(WorldPacket& recvData) +void WorldSession::HandleReclaimCorpse(WorldPackets::Misc::ReclaimCorpse& /*packet*/) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_RECLAIM_CORPSE"); - ObjectGuid guid; - recvData >> guid; - if (_player->IsAlive()) return; @@ -557,25 +552,20 @@ void WorldSession::HandleReclaimCorpseOpcode(WorldPacket& recvData) _player->SpawnCorpseBones(); } -void WorldSession::HandleResurrectResponseOpcode(WorldPacket& recvData) +void WorldSession::HandleResurrectResponse(WorldPackets::Misc::ResurrectResponse& packet) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_RESURRECT_RESPONSE"); - ObjectGuid guid; - uint8 status; - recvData >> guid; - recvData >> status; - if (GetPlayer()->IsAlive()) return; - if (status == 0) + if (packet.Response == 0) { GetPlayer()->ClearResurrectRequestData(); // reject return; } - if (!GetPlayer()->IsResurrectRequestedBy(guid)) + if (!GetPlayer()->IsResurrectRequestedBy(packet.Resurrecter)) return; GetPlayer()->ResurrectUsingRequestData(); diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 5efde8a4556..4aee0d8e0dd 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -201,3 +201,41 @@ void WorldPackets::Misc::WorldTeleport::Read() _worldPacket >> Pos; _worldPacket >> Facing; } + +WorldPacket const* WorldPackets::Misc::CorpseReclaimDelay::Write() +{ + _worldPacket << Remaining; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Misc::DeathReleaseLoc::Write() +{ + _worldPacket << int32(MapID); + _worldPacket << Loc; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Misc::PreRessurect::Write() +{ + _worldPacket << PlayerGUID.WriteAsPacked(); + + return &_worldPacket; +} + +void WorldPackets::Misc::ReclaimCorpse::Read() +{ + _worldPacket >> CorpseGUID; +} + +void WorldPackets::Misc::RepopRequest::Read() +{ + _worldPacket >> CheckInstance; +} + +void WorldPackets::Misc::ResurrectResponse::Read() +{ + _worldPacket >> Resurrecter; + _worldPacket >> Response; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index f849d82799d..70416d4b06f 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -333,6 +333,68 @@ namespace WorldPackets TaggedPosition<Position::XYZ> Pos; float Facing = 0.0f; }; + + class CorpseReclaimDelay : public ServerPacket + { + public: + CorpseReclaimDelay() : ServerPacket(SMSG_CORPSE_RECLAIM_DELAY, 4) { } + + WorldPacket const* Write() override; + + uint32 Remaining = 0; + }; + + class DeathReleaseLoc : public ServerPacket + { + public: + DeathReleaseLoc() : ServerPacket(SMSG_DEATH_RELEASE_LOC, 4 + (3 * 4)) { } + + WorldPacket const* Write() override; + + int32 MapID = 0; + TaggedPosition<Position::XYZ> Loc; + }; + + class PreRessurect : public ServerPacket + { + public: + PreRessurect() : ServerPacket(SMSG_PRE_RESURRECT, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid PlayerGUID; + }; + + class ReclaimCorpse final : public ClientPacket + { + public: + ReclaimCorpse(WorldPacket&& packet) : ClientPacket(CMSG_RECLAIM_CORPSE, std::move(packet)) { } + + void Read() override; + + ObjectGuid CorpseGUID; + }; + + class RepopRequest final : public ClientPacket + { + public: + RepopRequest(WorldPacket&& packet) : ClientPacket(CMSG_REPOP_REQUEST, std::move(packet)) { } + + void Read() override; + + bool CheckInstance = false; + }; + + class ResurrectResponse final : public ClientPacket + { + public: + ResurrectResponse(WorldPacket&& packet) : ClientPacket(CMSG_RESURRECT_RESPONSE, std::move(packet)) { } + + void Read() override; + + ObjectGuid Resurrecter; + uint32 Response = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 8c88f6af4c4..50f9702cf12 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -474,9 +474,9 @@ void OpcodeTable::Initialize() /*0x157*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDZONEREPLY, STATUS_NEVER); /*0x158*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_BOUND, STATUS_NEVER); /*0x159*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENT_CONTROL_UPDATE, STATUS_NEVER); - /*0x15A*/ DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepopRequestOpcode ); + /*0x15A*/ DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepopRequest ); /*0x15B*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_NEVER); - /*0x15C*/ DEFINE_HANDLER(CMSG_RESURRECT_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleResurrectResponseOpcode ); + /*0x15C*/ DEFINE_HANDLER(CMSG_RESURRECT_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleResurrectResponse ); /*0x15D*/ DEFINE_HANDLER(CMSG_LOOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLootOpcode ); /*0x15E*/ DEFINE_HANDLER(CMSG_LOOT_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMoneyOpcode ); /*0x15F*/ DEFINE_HANDLER(CMSG_LOOT_RELEASE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLootReleaseOpcode ); @@ -594,7 +594,7 @@ void OpcodeTable::Initialize() /*0x1CF*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER); /*0x1D0*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XPGAIN, STATUS_NEVER); /*0x1D1*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURACASTLOG, STATUS_NEVER); - /*0x1D2*/ DEFINE_HANDLER(CMSG_RECLAIM_CORPSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReclaimCorpseOpcode ); + /*0x1D2*/ DEFINE_HANDLER(CMSG_RECLAIM_CORPSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReclaimCorpse ); /*0x1D3*/ DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWrapItemOpcode ); /*0x1D4*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVELUP_INFO, STATUS_NEVER); /*0x1D5*/ DEFINE_HANDLER(MSG_MINIMAP_PING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode ); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index b9df671a502..e72ade20183 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -155,6 +155,9 @@ namespace WorldPackets class RandomRollClient; class TogglePvP; class WorldTeleport; + class ReclaimCorpse; + class RepopRequest; + class ResurrectResponse; } namespace Pet @@ -626,7 +629,7 @@ class TC_GAME_API WorldSession void HandleMoveTeleportAck(WorldPacket& recvPacket); void HandleForceSpeedChangeAck(WorldPacket& recvData); - void HandleRepopRequestOpcode(WorldPacket& recvPacket); + void HandleRepopRequest(WorldPackets::Misc::RepopRequest& packet); void HandleAutostoreLootItemOpcode(WorldPacket& recvPacket); void HandleLootMoneyOpcode(WorldPacket& recvPacket); void HandleLootOpcode(WorldPacket& recvPacket); @@ -881,10 +884,10 @@ class TC_GAME_API WorldSession void HandleTextEmoteOpcode(WorldPacket& recvPacket); void HandleChatIgnoredOpcode(WorldPacket& recvPacket); - void HandleReclaimCorpseOpcode(WorldPacket& recvPacket); + void HandleReclaimCorpse(WorldPackets::Misc::ReclaimCorpse& packet); void HandleCorpseQueryOpcode(WorldPacket& recvPacket); void HandleCorpseMapPositionQuery(WorldPacket& recvPacket); - void HandleResurrectResponseOpcode(WorldPacket& recvPacket); + void HandleResurrectResponse(WorldPackets::Misc::ResurrectResponse& packet); void HandleSummonResponseOpcode(WorldPacket& recvData); void HandleJoinChannel(WorldPacket& recvPacket); |