94 lines
2 KiB
C#
94 lines
2 KiB
C#
using System.Threading.Tasks;
|
|
using Godot;
|
|
|
|
public partial class NetworkManager : Node
|
|
{
|
|
public static NetworkManager Instance { get; private set; }
|
|
|
|
public int LocalNetId { get; private set; } = -1;
|
|
|
|
public override void _Ready()
|
|
{
|
|
Instance = this;
|
|
|
|
if (Global.IsGameHost)
|
|
{
|
|
CreateServer();
|
|
}
|
|
else
|
|
{
|
|
CreateClient();
|
|
}
|
|
|
|
GetTree().GetMultiplayer().PeerConnected += OnPlayerConnected;
|
|
GetTree().GetMultiplayer().PeerDisconnected += OnPlayerDisconnected;
|
|
GetTree().GetMultiplayer().ServerDisconnected += OnServerClosed;
|
|
}
|
|
|
|
public override void _ExitTree()
|
|
{
|
|
GetTree().GetMultiplayer().MultiplayerPeer.Close();
|
|
GetTree().GetMultiplayer().MultiplayerPeer = null;
|
|
}
|
|
|
|
public void CreateServer()
|
|
{
|
|
ENetMultiplayerPeer peer = new();
|
|
peer.CreateServer(2142, 128);
|
|
|
|
GetTree().GetMultiplayer().MultiplayerPeer = peer;
|
|
|
|
LocalNetId = GetTree().GetMultiplayer().GetUniqueId();
|
|
|
|
_ = SpawnNetPlayer(LocalNetId);
|
|
}
|
|
|
|
public void CreateClient()
|
|
{
|
|
ENetMultiplayerPeer peer = new();
|
|
peer.CreateClient("127.0.0.1", 2142);
|
|
|
|
GetTree().GetMultiplayer().MultiplayerPeer = peer;
|
|
|
|
LocalNetId = GetTree().GetMultiplayer().GetUniqueId();
|
|
|
|
_ = SpawnNetPlayer(LocalNetId);
|
|
}
|
|
|
|
public void OnServerClosed()
|
|
{
|
|
GetTree().ChangeSceneToFile("res://scenes/main_menu.tscn");
|
|
}
|
|
|
|
public void OnPlayerConnected(long id)
|
|
{
|
|
if (Global.IsGameHost)
|
|
{
|
|
GameManager.Instance.SendUniverseToClient(id);
|
|
}
|
|
|
|
_ = SpawnNetPlayer(id);
|
|
}
|
|
|
|
public void OnPlayerDisconnected(long id)
|
|
{
|
|
Player player = GetNode<Player>($"/root/Game/Space/Player-{id}");
|
|
GameManager.Instance.DespawnPlayer(player);
|
|
}
|
|
|
|
private async Task SpawnNetPlayer(long id)
|
|
{
|
|
while (GameManager.Loading)
|
|
{
|
|
await Task.Delay(10);
|
|
}
|
|
|
|
bool isMainPlayer = LocalNetId == id;
|
|
|
|
Character character = new(GameManager.GameUniverse.Sectors[5, 5, 5], new(0, 0, 0));
|
|
Player player = GameManager.Instance.SpawnPlayer(character, id, isMainPlayer);
|
|
player.Name = $"Player-{id}";
|
|
|
|
player.SetMultiplayerAuthority((int)id);
|
|
}
|
|
}
|