]> git.deb.at Git - rhonda/impostor.git/commitdiff
Allow Shapeshifters to use RPC Shapeshift
authorminiduikboot <mini@duikbo.at>
Fri, 12 Nov 2021 21:57:52 +0000 (22:57 +0100)
committerminiduikboot <mini@duikbo.at>
Fri, 12 Nov 2021 22:12:47 +0000 (23:12 +0100)
src/Impostor.Api/Net/Messages/Rpcs/Rpc46Shapeshift.cs [new file with mode: 0644]
src/Impostor.Server/Net/Inner/InnerNetObject.Anticheat.cs
src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.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 (file)
index 0000000..0d4d0f9
--- /dev/null
@@ -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<IInnerPlayerControl>(game);
+            shouldAnimate = reader.ReadBoolean();
+        }
+    }
+}
index 64a82016065c34e291af2db375b449dbd263c300..984d69928b70a437ec9f5ea0cd58edd48e1f7f63 100644 (file)
@@ -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<bool> 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<bool> UnregisteredCall(CheatContext context, IClientPlayer sender)
         {
             if (await sender.Client.ReportCheatAsync(context, "Client sent unregistered call"))
index cf8920686fd2e2c75086c0b9751feb88bbdf6e80..7c2a9889f25376cdcda2ec3d8ed505c1dd5e8bf5 100644 (file)
@@ -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);
             }