From 22f1d74cdf248e98d5077723099e28cd1ea43fce Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Fri, 12 Nov 2021 22:57:52 +0100 Subject: [PATCH] Allow Shapeshifters to use RPC Shapeshift --- .../Net/Messages/Rpcs/Rpc46Shapeshift.cs | 20 +++++++++++++++++++ .../Net/Inner/InnerNetObject.Anticheat.cs | 14 +++++++++++++ .../Net/Inner/Objects/InnerPlayerControl.cs | 12 +++++++++++ 3 files changed, 46 insertions(+) create mode 100644 src/Impostor.Api/Net/Messages/Rpcs/Rpc46Shapeshift.cs diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc46Shapeshift.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc46Shapeshift.cs new file mode 100644 index 0000000..0d4d0f9 --- /dev/null +++ b/src/Impostor.Api/Net/Messages/Rpcs/Rpc46Shapeshift.cs @@ -0,0 +1,20 @@ +using Impostor.Api.Games; +using Impostor.Api.Net.Inner.Objects; + +namespace Impostor.Api.Net.Messages.Rpcs +{ + public static class Rpc46Shapeshift + { + public static void Serialize(IMessageWriter writer, IInnerPlayerControl playerControl, bool shouldAnimate) + { + writer.Write(playerControl.NetId); + writer.Write(shouldAnimate); + } + + public static void Deserialize(IMessageReader reader, IGame game, out IInnerPlayerControl? playerControl, out bool shouldAnimate) + { + playerControl = reader.ReadNetObject(game); + shouldAnimate = reader.ReadBoolean(); + } + } +} diff --git a/src/Impostor.Server/Net/Inner/InnerNetObject.Anticheat.cs b/src/Impostor.Server/Net/Inner/InnerNetObject.Anticheat.cs index 64a8201..984d699 100644 --- a/src/Impostor.Server/Net/Inner/InnerNetObject.Anticheat.cs +++ b/src/Impostor.Server/Net/Inner/InnerNetObject.Anticheat.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Impostor.Api; +using Impostor.Api.Innersloth; using Impostor.Api.Net; using Impostor.Server.Net.Inner.Objects; @@ -98,6 +99,19 @@ namespace Impostor.Server.Net.Inner return true; } + protected async ValueTask ValidateRole(CheatContext context, IClientPlayer sender, InnerPlayerInfo playerInfo, RoleTypes role) + { + if (playerInfo.RoleType != role) + { + if (await sender.Client.ReportCheatAsync(context, $"Failed role = {role} check")) + { + return false; + } + } + + return true; + } + protected async ValueTask UnregisteredCall(CheatContext context, IClientPlayer sender) { if (await sender.Client.ReportCheatAsync(context, "Client sent unregistered call")) diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index cf89206..7c2a988 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -355,6 +355,18 @@ namespace Impostor.Server.Net.Inner.Objects break; } + case RpcCalls.Shapeshift: + { + if (!await ValidateRole(call, sender, PlayerInfo, RoleTypes.Shapeshifter)) + { + return false; + } + + Rpc46Shapeshift.Deserialize(reader, Game, out _, out _); + + break; + } + default: return await base.HandleRpcAsync(sender, target, call, reader); } -- 2.39.5