diff --git a/code/NetworkManager.cs b/code/NetworkManager.cs index f9649d0..f657a01 100644 --- a/code/NetworkManager.cs +++ b/code/NetworkManager.cs @@ -5,20 +5,47 @@ namespace LuckerParty; /// public sealed class NetworkManager : Component, Component.INetworkListener { + /// + /// Map from Connection to Client GameObject + /// + private readonly Dictionary _clientMap = new(); + /// /// A GameObject used for organizational grouping of Clients /// - [Property] private GameObject ClientGroup { get; set; } public void OnActive( Connection channel ) { - ClientGroup ??= new GameObject( Scene.Root ); - + // Set up the Client GameObject var gameObject = new GameObject( ClientGroup ) { Name = $"{channel.DisplayName} ({channel.SteamId})" }; - gameObject.NetworkSpawn( channel ); - + _clientMap.Add( channel, gameObject ); var client = gameObject.AddComponent(); client.Connection = channel; + + // Spawn it on remote clients + gameObject.NetworkSpawn( channel ); + } + + public void OnDisconnected( Connection channel ) + { + if ( !_clientMap.TryGetValue( channel, out var clientGameObject ) ) + { + Log.Warning( $"Disconnected client {channel.SteamId} has no associated GameObject." ); + return; + } + + clientGameObject.Destroy(); + _clientMap.Remove( channel ); + } + + protected override void OnAwake() + { + ClientGroup = new GameObject( Scene.Root ); + } + + protected override void OnDestroy() + { + ClientGroup.Destroy(); } }