--- /dev/null
+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();
+ }
+ }
+}
using System.Threading.Tasks;
using Impostor.Api;
+using Impostor.Api.Innersloth;
using Impostor.Api.Net;
using Impostor.Server.Net.Inner.Objects;
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"))
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);
}