From 2cb9c648f33c79b8dd831cabddd06243a76fd5b9 Mon Sep 17 00:00:00 2001 From: NikoCat233 <139348239+NikoCat233@users.noreply.github.com> Date: Tue, 12 May 2026 14:52:06 +0800 Subject: [PATCH] Add support for PackedGameDataTo --- src/Impostor.Api/Net/Messages/MessageFlags.cs | 1 + src/Impostor.Server/Net/Client.cs | 65 +++++++++++++++++++ src/Impostor.Tools.Proxy/Program.cs | 1 + 3 files changed, 67 insertions(+) diff --git a/src/Impostor.Api/Net/Messages/MessageFlags.cs b/src/Impostor.Api/Net/Messages/MessageFlags.cs index a1a9a11..a902e77 100644 --- a/src/Impostor.Api/Net/Messages/MessageFlags.cs +++ b/src/Impostor.Api/Net/Messages/MessageFlags.cs @@ -29,6 +29,7 @@ namespace Impostor.Api.Net.Messages public const byte QueryPlatformIds = 22; public const byte QueryLobbyInfo = 23; public const byte EndGameHostMigration = 24; + public const byte PackedGameDataTo = 26; private static readonly Dictionary FlagCache; diff --git a/src/Impostor.Server/Net/Client.cs b/src/Impostor.Server/Net/Client.cs index f675899..5f4572f 100644 --- a/src/Impostor.Server/Net/Client.cs +++ b/src/Impostor.Server/Net/Client.cs @@ -259,6 +259,47 @@ namespace Impostor.Server.Net break; } + case MessageFlags.PackedGameDataTo: + { + if (!IsPackedGameDataToAllowed(reader)) + { + return; + } + + while (reader.Position < reader.Length) + { + using var packed = reader.ReadMessage(); + + if (packed.Tag != MessageFlags.GameDataTo) + { + _logger.LogWarning("PackedGameDataTo contained non-GameDataTo flag {0}.", packed.Tag); + return; + } + + if (packed.ReadInt32() != Player!.Game.Code) + { + _logger.LogWarning("PackedGameDataTo contained GameDataTo for the wrong game."); + return; + } + + var position = packed.Position; + var verified = await Player.Game.HandleGameDataAsync(packed, Player, true); + packed.Seek(position); + + if (!verified || Player == null) + { + return; + } + + using var writer = MessageWriter.Get(messageType); + var target = packed.ReadPackedInt32(); + packed.CopyTo(writer); + await Player.Game.SendToAsync(writer, target); + } + + break; + } + case MessageFlags.EndGame: { if (!IsPacketAllowed(reader, true)) @@ -344,6 +385,7 @@ namespace Impostor.Server.Net #if DEBUG if (flag != MessageFlags.GameData && flag != MessageFlags.GameDataTo && + flag != MessageFlags.PackedGameDataTo && flag != MessageFlags.EndGame && reader.Position < reader.Length) { @@ -407,6 +449,29 @@ namespace Impostor.Server.Net return true; } + private bool IsPackedGameDataToAllowed(IMessageReader message) + { + if (Player == null) + { + return false; + } + + var game = Player.Game; + + if (message.ReadPackedInt32() != game.Code) + { + return false; + } + + if (game.HostId == Id) + { + return true; + } + + _logger.LogWarning("[{0}] Client sent PackedGameDataTo only allowed by the host ({1}).", Id, game.HostId); + return false; + } + /// /// Triggered when the connected client requests the PlatformSpecificData. /// diff --git a/src/Impostor.Tools.Proxy/Program.cs b/src/Impostor.Tools.Proxy/Program.cs index 2485fd3..0609ec9 100644 --- a/src/Impostor.Tools.Proxy/Program.cs +++ b/src/Impostor.Tools.Proxy/Program.cs @@ -34,6 +34,7 @@ namespace Impostor.Tools.Proxy { 13, "Redirect" }, { 14, "ReselectServer" }, { 16, "GetGameListV2" }, + { 26, "PackedGameDataTo" }, }; private static IServiceProvider _serviceProvider; -- 2.39.5