From: Minorusama Date: Thu, 10 Jun 2021 18:54:34 +0000 (+0200) Subject: Using MapData for Tasks (#395) X-Git-Tag: v1.5.0~9 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=8f1cba842939c9db162eccc034aa1189fe3af46c;p=rhonda%2Fimpostor.git Using MapData for Tasks (#395) Co-authored-by: John Tran Co-authored-by: js6pak --- diff --git a/src/Impostor.Api/Innersloth/ITask.cs b/src/Impostor.Api/Innersloth/ITask.cs new file mode 100644 index 0000000..114a75c --- /dev/null +++ b/src/Impostor.Api/Innersloth/ITask.cs @@ -0,0 +1,15 @@ +namespace Impostor.Api.Innersloth +{ + public interface ITask + { + int Id { get; } + + string Name { get; } + + TaskTypes Type { get; } + + TaskCategories Category { get; } + + bool IsVisual { get; } + } +} diff --git a/src/Impostor.Api/Innersloth/Maps/AirshipData.cs b/src/Impostor.Api/Innersloth/Maps/AirshipData.cs index 46504c9..52733a8 100644 --- a/src/Impostor.Api/Innersloth/Maps/AirshipData.cs +++ b/src/Impostor.Api/Innersloth/Maps/AirshipData.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using Impostor.Api.Innersloth.Maps.Tasks; using Impostor.Api.Innersloth.Maps.Vents; namespace Impostor.Api.Innersloth.Maps @@ -8,8 +9,9 @@ namespace Impostor.Api.Innersloth.Maps public class AirshipData : IMapData { private readonly IReadOnlyDictionary _vents; + private readonly IReadOnlyDictionary _tasks; - public AirshipData() + internal AirshipData() { var vents = new[] { @@ -29,10 +31,61 @@ namespace Impostor.Api.Innersloth.Maps Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly(); _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly(); + + var tasks = new[] + { + new AirshipTask(AirshipTask.Ids.ElectricalFixWiring, TaskTypes.FixWiring, TaskCategories.CommonTask), + new AirshipTask(AirshipTask.Ids.MeetingRoomEnterIDCode, TaskTypes.EnterIdCode, TaskCategories.CommonTask), + new AirshipTask(AirshipTask.Ids.ElectricalResetBreakers, TaskTypes.ResetBreakers, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.VaultRoomDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.BrigDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.CargoBayDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.GapRoomDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.RecordsDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.CargoBayUnlockSafe, TaskTypes.UnlockSafe, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.VentilationStartFans, TaskTypes.StartFans, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.MainHallEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.MedicalEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.KitchenEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.MainHallDevelopPhotos, TaskTypes.DevelopPhotos, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.CargoBayFuelEngines, TaskTypes.FuelEngines, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.SecurityRewindTapes, TaskTypes.RewindTapes, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.VaultRoomPolishRuby, TaskTypes.PolishRuby, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ElectricalCalibrateDistributor, TaskTypes.CalibrateDistributor, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.CockpitStabilizeSteering, TaskTypes.StabilizeSteering, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ArmoryDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.CockpitDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.CommsDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.MedicalDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.ViewingDeckDownloadData, TaskTypes.UploadData, TaskCategories.LongTask), + new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToArmory, TaskTypes.DivertPower, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToCockpit, TaskTypes.DivertPower, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToGapRoom, TaskTypes.DivertPower, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToMainHall, TaskTypes.DivertPower, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToMeetingRoom, TaskTypes.DivertPower, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToShowers, TaskTypes.DivertPower, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToEngine, TaskTypes.DivertPower, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ShowersPickUpTowels, TaskTypes.PickUpTowels, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.LoungeCleanToilet, TaskTypes.CleanToilet, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.VaultRoomDressMannequin, TaskTypes.DressMannequin, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.RecordsSortRecords, TaskTypes.SortRecords, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ArmoryPutAwayPistols, TaskTypes.PutAwayPistols, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ArmoryPutAwayRifles, TaskTypes.PutAwayRifles, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.MainHallDecontaminate, TaskTypes.Decontaminate, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.KitchenMakeBurger, TaskTypes.MakeBurger, TaskCategories.ShortTask), + new AirshipTask(AirshipTask.Ids.ShowersFixShower, TaskTypes.FixShower, TaskCategories.ShortTask), + }; + + Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly(); + _tasks = tasks.ToDictionary(x => (int)x.Id, x => (ITask)x).AsReadOnly(); } public IReadOnlyDictionary Vents { get; } IReadOnlyDictionary IMapData.Vents => _vents; + + public IReadOnlyDictionary Tasks { get; } + + IReadOnlyDictionary IMapData.Tasks => _tasks; } } diff --git a/src/Impostor.Api/Innersloth/Maps/IMapData.cs b/src/Impostor.Api/Innersloth/Maps/IMapData.cs index 8f94b38..ce804a0 100644 --- a/src/Impostor.Api/Innersloth/Maps/IMapData.cs +++ b/src/Impostor.Api/Innersloth/Maps/IMapData.cs @@ -13,5 +13,7 @@ namespace Impostor.Api.Innersloth.Maps }.AsReadOnly(); IReadOnlyDictionary Vents { get; } + + IReadOnlyDictionary Tasks { get; } } } diff --git a/src/Impostor.Api/Innersloth/Maps/MiraData.cs b/src/Impostor.Api/Innersloth/Maps/MiraData.cs index 37ed245..f66f89a 100644 --- a/src/Impostor.Api/Innersloth/Maps/MiraData.cs +++ b/src/Impostor.Api/Innersloth/Maps/MiraData.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using Impostor.Api.Innersloth.Maps.Tasks; using Impostor.Api.Innersloth.Maps.Vents; namespace Impostor.Api.Innersloth.Maps @@ -8,8 +9,9 @@ namespace Impostor.Api.Innersloth.Maps public class MiraData : IMapData { private readonly IReadOnlyDictionary _vents; + private readonly IReadOnlyDictionary _tasks; - public MiraData() + internal MiraData() { var vents = new[] { @@ -28,10 +30,47 @@ namespace Impostor.Api.Innersloth.Maps Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly(); _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly(); + + var tasks = new[] + { + new MiraTask(MiraTask.Ids.HallwayFixWiring, TaskTypes.FixWiring, TaskCategories.CommonTask), + new MiraTask(MiraTask.Ids.AdminEnterIDCode, TaskTypes.EnterIdCode, TaskCategories.CommonTask), + new MiraTask(MiraTask.Ids.MedbaySubmitScan, TaskTypes.SubmitScan, TaskCategories.LongTask, true), + new MiraTask(MiraTask.Ids.BalconyClearAsteroids, TaskTypes.ClearAsteroids, TaskCategories.LongTask), + new MiraTask(MiraTask.Ids.ElectricalDivertPowerToAdmin, TaskTypes.DivertPower, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.ElectricalDivertPowerToCafeteria, TaskTypes.DivertPower, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.ElectricalDivertPowerToCommunications, TaskTypes.DivertPower, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.ElectricalDivertPowerToLaunchpad, TaskTypes.DivertPower, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.ElectricalDivertPowerToMedbay, TaskTypes.DivertPower, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.ElectricalDivertPowerToOffice, TaskTypes.DivertPower, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.StorageWaterPlants, TaskTypes.WaterPlants, TaskCategories.LongTask), + new MiraTask(MiraTask.Ids.ReactorStartReactor, TaskTypes.StartReactor, TaskCategories.LongTask), + new MiraTask(MiraTask.Ids.ElectricalDivertPowerToGreenhouse, TaskTypes.DivertPower, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.AdminChartCourse, TaskTypes.ChartCourse, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.GreenhouseCleanO2Filter, TaskTypes.Filter, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.LaunchpadFuelEngines, TaskTypes.FuelEngines, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.LaboratoryAssembleArtifact, TaskTypes.AssembleArtifact, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.LaboratorySortSamples, TaskTypes.SortSamples, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.AdminPrimeShields, TaskTypes.PrimeShields, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.CafeteriaEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.BalconyMeasureWeather, TaskTypes.MeasureWeather, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.ElectricalDivertPowerToLaboratory, TaskTypes.DivertPower, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.CafeteriaBuyBeverage, TaskTypes.BuyBeverage, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.OfficeProcessData, TaskTypes.ProcessData, TaskCategories.ShortTask), + new MiraTask(MiraTask.Ids.LaunchpadRunDiagnostics, TaskTypes.RunDiagnostics, TaskCategories.LongTask), + new MiraTask(MiraTask.Ids.ReactorUnlockManifolds, TaskTypes.UnlockManifolds, TaskCategories.ShortTask), + }; + + Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly(); + _tasks = tasks.ToDictionary(x => (int)x.Id, x => (ITask)x).AsReadOnly(); } public IReadOnlyDictionary Vents { get; } IReadOnlyDictionary IMapData.Vents => _vents; + + public IReadOnlyDictionary Tasks { get; } + + IReadOnlyDictionary IMapData.Tasks => _tasks; } } diff --git a/src/Impostor.Api/Innersloth/Maps/PolusData.cs b/src/Impostor.Api/Innersloth/Maps/PolusData.cs index 76bc970..36e9403 100644 --- a/src/Impostor.Api/Innersloth/Maps/PolusData.cs +++ b/src/Impostor.Api/Innersloth/Maps/PolusData.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using Impostor.Api.Innersloth.Maps.Tasks; using Impostor.Api.Innersloth.Maps.Vents; namespace Impostor.Api.Innersloth.Maps @@ -8,8 +9,9 @@ namespace Impostor.Api.Innersloth.Maps public class PolusData : IMapData { private readonly IReadOnlyDictionary _vents; + private readonly IReadOnlyDictionary _tasks; - public PolusData() + internal PolusData() { var vents = new[] { @@ -29,10 +31,54 @@ namespace Impostor.Api.Innersloth.Maps Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly(); _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly(); + + var tasks = new[] + { + new PolusTask(PolusTask.Ids.OfficeSwipeCard, TaskTypes.SwipeCard, TaskCategories.CommonTask), + new PolusTask(PolusTask.Ids.DropshipInsertKeys, TaskTypes.InsertKeys, TaskCategories.CommonTask), + new PolusTask(PolusTask.Ids.OfficeScanBoardingPass, TaskTypes.ScanBoardingPass, TaskCategories.CommonTask), + new PolusTask(PolusTask.Ids.ElectricalFixWiring, TaskTypes.FixWiring, TaskCategories.CommonTask), + new PolusTask(PolusTask.Ids.WeaponsDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.OfficeDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.ElectricalDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.SpecimenRoomDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.O2DownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.SpecimenRoomStartReactor, TaskTypes.StartReactor, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.StorageFuelEngines, TaskTypes.FuelEngines, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.BoilerRoomOpenWaterways, TaskTypes.OpenWaterways, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.MedbayInspectSample, TaskTypes.InspectSample, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.BoilerRoomReplaceWaterJug, TaskTypes.ReplaceWaterJug, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_GI, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_IRO, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_PD, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_TB, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.CommunicationsRebootWiFi, TaskTypes.RebootWifi, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.O2MonitorTree, TaskTypes.MonitorOxygen, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.SpecimenRoomUnlockManifolds, TaskTypes.UnlockManifolds, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.SpecimenRoomStoreArtifacts, TaskTypes.StoreArtifact, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.O2FillCanisters, TaskTypes.FillCanisters, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.O2EmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.DropshipChartCourse, TaskTypes.ChartCourse, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.MedbaySubmitScan, TaskTypes.SubmitScan, TaskCategories.ShortTask, true), + new PolusTask(PolusTask.Ids.WeaponsClearAsteroids, TaskTypes.ClearAsteroids, TaskCategories.ShortTask, true), + new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_CA, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_MLG, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask), + new PolusTask(PolusTask.Ids.LaboratoryAlignTelescope, TaskTypes.AlignTelescope, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.LaboratoryRepairDrill, TaskTypes.RepairDrill, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.LaboratoryRecordTemperature, TaskTypes.RecordTemperature, TaskCategories.ShortTask), + new PolusTask(PolusTask.Ids.OutsideRecordTemperature, TaskTypes.RecordTemperature, TaskCategories.ShortTask), + }; + + Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly(); + _tasks = tasks.ToDictionary(x => (int)x.Id, x => (ITask)x).AsReadOnly(); } public IReadOnlyDictionary Vents { get; } IReadOnlyDictionary IMapData.Vents => _vents; + + public IReadOnlyDictionary Tasks { get; } + + IReadOnlyDictionary IMapData.Tasks => _tasks; } } diff --git a/src/Impostor.Api/Innersloth/Maps/SkeldData.cs b/src/Impostor.Api/Innersloth/Maps/SkeldData.cs index 6555ba1..a6df293 100644 --- a/src/Impostor.Api/Innersloth/Maps/SkeldData.cs +++ b/src/Impostor.Api/Innersloth/Maps/SkeldData.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using Impostor.Api.Innersloth.Maps.Tasks; using Impostor.Api.Innersloth.Maps.Vents; namespace Impostor.Api.Innersloth.Maps @@ -8,8 +9,9 @@ namespace Impostor.Api.Innersloth.Maps public class SkeldData : IMapData { private readonly IReadOnlyDictionary _vents; + private readonly IReadOnlyDictionary _tasks; - public SkeldData() + internal SkeldData() { var vents = new[] { @@ -31,10 +33,50 @@ namespace Impostor.Api.Innersloth.Maps Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly(); _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly(); + + var tasks = new[] + { + new SkeldTask(SkeldTask.Ids.AdminSwipeCard, TaskTypes.SwipeCard, TaskCategories.CommonTask), + new SkeldTask(SkeldTask.Ids.ElectricalFixWiring, TaskTypes.FixWiring, TaskCategories.CommonTask), + new SkeldTask(SkeldTask.Ids.WeaponsClearAsteroids, TaskTypes.ClearAsteroids, TaskCategories.LongTask, true), + new SkeldTask(SkeldTask.Ids.EnginesAlignEngineOutput, TaskTypes.AlignEngineOutput, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.MedbaySubmitScan, TaskTypes.SubmitScan, TaskCategories.LongTask, true), + new SkeldTask(SkeldTask.Ids.MedbayInspectSample, TaskTypes.InspectSample, TaskCategories.LongTask), + new SkeldTask(SkeldTask.Ids.StorageFuelEngines, TaskTypes.FuelEngines, TaskCategories.LongTask), + new SkeldTask(SkeldTask.Ids.ReactorStartReactor, TaskTypes.StartReactor, TaskCategories.LongTask), + new SkeldTask(SkeldTask.Ids.O2EmptyChute, TaskTypes.EmptyChute, TaskCategories.LongTask, true), + new SkeldTask(SkeldTask.Ids.CafeteriaEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask, true), + new SkeldTask(SkeldTask.Ids.CommunicationsDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalCalibrateDistributor, TaskTypes.CalibrateDistributor, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.NavigationChartCourse, TaskTypes.ChartCourse, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.O2CleanO2Filter, TaskTypes.Filter, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ReactorUnlockManifolds, TaskTypes.UnlockManifolds, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.NavigationStabilizeSteering, TaskTypes.StabilizeSteering, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.WeaponsDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ShieldsPrimeShields, TaskTypes.PrimeShields, TaskCategories.ShortTask, true), + new SkeldTask(SkeldTask.Ids.CafeteriaDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.NavigationDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToShields, TaskTypes.DivertPower, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToWeapons, TaskTypes.DivertPower, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToCommunications, TaskTypes.DivertPower, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToUpperEngine, TaskTypes.DivertPower, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToO2, TaskTypes.DivertPower, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToNavigation, TaskTypes.DivertPower, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToLowerEngine, TaskTypes.DivertPower, TaskCategories.ShortTask), + new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToSecurity, TaskTypes.DivertPower, TaskCategories.ShortTask), + }; + + Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly(); + _tasks = tasks.ToDictionary(x => (int)x.Id, x => (ITask)x).AsReadOnly(); } public IReadOnlyDictionary Vents { get; } IReadOnlyDictionary IMapData.Vents => _vents; + + public IReadOnlyDictionary Tasks { get; } + + IReadOnlyDictionary IMapData.Tasks => _tasks; } } diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs new file mode 100644 index 0000000..ab3b591 --- /dev/null +++ b/src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs @@ -0,0 +1,70 @@ +namespace Impostor.Api.Innersloth.Maps.Tasks +{ + public class AirshipTask : ITask + { + internal AirshipTask(Ids id, TaskTypes type, TaskCategories category, bool isVisual = false) + { + Id = id; + Name = id.ToString(); + Type = type; + Category = category; + IsVisual = isVisual; + } + + public enum Ids + { + ElectricalFixWiring = 0, + MeetingRoomEnterIDCode = 1, + ElectricalResetBreakers = 2, + VaultRoomDownloadData = 3, + BrigDownloadData = 4, + CargoBayDownloadData = 5, + GapRoomDownloadData = 6, + RecordsDownloadData = 7, + CargoBayUnlockSafe = 8, + VentilationStartFans = 9, + MainHallEmptyGarbage = 10, + MedicalEmptyGarbage = 11, + KitchenEmptyGarbage = 12, + MainHallDevelopPhotos = 13, + CargoBayFuelEngines = 14, + SecurityRewindTapes = 15, + VaultRoomPolishRuby = 16, + ElectricalCalibrateDistributor = 17, + CockpitStabilizeSteering = 18, + ArmoryDownloadData = 19, + CockpitDownloadData = 20, + CommsDownloadData = 21, + MedicalDownloadData = 22, + ViewingDeckDownloadData = 23, + ElectricalDivertPowerToArmory = 24, + ElectricalDivertPowerToCockpit = 25, + ElectricalDivertPowerToGapRoom = 26, + ElectricalDivertPowerToMainHall = 27, + ElectricalDivertPowerToMeetingRoom = 28, + ElectricalDivertPowerToShowers = 29, + ElectricalDivertPowerToEngine = 30, + ShowersPickUpTowels = 31, + LoungeCleanToilet = 32, + VaultRoomDressMannequin = 33, + RecordsSortRecords = 34, + ArmoryPutAwayPistols = 35, + ArmoryPutAwayRifles = 36, + MainHallDecontaminate = 37, + KitchenMakeBurger = 38, + ShowersFixShower = 39, + } + + public Ids Id { get; } + + int ITask.Id => (int)Id; + + public string Name { get; } + + public TaskTypes Type { get; } + + public TaskCategories Category { get; } + + public bool IsVisual { get; } + } +} diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs new file mode 100644 index 0000000..75755af --- /dev/null +++ b/src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs @@ -0,0 +1,56 @@ +namespace Impostor.Api.Innersloth.Maps.Tasks +{ + public class MiraTask : ITask + { + internal MiraTask(Ids id, TaskTypes type, TaskCategories category, bool isVisual = false) + { + Id = id; + Name = id.ToString(); + Type = type; + Category = category; + IsVisual = isVisual; + } + + public enum Ids + { + HallwayFixWiring = 0, + AdminEnterIDCode = 1, + MedbaySubmitScan = 2, + BalconyClearAsteroids = 3, + ElectricalDivertPowerToAdmin = 4, + ElectricalDivertPowerToCafeteria = 5, + ElectricalDivertPowerToCommunications = 6, + ElectricalDivertPowerToLaunchpad = 7, + ElectricalDivertPowerToMedbay = 8, + ElectricalDivertPowerToOffice = 9, + StorageWaterPlants = 10, + ReactorStartReactor = 11, + ElectricalDivertPowerToGreenhouse = 12, + AdminChartCourse = 13, + GreenhouseCleanO2Filter = 14, + LaunchpadFuelEngines = 15, + LaboratoryAssembleArtifact = 16, + LaboratorySortSamples = 17, + AdminPrimeShields = 18, + CafeteriaEmptyGarbage = 19, + BalconyMeasureWeather = 20, + ElectricalDivertPowerToLaboratory = 21, + CafeteriaBuyBeverage = 22, + OfficeProcessData = 23, + LaunchpadRunDiagnostics = 24, + ReactorUnlockManifolds = 25, + } + + public Ids Id { get; } + + int ITask.Id => (int)Id; + + public string Name { get; } + + public TaskTypes Type { get; } + + public TaskCategories Category { get; } + + public bool IsVisual { get; } + } +} diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/PolusTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/PolusTask.cs new file mode 100644 index 0000000..9c0c3dd --- /dev/null +++ b/src/Impostor.Api/Innersloth/Maps/Tasks/PolusTask.cs @@ -0,0 +1,63 @@ +namespace Impostor.Api.Innersloth.Maps.Tasks +{ + public class PolusTask : ITask + { + internal PolusTask(Ids id, TaskTypes type, TaskCategories category, bool isVisual = false) + { + Id = id; + Name = id.ToString(); + Type = type; + Category = category; + IsVisual = isVisual; + } + + public enum Ids + { + OfficeSwipeCard = 0, + DropshipInsertKeys = 1, + OfficeScanBoardingPass = 2, + ElectricalFixWiring = 3, + WeaponsDownloadData = 4, + OfficeDownloadData = 5, + ElectricalDownloadData = 6, + SpecimenRoomDownloadData = 7, + O2DownloadData = 8, + SpecimenRoomStartReactor = 9, + StorageFuelEngines = 10, + BoilerRoomOpenWaterways = 11, + MedbayInspectSample = 12, + BoilerRoomReplaceWaterJug = 13, + OutsideFixWeatherNodeNode_GI = 14, + OutsideFixWeatherNodeNode_IRO = 15, + OutsideFixWeatherNodeNode_PD = 16, + OutsideFixWeatherNodeNode_TB = 17, + CommunicationsRebootWiFi = 18, + O2MonitorTree = 19, + SpecimenRoomUnlockManifolds = 20, + SpecimenRoomStoreArtifacts = 21, + O2FillCanisters = 22, + O2EmptyGarbage = 23, + DropshipChartCourse = 24, + MedbaySubmitScan = 25, + WeaponsClearAsteroids = 26, + OutsideFixWeatherNodeNode_CA = 27, + OutsideFixWeatherNodeNode_MLG = 28, + LaboratoryAlignTelescope = 29, + LaboratoryRepairDrill = 30, + LaboratoryRecordTemperature = 31, + OutsideRecordTemperature = 32, + } + + public Ids Id { get; } + + int ITask.Id => (int)Id; + + public string Name { get; } + + public TaskTypes Type { get; } + + public TaskCategories Category { get; } + + public bool IsVisual { get; } + } +} diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs new file mode 100644 index 0000000..dc3db8a --- /dev/null +++ b/src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs @@ -0,0 +1,59 @@ +namespace Impostor.Api.Innersloth.Maps.Tasks +{ + public class SkeldTask : ITask + { + internal SkeldTask(Ids id, TaskTypes type, TaskCategories category, bool isVisual = false) + { + Id = id; + Name = id.ToString(); + Type = type; + Category = category; + IsVisual = isVisual; + } + + public enum Ids + { + AdminSwipeCard = 0, + ElectricalFixWiring = 1, + WeaponsClearAsteroids = 2, + EnginesAlignEngineOutput = 3, + MedbaySubmitScan = 4, + MedbayInspectSample = 5, + StorageFuelEngines = 6, + ReactorStartReactor = 7, + O2EmptyChute = 8, + CafeteriaEmptyGarbage = 9, + CommunicationsDownloadData = 10, + ElectricalCalibrateDistributor = 11, + NavigationChartCourse = 12, + O2CleanO2Filter = 13, + ReactorUnlockManifolds = 14, + ElectricalDownloadData = 15, + NavigationStabilizeSteering = 16, + WeaponsDownloadData = 17, + ShieldsPrimeShields = 18, + CafeteriaDownloadData = 19, + NavigationDownloadData = 20, + ElectricalDivertPowerToShields = 21, + ElectricalDivertPowerToWeapons = 22, + ElectricalDivertPowerToCommunications = 23, + ElectricalDivertPowerToUpperEngine = 24, + ElectricalDivertPowerToO2 = 25, + ElectricalDivertPowerToNavigation = 26, + ElectricalDivertPowerToLowerEngine = 27, + ElectricalDivertPowerToSecurity = 28, + } + + public Ids Id { get; } + + int ITask.Id => (int)Id; + + public string Name { get; } + + public TaskTypes Type { get; } + + public TaskCategories Category { get; } + + public bool IsVisual { get; } + } +} diff --git a/src/Impostor.Api/Innersloth/TaskCategories.cs b/src/Impostor.Api/Innersloth/TaskCategories.cs new file mode 100644 index 0000000..8b6c425 --- /dev/null +++ b/src/Impostor.Api/Innersloth/TaskCategories.cs @@ -0,0 +1,9 @@ +namespace Impostor.Api.Innersloth +{ + public enum TaskCategories : byte + { + CommonTask, + LongTask, + ShortTask, + } +} diff --git a/src/Impostor.Api/Innersloth/TaskTypes.cs b/src/Impostor.Api/Innersloth/TaskTypes.cs index d479479..1e8653c 100644 --- a/src/Impostor.Api/Innersloth/TaskTypes.cs +++ b/src/Impostor.Api/Innersloth/TaskTypes.cs @@ -1,4 +1,4 @@ -namespace Impostor.Api.Innersloth +namespace Impostor.Api.Innersloth { public enum TaskTypes : uint { @@ -45,5 +45,22 @@ AlignTelescope = 40, RecordTemperature = 41, RebootWifi = 42, + PolishRuby = 43, + ResetBreakers = 44, + Decontaminate = 45, + MakeBurger = 46, + UnlockSafe = 47, + SortRecords = 48, + PutAwayPistols = 49, + FixShower = 50, + CleanToilet = 51, + DressMannequin = 52, + PickUpTowels = 53, + RewindTapes = 54, + StartFans = 55, + DevelopPhotos = 56, + GetBiggolSword = 57, + PutAwayRifles = 58, + StopCharles = 59, } } diff --git a/src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs b/src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs index f4e54b1..c7a9928 100644 --- a/src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs +++ b/src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs @@ -1,4 +1,5 @@ -using Impostor.Api.Innersloth; +using System.Threading.Tasks; +using Impostor.Api.Innersloth; namespace Impostor.Api.Net.Inner.Objects { @@ -6,8 +7,14 @@ namespace Impostor.Api.Net.Inner.Objects { uint Id { get; } - TaskTypes Type { get; } + ITask Task { get; } bool Complete { get; } + + /// + /// Sets the task as complete. + /// + /// Task that must be awaited. + ValueTask CompleteAsync(); } } diff --git a/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs b/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs index 999cfc1..4477c04 100644 --- a/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs +++ b/src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs @@ -84,6 +84,14 @@ namespace Impostor.Plugins.Example.Handlers await e.PlayerControl.NetworkTransform.SnapToAsync(new Vector2(1, 1)); } + if (e.Message == "completetasks") + { + foreach (var task in e.PlayerControl.PlayerInfo.Tasks) + { + await task.CompleteAsync(); + } + } + await e.PlayerControl.SetNameAsync(e.Message); await e.PlayerControl.SendChatAsync(e.Message); } @@ -111,5 +119,11 @@ namespace Impostor.Plugins.Example.Handlers { _logger.LogInformation("Player {player} vented to {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.NewVent.Name); } + + [EventListener] + public void OnPlayerCompletedTaskEvent(IPlayerCompletedTaskEvent e) + { + _logger.LogInformation("Player {player} completed {task}, {type}, {category}, visual {visual}", e.PlayerControl.PlayerInfo.PlayerName, e.Task.Task.Name, e.Task.Task.Type, e.Task.Task.Category, e.Task.Task.IsVisual); + } } } diff --git a/src/Impostor.Server/Net/ClientBase.cs b/src/Impostor.Server/Net/ClientBase.cs index b9488c2..909c0e9 100644 --- a/src/Impostor.Server/Net/ClientBase.cs +++ b/src/Impostor.Server/Net/ClientBase.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading.Tasks; using Impostor.Api; diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.Api.cs b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.Api.cs new file mode 100644 index 0000000..c8aa17f --- /dev/null +++ b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.Api.cs @@ -0,0 +1,39 @@ +using System.Threading.Tasks; +using Impostor.Api; +using Impostor.Api.Net.Inner; +using Impostor.Api.Net.Messages.Rpcs; +using Impostor.Server.Events.Player; + +namespace Impostor.Server.Net.Inner.Objects +{ + internal partial class InnerGameData + { + public partial class TaskInfo + { + public async ValueTask CompleteAsync() + { + if (_playerInfo.Controller == null) + { + throw new ImpostorException("Can't complete a task that doesn't have a player assigned"); + } + + var player = _playerInfo.Controller; + + if (Complete) + { + throw new ImpostorException("Can't complete a task that is already completed"); + } + + Complete = true; + + // Send RPC. + using var writer = player.Game.StartRpc(player.NetId, RpcCalls.CompleteTask); + Rpc01CompleteTask.Serialize(writer, Id); + await player.Game.FinishRpcAsync(writer); + + // Notify plugins. + await _eventManager.CallAsync(new PlayerCompletedTaskEvent(player.Game, player.Game.GetClientPlayer(player.OwnerId)!, player, this)); + } + } + } +} diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs index 29ca50a..f4c5af4 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs @@ -1,4 +1,5 @@ -using Impostor.Api.Innersloth; +using Impostor.Api.Events.Managers; +using Impostor.Api.Innersloth; using Impostor.Api.Net.Inner.Objects; using Impostor.Api.Net.Messages; @@ -6,17 +7,28 @@ namespace Impostor.Server.Net.Inner.Objects { internal partial class InnerGameData { - public class TaskInfo : ITaskInfo + public partial class TaskInfo : ITaskInfo { + private readonly InnerPlayerInfo _playerInfo; + private readonly IEventManager _eventManager; + + public TaskInfo(InnerPlayerInfo playerInfo, IEventManager eventManager, uint id, ITask task) + { + _playerInfo = playerInfo; + _eventManager = eventManager; + Id = id; + Task = task; + } + public uint Id { get; internal set; } - public bool Complete { get; internal set; } + public ITask Task { get; internal set; } - public TaskTypes Type { get; internal set; } + public bool Complete { get; internal set; } public void Serialize(IMessageWriter writer) { - writer.WritePacked((uint)Id); + writer.WritePacked(Id); writer.Write(Complete); } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs index e7980da..c466746 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs @@ -1,8 +1,10 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading.Tasks; using Impostor.Api; +using Impostor.Api.Events.Managers; +using Impostor.Api.Innersloth.Maps; using Impostor.Api.Net; using Impostor.Api.Net.Custom; using Impostor.Api.Net.Inner; @@ -19,11 +21,13 @@ namespace Impostor.Server.Net.Inner.Objects internal partial class InnerGameData : InnerNetObject, IInnerGameData { private readonly ILogger _logger; + private readonly IEventManager _eventManager; private readonly ConcurrentDictionary _allPlayers; - public InnerGameData(ICustomMessageManager customMessageManager, Game game, ILogger logger, IServiceProvider serviceProvider) : base(customMessageManager, game) + public InnerGameData(ICustomMessageManager customMessageManager, Game game, ILogger logger, IEventManager eventManager, IServiceProvider serviceProvider) : base(customMessageManager, game) { _logger = logger; + _eventManager = eventManager; _allPlayers = new ConcurrentDictionary(); Components.Add(this); @@ -149,12 +153,15 @@ namespace Impostor.Server.Net.Inner.Objects player.Tasks = new List(taskTypeIds.Length); - foreach (var taskId in taskTypeIds.ToArray()) + var taskId = 0u; + foreach (var taskTypeId in taskTypeIds.Span) { - player.Tasks.Add(new TaskInfo - { - Id = taskId, - }); + player.Tasks.Add(new TaskInfo( + player, + _eventManager, + taskId++, + Game.GameNet!.ShipStatus!.Data.Tasks[taskTypeId] + )); } } } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs index e51906c..2629370 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; +using Impostor.Api.Events.Managers; using Impostor.Api.Games; using Impostor.Api.Innersloth; using Impostor.Api.Innersloth.Customization; using Impostor.Api.Net.Messages; using Impostor.Api.Utils; +using Impostor.Server.Net.State; namespace Impostor.Server.Net.Inner.Objects { @@ -78,7 +80,6 @@ namespace Impostor.Server.Net.Inner.Objects for (var i = 0; i < taskCount; i++) { - Tasks[i] ??= new InnerGameData.TaskInfo(); Tasks[i].Deserialize(reader); } }