]> git.deb.at Git - rhonda/impostor.git/commitdiff
Fixes #105 - Use correct method to retrieve PlayerControl
authorAeonLucid <aeonlucid@outlook.com>
Sun, 1 Nov 2020 19:53:54 +0000 (20:53 +0100)
committerAeonLucid <aeonlucid@outlook.com>
Sun, 1 Nov 2020 19:53:54 +0000 (20:53 +0100)
src/Impostor.Api/Events/Game/Player/IPlayerReportedBodyEvent.cs
src/Impostor.Server/Events/Game/Player/PlayerReportedBodyEvent.cs
src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs

index 800d9581edc2a1e8d9d5e645dedb8750c85e406e..bc45317d5c3770165cf7d334c17d9d945ab4f540 100644 (file)
@@ -7,6 +7,6 @@ namespace Impostor.Api.Events.Player
         /// <summary>
         ///     Gets the player who's body got reported.
         /// </summary>
-        IInnerPlayerControl Body { get; }
+        IInnerPlayerControl? Body { get; }
     }
 }
index 6798106074e3f1adb85a6044b493e0ade6e1b512..0db95b2ffb146153b6c92b2b2c718adba8a9d6fa 100644 (file)
@@ -7,7 +7,7 @@ namespace Impostor.Server.Events.Player
 {
     public class PlayerReportedBodyEvent : IPlayerReportedBodyEvent
     {
-        public PlayerReportedBodyEvent(IGame game, IClientPlayer clientPlayer, IInnerPlayerControl playerControl, IInnerPlayerControl body)
+        public PlayerReportedBodyEvent(IGame game, IClientPlayer clientPlayer, IInnerPlayerControl playerControl, IInnerPlayerControl? body)
         {
             Game = game;
             ClientPlayer = clientPlayer;
@@ -21,6 +21,6 @@ namespace Impostor.Server.Events.Player
 
         public IInnerPlayerControl PlayerControl { get; }
 
-        public IInnerPlayerControl Body { get; }
+        public IInnerPlayerControl? Body { get; }
     }
 }
index 213a868461959b8a47b7ac2a42b7ed010b278c3c..21e446eed31fe8347d61bb725b33af9a22103b4c 100644 (file)
@@ -248,9 +248,19 @@ namespace Impostor.Server.Net.Inner.Objects
                         throw new ImpostorCheatException($"Client sent {nameof(RpcCalls.ReportDeadBody)} to a specific player instead of broadcast");
                     }
 
+                    // deadBodyPlayerId can be byte.MaxValue.
+                    // It happens when internally PlayerInfo is null.
                     var deadBodyPlayerId = reader.ReadByte();
-                    await _eventManager.CallAsync(new PlayerReportedBodyEvent(_game, sender, this, _game.GetClientPlayer(deadBodyPlayerId).Character));
+                    var deadPlayer = deadBodyPlayerId != byte.MaxValue
+                        ? _game.GameNet.GameData.GetPlayerById(deadBodyPlayerId)?.Controller
+                        : null;
 
+                    if (deadBodyPlayerId == byte.MaxValue)
+                    {
+                        _logger.LogWarning("deadBodyPlayerId was byte.MaxValue");
+                    }
+
+                    await _eventManager.CallAsync(new PlayerReportedBodyEvent(_game, sender, this, deadPlayer));
                     break;
                 }