From 648be2738f62db5579ab4f73e908129fb812be24 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sun, 15 Jun 2025 13:27:06 +0300 Subject: [PATCH] fix: ball sync issues caused by network lerp fixed --- Shared/Behaviours/BallBehaviour.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Shared/Behaviours/BallBehaviour.cs b/Shared/Behaviours/BallBehaviour.cs index c77259d..a4e5a8c 100644 --- a/Shared/Behaviours/BallBehaviour.cs +++ b/Shared/Behaviours/BallBehaviour.cs @@ -6,7 +6,8 @@ using Syntriax.Engine.Systems.Tween; namespace Pong.Behaviours; public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INetworkEntity, - IPacketListenerClient + IPacketListenerClient, + IPacketListenerClient { public float Speed { get; set; } = 500f; public float SpeedUpMultiplier { get; set; } = .025f; @@ -16,6 +17,7 @@ public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INe private IPhysicsEngine2D physicsEngine2D = null!; private ITweenManager tweenManager = null!; private INetworkCommunicatorServer? networkServer = null; + private ITween? networkTween = null; public void FirstActiveFrame() { @@ -35,8 +37,11 @@ public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INe public void ResetBall() { + if (networkTween is not null) + tweenManager.CancelTween(networkTween); Transform.Position = Vector2D.Zero; RigidBody.Velocity = Vector2D.Zero; + networkServer?.SendToClient("*", new BallResetPacket()); } public void PhysicsUpdate(float delta) @@ -60,13 +65,15 @@ public class BallBehaviour : Behaviour2D, IFirstFrameUpdate, IPhysicsUpdate, INe public BallBehaviour() { } public BallBehaviour(float speed) => Speed = speed; + void IPacketListenerClient.OnClientPacketArrived(BallResetPacket packet) => ResetBall(); void IPacketListenerClient.OnClientPacketArrived(BallUpdatePacket packet) { - Transform.TweenPositionAdditive(tweenManager, .25f, Transform.Position.FromTo(packet.Position)); + networkTween = Transform.TweenPositionAdditive(tweenManager, .25f, Transform.Position.FromTo(packet.Position)); RigidBody.Velocity = packet.Velocity; physicsEngine2D.StepIndividual(RigidBody, new System.DateTime(System.DateTime.UtcNow.Ticks - packet.Timestamp).Second); } + private class BallResetPacket : INetworkPacket; private class BallUpdatePacket : INetworkPacket { public Vector2D Position { get; set; } = Vector2D.Zero;