From 8392fe42373df6b19484629bca94f8d8ef571005 Mon Sep 17 00:00:00 2001 From: AeonLucid Date: Thu, 15 Oct 2020 05:58:07 +0200 Subject: [PATCH] Parse GameData headers --- src/Impostor.Server.Api/Games/IGame.cs | 2 + src/Impostor.Server/Net/Client.cs | 9 ++- .../Net/State/Game.Incoming.cs | 79 ++++++++++++++++++- .../Innersloth/GameData/GameDataTag.cs | 13 +++ submodules/Hazel-Networking | 2 +- 5 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 src/Impostor.Shared/Innersloth/GameData/GameDataTag.cs diff --git a/src/Impostor.Server.Api/Games/IGame.cs b/src/Impostor.Server.Api/Games/IGame.cs index 13ffca9..84a301d 100644 --- a/src/Impostor.Server.Api/Games/IGame.cs +++ b/src/Impostor.Server.Api/Games/IGame.cs @@ -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 diff --git a/src/Impostor.Server/Net/Client.cs b/src/Impostor.Server/Net/Client.cs index e80951e..d82da6e 100644 --- a/src/Impostor.Server/Net/Client.cs +++ b/src/Impostor.Server/Net/Client.cs @@ -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); diff --git a/src/Impostor.Server/Net/State/Game.Incoming.cs b/src/Impostor.Server/Net/State/Game.Incoming.cs index 26a80b3..45f820f 100644 --- a/src/Impostor.Server/Net/State/Game.Incoming.cs +++ b/src/Impostor.Server/Net/State/Game.Incoming.cs @@ -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 index 0000000..757ab5e --- /dev/null +++ b/src/Impostor.Shared/Innersloth/GameData/GameDataTag.cs @@ -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 diff --git a/submodules/Hazel-Networking b/submodules/Hazel-Networking index f00245d..ebc3b36 160000 --- a/submodules/Hazel-Networking +++ b/submodules/Hazel-Networking @@ -1 +1 @@ -Subproject commit f00245df4523dbddd20e09ce52fd3c02cd8cda37 +Subproject commit ebc3b36068f57ebc1d34106e7778560fc8c09559 -- 2.39.5