aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorNoName <322016+Faq@users.noreply.github.com>2020-07-15 00:15:33 +0300
committerGitHub <noreply@github.com>2020-07-14 23:15:33 +0200
commit9fe6756cf26e916d69673879c31e09ee57ef6470 (patch)
tree9b7e519990e2c6e5f72e1e60162570b9083977b8 /src/server
parent0072fa922db1642d720c545ccc2ac095c140f0ca (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>
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Entities/Player/Player.cpp31
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp20
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp38
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h62
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h9
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);