From 681126dfb54369b864a3d4751c6570dad99c703a Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Wed, 19 Aug 2026 21:33:39 +0200 Subject: [PATCH] Address my own comments --- .../Net/Messages/C2S/Message00HostGameC2S.cs | 6 ---- .../C2S/Message25HostModdedGameC2S.cs | 25 +++++++++++++++ .../Net/Messages/Rpcs/Rpc23VotingComplete.cs | 32 +++++++++++++------ src/Impostor.Server/Net/Client.cs | 2 +- .../Net/Inner/Objects/InnerMeetingHud.cs | 20 +++++++++--- 5 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 src/Impostor.Api/Net/Messages/C2S/Message25HostModdedGameC2S.cs diff --git a/src/Impostor.Api/Net/Messages/C2S/Message00HostGameC2S.cs b/src/Impostor.Api/Net/Messages/C2S/Message00HostGameC2S.cs index 76c0bf4..7388a02 100644 --- a/src/Impostor.Api/Net/Messages/C2S/Message00HostGameC2S.cs +++ b/src/Impostor.Api/Net/Messages/C2S/Message00HostGameC2S.cs @@ -20,11 +20,5 @@ namespace Impostor.Api.Net.Messages.C2S crossplayFlags = (CrossplayFlags)reader.ReadInt32(); gameFilterOptions = GameFilterOptions.Deserialize(reader); } - - public static void DeserializeModded(IMessageReader reader, out IGameOptions gameOptions, out CrossplayFlags crossplayFlags, out GameFilterOptions gameFilterOptions, out Guid modGuid) - { - Deserialize(reader, out gameOptions, out crossplayFlags, out gameFilterOptions); - modGuid = new Guid(reader.ReadBytes(16).Span); - } } } diff --git a/src/Impostor.Api/Net/Messages/C2S/Message25HostModdedGameC2S.cs b/src/Impostor.Api/Net/Messages/C2S/Message25HostModdedGameC2S.cs new file mode 100644 index 0000000..c32bdc6 --- /dev/null +++ b/src/Impostor.Api/Net/Messages/C2S/Message25HostModdedGameC2S.cs @@ -0,0 +1,25 @@ +using System; +using Impostor.Api.Innersloth; +using Impostor.Api.Innersloth.GameOptions; + +namespace Impostor.Api.Net.Messages.C2S +{ + /// + /// Special serialization rules for AU MCI HostGame messages. + /// + /// for more information. + /// + public static class Message25HostModdedGameC2S + { + public static void Serialize(IMessageWriter writer, IGameOptions gameOptions, CrossplayFlags crossplayFlags, GameFilterOptions gameFilterOptions) + { + Message00HostGameC2S.Serialize(writer, gameOptions, crossplayFlags, gameFilterOptions); + } + + public static void Deserialize(IMessageReader reader, out IGameOptions gameOptions, out CrossplayFlags crossplayFlags, out GameFilterOptions gameFilterOptions, out Guid modGuid) + { + Message00HostGameC2S.Deserialize(reader, out gameOptions, out crossplayFlags, out gameFilterOptions); + modGuid = new Guid(reader.ReadBytes(16).Span); + } + } +} diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc23VotingComplete.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc23VotingComplete.cs index a004bb5..56a1154 100644 --- a/src/Impostor.Api/Net/Messages/Rpcs/Rpc23VotingComplete.cs +++ b/src/Impostor.Api/Net/Messages/Rpcs/Rpc23VotingComplete.cs @@ -2,6 +2,15 @@ namespace Impostor.Api.Net.Messages.Rpcs { public static class Rpc23VotingComplete { + // Pre 18.0 version + // TODO clean up when 17.4 and below are unsupported + public static void Serialize(IMessageWriter writer, byte[] states, byte playerId, bool tie) + { + writer.WriteBytesAndSize(states); + writer.Write(playerId); + writer.Write(tie); + } + public static void Serialize(IMessageWriter writer, byte[] states, byte playerId, bool tie, bool wasOverruled, ushort overrideId) { writer.WriteBytesAndSize(states); @@ -11,7 +20,7 @@ namespace Impostor.Api.Net.Messages.Rpcs writer.Write(overrideId); } - public static void Deserialize(IMessageReader reader, bool hasOverruleFields, out IMessageReader[] states, out byte playerId, out bool tie, out bool wasOverruled, out ushort overrideId) + public static void Deserialize(IMessageReader reader, out IMessageReader[] states, out byte playerId, out bool tie) { var length = reader.ReadPackedInt32(); states = new IMessageReader[length]; @@ -22,17 +31,22 @@ namespace Impostor.Api.Net.Messages.Rpcs playerId = reader.ReadByte(); tie = reader.ReadBoolean(); + } - if (hasOverruleFields) - { - wasOverruled = reader.ReadBoolean(); - overrideId = reader.ReadUInt16(); - } - else + public static void Deserialize(IMessageReader reader, out IMessageReader[] states, out byte playerId, out bool tie, out bool wasOverruled, out ushort overrideId) + { + var length = reader.ReadPackedInt32(); + states = new IMessageReader[length]; + for (var i = 0; i < length; i++) { - wasOverruled = false; - overrideId = 0; + states[i] = reader.ReadMessage(); } + + playerId = reader.ReadByte(); + tie = reader.ReadBoolean(); + + wasOverruled = reader.ReadBoolean(); + overrideId = reader.ReadUInt16(); } } } diff --git a/src/Impostor.Server/Net/Client.cs b/src/Impostor.Server/Net/Client.cs index f508ee1..a7d65f2 100644 --- a/src/Impostor.Server/Net/Client.cs +++ b/src/Impostor.Server/Net/Client.cs @@ -138,7 +138,7 @@ namespace Impostor.Server.Net if (flag == MessageFlags.HostModdedGame) { - Message00HostGameC2S.DeserializeModded(reader, out gameOptions, out _, out gameFilterOptions, out var parsedModGuid); + Message25HostModdedGameC2S.Deserialize(reader, out gameOptions, out _, out gameFilterOptions, out var parsedModGuid); modGuid = parsedModGuid; } else diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerMeetingHud.cs b/src/Impostor.Server/Net/Inner/Objects/InnerMeetingHud.cs index 1d6d3c5..0f1a4e4 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerMeetingHud.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerMeetingHud.cs @@ -151,11 +151,23 @@ namespace Impostor.Server.Net.Inner.Objects return false; } - var hasOverruleFields = sender.Client.GameVersion >= JudgeMinVersion; - Rpc23VotingComplete.Deserialize(reader, hasOverruleFields, out var states, out var playerId, out var tie, out var wasOverruled, out var overrideId); - foreach (var messageReader in states) + if (sender.Client.GameVersion >= JudgeMinVersion) { - messageReader.Dispose(); + Rpc23VotingComplete.Deserialize(reader, out var states, out var playerId, out var tie, out var wasOverruled, out var overrideId); + + foreach (var messageReader in states) + { + messageReader.Dispose(); + } + } + else + { + Rpc23VotingComplete.Deserialize(reader, out var states, out var playerId, out var tie); + + foreach (var messageReader in states) + { + messageReader.Dispose(); + } } // This would be a nice place to implement an anti cheat. -- 2.39.5