From fcf8d66266ba7bb5e48ff5bf52162d3b664e181d Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Sun, 24 Jul 2022 19:25:13 +0200 Subject: [PATCH] Allow spawning fake players (#488) This is used by some mods to implement roles for unmodded clients --- src/Impostor.Server/Net/State/Game.Data.cs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/Impostor.Server/Net/State/Game.Data.cs b/src/Impostor.Server/Net/State/Game.Data.cs index 1052973..e90102b 100644 --- a/src/Impostor.Server/Net/State/Game.Data.cs +++ b/src/Impostor.Server/Net/State/Game.Data.cs @@ -181,7 +181,7 @@ namespace Impostor.Server.Net.State await obj.DeserializeAsync(sender, target, readerSub, true); } - await OnSpawnAsync(obj); + await OnSpawnAsync(sender, obj); } continue; @@ -284,7 +284,7 @@ namespace Impostor.Server.Net.State return true; } - private async ValueTask OnSpawnAsync(InnerNetObject netObj) + private async ValueTask OnSpawnAsync(ClientPlayer sender, InnerNetObject netObj) { switch (netObj) { @@ -315,13 +315,15 @@ namespace Impostor.Server.Net.State case InnerPlayerControl control: { // Hook up InnerPlayerControl <-> IClientPlayer. - if (!TryGetPlayer(control.OwnerId, out var player)) + if (TryGetPlayer(control.OwnerId, out var player)) { - throw new ImpostorException("Failed to find player that spawned the InnerPlayerControl"); + player.Character = control; + player.DisableSpawnTimeout(); + } + else + { + await sender.Client.ReportCheatAsync(new CheatContext(nameof(GameDataTag.SpawnFlag)), "Failed to find player that spawned the InnerPlayerControl"); } - - player.Character = control; - player.DisableSpawnTimeout(); // Hook up InnerPlayerControl <-> InnerPlayerControl.PlayerInfo. var playerInfo = GameNet.GameData!.GetPlayerById(control.PlayerId) ?? GameNet.GameData.AddPlayer(control); @@ -332,7 +334,10 @@ namespace Impostor.Server.Net.State control.PlayerInfo = playerInfo; } - await _eventManager.CallAsync(new PlayerSpawnedEvent(this, player, control)); + if (player != null) + { + await _eventManager.CallAsync(new PlayerSpawnedEvent(this, player, control)); + } break; } -- 2.39.5