]> git.deb.at Git - rhonda/impostor.git/commitdiff
Allow spawning fake players (#488)
authorminiduikboot <mini@duikbo.at>
Sun, 24 Jul 2022 17:25:13 +0000 (19:25 +0200)
committerGitHub <noreply@github.com>
Sun, 24 Jul 2022 17:25:13 +0000 (19:25 +0200)
This is used by some mods to implement roles for unmodded clients

src/Impostor.Server/Net/State/Game.Data.cs

index 1052973e3e68e3c432197457958bb885ffe77124..e90102b3454a6ac799736ca9a1e5804078429a46 100644 (file)
@@ -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;
                 }