Parse GameData headers

This commit is contained in:
AeonLucid committed 2020-10-18 21:17:41 +02:00
1 parent 33519a1ead
commit 8392fe4237
5 files changed
+102 -3

No files matched your search

+2
View 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);
}
}
+8 -1
View 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);
+78 -1
View 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;
}
}
}
}
}
}
@@ -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;
}
}