--- /dev/null
+namespace Impostor.Api.Innersloth
+{
+ public interface ITask
+ {
+ int Id { get; }
+
+ string Name { get; }
+
+ TaskTypes Type { get; }
+
+ TaskCategories Category { get; }
+
+ bool IsVisual { get; }
+ }
+}
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
public class AirshipData : IMapData
{
private readonly IReadOnlyDictionary<int, IVent> _vents;
+ private readonly IReadOnlyDictionary<int, ITask> _tasks;
- public AirshipData()
+ internal AirshipData()
{
var vents = new[]
{
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;
}
}
}.AsReadOnly();
IReadOnlyDictionary<int, IVent> Vents { get; }
+
+ IReadOnlyDictionary<int, ITask> Tasks { get; }
}
}
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
public class MiraData : IMapData
{
private readonly IReadOnlyDictionary<int, IVent> _vents;
+ private readonly IReadOnlyDictionary<int, ITask> _tasks;
- public MiraData()
+ internal MiraData()
{
var vents = new[]
{
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;
}
}
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
public class PolusData : IMapData
{
private readonly IReadOnlyDictionary<int, IVent> _vents;
+ private readonly IReadOnlyDictionary<int, ITask> _tasks;
- public PolusData()
+ internal PolusData()
{
var vents = new[]
{
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;
}
}
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
public class SkeldData : IMapData
{
private readonly IReadOnlyDictionary<int, IVent> _vents;
+ private readonly IReadOnlyDictionary<int, ITask> _tasks;
- public SkeldData()
+ internal SkeldData()
{
var vents = new[]
{
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;
}
}
--- /dev/null
+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; }
+ }
+}
--- /dev/null
+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; }
+ }
+}
--- /dev/null
+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; }
+ }
+}
--- /dev/null
+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; }
+ }
+}
--- /dev/null
+namespace Impostor.Api.Innersloth
+{
+ public enum TaskCategories : byte
+ {
+ CommonTask,
+ LongTask,
+ ShortTask,
+ }
+}
-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,
}
}
-using Impostor.Api.Innersloth;
+using System.Threading.Tasks;
+using Impostor.Api.Innersloth;
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();
}
}
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);
}
{
_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);
+ }
}
}
-using System;
-using System.Collections.Concurrent;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
using Impostor.Api;
--- /dev/null
+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));
+ }
+ }
+ }
+}
-using Impostor.Api.Innersloth;
+using Impostor.Api.Events.Managers;
+using Impostor.Api.Innersloth;
using Impostor.Api.Net.Inner.Objects;
using Impostor.Api.Net.Messages;
{
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);
}
-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;
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);
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]
+ ));
}
}
}
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
{
for (var i = 0; i < taskCount; i++)
{
- Tasks[i] ??= new InnerGameData.TaskInfo();
Tasks[i].Deserialize(reader);
}
}