From 72c923f266142de151f031684befd567a4e5203f Mon Sep 17 00:00:00 2001 From: Hiumee <42638867+Hiumee@users.noreply.github.com> Date: Wed, 16 Dec 2020 20:32:52 +0200 Subject: [PATCH] Feature/add player vent event (#237) * Added VentLocation enum * Added PlayerVentEvent --- .../Events/Game/Player/IPlayerVentEvent.cs | 17 +++++++ src/Impostor.Api/Innersloth/VentLocation.cs | 48 +++++++++++++++++++ .../Events/Game/Player/PlayerVentEvent.cs | 30 ++++++++++++ .../Objects/Components/InnerPlayerPhysics.cs | 19 +++++--- .../Net/Inner/Objects/InnerPlayerControl.cs | 2 +- 5 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 src/Impostor.Api/Events/Game/Player/IPlayerVentEvent.cs create mode 100644 src/Impostor.Api/Innersloth/VentLocation.cs create mode 100644 src/Impostor.Server/Events/Game/Player/PlayerVentEvent.cs diff --git a/src/Impostor.Api/Events/Game/Player/IPlayerVentEvent.cs b/src/Impostor.Api/Events/Game/Player/IPlayerVentEvent.cs new file mode 100644 index 0000000..81f178b --- /dev/null +++ b/src/Impostor.Api/Events/Game/Player/IPlayerVentEvent.cs @@ -0,0 +1,17 @@ +using Impostor.Api.Innersloth; + +namespace Impostor.Api.Events.Player +{ + public interface IPlayerVentEvent : IPlayerEvent + { + /// + /// Gets get the id of the used vent. + /// + public VentLocation VentId { get; } + + /// + /// Gets a value indicating whether the vent was entered or exited. + /// + public bool VentEnter { get; } + } +} diff --git a/src/Impostor.Api/Innersloth/VentLocation.cs b/src/Impostor.Api/Innersloth/VentLocation.cs new file mode 100644 index 0000000..f9b8567 --- /dev/null +++ b/src/Impostor.Api/Innersloth/VentLocation.cs @@ -0,0 +1,48 @@ +namespace Impostor.Api.Innersloth +{ + public enum VentLocation : uint + { + // Skeld + SkeldAdmin = 0, + SkeldRightHallway = 1, + SkeldCafeteria = 2, + SkeldElectrical = 3, + SkeldUpperEngine = 4, + SkeldSecurity = 5, + SkeldMedbay = 6, + SkeldWeapons = 7, + SkeldLowerReactor = 8, + SkeldLowerEngine = 9, + SkeldShields = 10, + SkeldUpperReactor = 11, + SkeldUpperNavigation = 12, + SkeldLowerNavigation = 13, + + // Mira HQ + MiraBalcony = 1, + MiraCafeteria = 2, + MiraReactor = 3, + MiraLaboratory = 4, + MiraOffice = 5, + MiraAdmin = 6, + MiraGreenhouse = 7, + MiraMedbay = 8, + MiraDecontamination = 9, + MiraLockerRoom = 10, + MiraLaunchpad = 11, + + // Polus + PolusSecurity = 0, + PolusElectrical = 1, + PolusO2 = 2, + PolusCommunications = 3, + PolusOffice = 4, + PolusAdmin = 5, + PolusLaboratory = 6, + PolusLava = 7, + PolusStorage = 8, + PolusRightStabilizer = 9, + PolusLeftStabilizer = 10, + PolusOutsideAdmin = 11, + } +} diff --git a/src/Impostor.Server/Events/Game/Player/PlayerVentEvent.cs b/src/Impostor.Server/Events/Game/Player/PlayerVentEvent.cs new file mode 100644 index 0000000..0798d40 --- /dev/null +++ b/src/Impostor.Server/Events/Game/Player/PlayerVentEvent.cs @@ -0,0 +1,30 @@ +using Impostor.Api.Events.Player; +using Impostor.Api.Games; +using Impostor.Api.Innersloth; +using Impostor.Api.Net; +using Impostor.Api.Net.Inner.Objects; + +namespace Impostor.Server.Events.Player +{ + public class PlayerVentEvent : IPlayerVentEvent + { + public PlayerVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, VentLocation ventId, bool ventEnter) + { + Game = game; + ClientPlayer = sender; + PlayerControl = innerPlayerPhysics; + VentId = ventId; + VentEnter = ventEnter; + } + + public IGame Game { get; } + + public IClientPlayer ClientPlayer { get; } + + public IInnerPlayerControl PlayerControl { get; } + + public VentLocation VentId { get; } + + public bool VentEnter { get; } + } +} diff --git a/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs b/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs index ece39a4..29bc996 100644 --- a/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs +++ b/src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs @@ -1,8 +1,11 @@ -using System; +using System; using System.Threading.Tasks; using Impostor.Api; +using Impostor.Api.Events.Managers; +using Impostor.Api.Innersloth; using Impostor.Api.Net; using Impostor.Api.Net.Messages; +using Impostor.Server.Events.Player; using Impostor.Server.Net.State; using Microsoft.Extensions.Logging; @@ -12,19 +15,23 @@ 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) + public InnerPlayerPhysics(ILogger logger, InnerPlayerControl playerControl, IEventManager eventManager, Game game) { _logger = logger; _playerControl = playerControl; + _eventManager = eventManager; + _game = game; } - public override ValueTask HandleRpc(ClientPlayer sender, ClientPlayer? target, RpcCalls call, IMessageReader reader) + public override async ValueTask HandleRpc(ClientPlayer sender, ClientPlayer? target, RpcCalls call, IMessageReader reader) { if (call != RpcCalls.EnterVent && call != RpcCalls.ExitVent) { _logger.LogWarning("{0}: Unknown rpc call {1}", nameof(InnerPlayerPhysics), call); - return default; + return; } if (!sender.IsOwner(this)) @@ -45,9 +52,9 @@ namespace Impostor.Server.Net.Inner.Objects.Components var ventId = reader.ReadPackedUInt32(); var ventEnter = call == RpcCalls.EnterVent; - // TODO: Do stuff. + await _eventManager.CallAsync(new PlayerVentEvent(_game, sender, _playerControl, (VentLocation)ventId, ventEnter)); - return default; + return; } public override bool Serialize(IMessageWriter writer, bool initialState) diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index a2c6396..c71fcf7 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -26,7 +26,7 @@ namespace Impostor.Server.Net.Inner.Objects _eventManager = eventManager; _game = game; - Physics = ActivatorUtilities.CreateInstance(serviceProvider, this); + Physics = ActivatorUtilities.CreateInstance(serviceProvider, this, _eventManager, _game); NetworkTransform = ActivatorUtilities.CreateInstance(serviceProvider, this, _game); Components.Add(this); -- 2.39.5