From 94f30ef87d8bd4fd2af3050cf0e0955e0c143849 Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Sat, 22 Jun 2024 13:07:54 +0200 Subject: [PATCH] fixup! Spawn PlayerInfo's if host is not authoritive --- .../Net/Inner/Objects/InnerGameData.cs | 11 ++++++++++- src/Impostor.Server/Net/State/Game.Data.cs | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs index 7c210fb2..a2f27e18 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs @@ -7,11 +7,14 @@ namespace Impostor.Server.Net.Inner.Objects internal partial class InnerGameData : IInnerGameData { private readonly ConcurrentDictionary _allPlayers = new(); + private readonly ConcurrentDictionary _allPlayersByClientId = new(); public int PlayerCount => _allPlayers.Count; public IReadOnlyDictionary Players => _allPlayers; + internal IReadOnlyDictionary PlayersByClientId => _allPlayersByClientId; + public InnerPlayerInfo? GetPlayerById(byte id) { if (id == byte.MaxValue) @@ -25,11 +28,17 @@ namespace Impostor.Server.Net.Inner.Objects internal void AddPlayer(InnerPlayerInfo playerInfo) { _allPlayers.TryAdd(playerInfo.PlayerId, playerInfo); + _allPlayersByClientId.TryAdd(playerInfo.ClientId, playerInfo); } internal void RemovePlayer(byte playerId) { - _allPlayers.TryRemove(playerId, out _); + _allPlayers.TryRemove(playerId, out var player); + + if (player != null) + { + _allPlayersByClientId.TryRemove(player.ClientId, out _); + } } internal byte GetNextAvailablePlayerId() diff --git a/src/Impostor.Server/Net/State/Game.Data.cs b/src/Impostor.Server/Net/State/Game.Data.cs index 621b4974..7a7414f2 100644 --- a/src/Impostor.Server/Net/State/Game.Data.cs +++ b/src/Impostor.Server/Net/State/Game.Data.cs @@ -474,7 +474,7 @@ namespace Impostor.Server.Net.State } // If the host doesn't disable server authority, spawn a player info for it - if (!IsHostAuthoritive && sender.Character == null) + if (!IsHostAuthoritive && !GameNet.GameData.PlayersByClientId.ContainsKey(sender.Client.Id)) { var playerInfo = (InnerPlayerInfo)ActivatorUtilities.CreateInstance(_serviceProvider, typeof(InnerPlayerInfo), this); playerInfo.SpawnFlags = SpawnFlags.None;