]> git.deb.at Git - rhonda/impostor.git/commitdiff
GameData playerinfo parsing
authorAeonLucid <aeonlucid@gmail.com>
Fri, 16 Oct 2020 03:35:37 +0000 (05:35 +0200)
committerAeonLucid <aeonlucid@gmail.com>
Sun, 18 Oct 2020 19:17:41 +0000 (21:17 +0200)
src/Impostor.Server.Api/Net/Messages/IMessageWriter.cs
src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs
src/Impostor.Server/GameData/Objects/InnerGameData.PlayerInfo.cs [new file with mode: 0644]
src/Impostor.Server/GameData/Objects/InnerGameData.TaskInfo.cs [new file with mode: 0644]
src/Impostor.Server/GameData/Objects/InnerGameData.cs

index 77a6cf11e54cf86f4b84485f2acdf8262e9d29fb..add3154e96e1dc6740fcf6dd28f9174466284b85 100644 (file)
@@ -75,6 +75,12 @@ namespace Impostor.Server.Net.Messages
         /// <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>
index 83147b44dd41c1fe90cc7a4abd98168b88034934..0d4031393007812782ed38bde309b7a9245c472a 100644 (file)
@@ -94,6 +94,11 @@ namespace Impostor.Server.Hazel.Messages
             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.
diff --git a/src/Impostor.Server/GameData/Objects/InnerGameData.PlayerInfo.cs b/src/Impostor.Server/GameData/Objects/InnerGameData.PlayerInfo.cs
new file mode 100644 (file)
index 0000000..3e1f9de
--- /dev/null
@@ -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<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
diff --git a/src/Impostor.Server/GameData/Objects/InnerGameData.TaskInfo.cs b/src/Impostor.Server/GameData/Objects/InnerGameData.TaskInfo.cs
new file mode 100644 (file)
index 0000000..6082c14
--- /dev/null
@@ -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
index a25202c1a495ef2348763111b6493265e9462cd8..bbce83d69316eaca7398e7db8d5908bbf2af1773 100644 (file)
@@ -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<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