✨ Multiplayer Basis
This commit is contained in:
71
Scripts/Multiplayer.cs
Normal file
71
Scripts/Multiplayer.cs
Normal file
@ -0,0 +1,71 @@
|
||||
using System;
|
||||
using Godot;
|
||||
|
||||
namespace CodingLand.Scripts;
|
||||
|
||||
public partial class Multiplayer : Node
|
||||
{
|
||||
[Export] public Node2D Playground;
|
||||
|
||||
private void GameFreeze()
|
||||
{
|
||||
Playground.Hide();
|
||||
GetTree().Paused = true;
|
||||
}
|
||||
|
||||
private void GameUnfreeze()
|
||||
{
|
||||
Playground.Show();
|
||||
Playground.GetNode<Camera2D>("Camera2D").Enabled = true;
|
||||
GetTree().Paused = false;
|
||||
}
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
GameFreeze();
|
||||
|
||||
if (DisplayServer.GetName() == "headless")
|
||||
{
|
||||
GD.Print("Starting server in headless mode...");
|
||||
StartAsServer(4343);
|
||||
}
|
||||
}
|
||||
|
||||
public bool StartAsServer(int port)
|
||||
{
|
||||
var peer = new ENetMultiplayerPeer();
|
||||
peer.CreateServer(port);
|
||||
if (peer.GetConnectionStatus() == MultiplayerPeer.ConnectionStatus.Disconnected)
|
||||
{
|
||||
GD.PrintErr("Failed to start multiplayer server...");
|
||||
OS.Alert("Failed to start multiplayer server...");
|
||||
return false;
|
||||
}
|
||||
|
||||
Multiplayer.MultiplayerPeer = peer;
|
||||
GameUnfreeze();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool StartAsClient(string addr, int port)
|
||||
{
|
||||
if (string.IsNullOrEmpty(addr)) return false;
|
||||
|
||||
var peer = new ENetMultiplayerPeer();
|
||||
peer.CreateClient(addr, port);
|
||||
if (peer.GetConnectionStatus() == MultiplayerPeer.ConnectionStatus.Disconnected)
|
||||
{
|
||||
var info = $"Unable to connect multiplayer server {addr}:{port}";
|
||||
GD.PrintErr(info);
|
||||
OS.Alert(info);
|
||||
return false;
|
||||
}
|
||||
|
||||
Multiplayer.MultiplayerPeer = peer;
|
||||
GameUnfreeze();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using Godot;
|
||||
|
||||
namespace CodingLand.Scripts;
|
||||
@ -12,6 +13,9 @@ public partial class Player : CharacterBody2D
|
||||
[Export] public float CameraSmoothness = 0.05f;
|
||||
|
||||
[Export] public Camera2D PlayerCamera;
|
||||
|
||||
[Export] public Timer PlayerDashCountdown;
|
||||
[Export] public float PlayerDashAcceleration = 2f;
|
||||
|
||||
public override void _PhysicsProcess(double delta)
|
||||
{
|
||||
@ -39,6 +43,12 @@ public partial class Player : CharacterBody2D
|
||||
{
|
||||
Velocity = Velocity.MoveToward(Vector2.Zero, Deceleration * (float)delta);
|
||||
}
|
||||
|
||||
if (Input.IsActionJustPressed("move_dash") && PlayerDashCountdown.IsStopped())
|
||||
{
|
||||
Velocity *= PlayerDashAcceleration;
|
||||
PlayerDashCountdown.Start();
|
||||
}
|
||||
|
||||
Position += Velocity * (float)delta;
|
||||
MoveAndSlide();
|
||||
|
74
Scripts/UI/MultiplayerUi.cs
Normal file
74
Scripts/UI/MultiplayerUi.cs
Normal file
@ -0,0 +1,74 @@
|
||||
using Godot;
|
||||
|
||||
namespace CodingLand.Scripts.UI;
|
||||
|
||||
public partial class MultiplayerUi : Control
|
||||
{
|
||||
[Export] public int DefaultServerPort = 4343;
|
||||
[Export] public string DefaultServerAddr = "127.0.0.1";
|
||||
|
||||
[Export] public Multiplayer MultiplayerController;
|
||||
|
||||
[Export] public LineEdit ServerPortInput;
|
||||
[Export] public LineEdit ServerAddrInput;
|
||||
[Export] public Button StartAsServerButton;
|
||||
[Export] public Button StartAsClientButton;
|
||||
|
||||
private void ApplySize()
|
||||
{
|
||||
var screenSize = GetViewportRect().Size;
|
||||
|
||||
Position = new Vector2(0, 0);
|
||||
Size = screenSize;
|
||||
GetNode<CenterContainer>("CenterContainer").Size = screenSize;
|
||||
}
|
||||
|
||||
private bool DoValidation()
|
||||
{
|
||||
var addr = ServerAddrInput.Text;
|
||||
var port = ServerPortInput.Text;
|
||||
|
||||
if (string.IsNullOrEmpty(addr)) return false;
|
||||
if (string.IsNullOrEmpty(port) || !int.TryParse(port, out _)) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
ApplySize();
|
||||
|
||||
ServerPortInput.Text = DefaultServerPort.ToString();
|
||||
ServerAddrInput.Text = DefaultServerAddr;
|
||||
|
||||
StartAsServerButton.Pressed += () =>
|
||||
{
|
||||
if (!DoValidation())
|
||||
{
|
||||
OS.Alert("Invalid multiplayer configuration.");
|
||||
return;
|
||||
}
|
||||
|
||||
var port = ServerPortInput.Text;
|
||||
var result = MultiplayerController.StartAsServer(int.Parse(port));
|
||||
|
||||
if (result)
|
||||
Hide();
|
||||
};
|
||||
StartAsServerButton.Pressed += () =>
|
||||
{
|
||||
if (!DoValidation())
|
||||
{
|
||||
OS.Alert("Invalid multiplayer configuration.");
|
||||
return;
|
||||
}
|
||||
|
||||
var addr = ServerAddrInput.Text;
|
||||
var port = ServerPortInput.Text;
|
||||
var result = MultiplayerController.StartAsClient(addr, int.Parse(port));
|
||||
|
||||
if (result)
|
||||
Hide();
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user