From: miniduikboot Date: Sun, 24 Jul 2022 17:25:13 +0000 (+0200) Subject: Allow spawning fake players (#488) X-Git-Tag: v1.7.2~9 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=fcf8d66266ba7bb5e48ff5bf52162d3b664e181d;p=rhonda%2Fimpostor.git Allow spawning fake players (#488) This is used by some mods to implement roles for unmodded clients --- 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; }