]> git.deb.at Git - rhonda/impostor.git/commitdiff
Add support for PackedGameDataTo
authorNikoCat233 <139348239+NikoCat233@users.noreply.github.com>
Tue, 12 May 2026 06:52:06 +0000 (14:52 +0800)
committerminiduikboot <mini@duikbo.at>
Sun, 24 May 2026 18:36:02 +0000 (20:36 +0200)
src/Impostor.Api/Net/Messages/MessageFlags.cs
src/Impostor.Server/Net/Client.cs
src/Impostor.Tools.Proxy/Program.cs

index a1a9a11a4074a320c7d4203a3804b6e6e8a5ac9a..a902e77a7e6150c901b58ff8dc09883ced3e055a 100644 (file)
@@ -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<byte, string> FlagCache;
 
index f675899e54e2989f4b92916bb96955ba458d2564..5f4572fe497860b616ca87d88f412e4e9855998e 100644 (file)
@@ -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;
+        }
+
         /// <summary>
         ///     Triggered when the connected client requests the PlatformSpecificData.
         /// </summary>
index 2485fd3e6603166fd6c000adf504b5509de369f6..0609ec9bdc380e2fb31fd299d0c80ce215df8944 100644 (file)
@@ -34,6 +34,7 @@ namespace Impostor.Tools.Proxy
             { 13, "Redirect" },
             { 14, "ReselectServer" },
             { 16, "GetGameListV2" },
+            { 26, "PackedGameDataTo" },
         };
 
         private static IServiceProvider _serviceProvider;