From f1fecfd2587455f06cc99eda6bdaa169f40760e6 Mon Sep 17 00:00:00 2001 From: AeonLucid Date: Sun, 1 Nov 2020 20:53:54 +0100 Subject: [PATCH] Fixes #105 - Use correct method to retrieve PlayerControl --- .../Events/Game/Player/IPlayerReportedBodyEvent.cs | 2 +- .../Events/Game/Player/PlayerReportedBodyEvent.cs | 4 ++-- .../Net/Inner/Objects/InnerPlayerControl.cs | 12 +++++++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Impostor.Api/Events/Game/Player/IPlayerReportedBodyEvent.cs b/src/Impostor.Api/Events/Game/Player/IPlayerReportedBodyEvent.cs index 800d958..bc45317 100644 --- a/src/Impostor.Api/Events/Game/Player/IPlayerReportedBodyEvent.cs +++ b/src/Impostor.Api/Events/Game/Player/IPlayerReportedBodyEvent.cs @@ -7,6 +7,6 @@ namespace Impostor.Api.Events.Player /// /// Gets the player who's body got reported. /// - IInnerPlayerControl Body { get; } + IInnerPlayerControl? Body { get; } } } diff --git a/src/Impostor.Server/Events/Game/Player/PlayerReportedBodyEvent.cs b/src/Impostor.Server/Events/Game/Player/PlayerReportedBodyEvent.cs index 6798106..0db95b2 100644 --- a/src/Impostor.Server/Events/Game/Player/PlayerReportedBodyEvent.cs +++ b/src/Impostor.Server/Events/Game/Player/PlayerReportedBodyEvent.cs @@ -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; } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index 213a868..21e446e 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -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; } -- 2.39.5