using AceField.Scripts.Logic; using AceField.Scripts.UI; using Godot; namespace AceField.Scripts; public partial class Launcher : Node { [Export] public World World; [Export] public BootScreen BootMenu; [Export] public CanvasLayer Overlay; private void GameFreeze() { GetTree().Paused = true; World.Hide(); Overlay.Hide(); } private void GameUnfreeze() { GetTree().Paused = false; World.Show(); Overlay.Show(); BootMenu.StartGame -= GameUnfreeze; } public override void _Ready() { GameFreeze(); if (DisplayServer.GetName() == "headless") { GD.Print("Starting server in headless mode..."); StartAsServer(4343); } } public void StartAsSingle() { GameUnfreeze(); } 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; } GD.Print("Running game as server..."); Multiplayer.MultiplayerPeer = peer; BootMenu.StartGame += GameUnfreeze; BootMenu.Show(); 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; } GD.Print("Running game as client..."); Multiplayer.MultiplayerPeer = peer; BootMenu.StartGame += GameUnfreeze; BootMenu.Show(); return true; } }