chore: de-networked pong manager
This commit is contained in:
		@@ -8,18 +8,13 @@ using Syntriax.Engine.Systems.Input;
 | 
			
		||||
 | 
			
		||||
namespace Pong.Behaviours;
 | 
			
		||||
 | 
			
		||||
public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
    IPacketListenerServer<PongManagerBehaviour.PongStartPacket>,
 | 
			
		||||
    IPacketListenerServer<PongManagerBehaviour.PongResetPacket>,
 | 
			
		||||
    IPacketListenerClient<PongManagerBehaviour.PongStartPacket>,
 | 
			
		||||
    IPacketListenerClient<PongManagerBehaviour.PongResetPacket>,
 | 
			
		||||
    IPacketListenerClient<PongManagerBehaviour.PongScoreUpdatePacket>
 | 
			
		||||
public class PongManagerBehaviour : Behaviour
 | 
			
		||||
{
 | 
			
		||||
    public Action<PongManagerBehaviour>? OnReset { get; set; } = null;
 | 
			
		||||
    public Action<PongManagerBehaviour>? OnFinished { get; set; } = null;
 | 
			
		||||
    public Action<PongManagerBehaviour>? OnScored { get; set; } = null;
 | 
			
		||||
 | 
			
		||||
    private readonly Random random = new();
 | 
			
		||||
    private Random random = new();
 | 
			
		||||
    private BallBehaviour ball = null!;
 | 
			
		||||
 | 
			
		||||
    private INetworkCommunicatorClient? networkClient = null!;
 | 
			
		||||
@@ -37,7 +32,7 @@ public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
    protected override void OnFirstActiveFrame()
 | 
			
		||||
    {
 | 
			
		||||
        IButtonInputs<Keys> buttonInputs = Universe.FindRequired<IButtonInputs<Keys>>();
 | 
			
		||||
        buttonInputs.RegisterOnRelease(Keys.Space, (_, _1) => networkClient?.SendToServer(new PongResetPacket()));
 | 
			
		||||
        buttonInputs.RegisterOnRelease(Keys.Space, (_, _1) => Reset());
 | 
			
		||||
 | 
			
		||||
        ball = Universe.FindRequiredBehaviour<BallBehaviour>();
 | 
			
		||||
        networkClient = Universe.Find<INetworkCommunicatorClient>();
 | 
			
		||||
@@ -46,22 +41,16 @@ public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
 | 
			
		||||
    public void ScoreToLeft()
 | 
			
		||||
    {
 | 
			
		||||
        if (networkServer is not null)
 | 
			
		||||
        {
 | 
			
		||||
            ScoreLeft++;
 | 
			
		||||
            OnScored?.InvokeSafe(this);
 | 
			
		||||
        }
 | 
			
		||||
        ScoreLeft++;
 | 
			
		||||
        OnScored?.InvokeSafe(this);
 | 
			
		||||
 | 
			
		||||
        CheckFinish();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void ScoreToRight()
 | 
			
		||||
    {
 | 
			
		||||
        if (networkServer is not null)
 | 
			
		||||
        {
 | 
			
		||||
            ScoreRight++;
 | 
			
		||||
            OnScored?.InvokeSafe(this);
 | 
			
		||||
        }
 | 
			
		||||
        ScoreRight++;
 | 
			
		||||
        OnScored?.InvokeSafe(this);
 | 
			
		||||
 | 
			
		||||
        CheckFinish();
 | 
			
		||||
    }
 | 
			
		||||
@@ -69,6 +58,10 @@ public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
    public void Reset()
 | 
			
		||||
    {
 | 
			
		||||
        ScoreLeft = ScoreRight = 0;
 | 
			
		||||
 | 
			
		||||
        ball.ResetBall();
 | 
			
		||||
        ball.LaunchBall(GetBallLaunchDirection());
 | 
			
		||||
 | 
			
		||||
        OnReset?.InvokeSafe(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -77,11 +70,14 @@ public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
        int halfwayScore = (int)(WinScore * .5f);
 | 
			
		||||
        ball.ResetBall();
 | 
			
		||||
 | 
			
		||||
        networkServer?.SendToClient("*", new PongScoreUpdatePacket(this));
 | 
			
		||||
        if (ScoreLeft > halfwayScore || ScoreRight > halfwayScore)
 | 
			
		||||
        {
 | 
			
		||||
            OnFinished?.InvokeSafe(this);
 | 
			
		||||
        else
 | 
			
		||||
            networkServer?.SendToClient("*", new PongStartPacket() { BallVelocity = GetBallLaunchDirection() });
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ball.ResetBall();
 | 
			
		||||
        ball.LaunchBall(GetBallLaunchDirection());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Vector2D GetBallLaunchDirection()
 | 
			
		||||
@@ -91,49 +87,4 @@ public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
        bool isBackwards = (random.Next() % 2) == 1;
 | 
			
		||||
        return Vector2D.Right.Rotate(isBackwards ? rotation + Syntriax.Engine.Core.Math.PI : rotation);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void OnClientPacketArrived(PongStartPacket packet) => ball.LaunchBall(packet.BallVelocity);
 | 
			
		||||
    public void OnClientPacketArrived(PongResetPacket packet) => Reset();
 | 
			
		||||
    public void OnClientPacketArrived(PongScoreUpdatePacket packet)
 | 
			
		||||
    {
 | 
			
		||||
        ScoreLeft = packet.Left;
 | 
			
		||||
        ScoreRight = packet.Right;
 | 
			
		||||
        OnScored?.InvokeSafe(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void OnServerPacketArrived(PongResetPacket packet, string from)
 | 
			
		||||
    {
 | 
			
		||||
        Reset();
 | 
			
		||||
        Vector2D ballVelocity = GetBallLaunchDirection();
 | 
			
		||||
        ball.LaunchBall(ballVelocity);
 | 
			
		||||
        networkServer?.SendToClient("*", new PongResetPacket());
 | 
			
		||||
        networkServer?.SendToClient("*", new PongStartPacket() { BallVelocity = ballVelocity });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void OnServerPacketArrived(PongStartPacket packet, string from)
 | 
			
		||||
    {
 | 
			
		||||
        packet = new() { BallVelocity = GetBallLaunchDirection() };
 | 
			
		||||
        ball.LaunchBall(packet.BallVelocity);
 | 
			
		||||
        networkServer?.SendToClient("*", packet);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class PongStartPacket : INetworkPacket
 | 
			
		||||
    {
 | 
			
		||||
        public Vector2D BallVelocity { get; set; } = Vector2D.Zero;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class PongResetPacket : INetworkPacket;
 | 
			
		||||
 | 
			
		||||
    public class PongScoreUpdatePacket : INetworkPacket
 | 
			
		||||
    {
 | 
			
		||||
        public int Left { get; set; } = 0;
 | 
			
		||||
        public int Right { get; set; } = 0;
 | 
			
		||||
 | 
			
		||||
        public PongScoreUpdatePacket() { }
 | 
			
		||||
        public PongScoreUpdatePacket(PongManagerBehaviour pongManagerBehaviour)
 | 
			
		||||
        {
 | 
			
		||||
            Left = pongManagerBehaviour.ScoreLeft;
 | 
			
		||||
            Right = pongManagerBehaviour.ScoreRight;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user