using Godot; namespace AceField.Scripts.Logic; public partial class World : Node2D { [Export] public PackedScene PlayerScene; public void StartGame(string currentPlayerName = null) { if (!Multiplayer.IsServer()) return; // Handling player connect / disconnect after this client connected Multiplayer.PeerDisconnected += RemovePlayer_Adaptor; Multiplayer.PeerConnected += AddPlayer_Adaptor; // Handling player connected before this client foreach (var id in Multiplayer.GetPeers()) AddPlayer(id); // Add this client as a player if client isn't a dedicated server if (!OS.HasFeature("dedicated_server")) AddPlayer(1, currentPlayerName); } public override void _ExitTree() { if (!Multiplayer.IsServer()) return; Multiplayer.PeerDisconnected -= RemovePlayer_Adaptor; Multiplayer.PeerConnected -= AddPlayer_Adaptor; } private static string BuildPlayerName(int id) => $"Player@{id}"; private void AddPlayer_Adaptor(long id) => AddPlayer((int)id); private void RemovePlayer_Adaptor(long id) => RemovePlayer((int)id); private void AddPlayer(int id, string name = null) { var player = PlayerScene.Instantiate(); player.PlayerId = id; var position = Vector2.FromAngle(GD.Randf() * 2 * Mathf.Pi); player.Position = new Vector2(position.X * 5f * GD.Randf(), position.Y * 5f * GD.Randf()); player.Name = BuildPlayerName(id); player.PlayerName = name; AddChild(player, true); } private void RemovePlayer(int id) { var name = BuildPlayerName(id); if (!HasNode(name)) return; GetNode(name).QueueFree(); } public Player GetCurrentPlayer() { foreach(var child in GetChildren()) { if (child is Player { IsCurrentPlayer: true } player) { return player; } } return null; } public T GetTileByPosition(Vector2 position) where T : Node2D { foreach (var item in GetChildren()) { if (item is T tile && tile.Position == position) return tile; } return null; } }