From 13bddeb7bdd6d954faf5beec309ac83c1095aa72 Mon Sep 17 00:00:00 2001 From: js6pak Date: Sun, 4 Apr 2021 19:48:25 +0200 Subject: [PATCH] Split ShipStatus to multiple classes, implement new door types --- .../Innersloth/Customization/ColorType.cs | 2 +- src/Impostor.Api/Net/Inner/IGameNet.cs | 1 + src/Impostor.Api/Net/Inner/IInnerNetObject.cs | 6 +- .../Objects/ShipStatus/IInnerAirshipStatus.cs | 6 ++ .../ShipStatus/IInnerMiraShipStatus.cs | 6 ++ .../ShipStatus/IInnerPolusShipStatus.cs | 6 ++ .../{ => ShipStatus}/IInnerShipStatus.cs | 2 +- .../ShipStatus/IInnerSkeldShipStatus.cs | 6 ++ src/Impostor.Api/Net/Inner/RpcCalls.cs | 1 - .../Net/Inner/InnerNetObject.cs | 15 +++++ .../InnerCustomNetworkTransform.Api.cs | 6 +- .../Components/InnerCustomNetworkTransform.cs | 7 +-- .../Objects/Components/InnerPlayerPhysics.cs | 36 +++++++----- .../Objects/Components/InnerVoteBanSystem.cs | 2 +- .../Net/Inner/Objects/InnerGameData.cs | 53 +++++++----------- .../Net/Inner/Objects/InnerLobbyBehaviour.cs | 7 +-- .../Net/Inner/Objects/InnerMeetingHud.cs | 14 ++--- .../Inner/Objects/InnerPlayerControl.Api.cs | 40 ++++++------- .../Net/Inner/Objects/InnerPlayerControl.cs | 52 +++++++++-------- .../Net/Inner/Objects/InnerPlayerInfo.cs | 10 +++- .../Objects/ShipStatus/InnerAirshipStatus.cs | 31 ++++++++++ .../Objects/ShipStatus/InnerMiraShipStatus.cs | 27 +++++++++ .../ShipStatus/InnerPolusShipStatus.cs | 28 ++++++++++ .../{ => ShipStatus}/InnerShipStatus.cs | 56 +++++++++---------- .../ShipStatus/InnerSkeldShipStatus.cs | 29 ++++++++++ .../Systems/ShipStatus/AutoDoorsSystemType.cs | 44 +++++++++++++++ .../Systems/ShipStatus/DoorsSystemType.cs | 47 +++++----------- .../Systems/ShipStatus/ElectricalDoors.cs | 30 ++++++++++ .../ShipStatus/HeliSabotageSystemType.cs | 1 - .../ShipStatus/MovingPlatformBehaviour.cs | 22 ++++++++ src/Impostor.Server/Net/State/Game.Api.cs | 1 - src/Impostor.Server/Net/State/Game.Data.cs | 13 +++-- src/Impostor.Server/Net/State/GameNet.Api.cs | 1 + src/Impostor.Server/Net/State/GameNet.cs | 1 + 34 files changed, 419 insertions(+), 190 deletions(-) create mode 100644 src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerAirshipStatus.cs create mode 100644 src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerMiraShipStatus.cs create mode 100644 src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerPolusShipStatus.cs rename src/Impostor.Api/Net/Inner/Objects/{ => ShipStatus}/IInnerShipStatus.cs (56%) create mode 100644 src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerSkeldShipStatus.cs create mode 100644 src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerAirshipStatus.cs create mode 100644 src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerMiraShipStatus.cs create mode 100644 src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerPolusShipStatus.cs rename src/Impostor.Server/Net/Inner/Objects/{ => ShipStatus}/InnerShipStatus.cs (62%) create mode 100644 src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerSkeldShipStatus.cs create mode 100644 src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/AutoDoorsSystemType.cs create mode 100644 src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/ElectricalDoors.cs create mode 100644 src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/MovingPlatformBehaviour.cs diff --git a/src/Impostor.Api/Innersloth/Customization/ColorType.cs b/src/Impostor.Api/Innersloth/Customization/ColorType.cs index fc7be4c..d9e43a6 100644 --- a/src/Impostor.Api/Innersloth/Customization/ColorType.cs +++ b/src/Impostor.Api/Innersloth/Customization/ColorType.cs @@ -1,6 +1,6 @@ namespace Impostor.Api.Innersloth.Customization { - public enum ColorType : byte + public enum ColorType { Red = 0, Blue = 1, diff --git a/src/Impostor.Api/Net/Inner/IGameNet.cs b/src/Impostor.Api/Net/Inner/IGameNet.cs index 9cac0f2..7b068d1 100644 --- a/src/Impostor.Api/Net/Inner/IGameNet.cs +++ b/src/Impostor.Api/Net/Inner/IGameNet.cs @@ -1,4 +1,5 @@ using Impostor.Api.Net.Inner.Objects; +using Impostor.Api.Net.Inner.Objects.ShipStatus; namespace Impostor.Api.Net.Inner { diff --git a/src/Impostor.Api/Net/Inner/IInnerNetObject.cs b/src/Impostor.Api/Net/Inner/IInnerNetObject.cs index 8cfadb8..db868b6 100644 --- a/src/Impostor.Api/Net/Inner/IInnerNetObject.cs +++ b/src/Impostor.Api/Net/Inner/IInnerNetObject.cs @@ -1,9 +1,13 @@ -namespace Impostor.Api.Net.Inner +using Impostor.Api.Games; + +namespace Impostor.Api.Net.Inner { public interface IInnerNetObject { public uint NetId { get; } public int OwnerId { get; } + + public IGame Game { get; } } } diff --git a/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerAirshipStatus.cs b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerAirshipStatus.cs new file mode 100644 index 0000000..2711b89 --- /dev/null +++ b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerAirshipStatus.cs @@ -0,0 +1,6 @@ +namespace Impostor.Api.Net.Inner.Objects.ShipStatus +{ + public interface IInnerAirshipStatus : IInnerShipStatus + { + } +} diff --git a/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerMiraShipStatus.cs b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerMiraShipStatus.cs new file mode 100644 index 0000000..870a945 --- /dev/null +++ b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerMiraShipStatus.cs @@ -0,0 +1,6 @@ +namespace Impostor.Api.Net.Inner.Objects.ShipStatus +{ + public interface IInnerMiraShipStatus : IInnerShipStatus + { + } +} diff --git a/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerPolusShipStatus.cs b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerPolusShipStatus.cs new file mode 100644 index 0000000..5e336bd --- /dev/null +++ b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerPolusShipStatus.cs @@ -0,0 +1,6 @@ +namespace Impostor.Api.Net.Inner.Objects.ShipStatus +{ + public interface IInnerPolusShipStatus : IInnerShipStatus + { + } +} diff --git a/src/Impostor.Api/Net/Inner/Objects/IInnerShipStatus.cs b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerShipStatus.cs similarity index 56% rename from src/Impostor.Api/Net/Inner/Objects/IInnerShipStatus.cs rename to src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerShipStatus.cs index 79b9f96..c00769d 100644 --- a/src/Impostor.Api/Net/Inner/Objects/IInnerShipStatus.cs +++ b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerShipStatus.cs @@ -1,4 +1,4 @@ -namespace Impostor.Api.Net.Inner.Objects +namespace Impostor.Api.Net.Inner.Objects.ShipStatus { public interface IInnerShipStatus : IInnerNetObject { diff --git a/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerSkeldShipStatus.cs b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerSkeldShipStatus.cs new file mode 100644 index 0000000..e0e9df1 --- /dev/null +++ b/src/Impostor.Api/Net/Inner/Objects/ShipStatus/IInnerSkeldShipStatus.cs @@ -0,0 +1,6 @@ +namespace Impostor.Api.Net.Inner.Objects.ShipStatus +{ + public interface IInnerSkeldShipStatus : IInnerShipStatus + { + } +} diff --git a/src/Impostor.Api/Net/Inner/RpcCalls.cs b/src/Impostor.Api/Net/Inner/RpcCalls.cs index b288df3..44f85e7 100644 --- a/src/Impostor.Api/Net/Inner/RpcCalls.cs +++ b/src/Impostor.Api/Net/Inner/RpcCalls.cs @@ -32,7 +32,6 @@ CloseDoorsOfType = 27, RepairSystem = 28, SetTasks = 29, - UpdateGameData = 30, ClimbLadder = 31, UsePlatform = 32, } diff --git a/src/Impostor.Server/Net/Inner/InnerNetObject.cs b/src/Impostor.Server/Net/Inner/InnerNetObject.cs index 073e581..4a15104 100644 --- a/src/Impostor.Server/Net/Inner/InnerNetObject.cs +++ b/src/Impostor.Server/Net/Inner/InnerNetObject.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using Impostor.Api.Games; using Impostor.Api.Net; using Impostor.Api.Net.Inner; using Impostor.Api.Net.Messages; @@ -10,10 +11,19 @@ namespace Impostor.Server.Net.Inner { private const int HostInheritId = -2; + protected InnerNetObject(Game game) + { + Game = game; + } + public uint NetId { get; internal set; } public int OwnerId { get; internal set; } + public Game Game { get; } + + IGame IInnerNetObject.Game => Game; + public SpawnFlags SpawnFlags { get; internal set; } public bool IsOwnedBy(IClientPlayer player) @@ -27,5 +37,10 @@ namespace Impostor.Server.Net.Inner public abstract ValueTask DeserializeAsync(IClientPlayer sender, IClientPlayer? target, IMessageReader reader, bool initialState); public abstract ValueTask HandleRpcAsync(ClientPlayer sender, ClientPlayer? target, RpcCalls call, IMessageReader reader); + + public virtual ValueTask OnSpawnAsync() + { + return default; + } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/Components/InnerCustomNetworkTransform.Api.cs b/src/Impostor.Server/Net/Inner/Objects/Components/InnerCustomNetworkTransform.Api.cs index 2447aea..b73b835 100644 --- a/src/Impostor.Server/Net/Inner/Objects/Components/InnerCustomNetworkTransform.Api.cs +++ b/src/Impostor.Server/Net/Inner/Objects/Components/InnerCustomNetworkTransform.Api.cs @@ -12,14 +12,14 @@ namespace Impostor.Server.Net.Inner.Objects.Components var minSid = (ushort)(_lastSequenceId + 5U); // Snap in the server. - await SnapToAsync(_game.GetClientPlayer(OwnerId)!, position, minSid); + await SnapToAsync(Game.GetClientPlayer(OwnerId)!, position, minSid); // Broadcast to all clients. - using (var writer = _game.StartRpc(NetId, RpcCalls.SnapTo)) + using (var writer = Game.StartRpc(NetId, RpcCalls.SnapTo)) { writer.Write(position); writer.Write(_lastSequenceId); - await _game.FinishRpcAsync(writer); + await Game.FinishRpcAsync(writer); } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/Components/InnerCustomNetworkTransform.cs b/src/Impostor.Server/Net/Inner/Objects/Components/InnerCustomNetworkTransform.cs index e9e3dfb..d1a48a3 100644 --- a/src/Impostor.Server/Net/Inner/Objects/Components/InnerCustomNetworkTransform.cs +++ b/src/Impostor.Server/Net/Inner/Objects/Components/InnerCustomNetworkTransform.cs @@ -17,18 +17,15 @@ namespace Impostor.Server.Net.Inner.Objects.Components { private readonly ILogger _logger; private readonly InnerPlayerControl _playerControl; - private readonly Game _game; private readonly IEventManager _eventManager; private readonly ObjectPool _pool; private ushort _lastSequenceId; - public InnerCustomNetworkTransform(ILogger logger, InnerPlayerControl playerControl, Game game, IEventManager eventManager, ObjectPool pool) + public InnerCustomNetworkTransform(Game game, ILogger logger, InnerPlayerControl playerControl, IEventManager eventManager, ObjectPool pool) : base(game) { _logger = logger; _playerControl = playerControl; - _game = game; - _game = game; _eventManager = eventManager; _pool = pool; } @@ -106,7 +103,7 @@ namespace Impostor.Server.Net.Inner.Objects.Components Velocity = velocity; var playerMovementEvent = _pool.Get(); - playerMovementEvent.Reset(_game, sender, _playerControl); + playerMovementEvent.Reset(Game, sender, _playerControl); await _eventManager.CallAsync(playerMovementEvent); _pool.Return(playerMovementEvent); } diff --git a/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs b/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs index 80daa38..0f20750 100644 --- a/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs +++ b/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs @@ -17,14 +17,12 @@ namespace Impostor.Server.Net.Inner.Objects.Components private readonly ILogger _logger; private readonly InnerPlayerControl _playerControl; private readonly IEventManager _eventManager; - private readonly Game _game; - public InnerPlayerPhysics(ILogger logger, InnerPlayerControl playerControl, IEventManager eventManager, Game game) + public InnerPlayerPhysics(Game game, ILogger logger, InnerPlayerControl playerControl, IEventManager eventManager) : base(game) { _logger = logger; _playerControl = playerControl; _eventManager = eventManager; - _game = game; } public override ValueTask SerializeAsync(IMessageWriter writer, bool initialState) @@ -39,27 +37,39 @@ namespace Impostor.Server.Net.Inner.Objects.Components public override async ValueTask HandleRpcAsync(ClientPlayer sender, ClientPlayer? target, RpcCalls call, IMessageReader reader) { - if (!await ValidateOwnership(call, sender) || !await ValidateImpostor(call, sender, _playerControl.PlayerInfo)) + if (!await ValidateOwnership(call, sender)) { return false; } - int ventId; - switch (call) { case RpcCalls.EnterVent: - Rpc19EnterVent.Deserialize(reader, out ventId); - await _eventManager.CallAsync(new PlayerVentEvent(_game, sender, _playerControl, (VentLocation)ventId, true)); - break; - case RpcCalls.ExitVent: - Rpc19EnterVent.Deserialize(reader, out ventId); - await _eventManager.CallAsync(new PlayerVentEvent(_game, sender, _playerControl, (VentLocation)ventId, false)); + if (!await ValidateImpostor(call, sender, _playerControl.PlayerInfo)) + { + return false; + } + + int ventId; + + switch (call) + { + case RpcCalls.EnterVent: + Rpc19EnterVent.Deserialize(reader, out ventId); + break; + case RpcCalls.ExitVent: + Rpc20ExitVent.Deserialize(reader, out ventId); + break; + default: + throw new ArgumentOutOfRangeException(nameof(call), call, null); + } + + await _eventManager.CallAsync(new PlayerVentEvent(Game, sender, _playerControl, (VentLocation)ventId, call == RpcCalls.EnterVent)); break; case RpcCalls.ClimbLadder: - Rpc31ClimbLadder.Deserialize(reader, out byte ladderId, out byte lastClimbLadderSid); + Rpc31ClimbLadder.Deserialize(reader, out var ladderId, out var lastClimbLadderSid); break; default: diff --git a/src/Impostor.Server/Net/Inner/Objects/Components/InnerVoteBanSystem.cs b/src/Impostor.Server/Net/Inner/Objects/Components/InnerVoteBanSystem.cs index 3a310c8..ac63041 100644 --- a/src/Impostor.Server/Net/Inner/Objects/Components/InnerVoteBanSystem.cs +++ b/src/Impostor.Server/Net/Inner/Objects/Components/InnerVoteBanSystem.cs @@ -17,7 +17,7 @@ namespace Impostor.Server.Net.Inner.Objects.Components private readonly ILogger _logger; private readonly Dictionary _votes; - public InnerVoteBanSystem(ILogger logger) + public InnerVoteBanSystem(Game game, ILogger logger) : base(game) { _logger = logger; _votes = new Dictionary(); diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs index bcbda03..0a29d63 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs @@ -18,17 +18,15 @@ namespace Impostor.Server.Net.Inner.Objects internal partial class InnerGameData : InnerNetObject, IInnerGameData { private readonly ILogger _logger; - private readonly Game _game; private readonly ConcurrentDictionary _allPlayers; - public InnerGameData(ILogger logger, Game game, IServiceProvider serviceProvider) + public InnerGameData(Game game, ILogger logger, IServiceProvider serviceProvider) : base(game) { _logger = logger; - _game = game; _allPlayers = new ConcurrentDictionary(); Components.Add(this); - Components.Add(ActivatorUtilities.CreateInstance(serviceProvider)); + Components.Add(ActivatorUtilities.CreateInstance(serviceProvider, game)); } public int PlayerCount => _allPlayers.Count; @@ -76,8 +74,25 @@ namespace Impostor.Server.Net.Inner.Objects } else { - // It'll send an message per dirty player - // throw new NotImplementedException("This shouldn't happen, according to Among Us disassembly."); + while (reader.Position < reader.Length) + { + var inner = reader.ReadMessage(); + var playerInfo = this.GetPlayerById(inner.Tag); + if (playerInfo != null) + { + playerInfo.Deserialize(inner); + } + else + { + playerInfo = new InnerPlayerInfo(inner.Tag); + playerInfo.Deserialize(inner); + + if (!_allPlayers.TryAdd(playerInfo.PlayerId, playerInfo)) + { + throw new ImpostorException("Failed to add player to InnerGameData."); + } + } + } } } @@ -97,32 +112,6 @@ namespace Impostor.Server.Net.Inner.Objects break; } - case RpcCalls.UpdateGameData: - { - while (reader.Position < reader.Length) - { - using var message = reader.ReadMessage(); - var player = GetPlayerById(message.Tag); - if (player != null) - { - player.Deserialize(message); - } - else - { - var playerInfo = new InnerPlayerInfo(message.Tag); - - playerInfo.Deserialize(reader); - - if (!_allPlayers.TryAdd(playerInfo.PlayerId, playerInfo)) - { - throw new ImpostorException("Failed to add player to InnerGameData."); - } - } - } - - break; - } - default: return await UnregisteredCall(call, sender); } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerLobbyBehaviour.cs b/src/Impostor.Server/Net/Inner/Objects/InnerLobbyBehaviour.cs index 3a44fc5..c897a68 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerLobbyBehaviour.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerLobbyBehaviour.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using Impostor.Api.Games; using Impostor.Api.Net; using Impostor.Api.Net.Inner; using Impostor.Api.Net.Inner.Objects; @@ -11,12 +10,8 @@ namespace Impostor.Server.Net.Inner.Objects { internal class InnerLobbyBehaviour : InnerNetObject, IInnerLobbyBehaviour { - private readonly IGame _game; - - public InnerLobbyBehaviour(IGame game) + public InnerLobbyBehaviour(Game game) : base(game) { - _game = game; - Components.Add(this); } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerMeetingHud.cs b/src/Impostor.Server/Net/Inner/Objects/InnerMeetingHud.cs index a406028..f774cd0 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerMeetingHud.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerMeetingHud.cs @@ -20,18 +20,14 @@ namespace Impostor.Server.Net.Inner.Objects { private readonly ILogger _logger; private readonly IEventManager _eventManager; - private readonly Game _game; - private readonly GameNet _gameNet; [AllowNull] private PlayerVoteArea[] _playerStates; - public InnerMeetingHud(ILogger logger, IEventManager eventManager, Game game) + public InnerMeetingHud(Game game, ILogger logger, IEventManager eventManager) : base(game) { _logger = logger; _eventManager = eventManager; - _game = game; - _gameNet = game.GameNet; _playerStates = null; Components.Add(this); @@ -132,7 +128,7 @@ namespace Impostor.Server.Net.Inner.Objects private void PopulateButtons(byte reporter) { - _playerStates = _gameNet.GameData!.Players + _playerStates = Game.GameNet.GameData!.Players .Select(x => { var area = new PlayerVoteArea(this, x.Key); @@ -146,15 +142,15 @@ namespace Impostor.Server.Net.Inner.Objects { if (playerId != byte.MaxValue) { - var player = _game.GameNet.GameData!.GetPlayerById(playerId); + var player = Game.GameNet.GameData!.GetPlayerById(playerId); if (player?.Controller != null) { player.Controller.Die(DeathReason.Exile); - await _eventManager.CallAsync(new PlayerExileEvent(_game, sender, player.Controller)); + await _eventManager.CallAsync(new PlayerExileEvent(Game, sender, player.Controller)); } } - await _eventManager.CallAsync(new MeetingEndedEvent(_game, this)); + await _eventManager.CallAsync(new MeetingEndedEvent(Game, this)); } private async ValueTask HandleCastVote(ClientPlayer sender, ClientPlayer? target, byte playerId, sbyte suspectPlayerId) diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs index a2382e2..8804bee 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs @@ -22,52 +22,52 @@ namespace Impostor.Server.Net.Inner.Objects { PlayerInfo.PlayerName = name; - using var writer = _game.StartRpc(NetId, RpcCalls.SetName); + using var writer = Game.StartRpc(NetId, RpcCalls.SetName); writer.Write(name); - await _game.FinishRpcAsync(writer); + await Game.FinishRpcAsync(writer); } public async ValueTask SetColorAsync(ColorType color) { PlayerInfo.Color = color; - using var writer = _game.StartRpc(NetId, RpcCalls.SetColor); + using var writer = Game.StartRpc(NetId, RpcCalls.SetColor); Rpc08SetColor.Serialize(writer, color); - await _game.FinishRpcAsync(writer); + await Game.FinishRpcAsync(writer); } public async ValueTask SetHatAsync(HatType hat) { PlayerInfo.Hat = hat; - using var writer = _game.StartRpc(NetId, RpcCalls.SetHat); + using var writer = Game.StartRpc(NetId, RpcCalls.SetHat); Rpc09SetHat.Serialize(writer, hat); - await _game.FinishRpcAsync(writer); + await Game.FinishRpcAsync(writer); } public async ValueTask SetPetAsync(PetType pet) { PlayerInfo.Pet = pet; - using var writer = _game.StartRpc(NetId, RpcCalls.SetPet); + using var writer = Game.StartRpc(NetId, RpcCalls.SetPet); Rpc17SetPet.Serialize(writer, pet); - await _game.FinishRpcAsync(writer); + await Game.FinishRpcAsync(writer); } public async ValueTask SetSkinAsync(SkinType skin) { PlayerInfo.Skin = skin; - using var writer = _game.StartRpc(NetId, RpcCalls.SetSkin); + using var writer = Game.StartRpc(NetId, RpcCalls.SetSkin); Rpc10SetSkin.Serialize(writer, skin); - await _game.FinishRpcAsync(writer); + await Game.FinishRpcAsync(writer); } public async ValueTask SendChatAsync(string text) { - using var writer = _game.StartRpc(NetId, RpcCalls.SendChat); + using var writer = Game.StartRpc(NetId, RpcCalls.SendChat); writer.Write(text); - await _game.FinishRpcAsync(writer); + await Game.FinishRpcAsync(writer); } public async ValueTask SendChatToPlayerAsync(string text, IInnerPlayerControl? player = null) @@ -77,9 +77,9 @@ namespace Impostor.Server.Net.Inner.Objects player = this; } - using var writer = _game.StartRpc(NetId, RpcCalls.SendChat); + using var writer = Game.StartRpc(NetId, RpcCalls.SendChat); writer.Write(text); - await _game.FinishRpcAsync(writer, player.OwnerId); + await Game.FinishRpcAsync(writer, player.OwnerId); } public async ValueTask MurderPlayerAsync(IInnerPlayerControl target) @@ -101,11 +101,11 @@ namespace Impostor.Server.Net.Inner.Objects ((InnerPlayerControl)target).Die(DeathReason.Kill); - using var writer = _game.StartRpc(NetId, RpcCalls.MurderPlayer); + using var writer = Game.StartRpc(NetId, RpcCalls.MurderPlayer); Rpc12MurderPlayer.Serialize(writer, target); - await _game.FinishRpcAsync(writer); + await Game.FinishRpcAsync(writer); - await _eventManager.CallAsync(new PlayerMurderEvent(_game, _game.GetClientPlayer(OwnerId)!, this, target)); + await _eventManager.CallAsync(new PlayerMurderEvent(Game, Game.GetClientPlayer(OwnerId)!, this, target)); } public async ValueTask ExileAsync() @@ -119,12 +119,12 @@ namespace Impostor.Server.Net.Inner.Objects Die(DeathReason.Exile); // Send RPC. - using var writer = _game.StartRpc(NetId, RpcCalls.Exiled); + using var writer = Game.StartRpc(NetId, RpcCalls.Exiled); Rpc04Exiled.Serialize(writer); - await _game.FinishRpcAsync(writer); + await Game.FinishRpcAsync(writer); // Notify plugins. - await _eventManager.CallAsync(new PlayerExileEvent(_game, _game.GetClientPlayer(OwnerId)!, this)); + await _eventManager.CallAsync(new PlayerExileEvent(Game, Game.GetClientPlayer(OwnerId)!, this)); } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index bf4ed8c..06191a1 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -26,18 +26,16 @@ namespace Impostor.Server.Net.Inner.Objects private readonly ILogger _logger; private readonly IEventManager _eventManager; - private readonly Game _game; private readonly IDateTimeProvider _dateTimeProvider; - public InnerPlayerControl(ILogger logger, IServiceProvider serviceProvider, IEventManager eventManager, Game game, IDateTimeProvider dateTimeProvider) + public InnerPlayerControl(Game game, ILogger logger, IServiceProvider serviceProvider, IEventManager eventManager, IDateTimeProvider dateTimeProvider) : base(game) { _logger = logger; _eventManager = eventManager; - _game = game; _dateTimeProvider = dateTimeProvider; - Physics = ActivatorUtilities.CreateInstance(serviceProvider, this, _eventManager, _game); - NetworkTransform = ActivatorUtilities.CreateInstance(serviceProvider, this, _game); + Physics = ActivatorUtilities.CreateInstance(serviceProvider, this, _eventManager, game); + NetworkTransform = ActivatorUtilities.CreateInstance(serviceProvider, this, game); Components.Add(this); Components.Add(Physics); @@ -115,7 +113,7 @@ namespace Impostor.Server.Net.Inner.Objects return false; } - Rpc02SyncSettings.Deserialize(reader, _game.Options); + Rpc02SyncSettings.Deserialize(reader, Game.Options); break; } @@ -215,7 +213,7 @@ namespace Impostor.Server.Net.Inner.Objects return false; } - Rpc12MurderPlayer.Deserialize(reader, _game, out var murdered); + Rpc12MurderPlayer.Deserialize(reader, Game, out var murdered); return await HandleMurderPlayer(sender, murdered); } @@ -317,7 +315,7 @@ namespace Impostor.Server.Net.Inner.Objects if (task != null) { task.Complete = true; - await _eventManager.CallAsync(new PlayerCompletedTaskEvent(_game, sender, this, task)); + await _eventManager.CallAsync(new PlayerCompletedTaskEvent(Game, sender, this, task)); } else { @@ -329,16 +327,16 @@ namespace Impostor.Server.Net.Inner.Objects { for (var i = 0; i < infectedIds.Length; i++) { - var player = _game.GameNet.GameData!.GetPlayerById(infectedIds.Span[i]); + var player = Game.GameNet.GameData!.GetPlayerById(infectedIds.Span[i]); if (player != null) { player.IsImpostor = true; } } - if (_game.GameState == GameStates.Starting) + if (Game.GameState == GameStates.Starting) { - await _game.StartedAsync(); + await Game.StartedAsync(); } } @@ -375,7 +373,7 @@ namespace Impostor.Server.Net.Inner.Objects private async ValueTask HandleSetName(ClientPlayer sender, string name) { - if (_game.GameState == GameStates.Started) + if (Game.GameState == GameStates.Started) { if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, "Client tried to set a name midgame")) { @@ -385,7 +383,7 @@ namespace Impostor.Server.Net.Inner.Objects if (sender.IsOwner(this)) { - if (_game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == name)) + if (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == name)) { if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, "Client sent name that is already used")) { @@ -411,14 +409,14 @@ namespace Impostor.Server.Net.Inner.Objects var expected = RequestedPlayerName.Dequeue(); - if (_game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == expected)) + if (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == expected)) { var i = 1; while (true) { string text = expected + " " + i; - if (_game.Players.All(x => x.Character == null || x.Character == this || x.Character.PlayerInfo.PlayerName != text)) + if (Game.Players.All(x => x.Character == null || x.Character == this || x.Character.PlayerInfo.PlayerName != text)) { expected = text; break; @@ -458,7 +456,7 @@ namespace Impostor.Server.Net.Inner.Objects private async ValueTask HandleSetColor(ClientPlayer sender, ColorType color) { - if (_game.GameState == GameStates.Started) + if (Game.GameState == GameStates.Started) { if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, "Client tried to set a color midgame")) { @@ -468,7 +466,7 @@ namespace Impostor.Server.Net.Inner.Objects if (sender.IsOwner(this)) { - if (_game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.Color == color)) + if (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.Color == color)) { if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, "Client sent a color that is already used")) { @@ -486,7 +484,7 @@ namespace Impostor.Server.Net.Inner.Objects var expected = RequestedColorId.Dequeue(); - while (_game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.Color == expected)) + while (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.Color == expected)) { expected = (ColorType)(((byte)expected + 1) % ColorsCount); } @@ -506,7 +504,7 @@ namespace Impostor.Server.Net.Inner.Objects private async ValueTask HandleSetHat(ClientPlayer sender, HatType hat) { - if (_game.GameState == GameStates.Started && await sender.Client.ReportCheatAsync(RpcCalls.SetHat, "Client tried to change hat while not in lobby")) + if (Game.GameState == GameStates.Started && await sender.Client.ReportCheatAsync(RpcCalls.SetHat, "Client tried to change hat while not in lobby")) { return false; } @@ -518,7 +516,7 @@ namespace Impostor.Server.Net.Inner.Objects private async ValueTask HandleSetSkin(ClientPlayer sender, SkinType skin) { - if (_game.GameState == GameStates.Started && await sender.Client.ReportCheatAsync(RpcCalls.SetSkin, "Client tried to change skin while not in lobby")) + if (Game.GameState == GameStates.Started && await sender.Client.ReportCheatAsync(RpcCalls.SetSkin, "Client tried to change skin while not in lobby")) { return false; } @@ -530,7 +528,7 @@ namespace Impostor.Server.Net.Inner.Objects private async ValueTask HandleMurderPlayer(ClientPlayer sender, IInnerPlayerControl? target) { - if (!PlayerInfo.CanMurder(_game, _dateTimeProvider)) + if (!PlayerInfo.CanMurder(Game, _dateTimeProvider)) { if (await sender.Client.ReportCheatAsync(RpcCalls.MurderPlayer, "Client tried to murder too fast")) { @@ -551,7 +549,7 @@ namespace Impostor.Server.Net.Inner.Objects if (target != null && !target.PlayerInfo.IsDead) { ((InnerPlayerControl)target).Die(DeathReason.Kill); - await _eventManager.CallAsync(new PlayerMurderEvent(_game, sender, this, target)); + await _eventManager.CallAsync(new PlayerMurderEvent(Game, sender, this, target)); } return true; @@ -559,7 +557,7 @@ namespace Impostor.Server.Net.Inner.Objects private async ValueTask HandleSendChat(ClientPlayer sender, string message) { - var @event = new PlayerChatEvent(_game, sender, this, message); + var @event = new PlayerChatEvent(Game, sender, this, message); await _eventManager.CallAsync(@event); return !@event.IsCancelled; @@ -567,13 +565,13 @@ namespace Impostor.Server.Net.Inner.Objects private async ValueTask HandleStartMeeting(byte targetId) { - var deadPlayer = _game.GameNet.GameData!.GetPlayerById(targetId)?.Controller; - await _eventManager.CallAsync(new PlayerStartMeetingEvent(_game, _game.GetClientPlayer(this.OwnerId)!, this, deadPlayer)); + var deadPlayer = Game.GameNet.GameData!.GetPlayerById(targetId)?.Controller; + await _eventManager.CallAsync(new PlayerStartMeetingEvent(Game, Game.GetClientPlayer(this.OwnerId)!, this, deadPlayer)); } private async ValueTask HandleSetPet(ClientPlayer sender, PetType pet) { - if (_game.GameState == GameStates.Started && await sender.Client.ReportCheatAsync(RpcCalls.SetPet, "Client tried to change pet while not in lobby")) + if (Game.GameState == GameStates.Started && await sender.Client.ReportCheatAsync(RpcCalls.SetPet, "Client tried to change pet while not in lobby")) { return false; } @@ -595,7 +593,7 @@ namespace Impostor.Server.Net.Inner.Objects if (startCounter != -1) { - await _eventManager.CallAsync(new PlayerSetStartCounterEvent(_game, sender, this, (byte)startCounter)); + await _eventManager.CallAsync(new PlayerSetStartCounterEvent(Game, sender, this, (byte)startCounter)); } return true; diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs index 1d488fb..763782a 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs @@ -59,15 +59,23 @@ namespace Impostor.Server.Net.Inner.Objects public void Deserialize(IMessageReader reader) { PlayerName = reader.ReadString(); - Color = (ColorType)reader.ReadByte(); + Color = (ColorType)reader.ReadPackedInt32(); Hat = (HatType)reader.ReadPackedUInt32(); Pet = (PetType)reader.ReadPackedUInt32(); Skin = (SkinType)reader.ReadPackedUInt32(); + var flag = reader.ReadByte(); Disconnected = (flag & 1) > 0; IsImpostor = (flag & 2) > 0; IsDead = (flag & 4) > 0; + var taskCount = reader.ReadByte(); + + if (Tasks.Count != taskCount) + { + Tasks = new List(taskCount); + } + for (var i = 0; i < taskCount; i++) { Tasks[i] ??= new InnerGameData.TaskInfo(); diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerAirshipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerAirshipStatus.cs new file mode 100644 index 0000000..8776a8c --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerAirshipStatus.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Impostor.Api.Innersloth; +using Impostor.Api.Net.Inner.Objects.ShipStatus; +using Impostor.Server.Net.Inner.Objects.Systems; +using Impostor.Server.Net.Inner.Objects.Systems.ShipStatus; +using Impostor.Server.Net.State; + +namespace Impostor.Server.Net.Inner.Objects.ShipStatus +{ + internal class InnerAirshipStatus : InnerShipStatus, IInnerAirshipStatus + { + public InnerAirshipStatus(Game game) : base(game) + { + } + + public override Dictionary Doors { get; } = new Dictionary(21); + + protected override void AddSystems(Dictionary systems) + { + base.AddSystems(systems); + + systems.Add(SystemTypes.Doors, new DoorsSystemType(Doors)); + systems.Add(SystemTypes.Comms, new HudOverrideSystemType()); + systems.Add(SystemTypes.GapRoom, new MovingPlatformBehaviour()); + systems.Add(SystemTypes.Reactor, new HeliSabotageSystemType()); + systems.Add(SystemTypes.Decontamination, new ElectricalDoors(Doors)); + systems.Add(SystemTypes.Decontamination2, new AutoDoorsSystemType(Doors)); + systems.Add(SystemTypes.Security, new SecurityCameraSystemType()); + } + } +} diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerMiraShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerMiraShipStatus.cs new file mode 100644 index 0000000..04d033f --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerMiraShipStatus.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using Impostor.Api.Innersloth; +using Impostor.Api.Net.Inner.Objects.ShipStatus; +using Impostor.Server.Net.Inner.Objects.Systems; +using Impostor.Server.Net.Inner.Objects.Systems.ShipStatus; +using Impostor.Server.Net.State; + +namespace Impostor.Server.Net.Inner.Objects.ShipStatus +{ + internal class InnerMiraShipStatus : InnerShipStatus, IInnerMiraShipStatus + { + public InnerMiraShipStatus(Game game) : base(game) + { + } + + public override Dictionary Doors { get; } = new Dictionary(0); + + protected override void AddSystems(Dictionary systems) + { + base.AddSystems(systems); + + systems.Add(SystemTypes.Comms, new HudOverrideSystemType()); + systems.Add(SystemTypes.Reactor, new ReactorSystemType()); + systems.Add(SystemTypes.LifeSupp, new LifeSuppSystemType()); + } + } +} diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerPolusShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerPolusShipStatus.cs new file mode 100644 index 0000000..7ec077d --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerPolusShipStatus.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using Impostor.Api.Innersloth; +using Impostor.Api.Net.Inner.Objects.ShipStatus; +using Impostor.Server.Net.Inner.Objects.Systems; +using Impostor.Server.Net.Inner.Objects.Systems.ShipStatus; +using Impostor.Server.Net.State; + +namespace Impostor.Server.Net.Inner.Objects.ShipStatus +{ + internal class InnerPolusShipStatus : InnerShipStatus, IInnerPolusShipStatus + { + public InnerPolusShipStatus(Game game) : base(game) + { + } + + public override Dictionary Doors { get; } = new Dictionary(12); + + protected override void AddSystems(Dictionary systems) + { + base.AddSystems(systems); + + systems.Add(SystemTypes.Doors, new DoorsSystemType(Doors)); + systems.Add(SystemTypes.Comms, new HudOverrideSystemType()); + systems.Add(SystemTypes.Security, new SecurityCameraSystemType()); + systems.Add(SystemTypes.Laboratory, new ReactorSystemType()); + } + } +} diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs similarity index 62% rename from src/Impostor.Server/Net/Inner/Objects/InnerShipStatus.cs rename to src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs index dd8b511..418adef 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerShipStatus.cs +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs @@ -1,48 +1,42 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Impostor.Api; using Impostor.Api.Innersloth; using Impostor.Api.Net; using Impostor.Api.Net.Inner; -using Impostor.Api.Net.Inner.Objects; +using Impostor.Api.Net.Inner.Objects.ShipStatus; using Impostor.Api.Net.Messages; using Impostor.Api.Net.Messages.Rpcs; using Impostor.Server.Net.Inner.Objects.Systems; using Impostor.Server.Net.Inner.Objects.Systems.ShipStatus; using Impostor.Server.Net.State; -using Microsoft.Extensions.Logging; -namespace Impostor.Server.Net.Inner.Objects +namespace Impostor.Server.Net.Inner.Objects.ShipStatus { - internal class InnerShipStatus : InnerNetObject, IInnerShipStatus + internal abstract class InnerShipStatus : InnerNetObject, IInnerShipStatus { - private readonly ILogger _logger; - private readonly Game _game; - private readonly Dictionary _systems; + private readonly Dictionary _systems = new Dictionary(); - public InnerShipStatus(ILogger logger, Game game) + protected InnerShipStatus(Game game) : base(game) { - _logger = logger; - _game = game; + Components.Add(this); + } - _systems = new Dictionary - { - [SystemTypes.Electrical] = new SwitchSystem(), - [SystemTypes.MedBay] = new MedScanSystem(), - [SystemTypes.Reactor] = game.Options.Map == MapTypes.Airship ? new HeliSabotageSystemType() : new ReactorSystemType(), - [SystemTypes.LifeSupp] = new LifeSuppSystemType(), - [SystemTypes.Security] = new SecurityCameraSystemType(), - [SystemTypes.Comms] = new HudOverrideSystemType(), - [SystemTypes.Doors] = new DoorsSystemType(_game), - }; - - _systems.Add(SystemTypes.Sabotage, new SabotageSystemType(new[] + public abstract Dictionary Doors { get; } + + public override ValueTask OnSpawnAsync() + { + for (var i = 0; i < Doors.Count; i++) { - (IActivatable)_systems[SystemTypes.Comms], (IActivatable)_systems[SystemTypes.Reactor], (IActivatable)_systems[SystemTypes.LifeSupp], (IActivatable)_systems[SystemTypes.Electrical], - })); + Doors.Add(i, false); + } - Components.Add(this); + AddSystems(_systems); + _systems.Add(SystemTypes.Sabotage, new SabotageSystemType(_systems.Values.OfType().ToArray())); + + return base.OnSpawnAsync(); } public override ValueTask SerializeAsync(IMessageWriter writer, bool initialState) @@ -59,8 +53,8 @@ namespace Impostor.Server.Net.Inner.Objects while (reader.Position < reader.Length) { - IMessageReader messageReader = reader.ReadMessage(); - SystemTypes type = (SystemTypes)messageReader.Tag; + var messageReader = reader.ReadMessage(); + var type = (SystemTypes)messageReader.Tag; if (_systems.TryGetValue(type, out var value)) { value.Deserialize(messageReader, initialState); @@ -90,7 +84,7 @@ namespace Impostor.Server.Net.Inner.Objects case RpcCalls.RepairSystem: { - Rpc28RepairSystem.Deserialize(reader, _game, out var systemType, out var player, out var amount); + Rpc28RepairSystem.Deserialize(reader, Game, out var systemType, out var player, out var amount); if (systemType == SystemTypes.Sabotage && !await ValidateImpostor(call, sender, sender.Character!.PlayerInfo)) { @@ -106,5 +100,11 @@ namespace Impostor.Server.Net.Inner.Objects return true; } + + protected virtual void AddSystems(Dictionary systems) + { + systems.Add(SystemTypes.Electrical, new SwitchSystem()); + systems.Add(SystemTypes.MedBay, new MedScanSystem()); + } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerSkeldShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerSkeldShipStatus.cs new file mode 100644 index 0000000..12df2f3 --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerSkeldShipStatus.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using Impostor.Api.Innersloth; +using Impostor.Api.Net.Inner.Objects.ShipStatus; +using Impostor.Server.Net.Inner.Objects.Systems; +using Impostor.Server.Net.Inner.Objects.Systems.ShipStatus; +using Impostor.Server.Net.State; + +namespace Impostor.Server.Net.Inner.Objects.ShipStatus +{ + internal class InnerSkeldShipStatus : InnerShipStatus, IInnerSkeldShipStatus + { + public InnerSkeldShipStatus(Game game) : base(game) + { + } + + public override Dictionary Doors { get; } = new Dictionary(13); + + protected override void AddSystems(Dictionary systems) + { + base.AddSystems(systems); + + systems.Add(SystemTypes.Doors, new AutoDoorsSystemType(Doors)); + systems.Add(SystemTypes.Comms, new HudOverrideSystemType()); + systems.Add(SystemTypes.Security, new SecurityCameraSystemType()); + systems.Add(SystemTypes.Reactor, new ReactorSystemType()); + systems.Add(SystemTypes.LifeSupp, new LifeSuppSystemType()); + } + } +} diff --git a/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/AutoDoorsSystemType.cs b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/AutoDoorsSystemType.cs new file mode 100644 index 0000000..5a14575 --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/AutoDoorsSystemType.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using Impostor.Api.Net.Messages; + +namespace Impostor.Server.Net.Inner.Objects.Systems.ShipStatus +{ + public class AutoDoorsSystemType : ISystemType + { + private readonly Dictionary _doors; + + public AutoDoorsSystemType(Dictionary doors) + { + _doors = doors; + } + + public void Serialize(IMessageWriter writer, bool initialState) + { + throw new NotImplementedException(); + } + + public void Deserialize(IMessageReader reader, bool initialState) + { + if (initialState) + { + for (var i = 0; i < _doors.Count; i++) + { + _doors[i] = reader.ReadBoolean(); + } + } + else + { + var num = reader.ReadPackedUInt32(); + + for (var i = 0; i < _doors.Count; i++) + { + if ((num & 1 << i) != 0) + { + _doors[i] = reader.ReadBoolean(); + } + } + } + } + } +} diff --git a/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/DoorsSystemType.cs b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/DoorsSystemType.cs index 03ba1df..2bc7130 100644 --- a/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/DoorsSystemType.cs +++ b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/DoorsSystemType.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Collections.Generic; -using Impostor.Api.Games; using Impostor.Api.Innersloth; using Impostor.Api.Net.Messages; @@ -8,26 +7,12 @@ namespace Impostor.Server.Net.Inner.Objects.Systems.ShipStatus { public class DoorsSystemType : ISystemType { - // TODO: AutoDoors + private readonly Dictionary _timers = new Dictionary(); private readonly Dictionary _doors; - public DoorsSystemType(IGame game) + public DoorsSystemType(Dictionary doors) { - var doorCount = game.Options.Map switch - { - MapTypes.Skeld => 13, - MapTypes.MiraHQ => 2, - MapTypes.Polus => 12, - MapTypes.Airship => 21, // TODO do the toilet doors count? 21 yes, 17 no - _ => throw new ArgumentOutOfRangeException(), - }; - - _doors = new Dictionary(doorCount); - - for (var i = 0; i < doorCount; i++) - { - _doors.Add(i, false); - } + _doors = doors; } public void Serialize(IMessageWriter writer, bool initialState) @@ -37,24 +22,18 @@ namespace Impostor.Server.Net.Inner.Objects.Systems.ShipStatus public void Deserialize(IMessageReader reader, bool initialState) { - if (initialState) + var num = reader.ReadByte(); + for (var i = 0; i < num; i++) { - for (var i = 0; i < _doors.Count; i++) - { - _doors[i] = reader.ReadBoolean(); - } + var systemType = (SystemTypes)reader.ReadByte(); + var value = reader.ReadSingle(); + + _timers[systemType] = value; } - else - { - var num = reader.ReadPackedUInt32(); - for (var i = 0; i < _doors.Count; i++) - { - if ((num & 1 << i) != 0) - { - _doors[i] = reader.ReadBoolean(); - } - } + for (var j = 0; j < _doors.Count; j++) + { + _doors[j] = reader.ReadBoolean(); } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/ElectricalDoors.cs b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/ElectricalDoors.cs new file mode 100644 index 0000000..cadb995 --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/ElectricalDoors.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using Impostor.Api.Net.Messages; + +namespace Impostor.Server.Net.Inner.Objects.Systems.ShipStatus +{ + public class ElectricalDoors : ISystemType + { + private readonly Dictionary _doors; + + public ElectricalDoors(Dictionary doors) + { + _doors = doors; + } + + public void Serialize(IMessageWriter writer, bool initialState) + { + throw new NotImplementedException(); + } + + public void Deserialize(IMessageReader reader, bool initialState) + { + var num = reader.ReadUInt32(); + for (var i = 0; i < _doors.Count; i++) + { + _doors[i] = (num & (ulong)(1L << (i & 31))) > 0UL; + } + } + } +} diff --git a/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/HeliSabotageSystemType.cs b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/HeliSabotageSystemType.cs index 1d6be32..d72ed5b 100644 --- a/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/HeliSabotageSystemType.cs +++ b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/HeliSabotageSystemType.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using Impostor.Api.Net.Messages; -using Microsoft.Extensions.Logging; namespace Impostor.Server.Net.Inner.Objects.Systems.ShipStatus { diff --git a/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/MovingPlatformBehaviour.cs b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/MovingPlatformBehaviour.cs new file mode 100644 index 0000000..82cfb1f --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/Systems/ShipStatus/MovingPlatformBehaviour.cs @@ -0,0 +1,22 @@ +using System; +using Impostor.Api.Net.Messages; + +namespace Impostor.Server.Net.Inner.Objects.Systems.ShipStatus +{ + public class MovingPlatformBehaviour : ISystemType, IActivatable + { + public bool IsActive { get; private set; } + + public void Serialize(IMessageWriter writer, bool initialState) + { + throw new NotImplementedException(); + } + + public void Deserialize(IMessageReader reader, bool initialState) + { + var sid = reader.ReadByte(); + var targetId = reader.ReadUInt32(); + var isLeft = reader.ReadBoolean(); + } + } +} diff --git a/src/Impostor.Server/Net/State/Game.Api.cs b/src/Impostor.Server/Net/State/Game.Api.cs index 44257e7..a358585 100644 --- a/src/Impostor.Server/Net/State/Game.Api.cs +++ b/src/Impostor.Server/Net/State/Game.Api.cs @@ -8,7 +8,6 @@ using Impostor.Api.Net; using Impostor.Api.Net.Inner; using Impostor.Api.Net.Messages; using Impostor.Hazel; -using Impostor.Server.Net.Inner; namespace Impostor.Server.Net.State { diff --git a/src/Impostor.Server/Net/State/Game.Data.cs b/src/Impostor.Server/Net/State/Game.Data.cs index e691470..74b3c7b 100644 --- a/src/Impostor.Server/Net/State/Game.Data.cs +++ b/src/Impostor.Server/Net/State/Game.Data.cs @@ -10,6 +10,7 @@ using Impostor.Server.Events.Player; using Impostor.Server.Net.Inner; using Impostor.Server.Net.Inner.Objects; using Impostor.Server.Net.Inner.Objects.Components; +using Impostor.Server.Net.Inner.Objects.ShipStatus; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -32,15 +33,15 @@ namespace Impostor.Server.Net.State private static readonly Type[] SpawnableObjects = { - typeof(InnerShipStatus), // ShipStatus + typeof(InnerSkeldShipStatus), typeof(InnerMeetingHud), typeof(InnerLobbyBehaviour), typeof(InnerGameData), typeof(InnerPlayerControl), - typeof(InnerShipStatus), // HeadQuarters - typeof(InnerShipStatus), // PlanetMap - typeof(InnerShipStatus), // AprilShipStatus - typeof(InnerShipStatus), // Airship + typeof(InnerMiraShipStatus), + typeof(InnerPolusShipStatus), + typeof(InnerSkeldShipStatus), // April fools skeld + typeof(InnerAirshipStatus), }; private readonly List _allObjects = new List(); @@ -349,6 +350,8 @@ namespace Impostor.Server.Net.State break; } } + + await netObj.OnSpawnAsync(); } private async ValueTask OnDestroyAsync(InnerNetObject netObj) diff --git a/src/Impostor.Server/Net/State/GameNet.Api.cs b/src/Impostor.Server/Net/State/GameNet.Api.cs index 4fed527..3af856c 100644 --- a/src/Impostor.Server/Net/State/GameNet.Api.cs +++ b/src/Impostor.Server/Net/State/GameNet.Api.cs @@ -1,5 +1,6 @@ using Impostor.Api.Net.Inner; using Impostor.Api.Net.Inner.Objects; +using Impostor.Api.Net.Inner.Objects.ShipStatus; namespace Impostor.Server.Net.State { diff --git a/src/Impostor.Server/Net/State/GameNet.cs b/src/Impostor.Server/Net/State/GameNet.cs index 37e0cbd..bb7a8e2 100644 --- a/src/Impostor.Server/Net/State/GameNet.cs +++ b/src/Impostor.Server/Net/State/GameNet.cs @@ -1,5 +1,6 @@ using Impostor.Server.Net.Inner.Objects; using Impostor.Server.Net.Inner.Objects.Components; +using Impostor.Server.Net.Inner.Objects.ShipStatus; namespace Impostor.Server.Net.State { -- 2.39.5