diff --git a/Engine b/Engine index fe0173b..c11aced 160000 --- a/Engine +++ b/Engine @@ -1 +1 @@ -Subproject commit fe0173b091a00e02dd0ebe59f6678228e0d6f540 +Subproject commit c11aced8d2e81ae967d55b91ab76b8fcb2089a3a diff --git a/Shared/Behaviours/Ball.cs b/Shared/Behaviours/Ball.cs index 0c5b126..2591c9b 100644 --- a/Shared/Behaviours/Ball.cs +++ b/Shared/Behaviours/Ball.cs @@ -9,7 +9,7 @@ using Engine.Systems.Tween; namespace Pong.Behaviours; -public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate, INetworkEntity, +public class Ball : CommonNetworkBehaviour, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate, INetworkEntity, IPacketListenerClient, IPacketListenerClient { @@ -17,21 +17,23 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate public float SpeedUpMultiplier { get; set; } = .025f; public IRigidBody2D RigidBody { get; private set; } = null!; + public ITransform2D Transform { get; private set; } = null!; private IPhysicsEngine2D physicsEngine2D = null!; private ITweenManager tweenManager = null!; - private INetworkCommunicatorServer? networkServer = null; private ITween? networkTween = null; private SoundEffect? bounceSoundEffect = null; - public void FirstActiveFrame() + public override void FirstActiveFrame() { + base.FirstActiveFrame(); + + Transform = BehaviourController.GetRequiredBehaviour(); BehaviourController.GetRequiredBehaviour().OnCollisionDetected.AddListener(OnCollisionDetected); physicsEngine2D = Universe.FindRequiredBehaviour(); tweenManager = Universe.FindRequiredBehaviour(); RigidBody = BehaviourController.GetRequiredBehaviour(); - networkServer = Universe.FindBehaviour(); } public void LoadContent(ContentManager content) @@ -43,7 +45,7 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate { ResetBall(); RigidBody.Velocity = launchDirection * Speed; - networkServer?.SendToAll(new BallUpdatePacket(this)); + server?.SendToAll(new BallUpdatePacket(this)); } public void ResetBall() @@ -52,7 +54,7 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate tweenManager.CancelTween(networkTween); Transform.Position = Vector2D.Zero; RigidBody.Velocity = Vector2D.Zero; - networkServer?.SendToAll(new BallResetPacket()); + server?.SendToAll(new BallResetPacket()); } public void PhysicsUpdate(float delta) @@ -72,24 +74,34 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate RigidBody.Velocity = RigidBody.Velocity.Reflect(information.Normal); if (information.Detected.Transform.BehaviourController.GetBehaviour() is null) - networkServer?.SendToAll(new BallUpdatePacket(this)); + server?.SendToAll(new BallUpdatePacket(this)); } public Ball() { } public Ball(float speed) => Speed = speed; - void IPacketListenerClient.OnClientPacketArrived(IConnection sender, BallResetPacket packet) => ResetBall(); + void IPacketListenerClient.OnClientPacketArrived(IConnection sender, BallResetPacket packet) + { + if (IsServer) + return; + + ResetBall(); + } + void IPacketListenerClient.OnClientPacketArrived(IConnection sender, BallUpdatePacket packet) { + if (RigidBody.Velocity.MagnitudeSquared >= .01f) + bounceSoundEffect?.Play(); + + if (IsServer) + return; + Vector2D localToServerPosition = Transform.Position.FromTo(packet.Position); if (localToServerPosition.MagnitudeSquared < 4f) networkTween = Transform.TweenPositionAdditive(tweenManager, .25f, localToServerPosition); else Transform.Position = packet.Position; - if (RigidBody.Velocity.MagnitudeSquared >= .01f) - bounceSoundEffect?.Play(); - RigidBody.Velocity = packet.Velocity; physicsEngine2D.StepIndividual(RigidBody, sender.Ping); } diff --git a/Shared/Behaviours/PongManager.cs b/Shared/Behaviours/PongManager.cs index 75ad33c..eae1c96 100644 --- a/Shared/Behaviours/PongManager.cs +++ b/Shared/Behaviours/PongManager.cs @@ -10,7 +10,7 @@ using Engine.Systems.Network; namespace Pong.Behaviours; -public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadContent, +public class PongManager : CommonNetworkBehaviour, INetworkEntity, IFirstFrameUpdate, ILoadContent, IPacketListenerClient, IPacketListenerClient { @@ -20,7 +20,6 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo private Random random = new(); - private INetworkCommunicatorServer? networkServer = null; private ILogger? logger = null; private SoundEffectInstance? scoreSoundEffect = null; private SoundEffectInstance? gameEndSoundEffect = null; @@ -36,10 +35,11 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo public PongManager() => WinScore = 5; public PongManager(int winScore) => WinScore = winScore; - public void FirstActiveFrame() + public override void FirstActiveFrame() { + base.FirstActiveFrame(); + Ball = Universe.FindRequiredBehaviour(); - networkServer = Universe.FindBehaviour(); logger = Universe.FindBehaviour(); } @@ -63,7 +63,7 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo public bool Start() { - if (networkServer is null) + if (!IsServer) return false; if (Ball.RigidBody.Velocity.MagnitudeSquared > 0.01f) @@ -72,7 +72,7 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo Reset(); IsGameInProgress = true; PostScoreUpdate(); - networkServer.SendToAll(new StartPacket()); + Server.SendToAll(new StartPacket()); logger?.Log(this, $"Game started"); return true; } @@ -92,9 +92,9 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo OnScoreUpdated?.Invoke(this); Ball.ResetBall(); - if (networkServer is not null) + if (IsServer) { - networkServer.SendToAll(new ScorePacket(this)); + Server.SendToAll(new ScorePacket(this)); logger?.Log(this, $"Sending score update packet to all: {ScoreLeft} - {ScoreRight}"); } @@ -121,6 +121,9 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo void IPacketListenerClient.OnClientPacketArrived(IConnection sender, ScorePacket packet) { + if (IsServer) + return; + ScoreLeft = packet.Left; ScoreRight = packet.Right; @@ -134,6 +137,9 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo void IPacketListenerClient.OnClientPacketArrived(IConnection sender, StartPacket packet) { + if (IsServer) + return; + IsGameInProgress = true; logger?.Log(this, $"Game started"); }