From b238235c15ad72c40cb681191beec21cf728165d Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sat, 28 Jun 2025 22:44:00 +0300 Subject: [PATCH] feat: added pong score update packets --- Shared/Behaviours/PongManagerBehaviour.cs | 48 ++++++++++++++++++----- Shared/Behaviours/TextScoreBehaviour.cs | 2 +- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Shared/Behaviours/PongManagerBehaviour.cs b/Shared/Behaviours/PongManagerBehaviour.cs index 75adf31..4a827ea 100644 --- a/Shared/Behaviours/PongManagerBehaviour.cs +++ b/Shared/Behaviours/PongManagerBehaviour.cs @@ -3,23 +3,26 @@ using System; using Microsoft.Xna.Framework.Input; using Syntriax.Engine.Core; +using Syntriax.Engine.Core.Debug; using Syntriax.Engine.Network; using Syntriax.Engine.Systems.Input; namespace Pong.Behaviours; public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate, - IPacketListenerServer + IPacketListenerServer, + IPacketListenerClient { public Action? OnReset { get; set; } = null; public Action? OnFinished { get; set; } = null; - public Action? OnScored { get; set; } = null; + public Action? OnScoreUpdated { get; set; } = null; private Random random = new(); private BallBehaviour ball = null!; private INetworkCommunicatorClient? networkClient = null!; private INetworkCommunicatorServer? networkServer = null; + private ILogger? logger = null; public int ScoreLeft { get; private set; } = 0; public int ScoreRight { get; private set; } = 0; @@ -38,22 +41,23 @@ public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate ball = Universe.FindRequiredBehaviour(); networkClient = Universe.FindBehaviour(); networkServer = Universe.FindBehaviour(); + logger = Universe.FindBehaviour(); } public void ScoreToLeft() { ScoreLeft++; - OnScored?.Invoke(this); + OnScoreUpdated?.Invoke(this); - CheckFinish(); + PostScoreUpdate(); } public void ScoreToRight() { ScoreRight++; - OnScored?.Invoke(this); + OnScoreUpdated?.Invoke(this); - CheckFinish(); + PostScoreUpdate(); } public void Reset() @@ -66,18 +70,23 @@ public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate OnReset?.Invoke(this); } - private void CheckFinish() + private void PostScoreUpdate() { - int halfwayScore = (int)(WinScore * .5f); ball.ResetBall(); + if (networkServer is not null) + { + networkServer.SendToAll(new ScorePacket(this)); + logger?.Log(this, $"Sending score update packet to all: {ScoreLeft} - {ScoreRight}"); + } + + int halfwayScore = (int)(WinScore * .5f); if (ScoreLeft > halfwayScore || ScoreRight > halfwayScore) { OnFinished?.Invoke(this); return; } - ball.ResetBall(); ball.LaunchBall(GetBallLaunchDirection()); } @@ -89,6 +98,15 @@ public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate return Vector2D.Right.Rotate(isBackwards ? rotation + Syntriax.Engine.Core.Math.Pi : rotation); } + void IPacketListenerClient.OnClientPacketArrived(IConnection sender, ScorePacket packet) + { + ScoreLeft = packet.Left; + ScoreRight = packet.Right; + + OnScoreUpdated?.Invoke(this); + logger?.Log(this, $"Client score update packet arrived: {packet.Left} - {packet.Right}"); + } + void IPacketListenerServer.OnServerPacketArrived(IConnection sender, RequestStartPacket packet) { if (ball.RigidBody.Velocity.MagnitudeSquared > 0.01f) @@ -98,4 +116,16 @@ public class PongManagerBehaviour : Behaviour, INetworkEntity, IFirstFrameUpdate } private class RequestStartPacket : INetworkPacket; + private class ScorePacket : INetworkPacket + { + public int Left { get; set; } + public int Right { get; set; } + + public ScorePacket() { } + public ScorePacket(PongManagerBehaviour pongManagerBehaviour) + { + Left = pongManagerBehaviour.ScoreLeft; + Right = pongManagerBehaviour.ScoreRight; + } + } } diff --git a/Shared/Behaviours/TextScoreBehaviour.cs b/Shared/Behaviours/TextScoreBehaviour.cs index 7e06d5b..8cbe152 100644 --- a/Shared/Behaviours/TextScoreBehaviour.cs +++ b/Shared/Behaviours/TextScoreBehaviour.cs @@ -18,7 +18,7 @@ public class TextScoreBehaviour(bool IsLeft) : TextBehaviour, IFirstFrameUpdate pongManager = Universe.FindRequiredBehaviour(); - pongManager.OnScored += UpdateScores; + pongManager.OnScoreUpdated += UpdateScores; pongManager.OnReset += UpdateScores; UpdateScores(pongManager);