]> git.deb.at Git - rhonda/impostor.git/commitdiff
Using MapData for Tasks (#395)
authorMinorusama <pitilulu@gmail.com>
Thu, 10 Jun 2021 18:54:34 +0000 (20:54 +0200)
committerGitHub <noreply@github.com>
Thu, 10 Jun 2021 18:54:34 +0000 (18:54 +0000)
Co-authored-by: John Tran <john.tran.84@live.com.au>
Co-authored-by: js6pak <kubastaron@hotmail.com>
19 files changed:
src/Impostor.Api/Innersloth/ITask.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Maps/AirshipData.cs
src/Impostor.Api/Innersloth/Maps/IMapData.cs
src/Impostor.Api/Innersloth/Maps/MiraData.cs
src/Impostor.Api/Innersloth/Maps/PolusData.cs
src/Impostor.Api/Innersloth/Maps/SkeldData.cs
src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Maps/Tasks/PolusTask.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/TaskCategories.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/TaskTypes.cs
src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs
src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs
src/Impostor.Server/Net/ClientBase.cs
src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.Api.cs [new file with mode: 0644]
src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs
src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs
src/Impostor.Server/Net/Inner/Objects/InnerPlayerInfo.cs

diff --git a/src/Impostor.Api/Innersloth/ITask.cs b/src/Impostor.Api/Innersloth/ITask.cs
new file mode 100644 (file)
index 0000000..114a75c
--- /dev/null
@@ -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; }
+    }
+}
index 46504c9eba9c25120ab3d064cdf1a4fe88dfbd78..52733a8571a35312f5cf30cb770d61e69ab5fb8e 100644 (file)
@@ -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<int, IVent> _vents;
+        private readonly IReadOnlyDictionary<int, ITask> _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<AirshipVent.Ids, AirshipVent> Vents { get; }
 
         IReadOnlyDictionary<int, IVent> IMapData.Vents => _vents;
+
+        public IReadOnlyDictionary<AirshipTask.Ids, AirshipTask> Tasks { get; }
+
+        IReadOnlyDictionary<int, ITask> IMapData.Tasks => _tasks;
     }
 }
index 8f94b38cd8cfea77219da2be06b31bfc8e59f6e3..ce804a03da52611d116def0fbe873f38a9e9f1e4 100644 (file)
@@ -13,5 +13,7 @@ namespace Impostor.Api.Innersloth.Maps
         }.AsReadOnly();
 
         IReadOnlyDictionary<int, IVent> Vents { get; }
+
+        IReadOnlyDictionary<int, ITask> Tasks { get; }
     }
 }
index 37ed2451fdeef6a1849e5a1fb6f4cedf176baac5..f66f89a3890d63916019649c015117513bdda1c5 100644 (file)
@@ -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<int, IVent> _vents;
+        private readonly IReadOnlyDictionary<int, ITask> _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<MiraVent.Ids, MiraVent> Vents { get; }
 
         IReadOnlyDictionary<int, IVent> IMapData.Vents => _vents;
+
+        public IReadOnlyDictionary<MiraTask.Ids, MiraTask> Tasks { get; }
+
+        IReadOnlyDictionary<int, ITask> IMapData.Tasks => _tasks;
     }
 }
index 76bc97043f849e74f31acf1e2b9efb765a95878c..36e9403bce2449e00e522871e835de2453878b3a 100644 (file)
@@ -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<int, IVent> _vents;
+        private readonly IReadOnlyDictionary<int, ITask> _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<PolusVent.Ids, PolusVent> Vents { get; }
 
         IReadOnlyDictionary<int, IVent> IMapData.Vents => _vents;
+
+        public IReadOnlyDictionary<PolusTask.Ids, PolusTask> Tasks { get; }
+
+        IReadOnlyDictionary<int, ITask> IMapData.Tasks => _tasks;
     }
 }
index 6555ba1b91ad18a6d56a47c579b617e25a00fc17..a6df293618b882cabcb8efd812b7847feb5b20dd 100644 (file)
@@ -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<int, IVent> _vents;
+        private readonly IReadOnlyDictionary<int, ITask> _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<SkeldVent.Ids, SkeldVent> Vents { get; }
 
         IReadOnlyDictionary<int, IVent> IMapData.Vents => _vents;
+
+        public IReadOnlyDictionary<SkeldTask.Ids, SkeldTask> Tasks { get; }
+
+        IReadOnlyDictionary<int, ITask> 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 (file)
index 0000000..ab3b591
--- /dev/null
@@ -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 (file)
index 0000000..75755af
--- /dev/null
@@ -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 (file)
index 0000000..9c0c3dd
--- /dev/null
@@ -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 (file)
index 0000000..dc3db8a
--- /dev/null
@@ -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 (file)
index 0000000..8b6c425
--- /dev/null
@@ -0,0 +1,9 @@
+namespace Impostor.Api.Innersloth
+{
+    public enum TaskCategories : byte
+    {
+        CommonTask,
+        LongTask,
+        ShortTask,
+    }
+}
index d4794796cab417bee327a4071e3195d2aadd17be..1e8653cd0b900bdc6e0b6cb0c29b0dac9e90dbae 100644 (file)
@@ -1,4 +1,4 @@
-namespace Impostor.Api.Innersloth
+namespace Impostor.Api.Innersloth
 {
     public enum TaskTypes : uint
     {
         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,
     }
 }
index f4e54b1519f77ecf4bf4787f3ab3ca937266803e..c7a99289c0f44ef63adcce30279f97c5c36c1f6b 100644 (file)
@@ -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; }
+
+        /// <summary>
+        ///     Sets the task as complete.
+        /// </summary>
+        /// <returns>Task that must be awaited.</returns>
+        ValueTask CompleteAsync();
     }
 }
index 999cfc174cef2f035d2a8dcbe723466f543b9837..4477c0478af6734c2f92766d6b36d7b6ec1fb567 100644 (file)
@@ -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);
+        }
     }
 }
index b9488c2465c34075616c1f1f6a1aa7a0deb02965..909c0e9b89ec978cab6b43a47919db87048d5fe4 100644 (file)
@@ -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 (file)
index 0000000..c8aa17f
--- /dev/null
@@ -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));
+            }
+        }
+    }
+}
index 29ca50a42acafbdb56ea8237a707162985153f88..f4c5af4d8cf616a1c2bbc8e410c8a4843d910989 100644 (file)
@@ -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);
             }
 
index e7980da205be419d03828bec4e93c1c2672833fb..c466746a5f1762997af16c70282855dd0a62ae66 100644 (file)
@@ -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<InnerGameData> _logger;
+        private readonly IEventManager _eventManager;
         private readonly ConcurrentDictionary<byte, InnerPlayerInfo> _allPlayers;
 
-        public InnerGameData(ICustomMessageManager<ICustomRpc> customMessageManager, Game game, ILogger<InnerGameData> logger, IServiceProvider serviceProvider) : base(customMessageManager, game)
+        public InnerGameData(ICustomMessageManager<ICustomRpc> customMessageManager, Game game, ILogger<InnerGameData> logger, IEventManager eventManager, IServiceProvider serviceProvider) : base(customMessageManager, game)
         {
             _logger = logger;
+            _eventManager = eventManager;
             _allPlayers = new ConcurrentDictionary<byte, InnerPlayerInfo>();
 
             Components.Add(this);
@@ -149,12 +153,15 @@ namespace Impostor.Server.Net.Inner.Objects
 
             player.Tasks = new List<TaskInfo>(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]
+                ));
             }
         }
     }
index e51906cbb704b04d628fa9e878099216980fd732..262937095f981c334b66ee582ccd5a97709e7723 100644 (file)
@@ -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);
             }
         }