From c3a2d6ecfd18308b24af2abc1625ff7b3ce8072d Mon Sep 17 00:00:00 2001 From: AeonLucid Date: Fri, 16 Oct 2020 05:35:37 +0200 Subject: [PATCH] GameData playerinfo parsing --- .../Net/Messages/IMessageWriter.cs | 6 ++ .../Messages/HazelMessageWriter.cs | 5 ++ .../Objects/InnerGameData.PlayerInfo.cs | 59 +++++++++++++++++++ .../Objects/InnerGameData.TaskInfo.cs | 27 +++++++++ .../GameData/Objects/InnerGameData.cs | 59 +++++++++++++++++-- 5 files changed, 151 insertions(+), 5 deletions(-) create mode 100644 src/Impostor.Server/GameData/Objects/InnerGameData.PlayerInfo.cs create mode 100644 src/Impostor.Server/GameData/Objects/InnerGameData.TaskInfo.cs diff --git a/src/Impostor.Server.Api/Net/Messages/IMessageWriter.cs b/src/Impostor.Server.Api/Net/Messages/IMessageWriter.cs index 77a6cf1..add3154 100644 --- a/src/Impostor.Server.Api/Net/Messages/IMessageWriter.cs +++ b/src/Impostor.Server.Api/Net/Messages/IMessageWriter.cs @@ -75,6 +75,12 @@ namespace Impostor.Server.Net.Messages /// Value to write. void WritePacked(int value); + /// + /// Writes an packed uint to the message. + /// + /// Value to write. + void WritePacked(uint value); + /// /// Writes raw bytes to the message. /// diff --git a/src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs b/src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs index 83147b4..0d40313 100644 --- a/src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs +++ b/src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs @@ -94,6 +94,11 @@ namespace Impostor.Server.Hazel.Messages Writer.WritePacked(value); } + public void WritePacked(uint value) + { + Writer.WritePacked(value); + } + public void Write(ReadOnlyMemory data) { Writer.Write(data.ToArray()); // TODO: Fix memory allocation. diff --git a/src/Impostor.Server/GameData/Objects/InnerGameData.PlayerInfo.cs b/src/Impostor.Server/GameData/Objects/InnerGameData.PlayerInfo.cs new file mode 100644 index 0000000..3e1f9de --- /dev/null +++ b/src/Impostor.Server/GameData/Objects/InnerGameData.PlayerInfo.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using Impostor.Server.Net.Messages; + +namespace Impostor.Server.GameData.Objects +{ + public partial class InnerGameData + { + public class PlayerInfo + { + public PlayerInfo(byte playerId) + { + PlayerId = playerId; + } + + public byte PlayerId { get; } + + public string PlayerName { get; private set; } + + public byte ColorId { get; private set; } + + public uint HatId { get; private set; } + + public uint SkinId { get; private set; } + + public bool Disconnected { get; private set; } + + public bool IsImpostor { get; private set; } + + public bool IsDead { get; private set; } + + public List Tasks { get; private set; } + + public void Serialize(IMessageWriter writer) + { + throw new NotImplementedException(); + } + + public void Deserialize(IMessageReader reader) + { + PlayerName = reader.ReadString(); + ColorId = reader.ReadByte(); + HatId = reader.ReadPackedUInt32(); + SkinId = reader.ReadPackedUInt32(); + var flag = reader.ReadByte(); + Disconnected = (flag & 1) > 0; + IsImpostor = (flag & 2) > 0; + IsDead = (flag & 4) > 0; + var taskCount = reader.ReadByte(); + Tasks = new List(); + for (var i = 0; i < taskCount; i++) + { + Tasks.Add(new TaskInfo()); + Tasks[i].Deserialize(reader); + } + } + } + } +} \ No newline at end of file diff --git a/src/Impostor.Server/GameData/Objects/InnerGameData.TaskInfo.cs b/src/Impostor.Server/GameData/Objects/InnerGameData.TaskInfo.cs new file mode 100644 index 0000000..6082c14 --- /dev/null +++ b/src/Impostor.Server/GameData/Objects/InnerGameData.TaskInfo.cs @@ -0,0 +1,27 @@ +using Hazel; +using Impostor.Server.Net.Messages; + +namespace Impostor.Server.GameData.Objects +{ + public partial class InnerGameData + { + public class TaskInfo + { + public uint Id { get; private set; } + + public bool Complete { get; private set; } + + public void Serialize(IMessageWriter writer) + { + writer.WritePacked(Id); + writer.Write(Complete); + } + + public void Deserialize(IMessageReader reader) + { + this.Id = reader.ReadPackedUInt32(); + this.Complete = reader.ReadBoolean(); + } + } + } +} \ No newline at end of file diff --git a/src/Impostor.Server/GameData/Objects/InnerGameData.cs b/src/Impostor.Server/GameData/Objects/InnerGameData.cs index a25202c..bbce83d 100644 --- a/src/Impostor.Server/GameData/Objects/InnerGameData.cs +++ b/src/Impostor.Server/GameData/Objects/InnerGameData.cs @@ -1,34 +1,83 @@ -using Impostor.Server.GameData.Objects.Components; +using System; +using System.Collections.Generic; +using Impostor.Server.GameData.Objects.Components; using Impostor.Server.Games; using Impostor.Server.Net.Messages; namespace Impostor.Server.GameData.Objects { - public class InnerGameData : InnerNetObject + public partial class InnerGameData : InnerNetObject { private readonly IGame _game; + private readonly List _allPlayers; public InnerGameData(IGame game) { _game = game; + _allPlayers = new List(); Components.Add(this); Components.Add(new InnerVoteBanSystem()); } + public PlayerInfo GetPlayerById(byte id) + { + foreach (var player in _allPlayers) + { + if (player.PlayerId == id) + { + return player; + } + } + + return null; + } + public override void HandleRpc(byte callId, IMessageReader reader) { - throw new System.NotImplementedException(); + throw new NotImplementedException(); } public override bool Serialize(IMessageWriter writer, bool initialState) { - throw new System.NotImplementedException(); + throw new NotImplementedException(); } public override void Deserialize(IMessageReader reader, bool initialState) { - throw new System.NotImplementedException(); + if (initialState) + { + var gameGuid = reader.ReadBytesAndSize(); + // var gameGuid = new Guid(reader.ReadBytesAndSize().Span); + var num = reader.ReadPackedInt32(); + + for (var i = 0; i < num; i++) + { + var playerInfo = new PlayerInfo(reader.ReadByte()); + playerInfo.Deserialize(reader); + _allPlayers.Add(playerInfo); + } + } + else + { + var num = reader.ReadByte(); + + for (var i = 0; i < num; i++) + { + var id = reader.ReadByte(); + var player = GetPlayerById(id); + if (player != null) + { + player.Deserialize(reader); + } + else + { + var playerInfo = new PlayerInfo(id); + playerInfo.Deserialize(reader); + _allPlayers.Add(playerInfo); + } + } + } } } } \ No newline at end of file -- 2.39.5