Implement basic networking
This commit is contained in:
parent
c320d9ddcb
commit
994823a9c3
25 changed files with 643 additions and 217 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue