]> git.deb.at Git - rhonda/impostor.git/commitdiff
API Improvement and RpcCalls enum
authorAeonLucid <aeonlucid@outlook.com>
Fri, 23 Oct 2020 18:02:18 +0000 (20:02 +0200)
committerAeonLucid <aeonlucid@outlook.com>
Fri, 23 Oct 2020 18:02:18 +0000 (20:02 +0200)
26 files changed:
src/Impostor.Api/Games/IGame.cs
src/Impostor.Api/Innersloth/Data/DeathReason.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/GameNet.cs [deleted file]
src/Impostor.Api/Innersloth/GameData/GameDataTag.cs [deleted file]
src/Impostor.Api/Innersloth/GameOptionsData.cs
src/Impostor.Api/Innersloth/Net/GameDataTag.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Net/IGameNet.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Net/InnerNetObject.cs
src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs
src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs
src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.PlayerInfo.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs
src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs
src/Impostor.Api/Innersloth/Net/RpcCalls.cs [new file with mode: 0644]
src/Impostor.Api/Net/IClientPlayer.cs
src/Impostor.Api/Net/Messages/C2S/Message00HostGameC2S.cs
src/Impostor.Api/Net/Messages/C2S/Message16GetGameListC2S.cs
src/Impostor.Server/Net/State/ClientPlayer.cs
src/Impostor.Server/Net/State/Game.Api.cs
src/Impostor.Server/Net/State/Game.Data.cs
src/Impostor.Server/Net/State/Game.cs
src/Impostor.Server/Net/State/GameNet.cs [new file with mode: 0644]

index 05fcbdf471e4bfc2ffa4e7556801127d2633cef3..b098f7d1f069f444a82e25f31e26986b9d3db60e 100644 (file)
@@ -17,7 +17,7 @@ namespace Impostor.Api.Games
 
         GameStates GameState { get; }
 
-        GameNet GameNet { get; }
+        IGameNet GameNet { get; }
 
         IEnumerable<IClientPlayer> Players { get; }
 
diff --git a/src/Impostor.Api/Innersloth/Data/DeathReason.cs b/src/Impostor.Api/Innersloth/Data/DeathReason.cs
new file mode 100644 (file)
index 0000000..c473bfb
--- /dev/null
@@ -0,0 +1,9 @@
+namespace Impostor.Api.Innersloth.Data
+{
+    public enum DeathReason
+    {
+        Exile = 0,
+        Kill = 1,
+        Disconnect = 2
+    }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/GameNet.cs b/src/Impostor.Api/Innersloth/Data/GameNet.cs
deleted file mode 100644 (file)
index 614e6a2..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-using Impostor.Api.Games;
-using Impostor.Api.Innersloth.Net;
-using Impostor.Api.Innersloth.Net.Objects;
-using Impostor.Api.Innersloth.Net.Objects.Components;
-
-namespace Impostor.Api.Innersloth.Data
-{
-    /// <summary>
-    ///     Holds all data that is serialized over the network through GameData packets.
-    /// </summary>
-    public class GameNet
-    {
-        private readonly IGame _game;
-
-        public GameNet(IGame game)
-        {
-            _game = game;
-        }
-
-        public InnerLobbyBehaviour LobbyBehaviour { get; private set; }
-
-        public InnerGameData GameData { get; private set; }
-
-        public InnerVoteBanSystem VoteBan { get; private set; }
-
-        public InnerShipStatus ShipStatus { get; private set; }
-
-        internal void OnSpawn(InnerNetObject netObj)
-        {
-            switch (netObj)
-            {
-                case InnerLobbyBehaviour lobby:
-                {
-                    LobbyBehaviour = lobby;
-                    break;
-                }
-
-                case InnerGameData data:
-                {
-                    GameData = data;
-                    break;
-                }
-
-                case InnerVoteBanSystem voteBan:
-                {
-                    VoteBan = voteBan;
-                    break;
-                }
-
-                case InnerShipStatus shipStatus:
-                {
-                    ShipStatus = shipStatus;
-                    break;
-                }
-
-                case InnerPlayerControl control:
-                {
-                    // Hook up InnerPlayerControl <-> IClientPlayer.
-                    var clientPlayer = _game.GetClientPlayer(control.OwnerId);
-                    if (clientPlayer != null)
-                    {
-                        clientPlayer.Character = control;
-                    }
-
-                    // Hook up InnerPlayerControl <-> InnerPlayerControl.PlayerInfo.
-                    control.PlayerInfo = GameData.GetPlayerById(control.PlayerId);
-
-                    if (control.PlayerInfo == null)
-                    {
-                        GameData.AddPlayer(control);
-                    }
-
-                    break;
-                }
-            }
-        }
-
-        internal void OnDestroy(InnerNetObject netObj)
-        {
-            switch (netObj)
-            {
-                case InnerLobbyBehaviour lobby:
-                {
-                    LobbyBehaviour = null;
-                    break;
-                }
-
-                case InnerGameData:
-                {
-                    GameData = null;
-                    break;
-                }
-
-                case InnerVoteBanSystem:
-                {
-                    VoteBan = null;
-                    break;
-                }
-
-                case InnerShipStatus:
-                {
-                    ShipStatus = null;
-                    break;
-                }
-
-                case InnerPlayerControl control:
-                {
-                    // Remove InnerPlayerControl <-> IClientPlayer.
-                    var clientPlayer = _game.GetClientPlayer(control.OwnerId);
-                    if (clientPlayer != null)
-                    {
-                        clientPlayer.Character = null;
-                    }
-
-                    break;
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/GameData/GameDataTag.cs b/src/Impostor.Api/Innersloth/GameData/GameDataTag.cs
deleted file mode 100644 (file)
index d5f3fc5..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-namespace Impostor.Api.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
index 41bebff27a6d25a7e67e47b182b990329e4ac38d..5ffc1ff9b07323ae785d5c0fbd8afe193475b0c3 100644 (file)
@@ -1,7 +1,7 @@
-using Impostor.Api.Innersloth.Data;
-
-using System;
+using System;
 using System.IO;
+using Impostor.Api.Innersloth.Data;
+using Impostor.Api.Net.Messages;
 
 namespace Impostor.Api.Innersloth
 {
@@ -10,25 +10,45 @@ namespace Impostor.Api.Innersloth
         public const int LatestVersion = 2;
 
         public byte Version { get; set; }
+
         public byte MaxPlayers { get; set; }
+
         public GameKeywords Keywords { get; set; }
+
         public byte MapId { get; set; }
+
         public float PlayerSpeedMod { get; set; }
+
         public float CrewLightMod { get; set; }
+
         public float ImpostorLightMod { get; set; }
+
         public float KillCooldown { get; set; }
+
         public int NumCommonTasks { get; set; }
+
         public int NumLongTasks { get; set; }
+
         public int NumShortTasks { get; set; }
+
         public int NumEmergencyMeetings { get; set; }
+
         public int EmergencyCooldown { get; set; }
+
         public int NumImpostors { get; set; }
+
         public bool GhostsDoTasks { get; set; }
+
         public int KillDistance { get; set; }
+
         public int DiscussionTime { get; set; }
+
         public int VotingTime { get; set; }
+
         public bool ConfirmImpostor { get; set; }
+
         public bool VisualTasks { get; set; }
+
         public bool IsDefaults { get; set; }
 
         public void Serialize(BinaryWriter writer, byte version)
@@ -50,6 +70,7 @@ namespace Impostor.Api.Innersloth
             writer.Write((uint)DiscussionTime);
             writer.Write((uint)VotingTime);
             writer.Write((bool)IsDefaults);
+
             if (version > 1)
             {
                 writer.Write((byte)EmergencyCooldown);
@@ -60,48 +81,62 @@ namespace Impostor.Api.Innersloth
                 writer.Write((bool)ConfirmImpostor);
                 writer.Write((bool)VisualTasks);
             }
+
+            if (Version > 3)
+            {
+                throw new ImpostorException($"Unknown GameOptionsData version {Version}.");
+            }
         }
 
-        public static GameOptionsData Deserialize(ReadOnlyMemory<byte> memory)
+        public void Deserialize(ReadOnlyMemory<byte> memory)
         {
             var bytes = memory.Span;
 
-            var result = new GameOptionsData();
-            result.Version = bytes.ReadByte();
-            result.MaxPlayers = bytes.ReadByte();
-            result.Keywords = (GameKeywords)bytes.ReadUInt32();
-            result.MapId = bytes.ReadByte();
-            result.PlayerSpeedMod = bytes.ReadSingle();
+            Version = bytes.ReadByte();
+            MaxPlayers = bytes.ReadByte();
+            Keywords = (GameKeywords)bytes.ReadUInt32();
+            MapId = bytes.ReadByte();
+            PlayerSpeedMod = bytes.ReadSingle();
 
-            result.CrewLightMod = bytes.ReadSingle();
-            result.ImpostorLightMod = bytes.ReadSingle();
-            result.KillCooldown = bytes.ReadSingle();
+            CrewLightMod = bytes.ReadSingle();
+            ImpostorLightMod = bytes.ReadSingle();
+            KillCooldown = bytes.ReadSingle();
 
-            result.NumCommonTasks = bytes.ReadByte();
-            result.NumLongTasks = bytes.ReadByte();
-            result.NumShortTasks = bytes.ReadByte();
+            NumCommonTasks = bytes.ReadByte();
+            NumLongTasks = bytes.ReadByte();
+            NumShortTasks = bytes.ReadByte();
 
-            result.NumEmergencyMeetings = bytes.ReadInt32();
+            NumEmergencyMeetings = bytes.ReadInt32();
 
-            result.NumImpostors = bytes.ReadByte();
-            result.KillDistance = bytes.ReadByte();
-            result.DiscussionTime = bytes.ReadInt32();
-            result.VotingTime = bytes.ReadInt32();
+            NumImpostors = bytes.ReadByte();
+            KillDistance = bytes.ReadByte();
+            DiscussionTime = bytes.ReadInt32();
+            VotingTime = bytes.ReadInt32();
 
-            result.IsDefaults = bytes.ReadBoolean();
+            IsDefaults = bytes.ReadBoolean();
 
-            if (result.Version > 1)
+            if (Version > 1)
             {
-                result.EmergencyCooldown = bytes.ReadByte();
+                EmergencyCooldown = bytes.ReadByte();
             }
 
-            if (result.Version > 2)
+            if (Version > 2)
             {
-                result.ConfirmImpostor = bytes.ReadBoolean();
-                result.VisualTasks = bytes.ReadBoolean();
+                ConfirmImpostor = bytes.ReadBoolean();
+                VisualTasks = bytes.ReadBoolean();
             }
 
-            return result;
+            if (Version > 3)
+            {
+                throw new ImpostorException($"Unknown GameOptionsData version {Version}.");
+            }
+        }
+
+        public static GameOptionsData DeserializeCreate(IMessageReader reader)
+        {
+            var options = new GameOptionsData();
+            options.Deserialize(reader.ReadBytesAndSize());
+            return options;
         }
     }
 }
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Net/GameDataTag.cs b/src/Impostor.Api/Innersloth/Net/GameDataTag.cs
new file mode 100644 (file)
index 0000000..ae2c879
--- /dev/null
@@ -0,0 +1,13 @@
+namespace Impostor.Api.Innersloth.Net
+{
+    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
diff --git a/src/Impostor.Api/Innersloth/Net/IGameNet.cs b/src/Impostor.Api/Innersloth/Net/IGameNet.cs
new file mode 100644 (file)
index 0000000..b1061f0
--- /dev/null
@@ -0,0 +1,16 @@
+using Impostor.Api.Innersloth.Net.Objects;
+using Impostor.Api.Innersloth.Net.Objects.Components;
+
+namespace Impostor.Api.Innersloth.Net
+{
+    public interface IGameNet
+    {
+        InnerLobbyBehaviour LobbyBehaviour { get; }
+
+        InnerGameData GameData { get; }
+
+        InnerVoteBanSystem VoteBan { get; }
+
+        InnerShipStatus ShipStatus { get; }
+    }
+}
\ No newline at end of file
index adb5a9e8c9dee59fc7b4f285676cd40bb842ee40..7981051a25b1445d5e9ba78ea4880e31dd9d3ca5 100644 (file)
@@ -11,7 +11,7 @@ namespace Impostor.Api.Innersloth.Net
 
         public SpawnFlags SpawnFlags { get; internal set; }
 
-        public abstract void HandleRpc(IClientPlayer sender, byte callId, IMessageReader reader);
+        public abstract void HandleRpc(IClientPlayer sender, IClientPlayer target, RpcCalls call, IMessageReader reader);
 
         public abstract bool Serialize(IMessageWriter writer, bool initialState);
 
index a506d2e101c57d09eba9e1676e8c20898cb56954..4567ae7a398467e7c2c06b49653ec22b6cfc0c9f 100644 (file)
@@ -44,15 +44,15 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
             return new Vector2(XRange.Lerp(v1), YRange.Lerp(v2));
         }
 
-        public override void HandleRpc(IClientPlayer sender, byte callId, IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer target, RpcCalls call, IMessageReader reader)
         {
-            if (callId == 0)
+            if (call == 0)
             {
                 SnapTo(ReadVector2(reader), reader.ReadUInt16());
             }
             else
             {
-                _logger.LogWarning("InnerCustomNetworkTransform: Unknown rpc call {0}", callId);
+                _logger.LogWarning("InnerCustomNetworkTransform: Unknown rpc call {0}", call);
             }
         }
 
index c4b83a58250f825252bf30018c1268218b5401af..6ecfe63c1d81981945cc88258aba7b6bea407e49 100644 (file)
@@ -5,7 +5,7 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
 {
     public class InnerPlayerPhysics : InnerNetObject
     {
-        public override void HandleRpc(IClientPlayer sender, byte callId, IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer target, RpcCalls call, IMessageReader reader)
         {
             throw new System.NotImplementedException();
         }
index 266a3d55cf30e369ed1e43d91199376da08f8b4d..7930853ed5627f0d7ef3e161c18c7a79c4d9d869 100644 (file)
@@ -14,7 +14,7 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components
             _votes = new Dictionary<int, int[]>();
         }
 
-        public override void HandleRpc(IClientPlayer sender, byte callId, IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer target, RpcCalls call, IMessageReader reader)
         {
             throw new NotImplementedException();
         }
index df8f149b4d4fa227d807c4ff05c581bde5e1c740..3cc8a837f64c06e34caca4fef2ace59df7931cd2 100644 (file)
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using Impostor.Api.Innersloth.Data;
 using Impostor.Api.Net.Messages;
 
 namespace Impostor.Api.Innersloth.Net.Objects
@@ -29,7 +30,9 @@ namespace Impostor.Api.Innersloth.Net.Objects
 
             public bool IsImpostor { get; internal set; }
 
-            public bool IsDead { get; private set; }
+            public bool IsDead { get; internal set; }
+
+            public DeathReason LastDeathReason { get; internal set; }
 
             public List<TaskInfo> Tasks { get; private set; }
 
index 6c2eb6a74e84452e5f678d9b800f6d4597e7b07a..a4e05ef3c11f623ac895ee69b26878abe0625dbd 100644 (file)
@@ -42,7 +42,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
             return _allPlayers.TryGetValue(id, out var player) ? player : null;
         }
 
-        public override void HandleRpc(IClientPlayer sender, byte callId, IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer target, RpcCalls call, IMessageReader reader)
         {
             throw new NotImplementedException();
         }
index 3863f41abcebf216f38bd4ee97328c2cd37d55ac..7a3f8a9d285f6298028dd0c7dbf7fb1acdea35bf 100644 (file)
@@ -15,7 +15,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
             Components.Add(this);
         }
 
-        public override void HandleRpc(IClientPlayer sender, byte callId, IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer target, RpcCalls call, IMessageReader reader)
         {
             throw new System.NotImplementedException();
         }
index f60cd7ee45535cd4f49d9cedd2616beb7e809361..8496c65a8f8ef4296aa471ccdee6db692f9a673a 100644 (file)
@@ -10,7 +10,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
     public partial class InnerMeetingHud : InnerNetObject
     {
         private readonly IGame _game;
-        private readonly GameNet _gameNet;
+        private readonly IGameNet _gameNet;
         private PlayerVoteArea[] _playerStates;
 
         public InnerMeetingHud(IGame game)
@@ -36,7 +36,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
                 .ToArray();
         }
 
-        public override void HandleRpc(IClientPlayer sender, byte callId, IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer target, RpcCalls call, IMessageReader reader)
         {
             throw new NotImplementedException();
         }
index 65860f117ccf2cf02c6c6afd13288d5e2f7d6092..a6c44fbb66d530c1cb7f15078e8ba6e3456a72a0 100644 (file)
@@ -1,18 +1,22 @@
 using System;
 using Impostor.Api.Games;
+using Impostor.Api.Innersloth.Data;
 using Impostor.Api.Innersloth.Net.Objects.Components;
 using Impostor.Api.Net;
 using Impostor.Api.Net.Messages;
 using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
 
 namespace Impostor.Api.Innersloth.Net.Objects
 {
     public class InnerPlayerControl : InnerNetObject
     {
+        private readonly ILogger<InnerPlayerControl> _logger;
         private readonly IGame _game;
 
-        public InnerPlayerControl(IGame game, IServiceProvider serviceProvider)
+        public InnerPlayerControl(ILogger<InnerPlayerControl> logger, IServiceProvider serviceProvider, IGame game)
         {
+            _logger = logger;
             _game = game;
 
             Components.Add(this);
@@ -28,11 +32,37 @@ namespace Impostor.Api.Innersloth.Net.Objects
 
         public InnerGameData.PlayerInfo PlayerInfo { get; internal set; }
 
-        public override void HandleRpc(IClientPlayer sender, byte callId, IMessageReader reader)
+        private void Die(DeathReason reason)
         {
-            switch (callId)
+            PlayerInfo.IsDead = true;
+            PlayerInfo.LastDeathReason = reason;
+        }
+
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer target, RpcCalls call, IMessageReader reader)
+        {
+            switch (call)
             {
-                case 3:
+                case RpcCalls.PlayAnimation:
+                {
+                    var animation = reader.ReadByte();
+                    break;
+                }
+
+                case RpcCalls.CompleteTask:
+                {
+                    var index = reader.ReadPackedUInt32();
+                    break;
+                }
+
+                case RpcCalls.SyncSettings:
+                {
+                    _game.Options.Deserialize(reader.ReadBytesAndSize());
+                    Console.WriteLine(_game.Options.PlayerSpeedMod);
+                    break;
+                }
+
+                // Set Impostors.
+                case RpcCalls.SetInfected:
                 {
                     var length = reader.ReadPackedInt32();
 
@@ -47,13 +77,32 @@ namespace Impostor.Api.Innersloth.Net.Objects
                     break;
                 }
 
-                case 6:
+                // Player was voted out.
+                case RpcCalls.Exiled:
+                {
+                    Console.WriteLine(PlayerInfo.PlayerName + " was voted out.");
+                    break;
+                }
+
+                // Validates the player name at the host.
+                case RpcCalls.CheckName:
+                {
+                    if (!target.IsHost)
+                    {
+
+                    }
+                    var name = reader.ReadString();
+                    break;
+                }
+
+                case RpcCalls.SetName:
                 {
                     PlayerInfo.PlayerName = reader.ReadString();
                     break;
                 }
 
                 default:
+                    _logger.LogWarning("InnerPlayerControl: Unknown rpc call {0}", call);
                     break;
             }
         }
index 1c08dd6612fc5376a11b953dc58ef30652282b1a..2aeffecb25ae6f07bb9601ab897442b3842c6b61 100644 (file)
@@ -39,11 +39,11 @@ namespace Impostor.Api.Innersloth.Net.Objects
             Components.Add(this);
         }
 
-        public override void HandleRpc(IClientPlayer sender, byte callId, IMessageReader reader)
+        public override void HandleRpc(IClientPlayer sender, IClientPlayer target, RpcCalls call, IMessageReader reader)
         {
-            switch (callId)
+            switch (call)
             {
-                case 27:
+                case RpcCalls.CloseDoorsOfType:
                 {
                     if (!sender.Character.PlayerInfo.IsImpostor)
                     {
@@ -53,7 +53,7 @@ namespace Impostor.Api.Innersloth.Net.Objects
                     break;
                 }
 
-                case 28:
+                case RpcCalls.RepairSystem:
                 {
                     var systemType = (SystemTypes)reader.ReadByte();
                     var player = _game.FindObjectByNetId<InnerPlayerControl>(reader.ReadPackedUInt32());
diff --git a/src/Impostor.Api/Innersloth/Net/RpcCalls.cs b/src/Impostor.Api/Innersloth/Net/RpcCalls.cs
new file mode 100644 (file)
index 0000000..86d068c
--- /dev/null
@@ -0,0 +1,37 @@
+namespace Impostor.Api.Innersloth.Net
+{
+    public enum RpcCalls : byte
+    {
+        PlayAnimation = 0,
+        CompleteTask = 1,
+        SyncSettings = 2,
+        SetInfected = 3,
+        Exiled = 4,
+        CheckName = 5,
+        SetName = 6,
+        CheckColor = 7,
+        SetColor = 8,
+        SetHat = 9,
+        SetSkin = 10,
+        ReportDeadBody = 11,
+        MurderPlayer = 12,
+        SendChat = 13,
+        StartMeeting = 14,
+        SetScanner = 15,
+        SendChatNote = 16,
+        SetPet = 17,
+        SetStartCounter = 18,
+        EnterVent = 19,
+        ExitVent = 20,
+        SnapTo = 21,
+        Close = 22,
+        VotingComplete = 23,
+        CastVote = 24,
+        ClearVote = 25,
+        AddVote = 26,
+        CloseDoorsOfType = 27,
+        RepairSystem = 28,
+        SetTasks = 29,
+        UpdateGameData = 30,
+    }
+}
\ No newline at end of file
index 9cd832a95f33113c8d4cb86124db96371d26a32f..528d2ecd9cb07b31ad555094e19ed8b189143cce 100644 (file)
@@ -24,7 +24,9 @@ namespace Impostor.Api.Net
         /// </summary>
         LimboStates Limbo { get; set; }
 
-        InnerPlayerControl Character { get; set; }
+        InnerPlayerControl Character { get; }
+
+        public bool IsHost { get; }
 
         ValueTask KickAsync();
 
index 1ee8b7681059e45489d5c5dcc226200bf0952d4a..4f5b39ce7bca57743b0d3bedf078ff5238437093 100644 (file)
@@ -21,7 +21,7 @@ namespace Impostor.Api.Net.Messages.C2S
 
         public static GameOptionsData Deserialize(IMessageReader reader)
         {
-            return GameOptionsData.Deserialize(reader.ReadBytesAndSize());
+            return GameOptionsData.DeserializeCreate(reader);
         }
     }
 }
\ No newline at end of file
index 219374d08b7ef7afcf40a58ee10b031bb9bf84df..2b7e12a76b7e45b1581e2d0f213dc749fc996d37 100644 (file)
@@ -12,7 +12,7 @@ namespace Impostor.Api.Net.Messages.C2S
         public static void Deserialize(IMessageReader reader, out GameOptionsData options)
         {
             reader.ReadPackedInt32(); // Hardcoded 0.
-            options = GameOptionsData.Deserialize(reader.ReadBytesAndSize());
+            options = GameOptionsData.DeserializeCreate(reader);
         }
     }
 }
\ No newline at end of file
index c03effa92b1d5947d186039594c63f6ca3d7166a..f677c20eac73d41e44a8fdca223649da8f57c07e 100644 (file)
@@ -20,8 +20,7 @@ namespace Impostor.Server.Net.State
         /// <inheritdoc />
         public LimboStates Limbo { get; set; }
 
-        // TODO: Correct visibility to set internal only.
-        public InnerPlayerControl Character { get; set; }
+        public InnerPlayerControl Character { get; internal set; }
 
         public bool IsHost => Game?.Host == this;
 
index a0d8b6f923df67b8ec5aae17bdfb2f0902ede48c..f7c73fbe7beec7c63b5c20b213d6cff3d26e11e2 100644 (file)
@@ -1,4 +1,5 @@
 using Impostor.Api.Games;
+using Impostor.Api.Innersloth.Net;
 using Impostor.Api.Net;
 
 namespace Impostor.Server.Net.State
@@ -6,5 +7,7 @@ namespace Impostor.Server.Net.State
     internal partial class Game
     {
         IClientPlayer IGame.Host => Host;
+
+        IGameNet IGame.GameNet => GameNet;
     }
 }
\ No newline at end of file
index d54f8b4528a0f0f05c6b9e3474155d334ac2d5c7..d502d965849a166b2827bf29b55096c0a41ad406 100644 (file)
@@ -5,9 +5,9 @@ using System.Threading;
 using System.Threading.Tasks;
 using Impostor.Api;
 using Impostor.Api.Innersloth.Data;
-using Impostor.Api.Innersloth.GameData;
 using Impostor.Api.Innersloth.Net;
 using Impostor.Api.Innersloth.Net.Objects;
+using Impostor.Api.Innersloth.Net.Objects.Components;
 using Impostor.Api.Net.Messages;
 using Impostor.Api.Net.Messages.C2S;
 using Impostor.Api.Net.Messages.S2C;
@@ -50,6 +50,96 @@ namespace Impostor.Server.Net.State
         private int _gamedataInitialized;
         private bool _gamedataFakeReceived;
 
+        internal void OnSpawn(InnerNetObject netObj)
+        {
+            switch (netObj)
+            {
+                case InnerLobbyBehaviour lobby:
+                {
+                    GameNet.LobbyBehaviour = lobby;
+                    break;
+                }
+
+                case InnerGameData data:
+                {
+                    GameNet.GameData = data;
+                    break;
+                }
+
+                case InnerVoteBanSystem voteBan:
+                {
+                    GameNet.VoteBan = voteBan;
+                    break;
+                }
+
+                case InnerShipStatus shipStatus:
+                {
+                    GameNet.ShipStatus = shipStatus;
+                    break;
+                }
+
+                case InnerPlayerControl control:
+                {
+                    // Hook up InnerPlayerControl <-> IClientPlayer.
+                    if (TryGetPlayer(control.OwnerId, out var player))
+                    {
+                        player.Character = control;
+                    }
+
+                    // Hook up InnerPlayerControl <-> InnerPlayerControl.PlayerInfo.
+                    control.PlayerInfo = GameNet.GameData.GetPlayerById(control.PlayerId);
+
+                    if (control.PlayerInfo == null)
+                    {
+                        GameNet.GameData.AddPlayer(control);
+                    }
+
+                    break;
+                }
+            }
+        }
+
+        internal void OnDestroy(InnerNetObject netObj)
+        {
+            switch (netObj)
+            {
+                case InnerLobbyBehaviour lobby:
+                {
+                    GameNet.LobbyBehaviour = null;
+                    break;
+                }
+
+                case InnerGameData:
+                {
+                    GameNet.GameData = null;
+                    break;
+                }
+
+                case InnerVoteBanSystem:
+                {
+                    GameNet.VoteBan = null;
+                    break;
+                }
+
+                case InnerShipStatus:
+                {
+                    GameNet.ShipStatus = null;
+                    break;
+                }
+
+                case InnerPlayerControl control:
+                {
+                    // Remove InnerPlayerControl <-> IClientPlayer.
+                    if (TryGetPlayer(control.OwnerId, out var player))
+                    {
+                        player.Character = null;
+                    }
+
+                    break;
+                }
+            }
+        }
+
         private async ValueTask InitGameDataAsync(ClientPlayer player)
         {
             if (Interlocked.Exchange(ref _gamedataInitialized, 1) != 0)
@@ -141,7 +231,7 @@ namespace Impostor.Server.Net.State
                             // TODO: Remove try catch.
                             try
                             {
-                                obj.HandleRpc(sender, reader.ReadByte(), reader);
+                                obj.HandleRpc(sender, target, (RpcCalls) reader.ReadByte(), reader);
                             }
                             catch (NotImplementedException)
                             {
@@ -218,7 +308,7 @@ namespace Impostor.Server.Net.State
                                     obj.Deserialize(sender, readerSub, true);
                                 }
 
-                                GameNet.OnSpawn(obj);
+                                OnSpawn(obj);
                             }
 
                             continue;
@@ -245,7 +335,7 @@ namespace Impostor.Server.Net.State
                             }
 
                             RemoveNetObject(obj);
-                            GameNet.OnDestroy(obj);
+                            OnDestroy(obj);
                             _logger.LogDebug("Destroyed InnerNetObject {0} ({1}), OwnerId {2}", obj.GetType().Name, netId, obj.OwnerId);
                         }
                         else
index b228fec9dacbbdcfc3e95f58b89d33d2e1de5a55..01c7903b330177cb91be6cdd422eae1977305f57 100644 (file)
@@ -8,16 +8,12 @@ using Impostor.Api.Events.Managers;
 using Impostor.Api.Games;
 using Impostor.Api.Innersloth;
 using Impostor.Api.Innersloth.Data;
+using Impostor.Api.Innersloth.Net;
 using Impostor.Api.Net;
 using Impostor.Api.Net.Messages;
 using Impostor.Api.Net.Messages.S2C;
-using Impostor.Hazel;
-using Impostor.Server.Net.Hazel;
 using Impostor.Server.Net.Manager;
-using Impostor.Server.Net.Redirector;
 using Microsoft.Extensions.Logging;
-using Serilog;
-using ILogger = Serilog.ILogger;
 
 namespace Impostor.Server.Net.State
 {
@@ -51,7 +47,7 @@ namespace Impostor.Server.Net.State
             Code = code;
             HostId = -1;
             GameState = GameStates.NotStarted;
-            GameNet = new GameNet(this);
+            GameNet = new GameNet();
             Options = options;
             _clientManager = clientManager;
             _eventManager = eventManager;
@@ -68,7 +64,7 @@ namespace Impostor.Server.Net.State
 
         public GameStates GameState { get; private set; }
 
-        public GameNet GameNet { get; }
+        internal GameNet GameNet { get; }
 
         public GameOptionsData Options { get; }
 
diff --git a/src/Impostor.Server/Net/State/GameNet.cs b/src/Impostor.Server/Net/State/GameNet.cs
new file mode 100644 (file)
index 0000000..f29aa32
--- /dev/null
@@ -0,0 +1,20 @@
+using Impostor.Api.Innersloth.Net;
+using Impostor.Api.Innersloth.Net.Objects;
+using Impostor.Api.Innersloth.Net.Objects.Components;
+
+namespace Impostor.Server.Net.State
+{
+    /// <summary>
+    ///     Holds all data that is serialized over the network through GameData packets.
+    /// </summary>
+    public class GameNet : IGameNet
+    {
+        public InnerLobbyBehaviour LobbyBehaviour { get; internal set; }
+
+        public InnerGameData GameData { get; internal set; }
+
+        public InnerVoteBanSystem VoteBan { get; internal set; }
+
+        public InnerShipStatus ShipStatus { get; internal set; }
+    }
+}
\ No newline at end of file