using System;
+using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Hazel;
using Impostor.Server.Data;
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);
-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
{
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
--- /dev/null
+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