From 2cc0b372bf6dd2969a0c61a19e17b2598ec0c95c Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 2 Jun 2022 22:16:12 -0400 Subject: [PATCH] Core/PacketIO: Implemented CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE and ActivePlayerData::TransportServerTime updatefield Port From (https://github.com/TrinityCore/TrinityCore/commit/aa592e431b945800928f2e43b3812cfa240fada1) --- Source/Game/Entities/Object/WorldObject.cs | 2 +- Source/Game/Entities/Player/Player.cs | 12 ++++++++++++ Source/Game/Handlers/MovementHandler.cs | 9 +++++++++ .../Game/Networking/Packets/MovementPackets.cs | 16 ++++++++++++++-- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index d11d834e9..cbe724358 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -1232,7 +1232,7 @@ namespace Game.Entities return true; } - bool CanNeverSee(WorldObject obj) + public virtual bool CanNeverSee(WorldObject obj) { return GetMap() != obj.GetMap() || !IsInPhase(obj); } diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index d7e376702..90dc77fc6 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -780,6 +780,9 @@ namespace Game.Entities GetName(), viewpoint.GetEntry(), viewpoint.GetTypeId()); SetViewpoint(viewpoint, false); } + + RemovePlayerLocalFlag(PlayerLocalFlags.OverrideTransportServerTime); + SetTransportServerTime(0); } void ScheduleDelayedOperation(PlayerDelayedOperations operation) @@ -4099,6 +4102,13 @@ namespace Game.Entities return false; } + public override bool CanNeverSee(WorldObject obj) + { + // 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(PlayerLocalFlags.OverrideTransportServerTime); + } + public override bool CanAlwaysSee(WorldObject obj) { // Always can see self @@ -7739,6 +7749,8 @@ namespace Game.Entities public void AddAuraVision(PlayerFieldByte2Flags flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AuraVision), (byte)flags); } public void RemoveAuraVision(PlayerFieldByte2Flags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AuraVision), (byte)flags); } + public void SetTransportServerTime(int transportServerTime) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TransportServerTime), transportServerTime); } + public bool CanTameExoticPets() { return IsGameMaster() || HasAuraType(AuraType.AllowTamePetType); } void SendAttackSwingCantAttack() { SendPacket(new AttackSwingError(AttackSwingErr.CantAttack)); } diff --git a/Source/Game/Handlers/MovementHandler.cs b/Source/Game/Handlers/MovementHandler.cs index e6e882205..46bb53e9b 100644 --- a/Source/Game/Handlers/MovementHandler.cs +++ b/Source/Game/Handlers/MovementHandler.cs @@ -828,5 +828,14 @@ namespace Game _timeSyncClockDelta = back.Item1; } } + + [WorldPacketHandler(ClientOpcodes.MoveInitActiveMoverComplete, Processing = PacketProcessing.ThreadSafe)] + void HandleMoveInitActiveMoverComplete(MoveInitActiveMoverComplete moveInitActiveMoverComplete) + { + _player.SetPlayerLocalFlag(PlayerLocalFlags.OverrideTransportServerTime); + _player.SetTransportServerTime((int)(GameTime.GetGameTimeMS() - moveInitActiveMoverComplete.Ticks)); + + _player.UpdateObjectVisibility(false); + } } } diff --git a/Source/Game/Networking/Packets/MovementPackets.cs b/Source/Game/Networking/Packets/MovementPackets.cs index ca742a212..225519eab 100644 --- a/Source/Game/Networking/Packets/MovementPackets.cs +++ b/Source/Game/Networking/Packets/MovementPackets.cs @@ -490,7 +490,7 @@ namespace Game.Networking.Packets public ObjectGuid Guid; public float SplineDist; } - + public class MoveSplineSetSpeed : ServerPacket { public MoveSplineSetSpeed(ServerOpcodes opcode) : base(opcode, ConnectionType.Instance) { } @@ -1028,7 +1028,7 @@ namespace Game.Networking.Packets public ObjectGuid MoverGUID; public uint TimeSkipped; } - + class SummonResponse : ClientPacket { public SummonResponse(WorldPacket packet) : base(packet) { } @@ -1239,6 +1239,18 @@ namespace Game.Networking.Packets } } + class MoveInitActiveMoverComplete : ClientPacket + { + public uint Ticks; + + public MoveInitActiveMoverComplete(WorldPacket packet) : base(packet) { } + + public override void Read() + { + _worldPacket.WriteUInt32(Ticks); + } + } + //Structs public struct MovementAck {