Implement basic networking

This commit is contained in:
Aslan 2026-01-29 09:43:15 -05:00
parent c320d9ddcb
commit 994823a9c3
25 changed files with 643 additions and 217 deletions

View file

@ -2,11 +2,12 @@ using Godot;
public partial class Player : CharacterBody3D
{
[Export] public double Speed = 5;
[Export] public double SprintMultiplier = 2;
[Export] public double JumpForce = 5;
[Export] public double MouseSensitivity = 0.2;
[Export] public double NetworkSyncInterval = 0.2;
[Export] public double NetworkPhysicsSyncInterval = 0.05;
public Control GameMenu { get; set; }
@ -14,13 +15,17 @@ public partial class Player : CharacterBody3D
private Vector3 gravityVelocity = Vector3.Zero;
private Vector3 movementVelocity = Vector3.Zero;
private GravityReceiver gravityReceiver;
private double cameraPitch = 0;
private Camera3D camera;
private GravityReceiver gravityReceiver;
private double networkSyncCounter = 0;
private double networkPhysicsSyncCounter = 0;
public override void _Ready()
{
camera = GetNode<Camera3D>("Camera");
camera.Current = IsMultiplayerAuthority();
gravityReceiver = GetNode<GravityReceiver>("GravityReceiver");
PlayerData.UpdateNodePosition();
@ -28,7 +33,25 @@ public partial class Player : CharacterBody3D
public override void _Process(double delta)
{
PlayerData.SetCoordinatesFromLocal(GlobalPosition);
if (IsMultiplayerAuthority())
{
networkPhysicsSyncCounter += delta;
if (networkPhysicsSyncCounter >= NetworkPhysicsSyncInterval)
{
networkPhysicsSyncCounter = 0;
Rpc(nameof(RpcSyncPhysics), movementVelocity, gravityVelocity, GlobalRotation);
}
networkSyncCounter += delta;
if (networkSyncCounter >= NetworkSyncInterval)
{
networkSyncCounter = 0;
Rpc(nameof(RpcSync), GlobalPosition, PlayerData.CurrentSector.Coordinates);
}
PlayerData.SetCoordinatesFromLocal(GlobalPosition);
}
PlayerData.Simulate(delta);
}
@ -37,21 +60,18 @@ public partial class Player : CharacterBody3D
Vector3 newGravityVelocity = gravityVelocity;
Vector3 newMovementVelocity = movementVelocity;
if (IsInGravity())
if (!GameMenu.Visible && IsMultiplayerAuthority())
{
ProcessGravity(delta, ref newGravityVelocity);
if (!GameMenu.Visible)
if (IsInGravity())
{
ProcessGravity(delta, ref newGravityVelocity);
ProcessControlsGravity(ref newGravityVelocity, ref newMovementVelocity);
}
}
else
{
newGravityVelocity = Vector3.Zero;
ProcessCamera(delta);
if (!GameMenu.Visible)
else
{
newGravityVelocity = Vector3.Zero;
ProcessCamera(delta);
ProcessControls(ref newMovementVelocity);
}
}
@ -69,6 +89,10 @@ public partial class Player : CharacterBody3D
{
return;
}
if (!IsMultiplayerAuthority())
{
return;
}
if (@event is InputEventMouseMotion motion)
{
@ -213,4 +237,33 @@ public partial class Player : CharacterBody3D
RotateObjectLocal(Vector3.Forward, rotateAmountZ);
}
[Rpc(MultiplayerApi.RpcMode.AnyPeer)]
public void RpcSync(Vector3 position, Vector3I sectorCoordinates)
{
Sector sector = GameManager.GameUniverse.GetSector(sectorCoordinates);
if (sector == null)
{
return;
}
Vector3Dec newGlobal = PlayerData.CalculateGlobalCoordinates(sector.GlobalCenterCoordinates, position);
PlayerData.SetCoordinatesFromGlobal(newGlobal);
if (PlayerData.CurrentSector.Coordinates != sectorCoordinates)
{
sector.AssignObject(PlayerData);
}
GlobalPosition = position + PlayerData.SectorOffset;
}
[Rpc(MultiplayerApi.RpcMode.AnyPeer)]
public void RpcSyncPhysics(Vector3 _movementVelocity, Vector3 _gravityVelocity, Vector3 rotation)
{
movementVelocity = _movementVelocity;
gravityVelocity = _gravityVelocity;
GlobalRotation = rotation;
}
}