/// <param name="value">Value to write.</param>
void WritePacked(int value);
+ /// <summary>
+ /// Writes an packed uint to the message.
+ /// </summary>
+ /// <param name="value">Value to write.</param>
+ void WritePacked(uint value);
+
/// <summary>
/// Writes raw bytes to the message.
/// </summary>
Writer.WritePacked(value);
}
+ public void WritePacked(uint value)
+ {
+ Writer.WritePacked(value);
+ }
+
public void Write(ReadOnlyMemory<byte> data)
{
Writer.Write(data.ToArray()); // TODO: Fix memory allocation.
--- /dev/null
+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<TaskInfo> 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<TaskInfo>();
+ for (var i = 0; i < taskCount; i++)
+ {
+ Tasks.Add(new TaskInfo());
+ Tasks[i].Deserialize(reader);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+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
-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<PlayerInfo> _allPlayers;
public InnerGameData(IGame game)
{
_game = game;
+ _allPlayers = new List<PlayerInfo>();
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