refactor: network implementations switched to universe objects
This commit is contained in:
		
							
								
								
									
										21
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							@@ -2,7 +2,18 @@
 | 
			
		||||
  "version": "0.2.0",
 | 
			
		||||
  "configurations": [
 | 
			
		||||
    {
 | 
			
		||||
      "name": ".NET Launch (Client)",
 | 
			
		||||
      "name": ".NET Launch (Client) 1",
 | 
			
		||||
      "type": "coreclr",
 | 
			
		||||
      "request": "launch",
 | 
			
		||||
      "preLaunchTask": "build",
 | 
			
		||||
      "program": "${workspaceFolder}/Platforms/Desktop/bin/Debug/net9.0/Desktop.exe",
 | 
			
		||||
      "args": [],
 | 
			
		||||
      "cwd": "${workspaceFolder}",
 | 
			
		||||
      "stopAtEntry": false,
 | 
			
		||||
      "console": "internalConsole"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": ".NET Launch (Client) 2",
 | 
			
		||||
      "type": "coreclr",
 | 
			
		||||
      "request": "launch",
 | 
			
		||||
      "preLaunchTask": "build",
 | 
			
		||||
@@ -26,8 +37,12 @@
 | 
			
		||||
  ],
 | 
			
		||||
  "compounds": [
 | 
			
		||||
    {
 | 
			
		||||
      "name": ".NET Launch Both",
 | 
			
		||||
      "configurations": [".NET Launch (Server)", ".NET Launch (Client)"]
 | 
			
		||||
      "name": ".NET Launch 2 Client & 1 Server",
 | 
			
		||||
      "configurations": [
 | 
			
		||||
        ".NET Launch (Server)",
 | 
			
		||||
        ".NET Launch (Client) 1",
 | 
			
		||||
        ".NET Launch (Client) 2"
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								Engine
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								Engine
									
									
									
									
									
								
							 Submodule Engine updated: 6b9020bd24...2df41e1881
									
								
							@@ -22,7 +22,7 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
    private bool isDownPressed = false;
 | 
			
		||||
 | 
			
		||||
    private IButtonInputs<Keys> inputs = null!;
 | 
			
		||||
    private INetworkCommunicatorClient networkClient = null!;
 | 
			
		||||
    private INetworkCommunicatorClient? networkClient = null!;
 | 
			
		||||
    private INetworkCommunicatorServer? networkServer = null;
 | 
			
		||||
    private TweenManager tweenManager = null!;
 | 
			
		||||
 | 
			
		||||
@@ -41,9 +41,9 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
 | 
			
		||||
    protected override void OnFirstActiveFrame()
 | 
			
		||||
    {
 | 
			
		||||
        inputs = Universe.FindRequiredBehaviour<IButtonInputs<Keys>>();
 | 
			
		||||
        networkClient = Universe.FindRequiredBehaviour<INetworkCommunicatorClient>();
 | 
			
		||||
        networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
 | 
			
		||||
        inputs = Universe.FindRequired<IButtonInputs<Keys>>();
 | 
			
		||||
        networkClient = Universe.Find<INetworkCommunicatorClient>();
 | 
			
		||||
        networkServer = Universe.Find<INetworkCommunicatorServer>();
 | 
			
		||||
        tweenManager = Universe.GetRequiredUniverseObject<TweenManager>();
 | 
			
		||||
 | 
			
		||||
        inputs.RegisterOnPress(Up, OnUpPressed);
 | 
			
		||||
@@ -62,10 +62,10 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
        inputs.UnregisterOnRelease(Down, OnDownReleased);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void OnUpPressed(IButtonInputs<Keys> inputs, Keys keys) { isUpPressed = true; networkClient.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnUpReleased(IButtonInputs<Keys> inputs, Keys keys) { isUpPressed = false; networkClient.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnDownPressed(IButtonInputs<Keys> inputs, Keys keys) { isDownPressed = true; networkClient.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnDownReleased(IButtonInputs<Keys> inputs, Keys keys) { isDownPressed = false; networkClient.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnUpPressed(IButtonInputs<Keys> inputs, Keys keys) { isUpPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnUpReleased(IButtonInputs<Keys> inputs, Keys keys) { isUpPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnDownPressed(IButtonInputs<Keys> inputs, Keys keys) { isDownPressed = true; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
    private void OnDownReleased(IButtonInputs<Keys> inputs, Keys keys) { isDownPressed = false; networkClient?.SendToServer(new PaddleKeyStatePacket(this)); }
 | 
			
		||||
 | 
			
		||||
    public void OnServerPacketArrived(PaddleKeyStatePacket packet, string from)
 | 
			
		||||
    {
 | 
			
		||||
@@ -73,6 +73,8 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        packet.Position = Transform.Position;
 | 
			
		||||
        isUpPressed = packet.IsUpPressed;
 | 
			
		||||
        isDownPressed = packet.IsDownPressed;
 | 
			
		||||
        networkServer?.SendToClient("*", packet);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
    private readonly Random random = new();
 | 
			
		||||
    private BallBehaviour ball = null!;
 | 
			
		||||
 | 
			
		||||
    private INetworkCommunicatorClient networkClient = null!;
 | 
			
		||||
    private INetworkCommunicatorClient? networkClient = null!;
 | 
			
		||||
    private INetworkCommunicatorServer? networkServer = null;
 | 
			
		||||
 | 
			
		||||
    public int ScoreLeft { get; private set; } = 0;
 | 
			
		||||
@@ -36,12 +36,12 @@ public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
 | 
			
		||||
    protected override void OnFirstActiveFrame()
 | 
			
		||||
    {
 | 
			
		||||
        var buttonInputs = Universe.FindRequiredBehaviour<IButtonInputs<Keys>>();
 | 
			
		||||
        buttonInputs.RegisterOnRelease(Keys.Space, (_, _1) => networkClient.SendToServer(new PongResetPacket()));
 | 
			
		||||
        IButtonInputs<Keys> buttonInputs = Universe.FindRequired<IButtonInputs<Keys>>();
 | 
			
		||||
        buttonInputs.RegisterOnRelease(Keys.Space, (_, _1) => networkClient?.SendToServer(new PongResetPacket()));
 | 
			
		||||
 | 
			
		||||
        networkClient = Universe.FindRequiredBehaviour<INetworkCommunicatorClient>();
 | 
			
		||||
        ball = Universe.FindRequiredBehaviour<BallBehaviour>();
 | 
			
		||||
        networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
 | 
			
		||||
        networkClient = Universe.Find<INetworkCommunicatorClient>();
 | 
			
		||||
        networkServer = Universe.Find<INetworkCommunicatorServer>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void ScoreToLeft()
 | 
			
		||||
@@ -92,6 +92,7 @@ public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
        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)
 | 
			
		||||
    {
 | 
			
		||||
@@ -103,19 +104,17 @@ public class PongManagerBehaviour : Behaviour,
 | 
			
		||||
    public void OnServerPacketArrived(PongResetPacket packet, string from)
 | 
			
		||||
    {
 | 
			
		||||
        Reset();
 | 
			
		||||
        Vector2D ballVelocity = GetBallLaunchDirection();
 | 
			
		||||
        ball.LaunchBall(ballVelocity);
 | 
			
		||||
        networkServer?.SendToClient("*", new PongResetPacket());
 | 
			
		||||
        networkServer?.SendToClient("*", new PongStartPacket() { BallVelocity = GetBallLaunchDirection() });
 | 
			
		||||
        networkServer?.SendToClient("*", new PongStartPacket() { BallVelocity = ballVelocity });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void OnServerPacketArrived(PongStartPacket packet, string from)
 | 
			
		||||
    {
 | 
			
		||||
        packet = new() { BallVelocity = GetBallLaunchDirection() };
 | 
			
		||||
        networkServer?.SendToClient("*", packet);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void OnClientPacketArrived(PongStartPacket packet)
 | 
			
		||||
    {
 | 
			
		||||
        ball.LaunchBall(packet.BallVelocity);
 | 
			
		||||
        networkServer?.SendToClient("*", packet);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class PongStartPacket : INetworkPacket
 | 
			
		||||
 
 | 
			
		||||
@@ -28,10 +28,7 @@ public class GamePong : Game
 | 
			
		||||
    private BehaviourCollector<IDisplayableSprite> displayableCollector = null!;
 | 
			
		||||
    private BehaviourCollector<IDisplayableShape> displayableShapeCollector = null!;
 | 
			
		||||
    private MonoGameCamera2DBehaviour cameraBehaviour = null!;
 | 
			
		||||
 | 
			
		||||
    private PongManagerBehaviour pongManager = null!;
 | 
			
		||||
    private TextScoreBehaviour leftText;
 | 
			
		||||
    private TextScoreBehaviour rightText;
 | 
			
		||||
 | 
			
		||||
    public GamePong(IUniverseObject platformSpecificUniverseObject)
 | 
			
		||||
    {
 | 
			
		||||
@@ -67,8 +64,24 @@ public class GamePong : Game
 | 
			
		||||
 | 
			
		||||
        universe.Register(platformSpecificUniverseObject);
 | 
			
		||||
 | 
			
		||||
        if (Environment.GetCommandLineArgs().FirstOrDefault(x => x.CompareTo("-server") == 0) is not null)
 | 
			
		||||
        {
 | 
			
		||||
            LiteNetLibServer server = universe.InstantiateUniverseObject<LiteNetLibServer>().SetUniverseObject("Server");
 | 
			
		||||
            UniverseObjectFactory.Instantiate<NetworkManager>().SetUniverseObject("NetworkManager", server.BehaviourController.UniverseObject);
 | 
			
		||||
            server.Start(8888, 2);
 | 
			
		||||
            Window.Title = $"Server";
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            LiteNetLibClient client = universe.InstantiateUniverseObject<LiteNetLibClient>().SetUniverseObject("Client");
 | 
			
		||||
            UniverseObjectFactory.Instantiate<NetworkManager>().SetUniverseObject("NetworkManager", client.BehaviourController.UniverseObject);
 | 
			
		||||
            client.Connect("localhost", 8888);
 | 
			
		||||
            Window.Title = $"Client";
 | 
			
		||||
 | 
			
		||||
            universe.InstantiateUniverseObject<DrawManager>().SetUniverseObject("Draw Manager");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        universe.InstantiateUniverseObject<UpdateManager>().SetUniverseObject("Update Manager");
 | 
			
		||||
        universe.InstantiateUniverseObject<DrawManager>().SetUniverseObject("Draw Manager");
 | 
			
		||||
        universe.InstantiateUniverseObject<CoroutineManager>().SetUniverseObject("Coroutine Manager");
 | 
			
		||||
        universe.InstantiateUniverseObject<TweenManager>().SetUniverseObject("Tween Manager");
 | 
			
		||||
        universe.InstantiateUniverseObject<PhysicsEngine2D>().SetUniverseObject("Physics Engine 2D");
 | 
			
		||||
@@ -139,24 +152,13 @@ public class GamePong : Game
 | 
			
		||||
 | 
			
		||||
        ////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
        leftText = universe.InstantiateUniverseObject().SetUniverseObject("Score Left")
 | 
			
		||||
        universe.InstantiateUniverseObject().SetUniverseObject("Score Left")
 | 
			
		||||
            .BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(-250f, 250f), scale: Vector2D.One * .25f)
 | 
			
		||||
            .BehaviourController.AddBehaviour<TextScoreBehaviour>(true, spriteFont);
 | 
			
		||||
 | 
			
		||||
        rightText = universe.InstantiateUniverseObject().SetUniverseObject("Score Right")
 | 
			
		||||
        universe.InstantiateUniverseObject().SetUniverseObject("Score Right")
 | 
			
		||||
            .BehaviourController.AddBehaviour<Transform2D>().SetTransform(position: new Vector2D(250f, 250f), scale: Vector2D.One * .25f)
 | 
			
		||||
            .BehaviourController.AddBehaviour<TextScoreBehaviour>(false, spriteFont);
 | 
			
		||||
 | 
			
		||||
        if (Environment.GetCommandLineArgs().FirstOrDefault(x => x.CompareTo("-server") == 0) is not null)
 | 
			
		||||
        {
 | 
			
		||||
            LiteNetLibServer server = universe.InstantiateUniverseObject().SetUniverseObject("Server").BehaviourController.AddBehaviour<LiteNetLibServer>();
 | 
			
		||||
            UniverseObjectFactory.Instantiate<NetworkManager>().SetUniverseObject("NetworkManager", server.BehaviourController.UniverseObject);
 | 
			
		||||
            server.Start(8888, 2);
 | 
			
		||||
            Window.Title = $"{Window.Title} - Server";
 | 
			
		||||
        }
 | 
			
		||||
        LiteNetLibClient client = universe.InstantiateUniverseObject().SetUniverseObject("Client").BehaviourController.AddBehaviour<LiteNetLibClient>();
 | 
			
		||||
        UniverseObjectFactory.Instantiate<NetworkManager>().SetUniverseObject("NetworkManager", client.BehaviourController.UniverseObject);
 | 
			
		||||
        client.Connect("localhost", 8888);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected override void Update(GameTime gameTime)
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ public class LiteNetLibClient : LiteNetLibCommunicatorBase, INetworkCommunicator
 | 
			
		||||
 | 
			
		||||
    public INetworkCommunicatorClient Connect(string address, int port, string? password = null)
 | 
			
		||||
    {
 | 
			
		||||
        if (!UniverseObject.IsInUniverse)
 | 
			
		||||
        if (!IsInUniverse)
 | 
			
		||||
            throw new($"{nameof(LiteNetLibClient)} must be in an universe to connect");
 | 
			
		||||
 | 
			
		||||
        Manager.Start();
 | 
			
		||||
@@ -33,14 +33,17 @@ public class LiteNetLibClient : LiteNetLibCommunicatorBase, INetworkCommunicator
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected override void OnEnteredUniverse(IUniverse universe)
 | 
			
		||||
    protected override void OnEnteringUniverse(IUniverse universe)
 | 
			
		||||
    {
 | 
			
		||||
        base.OnEnteringUniverse(universe);
 | 
			
		||||
 | 
			
		||||
        cancellationTokenSource = new CancellationTokenSource();
 | 
			
		||||
        PollEvents(cancellationTokenSource.Token);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected override void OnExitedUniverse(IUniverse universe)
 | 
			
		||||
    protected override void OnExitingUniverse(IUniverse universe)
 | 
			
		||||
    {
 | 
			
		||||
        base.OnExitingUniverse(universe);
 | 
			
		||||
        cancellationTokenSource?.Cancel();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ using Syntriax.Engine.Core;
 | 
			
		||||
 | 
			
		||||
namespace Syntriax.Engine.Network;
 | 
			
		||||
 | 
			
		||||
public abstract class LiteNetLibCommunicatorBase : Behaviour, INetworkCommunicator
 | 
			
		||||
public abstract class LiteNetLibCommunicatorBase : UniverseObject, INetworkCommunicator
 | 
			
		||||
{
 | 
			
		||||
    protected readonly NetPacketProcessor netPacketProcessor = new();
 | 
			
		||||
 | 
			
		||||
@@ -25,8 +25,9 @@ public abstract class LiteNetLibCommunicatorBase : Behaviour, INetworkCommunicat
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected override void ExitedUniverse(IUniverseObject sender, IUniverse universe)
 | 
			
		||||
    protected override void OnExitingUniverse(IUniverse universe)
 | 
			
		||||
    {
 | 
			
		||||
        base.OnExitingUniverse(universe);
 | 
			
		||||
        Stop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ public class LiteNetLibServer : LiteNetLibCommunicatorBase, INetworkCommunicator
 | 
			
		||||
 | 
			
		||||
    public INetworkCommunicatorServer Start(int port, int maxConnectionCount, string? password = null)
 | 
			
		||||
    {
 | 
			
		||||
        if (!UniverseObject.IsInUniverse)
 | 
			
		||||
        if (!IsInUniverse)
 | 
			
		||||
            throw new($"{nameof(LiteNetLibServer)} must be in an universe to start");
 | 
			
		||||
 | 
			
		||||
        Password = password ?? string.Empty;
 | 
			
		||||
@@ -60,7 +60,17 @@ public class LiteNetLibServer : LiteNetLibCommunicatorBase, INetworkCommunicator
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected override void OnEnteredUniverse(IUniverse universe) => universe.OnPostUpdate += PollEvents;
 | 
			
		||||
    protected override void OnExitedUniverse(IUniverse universe) => universe.OnPostUpdate -= PollEvents;
 | 
			
		||||
    private void PollEvents(IUniverse sender, UniverseTime engineTime) => Manager.PollEvents();
 | 
			
		||||
 | 
			
		||||
    protected override void OnEnteringUniverse(IUniverse universe)
 | 
			
		||||
    {
 | 
			
		||||
        base.OnEnteringUniverse(universe);
 | 
			
		||||
        universe.OnPostUpdate += PollEvents;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected override void OnExitingUniverse(IUniverse universe)
 | 
			
		||||
    {
 | 
			
		||||
        base.OnExitingUniverse(universe);
 | 
			
		||||
        universe.OnPostUpdate -= PollEvents;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
 | 
			
		||||
using Syntriax.Engine.Core;
 | 
			
		||||
 | 
			
		||||
namespace Syntriax.Engine.Network;
 | 
			
		||||
@@ -151,6 +152,6 @@ public class NetworkManager : UniverseObject, INetworkManager
 | 
			
		||||
    protected override void OnEnteringUniverse(IUniverse universe)
 | 
			
		||||
    {
 | 
			
		||||
        _networkEntityCollector.Assign(universe);
 | 
			
		||||
        NetworkCommunicator = BehaviourController.GetRequiredBehaviourInParent<INetworkCommunicator>();
 | 
			
		||||
        NetworkCommunicator = this.GetRequiredUniverseObjectInParent<INetworkCommunicator>();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user