From: Niko233 <139348239+NikoCat233@users.noreply.github.com> Date: Mon, 24 Jun 2024 10:00:09 +0000 (+0800) Subject: Add handler for phantom rpcs X-Git-Tag: v1.10.0~7^2 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=4d6c060c7cccbe16b72365705c92c0e593e4755d;p=rhonda%2Fimpostor.git Add handler for phantom rpcs --- diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs index 46bb709..34163f6 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs @@ -148,5 +148,19 @@ namespace Impostor.Server.Net.Inner.Objects // Notify plugins. await _eventManager.CallAsync(new PlayerExileEvent(Game, Game.GetClientPlayer(OwnerId)!, this)); } + + public async ValueTask StartVanishAsync() + { + using var writer = Game.StartRpc(NetId, RpcCalls.StartVanish); + Rpc63StartVanish.Serialize(writer); + await Game.FinishRpcAsync(writer); + } + + public async ValueTask StartAppearAsync(bool shouldAnimate) + { + using var writer = Game.StartRpc(NetId, RpcCalls.StartAppear); + Rpc65StartAppear.Serialize(writer, shouldAnimate); + await Game.FinishRpcAsync(writer); + } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index c3d8872..60340ce 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -536,7 +536,7 @@ namespace Impostor.Server.Net.Inner.Objects } Rpc62CheckVanish.Deserialize(reader, out var maxDuration); - break; + return await HandleCheckVanish(sender, maxDuration); } case RpcCalls.StartVanish: @@ -548,7 +548,7 @@ namespace Impostor.Server.Net.Inner.Objects } Rpc63StartVanish.Deserialize(reader); - break; + return await HandleStartVanish(sender); } case RpcCalls.CheckAppear: @@ -560,8 +560,8 @@ namespace Impostor.Server.Net.Inner.Objects return false; } - Rpc64CheckAppear.Deserialize(reader, out bool shouldAnimate); - break; + Rpc64CheckAppear.Deserialize(reader, out var shouldAnimate); + return await HandleCheckAppear(sender, shouldAnimate); } case RpcCalls.StartAppear: @@ -572,8 +572,8 @@ namespace Impostor.Server.Net.Inner.Objects return false; } - Rpc65StartAppear.Deserialize(reader, out _); - break; + Rpc65StartAppear.Deserialize(reader, out var shouldAnimate); + return await HandleStartAppear(sender, shouldAnimate); } default: @@ -1071,5 +1071,61 @@ namespace Impostor.Server.Net.Inner.Objects return true; } + + private async ValueTask HandleCheckVanish(ClientPlayer sender, float maxDuration) + { + // TODO: Check if operation is taking place during lobby/meetings + // TODO: Check that the player unvanished before the maximum duration is reached + // If the game is host authoritive, the RPC is handled by the host, otherwise by the server + if (_game.IsHostAuthoritive) + { + return true; + } + else + { + await StartVanishAsync(); + return false; + } + } + + private async ValueTask HandleStartVanish(ClientPlayer sender) + { + if (!_game.IsHostAuthoritive) + { + if (await sender.Client.ReportCheatAsync(RpcCalls.StartVanish, CheatCategory.GameFlow, "Client tried to send StartVanish directly")) + { + return false; + } + } + + return true; + } + + private async ValueTask HandleCheckAppear(ClientPlayer sender, bool shouldAnimate) + { + // If the game is host authoritive, the RPC is handled by the host, otherwise by the server + if (_game.IsHostAuthoritive) + { + return true; + } + else + { + await StartAppearAsync(shouldAnimate); + return false; + } + } + + private async ValueTask HandleStartAppear(ClientPlayer sender, bool shouldAnimate) + { + if (!_game.IsHostAuthoritive) + { + if (await sender.Client.ReportCheatAsync(RpcCalls.StartAppear, CheatCategory.GameFlow, "Client tried to send StartAppear directly")) + { + return false; + } + } + + return true; + } } }