From: AeonLucid Date: Fri, 23 Oct 2020 18:02:18 +0000 (+0200) Subject: API Improvement and RpcCalls enum X-Git-Tag: v1.2.2~96^2~40 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=9e1292ce1f621933eadd52a38738136668ee482b;p=rhonda%2Fimpostor.git API Improvement and RpcCalls enum --- diff --git a/src/Impostor.Api/Games/IGame.cs b/src/Impostor.Api/Games/IGame.cs index 05fcbdf..b098f7d 100644 --- a/src/Impostor.Api/Games/IGame.cs +++ b/src/Impostor.Api/Games/IGame.cs @@ -17,7 +17,7 @@ namespace Impostor.Api.Games GameStates GameState { get; } - GameNet GameNet { get; } + IGameNet GameNet { get; } IEnumerable Players { get; } diff --git a/src/Impostor.Api/Innersloth/Data/DeathReason.cs b/src/Impostor.Api/Innersloth/Data/DeathReason.cs new file mode 100644 index 0000000..c473bfb --- /dev/null +++ b/src/Impostor.Api/Innersloth/Data/DeathReason.cs @@ -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 index 614e6a2..0000000 --- a/src/Impostor.Api/Innersloth/Data/GameNet.cs +++ /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 -{ - /// - /// Holds all data that is serialized over the network through GameData packets. - /// - 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 index d5f3fc5..0000000 --- a/src/Impostor.Api/Innersloth/GameData/GameDataTag.cs +++ /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 diff --git a/src/Impostor.Api/Innersloth/GameOptionsData.cs b/src/Impostor.Api/Innersloth/GameOptionsData.cs index 41bebff..5ffc1ff 100644 --- a/src/Impostor.Api/Innersloth/GameOptionsData.cs +++ b/src/Impostor.Api/Innersloth/GameOptionsData.cs @@ -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 memory) + public void Deserialize(ReadOnlyMemory 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 index 0000000..ae2c879 --- /dev/null +++ b/src/Impostor.Api/Innersloth/Net/GameDataTag.cs @@ -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 index 0000000..b1061f0 --- /dev/null +++ b/src/Impostor.Api/Innersloth/Net/IGameNet.cs @@ -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 diff --git a/src/Impostor.Api/Innersloth/Net/InnerNetObject.cs b/src/Impostor.Api/Innersloth/Net/InnerNetObject.cs index adb5a9e..7981051 100644 --- a/src/Impostor.Api/Innersloth/Net/InnerNetObject.cs +++ b/src/Impostor.Api/Innersloth/Net/InnerNetObject.cs @@ -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); diff --git a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs index a506d2e..4567ae7 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerCustomNetworkTransform.cs @@ -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); } } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs index c4b83a5..6ecfe63 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerPlayerPhysics.cs @@ -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(); } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs index 266a3d5..7930853 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/Components/InnerVoteBanSystem.cs @@ -14,7 +14,7 @@ namespace Impostor.Api.Innersloth.Net.Objects.Components _votes = new Dictionary(); } - 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(); } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.PlayerInfo.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.PlayerInfo.cs index df8f149..3cc8a83 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.PlayerInfo.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.PlayerInfo.cs @@ -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 Tasks { get; private set; } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs index 6c2eb6a..a4e05ef 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerGameData.cs @@ -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(); } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs index 3863f41..7a3f8a9 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerLobbyBehaviour.cs @@ -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(); } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs index f60cd7e..8496c65 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerMeetingHud.cs @@ -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(); } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs index 65860f1..a6c44fb 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerPlayerControl.cs @@ -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 _logger; private readonly IGame _game; - public InnerPlayerControl(IGame game, IServiceProvider serviceProvider) + public InnerPlayerControl(ILogger 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; } } diff --git a/src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs b/src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs index 1c08dd6..2aeffec 100644 --- a/src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs +++ b/src/Impostor.Api/Innersloth/Net/Objects/InnerShipStatus.cs @@ -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(reader.ReadPackedUInt32()); diff --git a/src/Impostor.Api/Innersloth/Net/RpcCalls.cs b/src/Impostor.Api/Innersloth/Net/RpcCalls.cs new file mode 100644 index 0000000..86d068c --- /dev/null +++ b/src/Impostor.Api/Innersloth/Net/RpcCalls.cs @@ -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 diff --git a/src/Impostor.Api/Net/IClientPlayer.cs b/src/Impostor.Api/Net/IClientPlayer.cs index 9cd832a..528d2ec 100644 --- a/src/Impostor.Api/Net/IClientPlayer.cs +++ b/src/Impostor.Api/Net/IClientPlayer.cs @@ -24,7 +24,9 @@ namespace Impostor.Api.Net /// LimboStates Limbo { get; set; } - InnerPlayerControl Character { get; set; } + InnerPlayerControl Character { get; } + + public bool IsHost { get; } ValueTask KickAsync(); diff --git a/src/Impostor.Api/Net/Messages/C2S/Message00HostGameC2S.cs b/src/Impostor.Api/Net/Messages/C2S/Message00HostGameC2S.cs index 1ee8b76..4f5b39c 100644 --- a/src/Impostor.Api/Net/Messages/C2S/Message00HostGameC2S.cs +++ b/src/Impostor.Api/Net/Messages/C2S/Message00HostGameC2S.cs @@ -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 diff --git a/src/Impostor.Api/Net/Messages/C2S/Message16GetGameListC2S.cs b/src/Impostor.Api/Net/Messages/C2S/Message16GetGameListC2S.cs index 219374d..2b7e12a 100644 --- a/src/Impostor.Api/Net/Messages/C2S/Message16GetGameListC2S.cs +++ b/src/Impostor.Api/Net/Messages/C2S/Message16GetGameListC2S.cs @@ -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 diff --git a/src/Impostor.Server/Net/State/ClientPlayer.cs b/src/Impostor.Server/Net/State/ClientPlayer.cs index c03effa..f677c20 100644 --- a/src/Impostor.Server/Net/State/ClientPlayer.cs +++ b/src/Impostor.Server/Net/State/ClientPlayer.cs @@ -20,8 +20,7 @@ namespace Impostor.Server.Net.State /// 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; diff --git a/src/Impostor.Server/Net/State/Game.Api.cs b/src/Impostor.Server/Net/State/Game.Api.cs index a0d8b6f..f7c73fb 100644 --- a/src/Impostor.Server/Net/State/Game.Api.cs +++ b/src/Impostor.Server/Net/State/Game.Api.cs @@ -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 diff --git a/src/Impostor.Server/Net/State/Game.Data.cs b/src/Impostor.Server/Net/State/Game.Data.cs index d54f8b4..d502d96 100644 --- a/src/Impostor.Server/Net/State/Game.Data.cs +++ b/src/Impostor.Server/Net/State/Game.Data.cs @@ -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 diff --git a/src/Impostor.Server/Net/State/Game.cs b/src/Impostor.Server/Net/State/Game.cs index b228fec..01c7903 100644 --- a/src/Impostor.Server/Net/State/Game.cs +++ b/src/Impostor.Server/Net/State/Game.cs @@ -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 index 0000000..f29aa32 --- /dev/null +++ b/src/Impostor.Server/Net/State/GameNet.cs @@ -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 +{ + /// + /// Holds all data that is serialized over the network through GameData packets. + /// + 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