using System; using Microsoft.Xna.Framework.Input; using LiteNetLib; using LiteNetLib.Utils; using Syntriax.Engine.Core; using Syntriax.Engine.Input; using Syntriax.Engine.Network; using Syntriax.Engine.Network.Abstract; namespace Pong.Behaviours; public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Speed) : BehaviourOverride { private Keys Up { get; } = Up; private Keys Down { get; } = Down; public float High { get; } = High; public float Low { get; } = Low; public float Speed { get; set; } = Speed; private bool isUpPressed = false; private bool isDownPressed = false; private IButtonInputs inputs = null!; private INetworkCommunicator communicator = null!; protected override void OnUpdate() { if (isUpPressed && isDownPressed) return; if (isUpPressed) MovePaddle(Vector2D.Up * (float)Time.Elapsed.TotalSeconds * Speed); else if (isDownPressed) MovePaddle(-Vector2D.Up * (float)Time.Elapsed.TotalSeconds * Speed); } private void MovePaddle(Vector2D vectorToAdd) { GameObject.Transform.Position += vectorToAdd; GameObject.Transform.Position = new Vector2D(GameObject.Transform.Position.X, MathF.Max(MathF.Min(GameObject.Transform.Position.Y, High), Low)); } protected override void OnFirstActiveFrame() { BehaviourController.TryGetBehaviour>(out var behaviourResult); inputs = behaviourResult ?? throw new Exception($"{nameof(IButtonInputs)} is missing on {GameObject.Name}."); if (!GameObject.GameManager.TryFindBehaviour(out INetworkCommunicator? foundCommunicator)) throw new Exception($"{nameof(INetworkCommunicator)} is missing on GameManager."); inputs.RegisterOnPress(Up, OnUpPressed); inputs.RegisterOnRelease(Up, OnUpReleased); inputs.RegisterOnPress(Down, OnDownPressed); inputs.RegisterOnRelease(Down, OnDownReleased); communicator = foundCommunicator; communicator.RegisterEntityListener(this, OnDataReceived); } protected override void OnFinalize() { inputs.UnregisterOnPress(Up, OnUpPressed); inputs.UnregisterOnRelease(Up, OnUpReleased); inputs.UnregisterOnPress(Down, OnDownPressed); inputs.UnregisterOnRelease(Down, OnDownReleased); } private void UpdateNetwork() { NetDataWriter netDataWriter = communicator.GetEntityWriter(this); netDataWriter.Put(isUpPressed); netDataWriter.Put(isDownPressed); netDataWriter.Put(Transform.Position); communicator.Manager.SendToAll(netDataWriter, DeliveryMethod.ReliableOrdered); } private void OnDataReceived(NetPacketReader reader, NetPeer peer) { if (communicator is INetworkServer server) { reader.Get(out isUpPressed); reader.Get(out isDownPressed); } else { reader.Get(out isUpPressed); reader.Get(out isDownPressed); Transform.Position = reader.GetVector2D(); } } private void OnUpPressed(IButtonInputs inputs, Keys keys) { isUpPressed = true; UpdateNetwork(); } private void OnUpReleased(IButtonInputs inputs, Keys keys) { isUpPressed = false; UpdateNetwork(); } private void OnDownPressed(IButtonInputs inputs, Keys keys) { isDownPressed = true; UpdateNetwork(); } private void OnDownReleased(IButtonInputs inputs, Keys keys) { isDownPressed = false; UpdateNetwork(); } }