feat: added pong score update packets
This commit is contained in:
		@@ -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<PongManagerBehaviour.RequestStartPacket>
 | 
			
		||||
    IPacketListenerServer<PongManagerBehaviour.RequestStartPacket>,
 | 
			
		||||
    IPacketListenerClient<PongManagerBehaviour.ScorePacket>
 | 
			
		||||
{
 | 
			
		||||
    public Action<PongManagerBehaviour>? OnReset { get; set; } = null;
 | 
			
		||||
    public Action<PongManagerBehaviour>? OnFinished { get; set; } = null;
 | 
			
		||||
    public Action<PongManagerBehaviour>? OnScored { get; set; } = null;
 | 
			
		||||
    public Action<PongManagerBehaviour>? 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<BallBehaviour>();
 | 
			
		||||
        networkClient = Universe.FindBehaviour<INetworkCommunicatorClient>();
 | 
			
		||||
        networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
 | 
			
		||||
        logger = Universe.FindBehaviour<ILogger>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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<ScorePacket>.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<RequestStartPacket>.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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ public class TextScoreBehaviour(bool IsLeft) : TextBehaviour, IFirstFrameUpdate
 | 
			
		||||
 | 
			
		||||
        pongManager = Universe.FindRequiredBehaviour<PongManagerBehaviour>();
 | 
			
		||||
 | 
			
		||||
        pongManager.OnScored += UpdateScores;
 | 
			
		||||
        pongManager.OnScoreUpdated += UpdateScores;
 | 
			
		||||
        pongManager.OnReset += UpdateScores;
 | 
			
		||||
 | 
			
		||||
        UpdateScores(pongManager);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user