diff --git a/src/Impostor.Api/Events/Game/Player/IPlayerEnterVentEvent.cs b/src/Impostor.Api/Events/Game/Player/IPlayerEnterVentEvent.cs index dddcb3bf8..fac832b7d 100644 --- a/src/Impostor.Api/Events/Game/Player/IPlayerEnterVentEvent.cs +++ b/src/Impostor.Api/Events/Game/Player/IPlayerEnterVentEvent.cs @@ -2,11 +2,14 @@ namespace Impostor.Api.Events.Player { + /// + /// Called whenever a player enters a vent. + /// public interface IPlayerEnterVentEvent : IPlayerEvent { /// - /// Gets get the id of the used vent. + /// Gets the entered vent. /// - public Vent Vent { get; } + public IVent Vent { get; } } } diff --git a/src/Impostor.Api/Events/Game/Player/IPlayerExitVentEvent.cs b/src/Impostor.Api/Events/Game/Player/IPlayerExitVentEvent.cs index 516f80b7d..84dc1afcc 100644 --- a/src/Impostor.Api/Events/Game/Player/IPlayerExitVentEvent.cs +++ b/src/Impostor.Api/Events/Game/Player/IPlayerExitVentEvent.cs @@ -2,11 +2,14 @@ namespace Impostor.Api.Events.Player { + /// + /// Called whenever a player exits a vent. + /// public interface IPlayerExitVentEvent : IPlayerEvent { /// - /// Gets get the id of the used vent. + /// Gets the exited vent. /// - public Vent Vent { get; } + public IVent Vent { get; } } } diff --git a/src/Impostor.Api/Events/Game/Player/IPlayerVentEvent.cs b/src/Impostor.Api/Events/Game/Player/IPlayerVentEvent.cs index 0ab202d41..959e75342 100644 --- a/src/Impostor.Api/Events/Game/Player/IPlayerVentEvent.cs +++ b/src/Impostor.Api/Events/Game/Player/IPlayerVentEvent.cs @@ -2,11 +2,14 @@ namespace Impostor.Api.Events.Player { + /// + /// Called whenever a player moves to another vent. + /// public interface IPlayerVentEvent : IPlayerEvent { /// - /// Gets get the id of the used vent. + /// Gets the vent player moved to. /// - public Vent Vent { get; } + public IVent NewVent { get; } } } diff --git a/src/Impostor.Api/Extensions/DictionaryExtensions.cs b/src/Impostor.Api/Extensions/DictionaryExtensions.cs new file mode 100644 index 000000000..b8b682feb --- /dev/null +++ b/src/Impostor.Api/Extensions/DictionaryExtensions.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Impostor.Api +{ + public static class DictionaryExtensions + { + /// Returns a read-only wrapper for the dictionary. + /// An object that acts as a read-only wrapper around the . + public static ReadOnlyDictionary AsReadOnly(this IDictionary dictionary) + where TKey : notnull + { + return new ReadOnlyDictionary(dictionary); + } + } +} diff --git a/src/Impostor.Api/Innersloth/IVent.cs b/src/Impostor.Api/Innersloth/IVent.cs new file mode 100644 index 000000000..4c697f624 --- /dev/null +++ b/src/Impostor.Api/Innersloth/IVent.cs @@ -0,0 +1,19 @@ +using System.Numerics; + +namespace Impostor.Api.Innersloth +{ + public interface IVent + { + int Id { get; } + + string Name { get; } + + Vector2 Position { get; } + + IVent? Left { get; } + + IVent? Center { get; } + + IVent? Right { get; } + } +} diff --git a/src/Impostor.Api/Innersloth/Maps/AirshipData.cs b/src/Impostor.Api/Innersloth/Maps/AirshipData.cs index 04657d00d..46504c9eb 100644 --- a/src/Impostor.Api/Innersloth/Maps/AirshipData.cs +++ b/src/Impostor.Api/Innersloth/Maps/AirshipData.cs @@ -5,45 +5,34 @@ namespace Impostor.Api.Innersloth.Maps { - public class AirshipData : MapData + public class AirshipData : IMapData { + private readonly IReadOnlyDictionary _vents; + public AirshipData() { - Vents = new[] + var vents = new[] { - new AirshipVent(AirshipVent.Ids.Vault, new Vector2(-12.6322f, 8.4735f)), - new AirshipVent(AirshipVent.Ids.Cockpit, new Vector2(-22.099f, -1.512f)), - new AirshipVent(AirshipVent.Ids.ViewingDeck, new Vector2(-15.659f, -11.6991f)), - new AirshipVent(AirshipVent.Ids.EngineRoom, new Vector2(0.203f, -2.5361f)), - new AirshipVent(AirshipVent.Ids.Kitchen, new Vector2(-2.6019f, -9.338f)), - new AirshipVent(AirshipVent.Ids.MainHallBottom, new Vector2(7.021f, -3.730999f)), - new AirshipVent(AirshipVent.Ids.GapRight, new Vector2(9.814f, 3.206f)), - new AirshipVent(AirshipVent.Ids.GapLeft, new Vector2(12.663f, 5.922f)), - new AirshipVent(AirshipVent.Ids.MainHallTop, new Vector2(3.605f, 6.923f)), - new AirshipVent(AirshipVent.Ids.Showers, new Vector2(23.9869f, -1.386f)), - new AirshipVent(AirshipVent.Ids.Records, new Vector2(23.2799f, 8.259998f)), - new AirshipVent(AirshipVent.Ids.CargoBay, new Vector2(30.4409f, -3.577f)), - }.ToDictionary(x => x.Id, x => (Vent)x); + new AirshipVent(this, AirshipVent.Ids.Vault, new Vector2(-12.6322f, 8.4735f), left: AirshipVent.Ids.Cockpit), + new AirshipVent(this, AirshipVent.Ids.Cockpit, new Vector2(-22.099f, -1.512f), left: AirshipVent.Ids.Vault, right: AirshipVent.Ids.ViewingDeck), + new AirshipVent(this, AirshipVent.Ids.ViewingDeck, new Vector2(-15.659f, -11.6991f), left: AirshipVent.Ids.Cockpit), + new AirshipVent(this, AirshipVent.Ids.EngineRoom, new Vector2(0.203f, -2.5361f), left: AirshipVent.Ids.Kitchen, right: AirshipVent.Ids.MainHallBottom), + new AirshipVent(this, AirshipVent.Ids.Kitchen, new Vector2(-2.6019f, -9.338f), left: AirshipVent.Ids.EngineRoom, right: AirshipVent.Ids.MainHallBottom), + new AirshipVent(this, AirshipVent.Ids.MainHallBottom, new Vector2(7.021f, -3.730999f), left: AirshipVent.Ids.EngineRoom, right: AirshipVent.Ids.Kitchen), + new AirshipVent(this, AirshipVent.Ids.GapRight, new Vector2(9.814f, 3.206f), left: AirshipVent.Ids.MainHallTop, right: AirshipVent.Ids.GapLeft), + new AirshipVent(this, AirshipVent.Ids.GapLeft, new Vector2(12.663f, 5.922f), left: AirshipVent.Ids.MainHallTop, right: AirshipVent.Ids.GapRight), + new AirshipVent(this, AirshipVent.Ids.MainHallTop, new Vector2(3.605f, 6.923f), left: AirshipVent.Ids.GapLeft, right: AirshipVent.Ids.GapRight), + new AirshipVent(this, AirshipVent.Ids.Showers, new Vector2(23.9869f, -1.386f), left: AirshipVent.Ids.Records, right: AirshipVent.Ids.CargoBay), + new AirshipVent(this, AirshipVent.Ids.Records, new Vector2(23.2799f, 8.259998f), left: AirshipVent.Ids.Showers, right: AirshipVent.Ids.CargoBay), + new AirshipVent(this, AirshipVent.Ids.CargoBay, new Vector2(30.4409f, -3.577f), left: AirshipVent.Ids.Showers, right: AirshipVent.Ids.Records), + }; - ConnectVents(AirshipVent.Ids.Vault, left: AirshipVent.Ids.Cockpit); - ConnectVents(AirshipVent.Ids.Cockpit, left: AirshipVent.Ids.Vault, right: AirshipVent.Ids.ViewingDeck); - ConnectVents(AirshipVent.Ids.ViewingDeck, left: AirshipVent.Ids.Cockpit); - ConnectVents(AirshipVent.Ids.EngineRoom, left: AirshipVent.Ids.Kitchen, right: AirshipVent.Ids.MainHallBottom); - ConnectVents(AirshipVent.Ids.Kitchen, left: AirshipVent.Ids.EngineRoom, right: AirshipVent.Ids.MainHallBottom); - ConnectVents(AirshipVent.Ids.MainHallBottom, left: AirshipVent.Ids.EngineRoom, right: AirshipVent.Ids.Kitchen); - ConnectVents(AirshipVent.Ids.GapRight, left: AirshipVent.Ids.MainHallTop, right: AirshipVent.Ids.GapLeft); - ConnectVents(AirshipVent.Ids.GapLeft, left: AirshipVent.Ids.MainHallTop, right: AirshipVent.Ids.GapRight); - ConnectVents(AirshipVent.Ids.MainHallTop, left: AirshipVent.Ids.GapLeft, right: AirshipVent.Ids.GapRight); - ConnectVents(AirshipVent.Ids.Showers, left: AirshipVent.Ids.Records, right: AirshipVent.Ids.CargoBay); - ConnectVents(AirshipVent.Ids.Records, left: AirshipVent.Ids.Showers, right: AirshipVent.Ids.CargoBay); - ConnectVents(AirshipVent.Ids.CargoBay, left: AirshipVent.Ids.Showers, right: AirshipVent.Ids.Records); + Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly(); + _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly(); } - public override IReadOnlyDictionary Vents { get; } + public IReadOnlyDictionary Vents { get; } - private void ConnectVents(AirshipVent.Ids vent, AirshipVent.Ids? left = null, AirshipVent.Ids? center = null, AirshipVent.Ids? right = null) - { - ConnectVents((int)vent, (int?)left, (int?)center, (int?)right); - } + IReadOnlyDictionary IMapData.Vents => _vents; } } diff --git a/src/Impostor.Api/Innersloth/Maps/IMapData.cs b/src/Impostor.Api/Innersloth/Maps/IMapData.cs new file mode 100644 index 000000000..8f94b38cd --- /dev/null +++ b/src/Impostor.Api/Innersloth/Maps/IMapData.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace Impostor.Api.Innersloth.Maps +{ + public interface IMapData + { + public static IReadOnlyDictionary Maps { get; } = new Dictionary + { + [MapTypes.Skeld] = new SkeldData(), + [MapTypes.MiraHQ] = new MiraData(), + [MapTypes.Polus] = new PolusData(), + [MapTypes.Airship] = new AirshipData(), + }.AsReadOnly(); + + IReadOnlyDictionary Vents { get; } + } +} diff --git a/src/Impostor.Api/Innersloth/Maps/MapData.cs b/src/Impostor.Api/Innersloth/Maps/MapData.cs deleted file mode 100644 index 53428f59a..000000000 --- a/src/Impostor.Api/Innersloth/Maps/MapData.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; - -namespace Impostor.Api.Innersloth.Maps -{ - public abstract class MapData - { - public static IReadOnlyDictionary Maps { get; } = new Dictionary - { - [MapTypes.Skeld] = new SkeldData(), - [MapTypes.MiraHQ] = new MiraData(), - [MapTypes.Polus] = new PolusData(), - [MapTypes.Airship] = new AirshipData(), - }; - - public abstract IReadOnlyDictionary Vents { get; } - - protected void ConnectVents(int vent, int? left = null, int? center = null, int? right = null) - { - Vents[vent].Left = left != null ? Vents[left.Value] : null; - Vents[vent].Center = center != null ? Vents[center.Value] : null; - Vents[vent].Right = right != null ? Vents[right.Value] : null; - } - } -} diff --git a/src/Impostor.Api/Innersloth/Maps/MiraData.cs b/src/Impostor.Api/Innersloth/Maps/MiraData.cs index 41f2c61fe..37ed2451f 100644 --- a/src/Impostor.Api/Innersloth/Maps/MiraData.cs +++ b/src/Impostor.Api/Innersloth/Maps/MiraData.cs @@ -5,43 +5,33 @@ namespace Impostor.Api.Innersloth.Maps { - public class MiraData : MapData + public class MiraData : IMapData { + private readonly IReadOnlyDictionary _vents; + public MiraData() { - Vents = new[] + var vents = new[] { - new MiraVent(MiraVent.Ids.Balcony, new Vector2(23.77f, -1.94f)), - new MiraVent(MiraVent.Ids.Cafeteria, new Vector2(23.9f, 7.18f)), - new MiraVent(MiraVent.Ids.Reactor, new Vector2(0.4800001f, 10.697f)), - new MiraVent(MiraVent.Ids.Laboratory, new Vector2(11.606f, 13.816f)), - new MiraVent(MiraVent.Ids.Office, new Vector2(13.28f, 20.13f)), - new MiraVent(MiraVent.Ids.Admin, new Vector2(22.39f, 17.23f)), - new MiraVent(MiraVent.Ids.Greenhouse, new Vector2(17.85f, 25.23f)), - new MiraVent(MiraVent.Ids.Medbay, new Vector2(15.41f, -1.82f)), - new MiraVent(MiraVent.Ids.Decontamination, new Vector2(6.83f, 3.145f)), - new MiraVent(MiraVent.Ids.LockerRoom, new Vector2(4.29f, 0.5299997f)), - new MiraVent(MiraVent.Ids.Launchpad, new Vector2(-6.18f, 3.56f)), - }.ToDictionary(x => x.Id, x => (Vent)x); + new MiraVent(this, MiraVent.Ids.Balcony, new Vector2(23.77f, -1.94f), left: MiraVent.Ids.Medbay, right: MiraVent.Ids.Cafeteria), + new MiraVent(this, MiraVent.Ids.Cafeteria, new Vector2(23.9f, 7.18f), left: MiraVent.Ids.Admin, right: MiraVent.Ids.Balcony), + new MiraVent(this, MiraVent.Ids.Reactor, new Vector2(0.4800001f, 10.697f), left: MiraVent.Ids.Laboratory, center: MiraVent.Ids.Decontamination, right: MiraVent.Ids.Launchpad), + new MiraVent(this, MiraVent.Ids.Laboratory, new Vector2(11.606f, 13.816f), left: MiraVent.Ids.Reactor, center: MiraVent.Ids.Decontamination, right: MiraVent.Ids.Office), + new MiraVent(this, MiraVent.Ids.Office, new Vector2(13.28f, 20.13f), left: MiraVent.Ids.Laboratory, center: MiraVent.Ids.Admin, right: MiraVent.Ids.Greenhouse), + new MiraVent(this, MiraVent.Ids.Admin, new Vector2(22.39f, 17.23f), left: MiraVent.Ids.Greenhouse, center: MiraVent.Ids.Cafeteria, right: MiraVent.Ids.Office), + new MiraVent(this, MiraVent.Ids.Greenhouse, new Vector2(17.85f, 25.23f), left: MiraVent.Ids.Admin, right: MiraVent.Ids.Office), + new MiraVent(this, MiraVent.Ids.Medbay, new Vector2(15.41f, -1.82f), left: MiraVent.Ids.Balcony, right: MiraVent.Ids.LockerRoom), + new MiraVent(this, MiraVent.Ids.Decontamination, new Vector2(6.83f, 3.145f), left: MiraVent.Ids.Reactor, center: MiraVent.Ids.LockerRoom, right: MiraVent.Ids.Laboratory), + new MiraVent(this, MiraVent.Ids.LockerRoom, new Vector2(4.29f, 0.5299997f), left: MiraVent.Ids.Medbay, center: MiraVent.Ids.Launchpad, right: MiraVent.Ids.Decontamination), + new MiraVent(this, MiraVent.Ids.Launchpad, new Vector2(-6.18f, 3.56f), left: MiraVent.Ids.Reactor, right: MiraVent.Ids.LockerRoom), + }; - ConnectVents(MiraVent.Ids.Balcony, left: MiraVent.Ids.Medbay, right: MiraVent.Ids.Cafeteria); - ConnectVents(MiraVent.Ids.Cafeteria, left: MiraVent.Ids.Admin, right: MiraVent.Ids.Balcony); - ConnectVents(MiraVent.Ids.Reactor, left: MiraVent.Ids.Laboratory, center: MiraVent.Ids.Decontamination, right: MiraVent.Ids.Launchpad); - ConnectVents(MiraVent.Ids.Laboratory, left: MiraVent.Ids.Reactor, center: MiraVent.Ids.Decontamination, right: MiraVent.Ids.Office); - ConnectVents(MiraVent.Ids.Office, left: MiraVent.Ids.Laboratory, center: MiraVent.Ids.Admin, right: MiraVent.Ids.Greenhouse); - ConnectVents(MiraVent.Ids.Admin, left: MiraVent.Ids.Greenhouse, center: MiraVent.Ids.Cafeteria, right: MiraVent.Ids.Office); - ConnectVents(MiraVent.Ids.Greenhouse, left: MiraVent.Ids.Admin, right: MiraVent.Ids.Office); - ConnectVents(MiraVent.Ids.Medbay, left: MiraVent.Ids.Balcony, right: MiraVent.Ids.LockerRoom); - ConnectVents(MiraVent.Ids.Decontamination, left: MiraVent.Ids.Reactor, center: MiraVent.Ids.LockerRoom, right: MiraVent.Ids.Laboratory); - ConnectVents(MiraVent.Ids.LockerRoom, left: MiraVent.Ids.Medbay, center: MiraVent.Ids.Launchpad, right: MiraVent.Ids.Decontamination); - ConnectVents(MiraVent.Ids.Launchpad, left: MiraVent.Ids.Reactor, right: MiraVent.Ids.LockerRoom); + Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly(); + _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly(); } - public override IReadOnlyDictionary Vents { get; } + public IReadOnlyDictionary Vents { get; } - private void ConnectVents(MiraVent.Ids vent, MiraVent.Ids? left = null, MiraVent.Ids? center = null, MiraVent.Ids? right = null) - { - ConnectVents((int)vent, (int?)left, (int?)center, (int?)right); - } + IReadOnlyDictionary IMapData.Vents => _vents; } } diff --git a/src/Impostor.Api/Innersloth/Maps/PolusData.cs b/src/Impostor.Api/Innersloth/Maps/PolusData.cs index 5748d26f1..76bc97043 100644 --- a/src/Impostor.Api/Innersloth/Maps/PolusData.cs +++ b/src/Impostor.Api/Innersloth/Maps/PolusData.cs @@ -5,45 +5,34 @@ namespace Impostor.Api.Innersloth.Maps { - public class PolusData : MapData + public class PolusData : IMapData { + private readonly IReadOnlyDictionary _vents; + public PolusData() { - Vents = new[] + var vents = new[] { - new PolusVent(PolusVent.Ids.Security, new Vector2(1.929f, -9.558001f)), - new PolusVent(PolusVent.Ids.Electrical, new Vector2(6.9f, -14.41f)), - new PolusVent(PolusVent.Ids.O2, new Vector2(3.51f, -16.58f)), - new PolusVent(PolusVent.Ids.Communications, new Vector2(12.304f, -18.898f)), - new PolusVent(PolusVent.Ids.Office, new Vector2(16.379f, -19.599f)), - new PolusVent(PolusVent.Ids.Admin, new Vector2(20.089f, -25.517f)), - new PolusVent(PolusVent.Ids.Laboratory, new Vector2(32.963f, -9.526f)), - new PolusVent(PolusVent.Ids.Lava, new Vector2(30.907f, -11.86f)), - new PolusVent(PolusVent.Ids.Storage, new Vector2(22f, -12.19f)), - new PolusVent(PolusVent.Ids.RightStabilizer, new Vector2(24.02f, -8.39f)), - new PolusVent(PolusVent.Ids.LeftStabilizer, new Vector2(9.64f, -7.72f)), - new PolusVent(PolusVent.Ids.OutsideAdmin, new Vector2(18.93f, -24.85f)), - }.ToDictionary(x => x.Id, x => (Vent)x); + new PolusVent(this, PolusVent.Ids.Security, new Vector2(1.929f, -9.558001f), left: PolusVent.Ids.O2, right: PolusVent.Ids.Electrical), + new PolusVent(this, PolusVent.Ids.Electrical, new Vector2(6.9f, -14.41f), left: PolusVent.Ids.O2, right: PolusVent.Ids.Security), + new PolusVent(this, PolusVent.Ids.O2, new Vector2(3.51f, -16.58f), left: PolusVent.Ids.Electrical, right: PolusVent.Ids.Security), + new PolusVent(this, PolusVent.Ids.Communications, new Vector2(12.304f, -18.898f), left: PolusVent.Ids.Storage, right: PolusVent.Ids.Office), + new PolusVent(this, PolusVent.Ids.Office, new Vector2(16.379f, -19.599f), left: PolusVent.Ids.Communications, right: PolusVent.Ids.Storage), + new PolusVent(this, PolusVent.Ids.Admin, new Vector2(20.089f, -25.517f), left: PolusVent.Ids.OutsideAdmin, right: PolusVent.Ids.Lava), + new PolusVent(this, PolusVent.Ids.Laboratory, new Vector2(32.963f, -9.526f), right: PolusVent.Ids.Lava), + new PolusVent(this, PolusVent.Ids.Lava, new Vector2(30.907f, -11.86f), left: PolusVent.Ids.Laboratory, right: PolusVent.Ids.Admin), + new PolusVent(this, PolusVent.Ids.Storage, new Vector2(22f, -12.19f), left: PolusVent.Ids.Communications, right: PolusVent.Ids.Office), + new PolusVent(this, PolusVent.Ids.RightStabilizer, new Vector2(24.02f, -8.39f), left: PolusVent.Ids.LeftStabilizer), + new PolusVent(this, PolusVent.Ids.LeftStabilizer, new Vector2(9.64f, -7.72f), left: PolusVent.Ids.RightStabilizer), + new PolusVent(this, PolusVent.Ids.OutsideAdmin, new Vector2(18.93f, -24.85f), right: PolusVent.Ids.Admin), + }; - ConnectVents(PolusVent.Ids.Security, left: PolusVent.Ids.O2, right: PolusVent.Ids.Electrical); - ConnectVents(PolusVent.Ids.Electrical, left: PolusVent.Ids.O2, right: PolusVent.Ids.Security); - ConnectVents(PolusVent.Ids.O2, left: PolusVent.Ids.Electrical, right: PolusVent.Ids.Security); - ConnectVents(PolusVent.Ids.Communications, left: PolusVent.Ids.Storage, right: PolusVent.Ids.Office); - ConnectVents(PolusVent.Ids.Office, left: PolusVent.Ids.Communications, right: PolusVent.Ids.Storage); - ConnectVents(PolusVent.Ids.Admin, left: PolusVent.Ids.OutsideAdmin, right: PolusVent.Ids.Lava); - ConnectVents(PolusVent.Ids.Laboratory, right: PolusVent.Ids.Lava); - ConnectVents(PolusVent.Ids.Lava, left: PolusVent.Ids.Laboratory, right: PolusVent.Ids.Admin); - ConnectVents(PolusVent.Ids.Storage, left: PolusVent.Ids.Communications, right: PolusVent.Ids.Office); - ConnectVents(PolusVent.Ids.RightStabilizer, left: PolusVent.Ids.LeftStabilizer); - ConnectVents(PolusVent.Ids.LeftStabilizer, left: PolusVent.Ids.RightStabilizer); - ConnectVents(PolusVent.Ids.OutsideAdmin, right: PolusVent.Ids.Admin); + Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly(); + _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly(); } - public override IReadOnlyDictionary Vents { get; } + public IReadOnlyDictionary Vents { get; } - private void ConnectVents(PolusVent.Ids vent, PolusVent.Ids? left = null, PolusVent.Ids? center = null, PolusVent.Ids? right = null) - { - ConnectVents((int)vent, (int?)left, (int?)center, (int?)right); - } + IReadOnlyDictionary IMapData.Vents => _vents; } } diff --git a/src/Impostor.Api/Innersloth/Maps/SkeldData.cs b/src/Impostor.Api/Innersloth/Maps/SkeldData.cs index b0bb95d95..6555ba1b9 100644 --- a/src/Impostor.Api/Innersloth/Maps/SkeldData.cs +++ b/src/Impostor.Api/Innersloth/Maps/SkeldData.cs @@ -5,49 +5,36 @@ namespace Impostor.Api.Innersloth.Maps { - public class SkeldData : MapData + public class SkeldData : IMapData { + private readonly IReadOnlyDictionary _vents; + public SkeldData() { - Vents = new[] + var vents = new[] { - new SkeldVent(SkeldVent.Ids.Admin, new Vector2(2.544f, -9.955201f)), - new SkeldVent(SkeldVent.Ids.RightHallway, new Vector2(9.384f, -6.438f)), - new SkeldVent(SkeldVent.Ids.Cafeteria, new Vector2(4.2588f, -0.276f)), - new SkeldVent(SkeldVent.Ids.Electrical, new Vector2(-9.7764f, -8.034f)), - new SkeldVent(SkeldVent.Ids.UpperEngine, new Vector2(-15.288f, 2.52f)), - new SkeldVent(SkeldVent.Ids.Security, new Vector2(-12.534f, -6.9492f)), - new SkeldVent(SkeldVent.Ids.Medbay, new Vector2(-10.608f, -4.176f)), - new SkeldVent(SkeldVent.Ids.Weapons, new Vector2(8.820001f, 3.324f)), - new SkeldVent(SkeldVent.Ids.LowerReactor, new Vector2(-20.796f, -6.9528f)), - new SkeldVent(SkeldVent.Ids.LowerEngine, new Vector2(-15.2508f, -13.656f)), - new SkeldVent(SkeldVent.Ids.Shields, new Vector2(9.5232f, -14.3376f)), - new SkeldVent(SkeldVent.Ids.UpperReactor, new Vector2(-21.876f, -3.0516f)), - new SkeldVent(SkeldVent.Ids.UpperNavigation, new Vector2(16.008f, -3.168f)), - new SkeldVent(SkeldVent.Ids.LowerNavigation, new Vector2(16.008f, -6.384f)), - }.ToDictionary(x => x.Id, x => (Vent)x); + new SkeldVent(this, SkeldVent.Ids.Admin, new Vector2(2.544f, -9.955201f), left: SkeldVent.Ids.Cafeteria, right: SkeldVent.Ids.RightHallway), + new SkeldVent(this, SkeldVent.Ids.RightHallway, new Vector2(9.384f, -6.438f), left: SkeldVent.Ids.Admin, right: SkeldVent.Ids.Cafeteria), + new SkeldVent(this, SkeldVent.Ids.Cafeteria, new Vector2(4.2588f, -0.276f), left: SkeldVent.Ids.Admin, right: SkeldVent.Ids.RightHallway), + new SkeldVent(this, SkeldVent.Ids.Electrical, new Vector2(-9.7764f, -8.034f), left: SkeldVent.Ids.Security, right: SkeldVent.Ids.Medbay), + new SkeldVent(this, SkeldVent.Ids.UpperEngine, new Vector2(-15.288f, 2.52f), left: SkeldVent.Ids.UpperReactor), + new SkeldVent(this, SkeldVent.Ids.Security, new Vector2(-12.534f, -6.9492f), left: SkeldVent.Ids.Medbay, right: SkeldVent.Ids.Electrical), + new SkeldVent(this, SkeldVent.Ids.Medbay, new Vector2(-10.608f, -4.176f), left: SkeldVent.Ids.Security, right: SkeldVent.Ids.Electrical), + new SkeldVent(this, SkeldVent.Ids.Weapons, new Vector2(8.820001f, 3.324f), right: SkeldVent.Ids.UpperNavigation), + new SkeldVent(this, SkeldVent.Ids.LowerReactor, new Vector2(-20.796f, -6.9528f), left: SkeldVent.Ids.LowerEngine), + new SkeldVent(this, SkeldVent.Ids.LowerEngine, new Vector2(-15.2508f, -13.656f), left: SkeldVent.Ids.LowerReactor), + new SkeldVent(this, SkeldVent.Ids.Shields, new Vector2(9.5232f, -14.3376f), left: SkeldVent.Ids.LowerNavigation), + new SkeldVent(this, SkeldVent.Ids.UpperReactor, new Vector2(-21.876f, -3.0516f), left: SkeldVent.Ids.UpperEngine), + new SkeldVent(this, SkeldVent.Ids.UpperNavigation, new Vector2(16.008f, -3.168f), right: SkeldVent.Ids.Weapons), + new SkeldVent(this, SkeldVent.Ids.LowerNavigation, new Vector2(16.008f, -6.384f), right: SkeldVent.Ids.Shields), + }; - ConnectVents(SkeldVent.Ids.Admin, left: SkeldVent.Ids.Cafeteria, right: SkeldVent.Ids.RightHallway); - ConnectVents(SkeldVent.Ids.RightHallway, left: SkeldVent.Ids.Admin, right: SkeldVent.Ids.Cafeteria); - ConnectVents(SkeldVent.Ids.Cafeteria, left: SkeldVent.Ids.Admin, right: SkeldVent.Ids.RightHallway); - ConnectVents(SkeldVent.Ids.Electrical, left: SkeldVent.Ids.Security, right: SkeldVent.Ids.Medbay); - ConnectVents(SkeldVent.Ids.UpperEngine, left: SkeldVent.Ids.UpperReactor); - ConnectVents(SkeldVent.Ids.Security, left: SkeldVent.Ids.Medbay, right: SkeldVent.Ids.Electrical); - ConnectVents(SkeldVent.Ids.Medbay, left: SkeldVent.Ids.Security, right: SkeldVent.Ids.Electrical); - ConnectVents(SkeldVent.Ids.Weapons, right: SkeldVent.Ids.UpperNavigation); - ConnectVents(SkeldVent.Ids.LowerReactor, left: SkeldVent.Ids.LowerEngine); - ConnectVents(SkeldVent.Ids.LowerEngine, left: SkeldVent.Ids.LowerReactor); - ConnectVents(SkeldVent.Ids.Shields, left: SkeldVent.Ids.LowerNavigation); - ConnectVents(SkeldVent.Ids.UpperReactor, left: SkeldVent.Ids.UpperEngine); - ConnectVents(SkeldVent.Ids.UpperNavigation, right: SkeldVent.Ids.Weapons); - ConnectVents(SkeldVent.Ids.LowerNavigation, right: SkeldVent.Ids.Shields); + Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly(); + _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly(); } - public override IReadOnlyDictionary Vents { get; } + public IReadOnlyDictionary Vents { get; } - private void ConnectVents(SkeldVent.Ids vent, SkeldVent.Ids? left = null, SkeldVent.Ids? center = null, SkeldVent.Ids? right = null) - { - ConnectVents((int)vent, (int?)left, (int?)center, (int?)right); - } + IReadOnlyDictionary IMapData.Vents => _vents; } } diff --git a/src/Impostor.Api/Innersloth/Maps/Vents/AirshipVent.cs b/src/Impostor.Api/Innersloth/Maps/Vents/AirshipVent.cs index 7605504c8..331469244 100644 --- a/src/Impostor.Api/Innersloth/Maps/Vents/AirshipVent.cs +++ b/src/Impostor.Api/Innersloth/Maps/Vents/AirshipVent.cs @@ -1,11 +1,25 @@ +using System; using System.Numerics; namespace Impostor.Api.Innersloth.Maps.Vents { - public class AirshipVent : Vent + public class AirshipVent : IVent { - internal AirshipVent(Ids id, Vector2 position) : base((int)id, id.ToString(), position) + private readonly Lazy? _left; + + private readonly Lazy? _center; + + private readonly Lazy? _right; + + internal AirshipVent(AirshipData data, Ids id, Vector2 position, Ids? left = null, Ids? center = null, Ids? right = null) { + Id = id; + Name = id.ToString(); + Position = position; + + _left = left == null ? null : new Lazy(() => data.Vents[left.Value]); + _center = center == null ? null : new Lazy(() => data.Vents[center.Value]); + _right = right == null ? null : new Lazy(() => data.Vents[right.Value]); } public enum Ids @@ -23,5 +37,25 @@ public enum Ids Records = 10, CargoBay = 11, } + + public Ids Id { get; } + + int IVent.Id => (int)Id; + + public string Name { get; } + + public Vector2 Position { get; } + + public AirshipVent? Left => _left?.Value; + + IVent? IVent.Left => Left; + + public AirshipVent? Center => _center?.Value; + + IVent? IVent.Center => Center; + + public AirshipVent? Right => _right?.Value; + + IVent? IVent.Right => Right; } } diff --git a/src/Impostor.Api/Innersloth/Maps/Vents/MiraVent.cs b/src/Impostor.Api/Innersloth/Maps/Vents/MiraVent.cs index 775401a35..81daddb18 100644 --- a/src/Impostor.Api/Innersloth/Maps/Vents/MiraVent.cs +++ b/src/Impostor.Api/Innersloth/Maps/Vents/MiraVent.cs @@ -1,11 +1,25 @@ +using System; using System.Numerics; namespace Impostor.Api.Innersloth.Maps.Vents { - public class MiraVent : Vent + public class MiraVent : IVent { - internal MiraVent(Ids id, Vector2 position) : base((int)id, id.ToString(), position) + private readonly Lazy? _left; + + private readonly Lazy? _center; + + private readonly Lazy? _right; + + internal MiraVent(MiraData data, Ids id, Vector2 position, Ids? left = null, Ids? center = null, Ids? right = null) { + Id = id; + Name = id.ToString(); + Position = position; + + _left = left == null ? null : new Lazy(() => data.Vents[left.Value]); + _center = center == null ? null : new Lazy(() => data.Vents[center.Value]); + _right = right == null ? null : new Lazy(() => data.Vents[right.Value]); } public enum Ids @@ -22,5 +36,25 @@ public enum Ids LockerRoom = 10, Launchpad = 11, } + + public Ids Id { get; } + + int IVent.Id => (int)Id; + + public string Name { get; } + + public Vector2 Position { get; } + + public MiraVent? Left => _left?.Value; + + IVent? IVent.Left => Left; + + public MiraVent? Center => _center?.Value; + + IVent? IVent.Center => Center; + + public MiraVent? Right => _right?.Value; + + IVent? IVent.Right => Right; } } diff --git a/src/Impostor.Api/Innersloth/Maps/Vents/PolusVent.cs b/src/Impostor.Api/Innersloth/Maps/Vents/PolusVent.cs index 8310af07b..54b542aff 100644 --- a/src/Impostor.Api/Innersloth/Maps/Vents/PolusVent.cs +++ b/src/Impostor.Api/Innersloth/Maps/Vents/PolusVent.cs @@ -1,11 +1,25 @@ +using System; using System.Numerics; namespace Impostor.Api.Innersloth.Maps.Vents { - public class PolusVent : Vent + public class PolusVent : IVent { - internal PolusVent(Ids id, Vector2 position) : base((int)id, id.ToString(), position) + private readonly Lazy? _left; + + private readonly Lazy? _center; + + private readonly Lazy? _right; + + internal PolusVent(PolusData data, Ids id, Vector2 position, Ids? left = null, Ids? center = null, Ids? right = null) { + Id = id; + Name = id.ToString(); + Position = position; + + _left = left == null ? null : new Lazy(() => data.Vents[left.Value]); + _center = center == null ? null : new Lazy(() => data.Vents[center.Value]); + _right = right == null ? null : new Lazy(() => data.Vents[right.Value]); } public enum Ids @@ -23,5 +37,25 @@ public enum Ids LeftStabilizer = 10, OutsideAdmin = 11, } + + public Ids Id { get; } + + int IVent.Id => (int)Id; + + public string Name { get; } + + public Vector2 Position { get; } + + public PolusVent? Left => _left?.Value; + + IVent? IVent.Left => Left; + + public PolusVent? Center => _center?.Value; + + IVent? IVent.Center => Center; + + public PolusVent? Right => _right?.Value; + + IVent? IVent.Right => Right; } } diff --git a/src/Impostor.Api/Innersloth/Maps/Vents/SkeldVent.cs b/src/Impostor.Api/Innersloth/Maps/Vents/SkeldVent.cs index e670a8d3d..747b6fdf9 100644 --- a/src/Impostor.Api/Innersloth/Maps/Vents/SkeldVent.cs +++ b/src/Impostor.Api/Innersloth/Maps/Vents/SkeldVent.cs @@ -1,11 +1,25 @@ +using System; using System.Numerics; namespace Impostor.Api.Innersloth.Maps.Vents { - public class SkeldVent : Vent + public class SkeldVent : IVent { - internal SkeldVent(Ids id, Vector2 position) : base((int)id, id.ToString(), position) + private readonly Lazy? _left; + + private readonly Lazy? _center; + + private readonly Lazy? _right; + + internal SkeldVent(SkeldData data, Ids id, Vector2 position, Ids? left = null, Ids? center = null, Ids? right = null) { + Id = id; + Name = id.ToString(); + Position = position; + + _left = left == null ? null : new Lazy(() => data.Vents[left.Value]); + _center = center == null ? null : new Lazy(() => data.Vents[center.Value]); + _right = right == null ? null : new Lazy(() => data.Vents[right.Value]); } public enum Ids @@ -25,5 +39,25 @@ public enum Ids UpperNavigation = 12, LowerNavigation = 13, } + + public Ids Id { get; } + + int IVent.Id => (int)Id; + + public string Name { get; } + + public Vector2 Position { get; } + + public SkeldVent? Left => _left?.Value; + + IVent? IVent.Left => Left; + + public SkeldVent? Center => _center?.Value; + + IVent? IVent.Center => Center; + + public SkeldVent? Right => _right?.Value; + + IVent? IVent.Right => Right; } } diff --git a/src/Impostor.Api/Innersloth/Vent.cs b/src/Impostor.Api/Innersloth/Vent.cs deleted file mode 100644 index 723207b28..000000000 --- a/src/Impostor.Api/Innersloth/Vent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Numerics; - -namespace Impostor.Api.Innersloth -{ - public abstract class Vent - { - internal Vent(int id, string name, Vector2 position) - { - Id = id; - Name = name; - Position = position; - } - - public int Id { get; } - - public string Name { get; } - - public Vector2 Position { get; } - - public Vent? Left { get; internal set; } - - public Vent? Center { get; internal set; } - - public Vent? Right { get; internal set; } - } -} diff --git a/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs b/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs index fbef0f40b..999cfc174 100644 --- a/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs +++ b/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs @@ -103,13 +103,13 @@ public void OnPlayerEnterVentEvent(IPlayerEnterVentEvent e) [EventListener] public void OnPlayerExitVentEvent(IPlayerExitVentEvent e) { - _logger.LogInformation("Player {player} exit the vent in {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name); + _logger.LogInformation("Player {player} exited the vent in {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name); } [EventListener] public void OnPlayerVentEvent(IPlayerVentEvent e) { - _logger.LogInformation("Player {player} vented to {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name); + _logger.LogInformation("Player {player} vented to {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.NewVent.Name); } } } diff --git a/src/Impostor.Server/Events/Game/Player/PlayerEnterVentEvent.cs b/src/Impostor.Server/Events/Game/Player/PlayerEnterVentEvent.cs index 8e22eb6df..b072dc799 100644 --- a/src/Impostor.Server/Events/Game/Player/PlayerEnterVentEvent.cs +++ b/src/Impostor.Server/Events/Game/Player/PlayerEnterVentEvent.cs @@ -8,7 +8,7 @@ namespace Impostor.Server.Events.Player { public class PlayerEnterVentEvent : IPlayerEnterVentEvent { - public PlayerEnterVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, Vent vent) + public PlayerEnterVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, IVent vent) { Game = game; ClientPlayer = sender; @@ -22,6 +22,6 @@ public PlayerEnterVentEvent(IGame game, IClientPlayer sender, IInnerPlayerContro public IInnerPlayerControl PlayerControl { get; } - public Vent Vent { get; } + public IVent Vent { get; } } } diff --git a/src/Impostor.Server/Events/Game/Player/PlayerExitVentEvent.cs b/src/Impostor.Server/Events/Game/Player/PlayerExitVentEvent.cs index 93842b225..2343c708d 100644 --- a/src/Impostor.Server/Events/Game/Player/PlayerExitVentEvent.cs +++ b/src/Impostor.Server/Events/Game/Player/PlayerExitVentEvent.cs @@ -8,7 +8,7 @@ namespace Impostor.Server.Events.Player { public class PlayerExitVentEvent : IPlayerExitVentEvent { - public PlayerExitVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, Vent vent) + public PlayerExitVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, IVent vent) { Game = game; ClientPlayer = sender; @@ -22,6 +22,6 @@ public PlayerExitVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl public IInnerPlayerControl PlayerControl { get; } - public Vent Vent { get; } + public IVent Vent { get; } } } diff --git a/src/Impostor.Server/Events/Game/Player/PlayerVentEvent.cs b/src/Impostor.Server/Events/Game/Player/PlayerVentEvent.cs index 82a99cdf6..7cfdcd027 100644 --- a/src/Impostor.Server/Events/Game/Player/PlayerVentEvent.cs +++ b/src/Impostor.Server/Events/Game/Player/PlayerVentEvent.cs @@ -8,12 +8,12 @@ namespace Impostor.Server.Events.Player { public class PlayerVentEvent : IPlayerVentEvent { - public PlayerVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, Vent vent) + public PlayerVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, IVent vent) { Game = game; ClientPlayer = sender; PlayerControl = innerPlayerPhysics; - Vent = vent; + NewVent = vent; } public IGame Game { get; } @@ -22,6 +22,6 @@ public PlayerVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl inn public IInnerPlayerControl PlayerControl { get; } - public Vent Vent { get; } + public IVent NewVent { get; } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerAirshipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerAirshipStatus.cs index 84861b1a4..3ed285c10 100644 --- a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerAirshipStatus.cs +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerAirshipStatus.cs @@ -16,7 +16,7 @@ public InnerAirshipStatus(Game game) : base(game) { } - public override MapData Data => MapData.Maps[MapTypes.Airship]; + public override IMapData Data => IMapData.Maps[MapTypes.Airship]; public override Dictionary Doors { get; } = new Dictionary(21); diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerMiraShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerMiraShipStatus.cs index 143c98f77..6f1879de0 100644 --- a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerMiraShipStatus.cs +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerMiraShipStatus.cs @@ -15,7 +15,7 @@ public InnerMiraShipStatus(Game game) : base(game) { } - public override MapData Data => MapData.Maps[MapTypes.MiraHQ]; + public override IMapData Data => IMapData.Maps[MapTypes.MiraHQ]; public override Dictionary Doors { get; } = new Dictionary(0); diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerPolusShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerPolusShipStatus.cs index 7301bc44c..3274727ed 100644 --- a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerPolusShipStatus.cs +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerPolusShipStatus.cs @@ -15,7 +15,7 @@ public InnerPolusShipStatus(Game game) : base(game) { } - public override MapData Data => MapData.Maps[MapTypes.Polus]; + public override IMapData Data => IMapData.Maps[MapTypes.Polus]; public override Dictionary Doors { get; } = new Dictionary(12); diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs index 0f7a4edd8..3dd2d5413 100644 --- a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs @@ -26,7 +26,7 @@ protected InnerShipStatus(Game game) : base(game) Components.Add(this); } - public abstract MapData Data { get; } + public abstract IMapData Data { get; } public abstract Dictionary Doors { get; } diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerSkeldShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerSkeldShipStatus.cs index 6d04f5bb2..6670aad68 100644 --- a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerSkeldShipStatus.cs +++ b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerSkeldShipStatus.cs @@ -15,7 +15,7 @@ public InnerSkeldShipStatus(Game game) : base(game) { } - public override MapData Data { get; } = MapData.Maps[MapTypes.Skeld]; + public override IMapData Data { get; } = IMapData.Maps[MapTypes.Skeld]; public override Dictionary Doors { get; } = new Dictionary(13);