diff options
| author | Shauren <shauren.trinity@gmail.com> | 2015-04-13 00:21:21 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2015-04-13 00:21:21 +0200 |
| commit | 953cbd4c284cdcd3e6096932bd1ba55d3e88a485 (patch) | |
| tree | c7f7706afe9da38f6da0971608c567ebec9785eb /src | |
| parent | 15d4bf8a61b66dcea186efd96f02fa697623aa60 (diff) | |
Core/PacketIO: Updated and enabled CMSG_OBJECT_UPDATE_FAILED, implemented CMSG_OBJECT_UPDATE_RESCUED
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 37 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 20 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 5 |
5 files changed, 49 insertions, 27 deletions
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index b8759d7731c..94b009219d6 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1340,39 +1340,28 @@ void WorldSession::HandleViolenceLevel(WorldPackets::Misc::ViolenceLevel& /*viol // do something? } -void WorldSession::HandleObjectUpdateFailedOpcode(WorldPacket& recvPacket) +void WorldSession::HandleObjectUpdateFailedOpcode(WorldPackets::Misc::ObjectUpdateFailed& objectUpdateFailed) { - ObjectGuid guid; - guid[6] = recvPacket.ReadBit(); - guid[7] = recvPacket.ReadBit(); - guid[4] = recvPacket.ReadBit(); - guid[0] = recvPacket.ReadBit(); - guid[1] = recvPacket.ReadBit(); - guid[5] = recvPacket.ReadBit(); - guid[3] = recvPacket.ReadBit(); - guid[2] = recvPacket.ReadBit(); - - recvPacket.ReadByteSeq(guid[6]); - recvPacket.ReadByteSeq(guid[7]); - recvPacket.ReadByteSeq(guid[2]); - recvPacket.ReadByteSeq(guid[3]); - recvPacket.ReadByteSeq(guid[1]); - recvPacket.ReadByteSeq(guid[4]); - recvPacket.ReadByteSeq(guid[0]); - recvPacket.ReadByteSeq(guid[5]); - - WorldObject* obj = ObjectAccessor::GetWorldObject(*GetPlayer(), guid); - TC_LOG_ERROR("network", "Object update failed for %s (%s) for player %s (%s)", guid.ToString().c_str(), obj ? obj->GetName().c_str() : "object-not-found", GetPlayerName().c_str(), _player->GetGUID().ToString().c_str()); + TC_LOG_ERROR("network", "Object update failed for %s for player %s (%s)", objectUpdateFailed.ObjectGUID.ToString().c_str(), GetPlayerName().c_str(), _player->GetGUID().ToString().c_str()); // If create object failed for current player then client will be stuck on loading screen - if (_player->GetGUID() == guid) + if (_player->GetGUID() == objectUpdateFailed.ObjectGUID) { LogoutPlayer(true); return; } // Pretend we've never seen this object - _player->m_clientGUIDs.erase(guid); + _player->m_clientGUIDs.erase(objectUpdateFailed.ObjectGUID); +} + +void WorldSession::HandleObjectUpdateRescuedOpcode(WorldPackets::Misc::ObjectUpdateRescued& objectUpdateRescued) +{ + TC_LOG_ERROR("network", "Object update rescued for %s for player %s (%s)", objectUpdateRescued.ObjectGUID.ToString().c_str(), GetPlayerName().c_str(), _player->GetGUID().ToString().c_str()); + + // Client received values update after destroying object + // re-register object in m_clientGUIDs to send DestroyObject on next visibility update + _player->m_clientGUIDs.insert(objectUpdateRescued.ObjectGUID); } void WorldSession::HandleSaveCUFProfiles(WorldPacket& recvPacket) diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index c98c8507243..92920af0d45 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -420,3 +420,13 @@ WorldPacket const* WorldPackets::Misc::DurabilityDamageDeath::Write() return &_worldPacket; } + +void WorldPackets::Misc::ObjectUpdateFailed::Read() +{ + _worldPacket >> ObjectGUID; +} + +void WorldPackets::Misc::ObjectUpdateRescued::Read() +{ + _worldPacket >> ObjectGUID; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 7a7897383a0..2da2ca2f9c3 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -573,6 +573,26 @@ namespace WorldPackets int32 Percent = 0; }; + + class ObjectUpdateFailed final : public ClientPacket + { + public: + ObjectUpdateFailed(WorldPacket&& packet) : ClientPacket(CMSG_OBJECT_UPDATE_FAILED, std::move(packet)) { } + + void Read() override; + + ObjectGuid ObjectGUID; + }; + + class ObjectUpdateRescued final : public ClientPacket + { + public: + ObjectUpdateRescued(WorldPacket&& packet) : ClientPacket(CMSG_OBJECT_UPDATE_RESCUED, std::move(packet)) { } + + void Read() override; + + ObjectGuid ObjectGUID; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index b7ea37b7fa8..ffb2de1f64a 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -579,8 +579,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementAckMessage, &WorldSession::HandleMovementAckMessage); DEFINE_OPCODE_HANDLER_OLD(CMSG_NEUTRAL_PLAYER_SELECT_FACTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_OBJECT_UPDATE_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleObjectUpdateFailedOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_OBJECT_UPDATE_RESCUED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_HANDLER(CMSG_OBJECT_UPDATE_FAILED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::ObjectUpdateFailed, &WorldSession::HandleObjectUpdateFailedOpcode); + DEFINE_HANDLER(CMSG_OBJECT_UPDATE_RESCUED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::ObjectUpdateRescued, &WorldSession::HandleObjectUpdateRescuedOpcode); DEFINE_HANDLER(CMSG_OFFER_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::OfferPetition, &WorldSession::HandleOfferPetition); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPENING_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic ); DEFINE_HANDLER(CMSG_OPEN_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::OpenItem, &WorldSession::HandleOpenItemOpcode); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index d7f3be41a61..837f0b42021 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -310,6 +310,8 @@ namespace WorldPackets class StandStateChange; class UITimeRequest; class RandomRollClient; + class ObjectUpdateFailed; + class ObjectUpdateRescued; } namespace Movement @@ -1411,7 +1413,8 @@ class WorldSession void HandleUpdateProjectilePosition(WorldPacket& recvPacket); void HandleUpdateMissileTrajectory(WorldPacket& recvPacket); void HandleViolenceLevel(WorldPackets::Misc::ViolenceLevel& violenceLevel); - void HandleObjectUpdateFailedOpcode(WorldPacket& recvPacket); + void HandleObjectUpdateFailedOpcode(WorldPackets::Misc::ObjectUpdateFailed& objectUpdateFailed); + void HandleObjectUpdateRescuedOpcode(WorldPackets::Misc::ObjectUpdateRescued& objectUpdateRescued); void HandleRequestCategoryCooldowns(WorldPackets::Spells::RequestCategoryCooldowns& requestCategoryCooldowns); // Scenes |
