]> git.deb.at Git - rhonda/impostor.git/commitdiff
Parse GameData headers
authorAeonLucid <aeonlucid@gmail.com>
Thu, 15 Oct 2020 03:58:07 +0000 (05:58 +0200)
committerAeonLucid <aeonlucid@gmail.com>
Sun, 18 Oct 2020 19:17:41 +0000 (21:17 +0200)
src/Impostor.Server.Api/Games/IGame.cs
src/Impostor.Server/Net/Client.cs
src/Impostor.Server/Net/State/Game.Incoming.cs
src/Impostor.Shared/Innersloth/GameData/GameDataTag.cs [new file with mode: 0644]
submodules/Hazel-Networking

index 13ffca958a81be128a10ee08dc06258d1607e54c..84a301dda2258f91d1e593c4145e37103bd7e003 100644 (file)
@@ -57,5 +57,7 @@ namespace Impostor.Server.Games
         ValueTask HandleRemovePlayer(int playerId, DisconnectReason reason);
 
         ValueTask HandleAlterGame(IMessageReader message, IClientPlayer sender, bool isPublic);
+
+        ValueTask HandleGameData(IMessageReader parent, IClientPlayer sender, bool toPlayer);
     }
 }
\ No newline at end of file
index e80951e185f4e65e7f546e62ea6633b0df2fd975..d82da6ecf84517b079712bdfde759564c9d786b0 100644 (file)
@@ -1,4 +1,5 @@
 using System;
+using System.Runtime.InteropServices;
 using System.Threading.Tasks;
 using Hazel;
 using Impostor.Server.Data;
@@ -144,10 +145,16 @@ namespace Impostor.Server.Net
                         return;
                     }
 
+                    var toPlayer = flag == MessageFlags.GameDataTo;
+
+                    // Handle packet.
+                    var readerCopy = reader.Slice(reader.Position);
+                    await Player.Game.HandleGameData(readerCopy, Player, toPlayer);
+
                     // Broadcast packet to all other players.
                     using var writer = Player.Game.CreateMessage(message.Type);
 
-                    if (flag == MessageFlags.GameDataTo)
+                    if (toPlayer)
                     {
                         var target = reader.ReadPackedInt32();
                         reader.CopyTo(writer);
index 26a80b3c3af5abfb7ddfc95de22abcce224ff26b..45f820f68fb909c235a12ece7d0c3c2ab7fbc325 100644 (file)
@@ -1,7 +1,9 @@
-using System.Threading.Tasks;
+using System;
+using System.Threading.Tasks;
 using Impostor.Server.Games;
 using Impostor.Server.Net.Messages;
 using Impostor.Shared.Innersloth.Data;
+using Impostor.Shared.Innersloth.GameData;
 
 namespace Impostor.Server.Net.State
 {
@@ -193,5 +195,80 @@ namespace Impostor.Server.Net.State
 
             await BroadcastJoinMessage(packet, true, sender);
         }
+
+        public async ValueTask HandleGameData(IMessageReader parent, IClientPlayer sender, bool toPlayer)
+        {
+            // Find target player.
+            IClientPlayer target = null;
+
+            if (toPlayer)
+            {
+                var targetId = parent.ReadPackedInt32();
+                if (!TryGetPlayer(targetId, out target))
+                {
+                    // Invalid target.
+                    return;
+                }
+            }
+
+            // Parse GameData messages.
+            while (parent.Position < parent.Length)
+            {
+                var reader = parent.ReadMessage();
+
+                switch (reader.Tag)
+                {
+                    case GameDataTag.DataFlag:
+                    {
+                        var objectNetId = reader.ReadPackedUInt32();
+                        Logger.Verbose("> Update {0}", objectNetId);
+                        break;
+                    }
+
+                    case GameDataTag.RpcFlag:
+                    {
+                        var objectNetId = reader.ReadPackedUInt32();
+                        var callId = reader.ReadByte();
+                        Logger.Verbose("> RPC {0} {1}", objectNetId, callId);
+                        break;
+                    }
+
+                    case GameDataTag.SpawnFlag:
+                    {
+                        var objectId = reader.ReadPackedUInt32();
+                        Logger.Verbose("> Spawn {0}", objectId);
+                        break;
+                    }
+
+                    case GameDataTag.DespawnFlag:
+                    {
+                        var objectNetId = reader.ReadPackedUInt32();
+                        Logger.Verbose("> Destroy {0}", objectNetId);
+                        break;
+                    }
+
+                    case GameDataTag.SceneChangeFlag:
+                    {
+                        var clientId = reader.ReadPackedInt32();
+                        var targetScene = reader.ReadString();
+                        Logger.Verbose("> Scene {0} to {1}", clientId, targetScene);
+                        break;
+                    }
+
+                    case GameDataTag.ReadyFlag:
+                    {
+                        var clientId = reader.ReadPackedInt32();
+                        Logger.Verbose("> IsReady {0}", clientId);
+                        break;
+                    }
+
+                    default:
+                    {
+                        Logger.Debug("Bad GameData tag {0}", reader.Tag);
+                        break;
+                    }
+                }
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/src/Impostor.Shared/Innersloth/GameData/GameDataTag.cs b/src/Impostor.Shared/Innersloth/GameData/GameDataTag.cs
new file mode 100644 (file)
index 0000000..757ab5e
--- /dev/null
@@ -0,0 +1,13 @@
+namespace Impostor.Shared.Innersloth.GameData
+{
+    public static class GameDataTag
+    {
+        public const byte DataFlag = 1;
+        public const byte RpcFlag = 2;
+        public const byte SpawnFlag = 4;
+        public const byte DespawnFlag = 5;
+        public const byte SceneChangeFlag = 6;
+        public const byte ReadyFlag = 7;
+        public const byte ChangeSettingsFlag = 8;
+    }
+}
\ No newline at end of file
index f00245df4523dbddd20e09ce52fd3c02cd8cda37..ebc3b36068f57ebc1d34106e7778560fc8c09559 160000 (submodule)
@@ -1 +1 @@
-Subproject commit f00245df4523dbddd20e09ce52fd3c02cd8cda37
+Subproject commit ebc3b36068f57ebc1d34106e7778560fc8c09559