diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-05-24 16:28:26 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-05-24 16:28:26 +0200 |
commit | aa592e431b945800928f2e43b3812cfa240fada1 (patch) | |
tree | f074a0d74fdf63e0aa5b9ae6e62cb1d87b913fa8 | |
parent | bca4c05da3d5e31efa150c73b15eb6bad08a0051 (diff) |
Core/PacketIO: Implemented CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE and ActivePlayerData::TransportServerTime updatefield
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.h | 10 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
8 files changed, 40 insertions, 2 deletions
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 8317e80f0b3..db57584c76a 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -765,7 +765,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation virtual bool _IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D, bool incOwnRadius = true, bool incTargetRadius = true) const; - bool CanNeverSee(WorldObject const* obj) const; + virtual bool CanNeverSee(WorldObject const* obj) const; virtual bool CanAlwaysSee(WorldObject const* /*obj*/) const { return false; } bool CanDetect(WorldObject const* obj, bool ignoreStealth, bool checkAlert = false) const; bool CanDetectInvisibilityOf(WorldObject const* obj) const; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 5608e4f2482..bf699108081 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1660,6 +1660,9 @@ void Player::RemoveFromWorld() GetName().c_str(), GetGUID().ToString().c_str(), viewpoint->GetEntry(), viewpoint->GetTypeId()); SetViewpoint(viewpoint, false); } + + RemovePlayerLocalFlag(PLAYER_LOCAL_FLAG_OVERRIDE_TRANSPORT_SERVER_TIME); + SetTransportServerTime(0); } void Player::SetObjectScale(float scale) @@ -24101,6 +24104,13 @@ bool Player::IsNeverVisibleFor(WorldObject const* seer) const return false; } +bool Player::CanNeverSee(WorldObject const* /*obj*/) const +{ + // the intent is to delay sending visible objects until client is ready for them + // some gameobjects dont function correctly if they are sent before TransportServerTime is correctly set (after CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE) + return !HasPlayerLocalFlag(PLAYER_LOCAL_FLAG_OVERRIDE_TRANSPORT_SERVER_TIME); +} + bool Player::CanAlwaysSee(WorldObject const* obj) const { // Always can see self diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 72eb188b026..0098e0742dd 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2795,6 +2795,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void AddAuraVision(PlayerFieldByte2Flags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::AuraVision), flags); } void RemoveAuraVision(PlayerFieldByte2Flags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::AuraVision), flags); } + void SetTransportServerTime(int32 transportServerTime) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TransportServerTime), transportServerTime); } + bool IsInFriendlyArea() const; bool IsFriendlyArea(AreaTableEntry const* inArea) const; @@ -3085,6 +3087,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> Runes *m_runes; EquipmentSetContainer _equipmentSets; + bool CanNeverSee(WorldObject const* obj) const override; bool CanAlwaysSee(WorldObject const* obj) const override; bool IsAlwaysDetectableFor(WorldObject const* seer) const override; diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index d680550483c..4fd59ea3aa7 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -785,3 +785,11 @@ void WorldSession::ComputeNewClockDelta() _timeSyncClockDelta = back.first; } } + +void WorldSession::HandleMoveInitActiveMoverComplete(WorldPackets::Movement::MoveInitActiveMoverComplete& moveInitActiveMoverComplete) +{ + _player->SetPlayerLocalFlag(PLAYER_LOCAL_FLAG_OVERRIDE_TRANSPORT_SERVER_TIME); + _player->SetTransportServerTime(GameTime::GetGameTimeMS() - moveInitActiveMoverComplete.Ticks); + + _player->UpdateObjectVisibility(false); +} diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 1b3cf008ea9..48dd1381785 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -1067,3 +1067,8 @@ WorldPacket const* WorldPackets::Movement::MoveSetCompoundState::Write() return &_worldPacket; } + +void WorldPackets::Movement::MoveInitActiveMoverComplete::Read() +{ + _worldPacket >> Ticks; +} diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index a44b9bf2871..d56386a5684 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -693,6 +693,16 @@ namespace WorldPackets ObjectGuid MoverGUID; std::vector<MoveStateChange> StateChanges; }; + + class MoveInitActiveMoverComplete final : public ClientPacket + { + public: + MoveInitActiveMoverComplete(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE, std::move(packet)) { } + + void Read() override; + + uint32 Ticks = 0; + }; } ByteBuffer& operator<<(ByteBuffer& data, Movement::MonsterSplineFilterKey const& monsterSplineFilterKey); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 21b4ce7a7d3..bb64ab455fe 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -588,7 +588,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_HOVER_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_INERTIA_DISABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_INERTIA_ENABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); - DEFINE_HANDLER(CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveInitActiveMoverComplete); DEFINE_HANDLER(CMSG_MOVE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_KNOCK_BACK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveKnockBackAck); DEFINE_HANDLER(CMSG_MOVE_REMOVE_INERTIA_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 96debb5151b..8762b3d0899 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -539,6 +539,7 @@ namespace WorldPackets class SuspendTokenResponse; class MoveApplyMovementForceAck; class MoveRemoveMovementForceAck; + class MoveInitActiveMoverComplete; } namespace NPC @@ -1322,6 +1323,7 @@ class TC_GAME_API WorldSession void HandleMoveSetVehicleRecAck(WorldPackets::Vehicle::MoveSetVehicleRecIdAck& setVehicleRecIdAck); void HandleMoveTimeSkippedOpcode(WorldPackets::Movement::MoveTimeSkipped& moveTimeSkipped); void HandleMovementAckMessage(WorldPackets::Movement::MovementAckMessage& movementAck); + void HandleMoveInitActiveMoverComplete(WorldPackets::Movement::MoveInitActiveMoverComplete& moveInitActiveMoverComplete); void HandleRequestRaidInfoOpcode(WorldPackets::Party::RequestRaidInfo& packet); |