fix: games not working when hosting a game

This commit is contained in:
2026-03-31 17:47:26 +03:00
parent eb8bf5837c
commit 174b34dcb6
3 changed files with 38 additions and 20 deletions

2
Engine

Submodule Engine updated: fe0173b091...c11aced8d2

View File

@@ -9,7 +9,7 @@ using Engine.Systems.Tween;
namespace Pong.Behaviours; namespace Pong.Behaviours;
public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate, INetworkEntity, public class Ball : CommonNetworkBehaviour, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate, INetworkEntity,
IPacketListenerClient<Ball.BallUpdatePacket>, IPacketListenerClient<Ball.BallUpdatePacket>,
IPacketListenerClient<Ball.BallResetPacket> IPacketListenerClient<Ball.BallResetPacket>
{ {
@@ -17,21 +17,23 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate
public float SpeedUpMultiplier { get; set; } = .025f; public float SpeedUpMultiplier { get; set; } = .025f;
public IRigidBody2D RigidBody { get; private set; } = null!; public IRigidBody2D RigidBody { get; private set; } = null!;
public ITransform2D Transform { get; private set; } = null!;
private IPhysicsEngine2D physicsEngine2D = null!; private IPhysicsEngine2D physicsEngine2D = null!;
private ITweenManager tweenManager = null!; private ITweenManager tweenManager = null!;
private INetworkCommunicatorServer? networkServer = null;
private ITween? networkTween = null; private ITween? networkTween = null;
private SoundEffect? bounceSoundEffect = null; private SoundEffect? bounceSoundEffect = null;
public void FirstActiveFrame() public override void FirstActiveFrame()
{ {
base.FirstActiveFrame();
Transform = BehaviourController.GetRequiredBehaviour<ITransform2D>();
BehaviourController.GetRequiredBehaviour<ICollider2D>().OnCollisionDetected.AddListener(OnCollisionDetected); BehaviourController.GetRequiredBehaviour<ICollider2D>().OnCollisionDetected.AddListener(OnCollisionDetected);
physicsEngine2D = Universe.FindRequiredBehaviour<IPhysicsEngine2D>(); physicsEngine2D = Universe.FindRequiredBehaviour<IPhysicsEngine2D>();
tweenManager = Universe.FindRequiredBehaviour<ITweenManager>(); tweenManager = Universe.FindRequiredBehaviour<ITweenManager>();
RigidBody = BehaviourController.GetRequiredBehaviour<IRigidBody2D>(); RigidBody = BehaviourController.GetRequiredBehaviour<IRigidBody2D>();
networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
} }
public void LoadContent(ContentManager content) public void LoadContent(ContentManager content)
@@ -43,7 +45,7 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate
{ {
ResetBall(); ResetBall();
RigidBody.Velocity = launchDirection * Speed; RigidBody.Velocity = launchDirection * Speed;
networkServer?.SendToAll(new BallUpdatePacket(this)); server?.SendToAll(new BallUpdatePacket(this));
} }
public void ResetBall() public void ResetBall()
@@ -52,7 +54,7 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate
tweenManager.CancelTween(networkTween); tweenManager.CancelTween(networkTween);
Transform.Position = Vector2D.Zero; Transform.Position = Vector2D.Zero;
RigidBody.Velocity = Vector2D.Zero; RigidBody.Velocity = Vector2D.Zero;
networkServer?.SendToAll(new BallResetPacket()); server?.SendToAll(new BallResetPacket());
} }
public void PhysicsUpdate(float delta) public void PhysicsUpdate(float delta)
@@ -72,24 +74,34 @@ public class Ball : Behaviour2D, IFirstFrameUpdate, ILoadContent, IPhysicsUpdate
RigidBody.Velocity = RigidBody.Velocity.Reflect(information.Normal); RigidBody.Velocity = RigidBody.Velocity.Reflect(information.Normal);
if (information.Detected.Transform.BehaviourController.GetBehaviour<ScoreWall>() is null) if (information.Detected.Transform.BehaviourController.GetBehaviour<ScoreWall>() is null)
networkServer?.SendToAll(new BallUpdatePacket(this)); server?.SendToAll(new BallUpdatePacket(this));
} }
public Ball() { } public Ball() { }
public Ball(float speed) => Speed = speed; public Ball(float speed) => Speed = speed;
void IPacketListenerClient<BallResetPacket>.OnClientPacketArrived(IConnection sender, BallResetPacket packet) => ResetBall(); void IPacketListenerClient<BallResetPacket>.OnClientPacketArrived(IConnection sender, BallResetPacket packet)
{
if (IsServer)
return;
ResetBall();
}
void IPacketListenerClient<BallUpdatePacket>.OnClientPacketArrived(IConnection sender, BallUpdatePacket packet) void IPacketListenerClient<BallUpdatePacket>.OnClientPacketArrived(IConnection sender, BallUpdatePacket packet)
{ {
if (RigidBody.Velocity.MagnitudeSquared >= .01f)
bounceSoundEffect?.Play();
if (IsServer)
return;
Vector2D localToServerPosition = Transform.Position.FromTo(packet.Position); Vector2D localToServerPosition = Transform.Position.FromTo(packet.Position);
if (localToServerPosition.MagnitudeSquared < 4f) if (localToServerPosition.MagnitudeSquared < 4f)
networkTween = Transform.TweenPositionAdditive(tweenManager, .25f, localToServerPosition); networkTween = Transform.TweenPositionAdditive(tweenManager, .25f, localToServerPosition);
else else
Transform.Position = packet.Position; Transform.Position = packet.Position;
if (RigidBody.Velocity.MagnitudeSquared >= .01f)
bounceSoundEffect?.Play();
RigidBody.Velocity = packet.Velocity; RigidBody.Velocity = packet.Velocity;
physicsEngine2D.StepIndividual(RigidBody, sender.Ping); physicsEngine2D.StepIndividual(RigidBody, sender.Ping);
} }

View File

@@ -10,7 +10,7 @@ using Engine.Systems.Network;
namespace Pong.Behaviours; namespace Pong.Behaviours;
public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadContent, public class PongManager : CommonNetworkBehaviour, INetworkEntity, IFirstFrameUpdate, ILoadContent,
IPacketListenerClient<PongManager.StartPacket>, IPacketListenerClient<PongManager.StartPacket>,
IPacketListenerClient<PongManager.ScorePacket> IPacketListenerClient<PongManager.ScorePacket>
{ {
@@ -20,7 +20,6 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo
private Random random = new(); private Random random = new();
private INetworkCommunicatorServer? networkServer = null;
private ILogger? logger = null; private ILogger? logger = null;
private SoundEffectInstance? scoreSoundEffect = null; private SoundEffectInstance? scoreSoundEffect = null;
private SoundEffectInstance? gameEndSoundEffect = null; private SoundEffectInstance? gameEndSoundEffect = null;
@@ -36,10 +35,11 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo
public PongManager() => WinScore = 5; public PongManager() => WinScore = 5;
public PongManager(int winScore) => WinScore = winScore; public PongManager(int winScore) => WinScore = winScore;
public void FirstActiveFrame() public override void FirstActiveFrame()
{ {
base.FirstActiveFrame();
Ball = Universe.FindRequiredBehaviour<Ball>(); Ball = Universe.FindRequiredBehaviour<Ball>();
networkServer = Universe.FindBehaviour<INetworkCommunicatorServer>();
logger = Universe.FindBehaviour<ILogger>(); logger = Universe.FindBehaviour<ILogger>();
} }
@@ -63,7 +63,7 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo
public bool Start() public bool Start()
{ {
if (networkServer is null) if (!IsServer)
return false; return false;
if (Ball.RigidBody.Velocity.MagnitudeSquared > 0.01f) if (Ball.RigidBody.Velocity.MagnitudeSquared > 0.01f)
@@ -72,7 +72,7 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo
Reset(); Reset();
IsGameInProgress = true; IsGameInProgress = true;
PostScoreUpdate(); PostScoreUpdate();
networkServer.SendToAll(new StartPacket()); Server.SendToAll(new StartPacket());
logger?.Log(this, $"Game started"); logger?.Log(this, $"Game started");
return true; return true;
} }
@@ -92,9 +92,9 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo
OnScoreUpdated?.Invoke(this); OnScoreUpdated?.Invoke(this);
Ball.ResetBall(); Ball.ResetBall();
if (networkServer is not null) if (IsServer)
{ {
networkServer.SendToAll(new ScorePacket(this)); Server.SendToAll(new ScorePacket(this));
logger?.Log(this, $"Sending score update packet to all: {ScoreLeft} - {ScoreRight}"); logger?.Log(this, $"Sending score update packet to all: {ScoreLeft} - {ScoreRight}");
} }
@@ -121,6 +121,9 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo
void IPacketListenerClient<ScorePacket>.OnClientPacketArrived(IConnection sender, ScorePacket packet) void IPacketListenerClient<ScorePacket>.OnClientPacketArrived(IConnection sender, ScorePacket packet)
{ {
if (IsServer)
return;
ScoreLeft = packet.Left; ScoreLeft = packet.Left;
ScoreRight = packet.Right; ScoreRight = packet.Right;
@@ -134,6 +137,9 @@ public class PongManager : Behaviour, INetworkEntity, IFirstFrameUpdate, ILoadCo
void IPacketListenerClient<StartPacket>.OnClientPacketArrived(IConnection sender, StartPacket packet) void IPacketListenerClient<StartPacket>.OnClientPacketArrived(IConnection sender, StartPacket packet)
{ {
if (IsServer)
return;
IsGameInProgress = true; IsGameInProgress = true;
logger?.Log(this, $"Game started"); logger?.Log(this, $"Game started");
} }