From 0a23cd4a70f55ff2b8db597ed6f709875ad7ba9e Mon Sep 17 00:00:00 2001 From: Dvir <39403717+dvir001@users.noreply.github.com> Date: Fri, 1 Nov 2024 23:07:34 +0200 Subject: [PATCH] Bluespace rule + Events cleanup and improvements (#2337) * First * Cleanup 1 * cleanup * Here we go * Works * Getting closer * Update dungeons.yml * Update ShuttleSystem.GridFill.cs * Update dungeons.yml * Update basic.yml * Update GridSpawnComponent.cs * Update basic.yml * Update OwnedDebrisComponent.cs * Update ShuttleSystem.GridFill.cs * Update ShuttleSystem.GridFill.cs * Replace events spawner code * Update GridSpawnComponent.cs * Update GridSpawnComponent.cs * fixups * fixup * Edits * FTL, Working warnings * comp * Fix this please * Update BluespaceErrorRule.cs * Support multi grids * Add radio support * Rename files * Update nf_bluespace_grids_events.yml * Event Mc * Cleanup * Update nf_bluespace_dungeons_events.yml * Temp Restore space dungeon * Update StationEventComponent.cs * Update StationEventSystem.cs * WIP: bluespace event random order * position fix * assign to WithPosition * Warning fluent entries, bluespace dungeon comments * BluespaceErrorRuleComponent cleanup --------- Co-authored-by: Whatstone <whatston3@gmail.com> --- .../Components/StationEventComponent.cs | 43 ++ .../Events/StationEventSystem.cs | 20 + .../Components/Debris/OwnedDebrisComponent.cs | 2 +- .../Components/AdventureRuleComponent.cs | 2 +- .../_NF/GameRule/NfAdventureRuleSystem.cs | 1 + .../Components/BluespaceErrorRuleComponent.cs | 123 ++++- .../Events/BluespaceErrorRule.cs | 247 +++++++--- .../en-US/_NF/bluespace-events/events.ftl | 26 +- Resources/Maps/_NF/Bluespace/mcevent.yml | 443 ++++++++++-------- .../_NF/Entities/Markers/warp_point.yml | 9 + .../Events/nf_bluespace_dungeons_events.yml | 34 ++ .../_NF/Events/nf_bluespace_grids_events.yml | 279 +++++++++++ .../_NF/Events/nf_events_bluespace.yml | 157 ------- .../Prototypes/_NF/GameRules/roundstart.yml | 2 +- .../Prototypes/_NF/World/Biomes/basic.yml | 3 +- 15 files changed, 942 insertions(+), 449 deletions(-) create mode 100644 Resources/Prototypes/_NF/Events/nf_bluespace_dungeons_events.yml create mode 100644 Resources/Prototypes/_NF/Events/nf_bluespace_grids_events.yml delete mode 100644 Resources/Prototypes/_NF/Events/nf_events_bluespace.yml diff --git a/Content.Server/StationEvents/Components/StationEventComponent.cs b/Content.Server/StationEvents/Components/StationEventComponent.cs index 3980cdbca79..7ed6f934f78 100644 --- a/Content.Server/StationEvents/Components/StationEventComponent.cs +++ b/Content.Server/StationEvents/Components/StationEventComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Radio; // Frontier using Content.Shared.Roles; // Frontier using Robust.Shared.Audio; using Robust.Shared.Prototypes; // Frontier @@ -23,21 +24,51 @@ public sealed partial class StationEventComponent : Component [DataField] public string? StartAnnouncement; + [DataField] + public string? WarningAnnouncement; // Frontier + [DataField] public string? EndAnnouncement; [DataField] public Color StartAnnouncementColor = Color.Gold; + [DataField] + public Color WarningAnnouncementColor = Color.Gold; // Frontier + [DataField] public Color EndAnnouncementColor = Color.Gold; [DataField] public SoundSpecifier? StartAudio; + [DataField] + public SoundSpecifier? WarningAudio; // Frontier + [DataField] public SoundSpecifier? EndAudio; + /// <summary> + /// Frontier: Radio channels on which announcements are transmitted + /// </summary> + [DataField] + public string? StartRadioAnnouncement; // Frontier + + [DataField] + public string? WarningRadioAnnouncement; // Frontier + + [DataField] + public string? EndRadioAnnouncement; // Frontier + + [DataField] + public ProtoId<RadioChannelPrototype> StartRadioAnnouncementChannel = "Supply"; // Frontier + + [DataField] + public ProtoId<RadioChannelPrototype> WarningRadioAnnouncementChannel = "Supply"; // Frontier + + [DataField] + public ProtoId<RadioChannelPrototype> EndRadioAnnouncementChannel = "Supply"; // Frontier + /// <summary> /// In minutes, when is the first round time this event can start /// </summary> @@ -101,4 +132,16 @@ public sealed partial class StationEventComponent : Component /// </summary> [DataField] public Dictionary<ProtoId<JobPrototype>, int> RequiredJobs = new(); + + /// <summary> + /// Frontier: Warning timer. + /// </summary> + [DataField] + public int WarningDurationLeft = 300; // 5 minutes + + /// <summary> + /// Frontier: True if the warning has already been sent off. + /// </summary> + [DataField] + public bool WarningAnnounced; } diff --git a/Content.Server/StationEvents/Events/StationEventSystem.cs b/Content.Server/StationEvents/Events/StationEventSystem.cs index aaa48a482ec..bd0ebe07dd0 100644 --- a/Content.Server/StationEvents/Events/StationEventSystem.cs +++ b/Content.Server/StationEvents/Events/StationEventSystem.cs @@ -2,6 +2,7 @@ using Content.Server.Chat.Systems; using Content.Server.GameTicking; using Content.Server.GameTicking.Rules; +using Content.Server.Radio.EntitySystems; // Frontier using Content.Server.Station.Systems; using Content.Server.StationEvents.Components; using Content.Shared.Database; @@ -22,6 +23,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo [Dependency] protected readonly ChatSystem ChatSystem = default!; [Dependency] protected readonly SharedAudioSystem Audio = default!; [Dependency] protected readonly StationSystem StationSystem = default!; + [Dependency] protected readonly RadioSystem RadioSystem = default!; // Frontier protected ISawmill Sawmill = default!; @@ -48,6 +50,9 @@ protected override void Added(EntityUid uid, T component, GameRuleComponent game if (stationEvent.StartAnnouncement != null) ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: stationEvent.StartAnnouncementColor); + if (stationEvent.StartRadioAnnouncement != null) // Frontier + RadioSystem.SendRadioMessage(uid, stationEvent.StartRadioAnnouncement, stationEvent.StartRadioAnnouncementChannel, uid, escapeMarkup: false); // Frontier + Audio.PlayGlobal(stationEvent.StartAudio, allPlayersInGame, true); } @@ -87,6 +92,9 @@ protected override void Ended(EntityUid uid, T component, GameRuleComponent game if (stationEvent.EndAnnouncement != null) ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: stationEvent.EndAnnouncementColor); + if (stationEvent.EndRadioAnnouncement != null) // Frontier + RadioSystem.SendRadioMessage(uid, stationEvent.EndRadioAnnouncement, stationEvent.EndRadioAnnouncementChannel, uid, escapeMarkup: false); // Frontier + Audio.PlayGlobal(stationEvent.EndAudio, allPlayersInGame, true); } @@ -113,6 +121,18 @@ public override void Update(float frameTime) { GameTicker.EndGameRule(uid, ruleData); } + // Frontier: Added Warning for events ending soon + else if (!stationEvent.WarningAnnounced && stationEvent.EndTime != null && (stationEvent.EndTime.Value - Timing.CurTime).TotalSeconds <= stationEvent.WarningDurationLeft && GameTicker.IsGameRuleActive(uid, ruleData)) + { + Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame); // we don't want to send to players who aren't in game (i.e. in the lobby) + if (stationEvent.WarningAnnouncement != null) + ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.WarningAnnouncement), playSound: false, colorOverride: stationEvent.WarningAnnouncementColor); + if (stationEvent.WarningRadioAnnouncement != null) + RadioSystem.SendRadioMessage(uid, stationEvent.WarningRadioAnnouncement, stationEvent.WarningRadioAnnouncementChannel, uid, escapeMarkup: false); + Audio.PlayGlobal(stationEvent.WarningAudio, allPlayersInGame, true); + stationEvent.WarningAnnounced = true; + } + // End Frontier } } } diff --git a/Content.Server/Worldgen/Components/Debris/OwnedDebrisComponent.cs b/Content.Server/Worldgen/Components/Debris/OwnedDebrisComponent.cs index b2112779972..586690f032e 100644 --- a/Content.Server/Worldgen/Components/Debris/OwnedDebrisComponent.cs +++ b/Content.Server/Worldgen/Components/Debris/OwnedDebrisComponent.cs @@ -1,4 +1,4 @@ -using System.Numerics; +using System.Numerics; using Content.Server.Worldgen.Systems.Debris; namespace Content.Server.Worldgen.Components.Debris; diff --git a/Content.Server/_NF/GameRule/Components/AdventureRuleComponent.cs b/Content.Server/_NF/GameRule/Components/AdventureRuleComponent.cs index 401228dae80..6b39a2ea87a 100644 --- a/Content.Server/_NF/GameRule/Components/AdventureRuleComponent.cs +++ b/Content.Server/_NF/GameRule/Components/AdventureRuleComponent.cs @@ -13,6 +13,6 @@ public sealed partial class AdventureRuleComponent : Component public List<EntityUid> OptionalPois = new(); public List<EntityUid> UniquePois = new(); - [DataField(customTypeSerializer: typeof(PrototypeIdListSerializer<DungeonConfigPrototype>))] + [DataField(customTypeSerializer: typeof(PrototypeIdListSerializer<DungeonConfigPrototype>))] // TODO: Remove this for new system public List<string> SpaceDungeons = new(); } diff --git a/Content.Server/_NF/GameRule/NfAdventureRuleSystem.cs b/Content.Server/_NF/GameRule/NfAdventureRuleSystem.cs index 33af98aee5a..65620303a11 100644 --- a/Content.Server/_NF/GameRule/NfAdventureRuleSystem.cs +++ b/Content.Server/_NF/GameRule/NfAdventureRuleSystem.cs @@ -257,6 +257,7 @@ protected override void Started(EntityUid uid, AdventureRuleComponent component, // Using invalid entity, we don't have a relevant entity to reference here. RaiseLocalEvent(EntityUid.Invalid, new StationsGeneratedEvent(), broadcast: true); // TODO: attach this to a meaningful entity. + // TODO: Remove this for new system foreach (var dungeonProto in component.SpaceDungeons) { if (!_prototypeManager.TryIndex<DungeonConfigPrototype>(dungeonProto, out var dunGen)) diff --git a/Content.Server/_NF/StationEvents/Components/BluespaceErrorRuleComponent.cs b/Content.Server/_NF/StationEvents/Components/BluespaceErrorRuleComponent.cs index 97a7bb65ec9..c007f9c76ee 100644 --- a/Content.Server/_NF/StationEvents/Components/BluespaceErrorRuleComponent.cs +++ b/Content.Server/_NF/StationEvents/Components/BluespaceErrorRuleComponent.cs @@ -1,38 +1,129 @@ -using Content.Server.StationEvents.Events; +using Content.Server.StationEvents.Events; using Content.Shared.Storage; +using Content.Server.Shuttles.Systems; +using Content.Shared.Dataset; +using Content.Shared.Procedural; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; namespace Content.Server.StationEvents.Components; -[RegisterComponent, Access(typeof(BluespaceErrorRule))] +[RegisterComponent, Access(typeof(BluespaceErrorRule), typeof(ShuttleSystem))] public sealed partial class BluespaceErrorRuleComponent : Component { /// <summary> - /// List of paths to the grids that can be bluespaced in. + /// Dictionary of groups where each group will have entries selected. + /// String is just an identifier to make yaml easier. /// </summary> - [DataField("gridPaths")] - public List<string> GridPaths = new(); + [DataField(required: true)] public Dictionary<string, IBluespaceSpawnGroup> Groups = new(); /// <summary> - /// The color of your thing. The name should be set by the mapper when mapping. + /// The grid in question, set after starting the event /// </summary> - [DataField("color")] - public Color Color = new Color(225, 15, 155); + [DataField] + public List<EntityUid> GridsUid = new(); /// <summary> - /// Multiplier to apply to the remaining value of a grid, to be deposited in the station account for defending + /// If true, the grids are deleted at the end of the event. If false, the grids are left in the map. /// </summary> - [DataField("rewardFactor")] - public float RewardFactor = 0f; + [DataField] + public bool DeleteGridsOnEnd = true; /// <summary> - /// The grid in question, set after starting the event + /// Multiplier to apply to the remaining value of a grid, to be deposited in the station account for defending the grids. + /// Note: /// </summary> - [DataField("gridUid")] - public EntityUid? GridUid = null; + [DataField] + public float NfsdRewardFactor = 0f; /// <summary> /// How much the grid is appraised at upon entering into existence, set after starting the event /// </summary> - [DataField("startingValue")] - public double startingValue = 0; + [DataField] + public double StartingValue = 0; +} + +public interface IBluespaceSpawnGroup +{ + /// <summary> + /// Minimum distance to spawn away from the station. + /// </summary> + public float MinimumDistance { get; } + + /// <summary> + /// Maximum distance to spawn away from the station. + /// </summary> + public float MaximumDistance { get; } + + /// <inheritdoc /> + public List<LocId> NameLoc { get; } + + /// <inheritdoc /> + public ProtoId<DatasetPrototype>? NameDataset { get; } + + /// <inheritdoc /> + int MinCount { get; set; } + + /// <inheritdoc /> + int MaxCount { get; set; } + + /// <summary> + /// Components to be added to any spawned grids. + /// </summary> + public ComponentRegistry AddComponents { get; set; } + + /// <summary> + /// Should we set the metadata name of a grid. Useful for admin purposes. + /// </summary> + public bool NameGrid { get; set; } +} + +[DataRecord] +public sealed class BluespaceDungeonSpawnGroup : IBluespaceSpawnGroup +{ + /// <summary> + /// Prototypes we can choose from to spawn. + /// </summary> + public List<ProtoId<DungeonConfigPrototype>> Protos = new(); + + /// <inheritdoc /> + public float MinimumDistance { get; } + + public float MaximumDistance { get; } + + /// <inheritdoc /> + public List<LocId> NameLoc { get; } = new(); + + /// <inheritdoc /> + public ProtoId<DatasetPrototype>? NameDataset { get; } + + /// <inheritdoc /> + public int MinCount { get; set; } = 1; + + /// <inheritdoc /> + public int MaxCount { get; set; } = 1; + + /// <inheritdoc /> + public ComponentRegistry AddComponents { get; set; } = new(); + + /// <inheritdoc /> + public bool NameGrid { get; set; } = false; +} + +[DataRecord] +public sealed class BluespaceGridSpawnGroup : IBluespaceSpawnGroup +{ + public List<ResPath> Paths = new(); + + /// <inheritdoc /> + public float MinimumDistance { get; } + + /// <inheritdoc /> + public float MaximumDistance { get; } + public List<LocId> NameLoc { get; } = new(); + public ProtoId<DatasetPrototype>? NameDataset { get; } + public int MinCount { get; set; } = 1; + public int MaxCount { get; set; } = 1; + public ComponentRegistry AddComponents { get; set; } = new(); + public bool NameGrid { get; set; } = true; } diff --git a/Content.Server/_NF/StationEvents/Events/BluespaceErrorRule.cs b/Content.Server/_NF/StationEvents/Events/BluespaceErrorRule.cs index 91638ace75b..ec33888f475 100644 --- a/Content.Server/_NF/StationEvents/Events/BluespaceErrorRule.cs +++ b/Content.Server/_NF/StationEvents/Events/BluespaceErrorRule.cs @@ -2,7 +2,6 @@ using Content.Server.Cargo.Components; using Content.Server.Cargo.Systems; using Robust.Server.GameObjects; -using Robust.Server.Maps; using Robust.Shared.Map; using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Systems; @@ -12,119 +11,237 @@ using Content.Shared.Mobs.Components; using Robust.Shared.Random; using Content.Server._NF.Salvage; +using Content.Server.GameTicking; +using Content.Server.Procedural; +using Robust.Shared.Prototypes; +using Content.Shared.Salvage; namespace Content.Server.StationEvents.Events; public sealed class BluespaceErrorRule : StationEventSystem<BluespaceErrorRuleComponent> { [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly MapLoaderSystem _map = default!; - [Dependency] private readonly ShuttleSystem _shuttle = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly DungeonSystem _dungeon = default!; + [Dependency] private readonly MapLoaderSystem _loader = default!; + [Dependency] private readonly MetaDataSystem _metadata = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly ShuttleSystem _shuttle = default!; [Dependency] private readonly PricingSystem _pricing = default!; [Dependency] private readonly CargoSystem _cargo = default!; private List<(Entity<TransformComponent> Entity, EntityUid MapUid, Vector2 LocalPosition)> _playerMobs = new(); + public override void Initialize() + { + base.Initialize(); + } + protected override void Started(EntityUid uid, BluespaceErrorRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); - // Select a random grid path - var selectedGridPath = _random.Pick(component.GridPaths); - var shuttleMap = _mapManager.CreateMap(); - var options = new MapLoadOptions - { - LoadMap = true, - }; - - if (!_map.TryLoad(shuttleMap, selectedGridPath, out var gridUids, options)) + if (!_mapSystem.TryGetMap(GameTicker.DefaultMap, out var mapUid)) return; - component.GridUid = gridUids[0]; - if (component.GridUid is not EntityUid gridUid) - return; + var spawnCoords = new EntityCoordinates(mapUid.Value, Vector2.Zero); - component.startingValue = _pricing.AppraiseGrid(gridUid); - _shuttle.SetIFFColor(gridUid, component.Color); - var offset = _random.NextVector2(1350f, 2200f); - var mapId = GameTicker.DefaultMap; - var mapUid = _mapManager.GetMapEntityId(mapId); + // Spawn on a dummy map and try to FTL if possible, otherwise dump it. + _mapSystem.CreateMap(out var mapId); - if (TryComp<ShuttleComponent>(component.GridUid, out var shuttle)) + foreach (var group in component.Groups.Values) { - _shuttle.FTLToCoordinates(gridUid, shuttle, new EntityCoordinates(mapUid, offset), 0f, 0f, 30f); + var count = _random.Next(group.MinCount, group.MaxCount + 1); + + for (var i = 0; i < count; i++) + { + EntityUid spawned; + + if (group.MinimumDistance > 0f) + { + spawnCoords = spawnCoords.WithPosition(_random.NextVector2(group.MinimumDistance, group.MaximumDistance)); + } + + switch (group) + { + case BluespaceDungeonSpawnGroup dungeon: + if (!TryDungeonSpawn(spawnCoords, mapId, ref dungeon, i, out spawned)) + continue; + + break; + case BluespaceGridSpawnGroup grid: + if (!TryGridSpawn(spawnCoords, uid, mapId, ref grid, i, out spawned)) + continue; + + break; + default: + throw new NotImplementedException(); + } + + if (group.NameLoc != null && group.NameLoc.Count > 0) + { + _metadata.SetEntityName(spawned, Loc.GetString(_random.Pick(group.NameLoc))); + } + + if (_protoManager.TryIndex(group.NameDataset, out var dataset)) + { + _metadata.SetEntityName(spawned, SharedSalvageSystem.GetFTLName(dataset, _random.Next())); + } + + EntityManager.AddComponents(spawned, group.AddComponents); + + component.GridsUid.Add(spawned); + } } + + _mapManager.DeleteMap(mapId); } - protected override void Ended(EntityUid uid, BluespaceErrorRuleComponent component, GameRuleComponent gameRule, GameRuleEndedEvent args) + private bool TryDungeonSpawn(EntityCoordinates spawnCoords, MapId mapId, ref BluespaceDungeonSpawnGroup group, int i, out EntityUid spawned) { - base.Ended(uid, component, gameRule, args); + spawned = EntityUid.Invalid; - if (component.GridUid == null || !component.GridUid.Value.Valid) - return; + // handle empty prototype list, _random.Pick throws + if (group.Protos.Count <= 0) + return false; + + // Enforce randomness with some round-robin-ish behaviour + int maxIndex = group.Protos.Count - (i % group.Protos.Count); + int index = _random.Next(maxIndex); + var dungeonProtoId = group.Protos[index]; + // Move selected item to the end of the list + group.Protos.RemoveAt(index); + group.Protos.Add(dungeonProtoId); - if (!EntityManager.TryGetComponent<TransformComponent>(component.GridUid, out var gridTransform)) + if (!_protoManager.TryIndex(dungeonProtoId, out var dungeonProto)) { - Log.Error("bluespace error objective was missing transform component"); - return; + return false; } - if (gridTransform.GridUid is not EntityUid gridUid) + var spawnedGrid = _mapManager.CreateGridEntity(mapId); + + _transform.SetMapCoordinates(spawnedGrid, new MapCoordinates(Vector2.Zero, mapId)); + _dungeon.GenerateDungeon(dungeonProto, dungeonProto.ID, spawnedGrid.Owner, spawnedGrid.Comp, Vector2i.Zero, _random.Next(), spawnCoords); // Frontier: add dungeonProto.ID + + spawned = spawnedGrid.Owner; + return true; + } + + private bool TryGridSpawn(EntityCoordinates spawnCoords, EntityUid stationUid, MapId mapId, ref BluespaceGridSpawnGroup group, int i, out EntityUid spawned) + { + spawned = EntityUid.Invalid; + + if (group.Paths.Count == 0) { - Log.Error("bluespace error has no associated grid?"); - return; + Log.Error($"Found no paths for GridSpawn"); + return false; } - var gridValue = _pricing.AppraiseGrid(gridUid, null); - - // Handle mobrestrictions getting deleted - var query = AllEntityQuery<NFSalvageMobRestrictionsComponent>(); + // Enforce randomness with some round-robin-ish behaviour + int maxIndex = group.Paths.Count - (i % group.Paths.Count); + int index = _random.Next(maxIndex); + var path = group.Paths[index]; + // Move selected item to the end of the list + group.Paths.RemoveAt(index); + group.Paths.Add(path); - while (query.MoveNext(out var salvUid, out var salvMob)) + // Do we support maps with multiple grids? + if (_loader.TryLoad(mapId, path.ToString(), out var ent) && ent.Count == 1) { - if (!salvMob.DespawnIfOffLinkedGrid) + if (HasComp<ShuttleComponent>(ent[0])) { - var transform = Transform(salvUid); - if (transform.GridUid != salvMob.LinkedGridEntity) - { - RemComp<NFSalvageMobRestrictionsComponent>(salvUid); - continue; - } + _shuttle.TryFTLProximity(ent[0], spawnCoords); } - if (gridTransform.GridUid == salvMob.LinkedGridEntity) + if (group.NameGrid) { - QueueDel(salvUid); + var name = path.FilenameWithoutExtension; + _metadata.SetEntityName(ent[0], name); } + + spawned = ent[0]; + return true; } - var mobQuery = AllEntityQuery<HumanoidAppearanceComponent, MobStateComponent, TransformComponent>(); - _playerMobs.Clear(); + Log.Error($"Error loading gridspawn for {ToPrettyString(stationUid)} / {path}"); + return false; + } + + protected override void Ended(EntityUid uid, BluespaceErrorRuleComponent component, GameRuleComponent gameRule, GameRuleEndedEvent args) + { + base.Ended(uid, component, gameRule, args); + + if (component.GridsUid == null) + return; - while (mobQuery.MoveNext(out var mobUid, out _, out _, out var xform)) + foreach (var componentGridUid in component.GridsUid) { - if (xform.GridUid == null || xform.MapUid == null || xform.GridUid != gridUid) - continue; + if (!EntityManager.TryGetComponent<TransformComponent>(componentGridUid, out var gridTransform)) + { + Log.Error("bluespace error objective was missing transform component"); + return; + } - // Can't parent directly to map as it runs grid traversal. - _playerMobs.Add(((mobUid, xform), xform.MapUid.Value, _transform.GetWorldPosition(xform))); - _transform.DetachParentToNull(mobUid, xform); - } + if (gridTransform.GridUid is not EntityUid gridUid) + { + Log.Error("bluespace error has no associated grid?"); + return; + } + + if (component.DeleteGridsOnEnd) + { + // Handle mobrestrictions getting deleted + var query = AllEntityQuery<NFSalvageMobRestrictionsComponent>(); - // Deletion has to happen before grid traversal re-parents players. - Del(gridUid); + while (query.MoveNext(out var salvUid, out var salvMob)) + { + if (!salvMob.DespawnIfOffLinkedGrid) + { + var transform = Transform(salvUid); + if (transform.GridUid != salvMob.LinkedGridEntity) + { + RemComp<NFSalvageMobRestrictionsComponent>(salvUid); + continue; + } + } + + if (gridTransform.GridUid == salvMob.LinkedGridEntity) + { + QueueDel(salvUid); + } + } - foreach (var mob in _playerMobs) - { - _transform.SetCoordinates(mob.Entity.Owner, new EntityCoordinates(mob.MapUid, mob.LocalPosition)); - } + var mobQuery = AllEntityQuery<HumanoidAppearanceComponent, MobStateComponent, TransformComponent>(); + _playerMobs.Clear(); - var queryBank = EntityQuery<StationBankAccountComponent>(); - foreach (var account in queryBank) - { - _cargo.DeductFunds(account, (int)-(gridValue * component.RewardFactor)); + while (mobQuery.MoveNext(out var mobUid, out _, out _, out var xform)) + { + if (xform.GridUid == null || xform.MapUid == null || xform.GridUid != gridUid) + continue; + + // Can't parent directly to map as it runs grid traversal. + _playerMobs.Add(((mobUid, xform), xform.MapUid.Value, _transform.GetWorldPosition(xform))); + _transform.DetachEntity(mobUid, xform); + } + + var gridValue = _pricing.AppraiseGrid(gridUid, null); + + // Deletion has to happen before grid traversal re-parents players. + Del(gridUid); + + foreach (var mob in _playerMobs) + { + _transform.SetCoordinates(mob.Entity.Owner, new EntityCoordinates(mob.MapUid, mob.LocalPosition)); + } + + var queryBank = EntityQuery<StationBankAccountComponent>(); + foreach (var account in queryBank) + { + _cargo.DeductFunds(account, (int)-(gridValue * component.NfsdRewardFactor)); + } + } } } } diff --git a/Resources/Locale/en-US/_NF/bluespace-events/events.ftl b/Resources/Locale/en-US/_NF/bluespace-events/events.ftl index 2a8b21f54fc..10b1aed8d39 100644 --- a/Resources/Locale/en-US/_NF/bluespace-events/events.ftl +++ b/Resources/Locale/en-US/_NF/bluespace-events/events.ftl @@ -1,23 +1,41 @@ +station-event-bluespace-dungeon-start-announcement = Inbound facility-class bluespace signatures have been detected. Investigate with caution, NanoTrasen is not liable for damages sustained or loss of life. +station-event-bluespace-dungeon-warning-announcement = Bluespace instability detected on facility, five minutes until estimated departure. +station-event-bluespace-dungeon-end-announcement = Critical bluespace instability detected, the facility has exited the sector. + station-event-bluespace-vault-start-announcement = A NanoTrasen autonomous armored vault transport has made an FTL error and will soon arrive nearby. Your sector will be rewarded for it's safe return. +station-event-bluespace-vault-warning-announcement = Remote FTL procedures initialized, five minutes until vault extraction. station-event-bluespace-vault-end-announcement = We have successfully retrieved the vault from your sector and have reimbursed your nearby Frontier Outpost accordingly. station-event-bluespace-cache-start-announcement = A Syndicate transport has been intercepted from FTL and will soon arrive nearby. Guard the armored weapons cache until NanoTrasen can retrieve it for a reward. +station-event-bluespace-cache-warning-announcement = Remote FTL procedures initialized, five minutes until weapons cache extraction. station-event-bluespace-cache-end-announcement = We have successfully retrieved the Syndicate weapons cache from your sector and have reimbursed your nearby Frontier Outpost accordingly. station-event-bluespace-asteroid-start-announcement = Long range scans indicate an unusually large asteroid entering the sector. NanoTrasen advises prospectors to divert operations for maximum profit potential. -station-event-bluespace-asteroid-end-announcement = In compliance with NanoTrasen FTL traffic patterns, the asteroid has been dissipated to ensure non-collision. +station-event-bluespace-asteroid-warning-announcement = Bluespace instability detected on asteroid, five minutes until estimated departure. +station-event-bluespace-asteroid-end-announcement = Critical bluespace instability detected, the asteroid has exited the sector. station-event-bluespace-ship-start-announcement = We have detected an unusual FTL signature - long range scans indicate an unknown ship. NanoTrasen cannot confirm safety for prospectors within its vicinity, be advised. +station-event-bluespace-ship-warning-announcement = Remote FTL procedures initialized, five minutes until ship dissipation. station-event-bluespace-ship-end-announcement = In compliance with NanoTrasen FTL traffic patterns, the unknown ship has been dissipated to ensure non-collision. station-event-bluespace-syndicate-ftl-interception-start-announcement = Attention all available NanoTrasen personnel! NanoTrasen Naval Command disrupted the FTL-jump of Syndicate Vessel, according to our deepspace scanners the vessel either already entered the real space in your sector or is about to enter. Code: Intercept, Expunge, Decimate, Cauterise. Expect armed opposition, use of lethal force against enemy agents is authorized. Do note: any loss of NT-affiliated personnel lives will not be compensated. Reminder: NT personnel who are granted security clearance for the engagement are required to surrender any hazardous materials to the local security department to ensure safe transportation of Syndicate technology to CentCom for study. Should there be any prisoners, security personnel is required to prepare them for transportation to CentCom for interrogation through the NT-patented Contraband Exchange System (tm). +station-event-bluespace-syndicate-ftl-interception-warning-announcement = Remote FTL procedures initialized, five minutes until Syndicate ship dissipation. station-event-bluespace-syndicate-ftl-interception-end-announcement = In compliance with NanoTrasen FTL traffic patterns, the Syndicate Vessel has been dissipated to ensure non-collision. station-event-bluespace-wizardfederation-scout-start-announcement = Attention all available NanoTrasen personnel! NanoTrasen Naval Command detected a Bluespace Anomaly in your sector with the signature indicative of the imminent arrival of a Wizard Federation small vessel. Code: Intercept, Detain, Incarcerate. Arrest the intruders and prepare them for transportation to CentCom for interrogation through NT patented Contraband Exchange System (tm). -station-event-bluespace-wizardfederation-scout-end-announcement = In compliance with NanoTrasen FTL traffic patterns, the Wizard Federation Vessel has been dissipated to ensure non-collision. +station-event-bluespace-wizardfederation-scout-warning-announcement = Remote FTL procedures initialized, five minutes until Wizard Federation vessel dissipation. +station-event-bluespace-wizardfederation-scout-end-announcement = In compliance with NanoTrasen FTL traffic patterns, the Wizard Federation vessel has been dissipated to ensure non-collision. station-event-bluespace-bloodmoon-start-announcement = Attention all available NanoTrasen personnel! NanoTrasen Naval Command detected a Bluespace Anomaly in your sector with the signature indicative of the imminent arrival of a Blood Cult's Vessel. Code: Intercept, Expunge, Exterminate, Cauterise. Expect armed opposition, use of lethal force against enemy combatants is mandatory, take no prisoners. Warning! Materials on the Blood Cult's Vessel possess Level 3 Cognitohazard! Local security force is advised to take steps to limit NT personnel's exposure to hazardous materials. Reminder: NT personnel who are granted security clearance for the engagement are required to surrender any hazardous materials to the local security department for containment and undergo a medical examination afterward. -station-event-bluespace-bloodmoon-end-announcement = In compliance with NanoTrasen FTL traffic patterns, the Blood Cult's Vessel has been dissipated to ensure non-collision. +station-event-bluespace-bloodmoon-warning-announcement = Remote FTL procedures initialized, five minutes until Blood Cult vessel dissipation. +station-event-bluespace-bloodmoon-end-announcement = In compliance with NanoTrasen FTL traffic patterns, the Blood Cult vessel has been dissipated to ensure non-collision. -station-event-bluespace-generic-ftl-start-announcement = Attention all NanoTrasen personnel! NanoTrasen Naval Command has detected an unidentified vessel entering the Frontier Sector. NanoTrasen-affiliated captains should approach with caution. NanoTrasen is not liable for damages sustained or loss of life. +station-event-bluespace-generic-ftl-start-announcement = Attention all NanoTrasen personnel! NanoTrasen Naval Command has detected an unidentified vessel entering the Frontier Sector. Investigate with caution, NanoTrasen is not liable for damages sustained or loss of life. +station-event-bluespace-generic-ftl-warning-announcement = Remote FTL procedures initialized, five minutes until unidentified vessel dissipation. station-event-bluespace-generic-ftl-end-announcement = In compliance with NanoTrasen FTL traffic patterns, the unidentified vessel has been dissipated to ensure non-collision. + +station-event-bluespace-name-BrokenMcDelivery = McDelivery +station-event-bluespace-name-Cave = Cave +station-event-bluespace-name-UnidentifiedVessel = Unidentified Vessel +station-event-bluespace-name-SecureNTVault = Secure NT Vault +station-event-bluespace-name-SyndicateWeaponsCache = Syndicate Weapons Cache diff --git a/Resources/Maps/_NF/Bluespace/mcevent.yml b/Resources/Maps/_NF/Bluespace/mcevent.yml index 74e67454e82..5e6457a4004 100644 --- a/Resources/Maps/_NF/Bluespace/mcevent.yml +++ b/Resources/Maps/_NF/Bluespace/mcevent.yml @@ -23,11 +23,11 @@ entities: chunks: 0,0: ind: 0,0 - tiles: AQAAAAAAawAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAfQAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAawAAAAAAfQAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AQAAAAAAawAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAawAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAfQAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAawAAAAAAfQAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAawAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 @@ -57,16 +57,6 @@ entities: chunkCollection: version: 2 nodes: - - node: - color: '#A46106FF' - id: WarnCornerNE - decals: - 10: 0,3 - - node: - color: '#A46106FF' - id: WarnCornerNW - decals: - 9: -1,3 - node: color: '#A46106FF' id: WarnCornerSE @@ -93,8 +83,7 @@ entities: color: '#A46106FF' id: WarnLineS decals: - 7: 0,-1 - 8: 0,-2 + 12: 0,-2 - node: color: '#FFFFFFFF' id: WarnLineW @@ -105,10 +94,10 @@ entities: data: tiles: 0,0: - 0: 4407 + 0: 4403 1: 17408 0,-1: - 0: 29490 + 0: 13106 -1,0: 0: 36044 0,1: @@ -151,163 +140,235 @@ entities: chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance -- proto: AirlockShuttleAssembly +- proto: AirlockGlassShuttle entities: - - uid: 3 + - uid: 24 components: - type: Transform pos: 1.5,-3.5 parent: 1 -- proto: APCBasic +- proto: AtmosDeviceFanDirectional entities: - - uid: 75 + - uid: 5 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,2.5 + pos: 0.5,-3.5 parent: 1 -- proto: CableApcExtension + - uid: 10 + components: + - type: Transform + pos: 1.5,-3.5 + parent: 1 +- proto: AtmosFixBlockerMarker entities: - - uid: 4 + - uid: 8 components: - type: Transform - pos: -0.5,1.5 + pos: -1.5,0.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: -1.5,1.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: -1.5,2.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: -1.5,-2.5 parent: 1 - uid: 63 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 68 components: - type: Transform pos: 0.5,0.5 parent: 1 + - uid: 72 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 - uid: 74 components: - type: Transform - pos: 1.5,2.5 + pos: 1.5,-0.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 1.5,0.5 parent: 1 - uid: 76 components: - type: Transform - pos: 0.5,2.5 + pos: 1.5,1.5 parent: 1 - uid: 78 components: - type: Transform - pos: 0.5,1.5 + pos: 1.5,-1.5 parent: 1 - - uid: 80 + - uid: 83 components: - type: Transform - pos: 0.5,-0.5 + pos: -1.5,-3.5 parent: 1 - - uid: 81 + - uid: 84 components: - type: Transform pos: 0.5,-1.5 parent: 1 - - uid: 82 + - uid: 85 components: - type: Transform pos: 0.5,-2.5 parent: 1 -- proto: ChairOfficeLight - entities: - - uid: 58 + - uid: 87 components: - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,2.5 + pos: 1.5,-2.5 parent: 1 -- proto: CigaretteSpent - entities: - - uid: 6 + - uid: 89 components: - type: Transform - pos: -0.6830013,3.557549 + pos: 1.5,-3.5 parent: 1 - - uid: 11 + - uid: 90 components: - type: Transform - pos: -0.7350848,3.3908823 + pos: 0.5,-3.5 parent: 1 - - uid: 52 + - uid: 93 components: - type: Transform - pos: -0.537168,3.3804657 + pos: -1.5,-0.5 parent: 1 - - uid: 56 + - uid: 95 components: - type: Transform - pos: -0.662168,3.682549 + pos: -1.5,4.5 parent: 1 - - uid: 57 + - uid: 96 components: - type: Transform - pos: -0.4850848,3.5992157 + pos: 2.5,4.5 parent: 1 - - uid: 71 + - uid: 97 components: - type: Transform - pos: -0.3288348,3.213799 + pos: 2.5,3.5 parent: 1 -- proto: CigPackBlack - entities: - - uid: 68 + - uid: 100 components: - type: Transform - pos: -0.693418,3.7971323 + pos: 2.5,2.5 parent: 1 -- proto: ClosetWall +- proto: CableApcExtension entities: - - uid: 72 + - uid: 64 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-1.5 + pos: 1.5,2.5 parent: 1 - - type: EntityStorage - air: - volume: 200 - immutable: False - temperature: 293.14923 - moles: - - 1.8977377 - - 7.139109 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 -- proto: ComputerTabletopBroken + - uid: 80 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 +- proto: CigaretteSpent entities: - - uid: 5 + - uid: 4 components: - type: Transform - pos: 0.5,3.5 + pos: -0.3662252,3.54995 parent: 1 -- proto: CrateFoodMcCargo + - uid: 23 + components: + - type: Transform + pos: -0.07455853,3.5916455 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -0.2203919,3.5291016 + parent: 1 +- proto: CigPackBlack entities: - - uid: 8 + - uid: 11 components: - type: Transform - pos: 1.5,-0.5 + pos: -0.14747521,3.6958845 parent: 1 - - uid: 32 +- proto: ComputerTabletopBroken + entities: + - uid: 13 components: - type: Transform - pos: 0.5,-0.5 + pos: 0.5,3.5 parent: 1 - - uid: 36 +- proto: CrateFoodMcCargo + entities: + - uid: 14 components: - type: Transform - pos: 0.5,-1.5 + pos: 1.5,-1.5 parent: 1 -- proto: DefibrillatorCabinetOpen +- proto: DefibrillatorCabinetFilled entities: - - uid: 9 + - uid: 25 components: - type: Transform rot: 1.5707963267948966 rad @@ -320,20 +381,14 @@ entities: - type: Transform pos: 1.5,1.5 parent: 1 -- proto: ExtinguisherCabinetOpen +- proto: ExtinguisherCabinetFilled entities: - - uid: 10 + - uid: 65 components: - type: Transform + rot: -1.5707963267948966 rad pos: -0.5,-1.5 parent: 1 -- proto: FireExtinguisher - entities: - - uid: 13 - components: - - type: Transform - pos: 0.7747072,2.503793 - parent: 1 - proto: GasPassiveVent entities: - uid: 102 @@ -354,14 +409,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' -- proto: GasPipeBroken - entities: - - uid: 12 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -0.5,2.5 - parent: 1 - proto: GasPipeStraight entities: - uid: 62 @@ -382,6 +429,14 @@ entities: color: '#990000FF' - proto: GasPort entities: + - uid: 16 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 19 components: - type: Transform @@ -390,6 +445,13 @@ entities: parent: 1 - type: AtmosPipeColor color: '#0055CCFF' +- proto: GravityGeneratorMini + entities: + - uid: 12 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 - proto: Grille entities: - uid: 20 @@ -402,17 +464,6 @@ entities: - type: Transform pos: 0.5,4.5 parent: 1 - - uid: 23 - components: - - type: Transform - pos: -1.5,2.5 - parent: 1 - - uid: 25 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 2.5,1.5 - parent: 1 - uid: 26 components: - type: Transform @@ -428,23 +479,20 @@ entities: - type: Transform pos: 1.5,4.5 parent: 1 - - uid: 54 + - uid: 36 components: - type: Transform - pos: 2.5,-0.5 + pos: 2.5,0.5 parent: 1 -- proto: GrilleBroken - entities: - - uid: 16 + - uid: 54 components: - type: Transform - rot: 3.141592653589793 rad - pos: -1.5,1.5 + pos: 2.5,-0.5 parent: 1 - - uid: 24 + - uid: 86 components: - type: Transform - pos: 2.5,0.5 + pos: 2.5,1.5 parent: 1 - proto: GrilleDiagonal entities: @@ -453,41 +501,35 @@ entities: - type: Transform pos: -1.5,4.5 parent: 1 -- proto: MachineFrame +- proto: LockerWallEVAColorCargoFilled entities: - - uid: 14 + - uid: 69 components: - type: Transform - pos: -1.5,-1.5 + rot: 1.5707963267948966 rad + pos: -0.5,-2.5 parent: 1 -- proto: MachineFrameDestroyed +- proto: NitrogenCanisterBroken entities: - - uid: 61 - components: - - type: Transform - pos: -1.5,-2.5 - parent: 1 - - uid: 67 + - uid: 32 components: - type: Transform - pos: -1.5,-3.5 + pos: 1.4296019,0.5208333 parent: 1 -- proto: NitrogenCanisterBroken +- proto: NoticeBoardNF entities: - - uid: 41 + - uid: 61 components: - type: Transform - rot: -0.00029320293106138706 rad - pos: 1.438669,0.9354652 + rot: -1.5707963267948966 rad + pos: 1.5,2.5 parent: 1 - - type: Physics - fixedRotation: False - proto: OxygenCanisterBroken entities: - - uid: 45 + - uid: 35 components: - type: Transform - pos: 1.137756,1.7390673 + pos: 1.4296019,1.7513416 parent: 1 - proto: PlasticFlapsAirtightClear entities: @@ -496,20 +538,13 @@ entities: - type: Transform pos: 0.5,-3.5 parent: 1 -- proto: PosterBroken - entities: - - uid: 50 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -0.5,-3.5 - parent: 1 - proto: PowerCellRecharger entities: - uid: 43 components: - type: Transform - pos: 1.5,-1.5 + rot: 1.5707963267948966 rad + pos: 1.5,-0.5 parent: 1 - proto: Poweredlight entities: @@ -519,13 +554,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,-1.5 parent: 1 -- proto: RandomCargoCorpseSpawner - entities: - - uid: 69 - components: - - type: Transform - pos: 0.5,2.5 - parent: 1 - proto: ReinforcedWindow entities: - uid: 46 @@ -548,16 +576,25 @@ entities: - type: Transform pos: -0.5,4.5 parent: 1 - - uid: 53 + - uid: 59 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 + - uid: 71 components: - type: Transform - rot: 3.141592653589793 rad pos: 2.5,1.5 parent: 1 - - uid: 59 + - uid: 73 components: - type: Transform - pos: -1.5,3.5 + pos: 2.5,0.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 2.5,-0.5 parent: 1 - proto: ReinforcedWindowDiagonal entities: @@ -573,9 +610,6 @@ entities: - type: Transform pos: 1.5,-3.5 parent: 1 - - type: DeviceLinkSink - links: - - 88 - proto: SignalButtonDirectional entities: - uid: 88 @@ -588,8 +622,29 @@ entities: linkedPorts: 79: - Pressed: Toggle +- proto: SignCargoDock + entities: + - uid: 30 + components: + - type: Transform + pos: -0.5,-3.5 + parent: 1 +- proto: SmallGyroscope + entities: + - uid: 6 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-1.5 + parent: 1 - proto: SmallThruster entities: + - uid: 67 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-2.5 + parent: 1 - uid: 70 components: - type: Transform @@ -601,29 +656,19 @@ entities: rot: -1.5707963267948966 rad pos: 2.5,3.5 parent: 1 -- proto: SuitStorageWallmount +- proto: Table entities: - - uid: 65 + - uid: 15 components: - type: Transform rot: 1.5707963267948966 rad - pos: -0.5,-2.5 + pos: 1.5,-0.5 parent: 1 - - type: Physics - canCollide: False -- proto: Table - entities: - uid: 17 components: - type: Transform pos: 0.5,3.5 parent: 1 - - uid: 35 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,-1.5 - parent: 1 - uid: 38 components: - type: Transform @@ -634,19 +679,13 @@ entities: - type: Transform pos: 0.5,-3.5 parent: 1 -- proto: TableFrame +- proto: Thruster entities: - - uid: 66 - components: - - type: Transform - pos: -0.5,2.5 - parent: 1 -- proto: UnfinishedMachineFrame - entities: - - uid: 60 + - uid: 3 components: - type: Transform - pos: -1.5,-0.5 + rot: 3.141592653589793 rad + pos: -1.5,-3.5 parent: 1 - proto: WallReinforced entities: @@ -662,17 +701,17 @@ entities: rot: 3.141592653589793 rad pos: 2.5,-2.5 parent: 1 - - uid: 15 - components: - - type: Transform - pos: 1.5,2.5 - parent: 1 - uid: 28 components: - type: Transform rot: 3.141592653589793 rad pos: -0.5,-3.5 parent: 1 + - uid: 29 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 - uid: 33 components: - type: Transform @@ -701,21 +740,19 @@ entities: rot: -1.5707963267948966 rad pos: 2.5,2.5 parent: 1 -- proto: WarpPoint +- proto: WarpPointNFMcDelivery entities: - - uid: 64 + - uid: 98 components: - type: Transform pos: 0.5,2.5 parent: 1 - - type: WarpPoint - location: Broken McDelivery -- proto: Welder +- proto: WelderEmpty entities: - - uid: 49 + - uid: 9 components: - type: Transform - pos: -0.2350848,3.588799 + pos: -0.5120585,3.6020691 parent: 1 - proto: WindoorSecure entities: diff --git a/Resources/Prototypes/_NF/Entities/Markers/warp_point.yml b/Resources/Prototypes/_NF/Entities/Markers/warp_point.yml index 7a5e7ecd0cb..fd3098ebe7f 100644 --- a/Resources/Prototypes/_NF/Entities/Markers/warp_point.yml +++ b/Resources/Prototypes/_NF/Entities/Markers/warp_point.yml @@ -174,6 +174,15 @@ location: Edison Power Plant # Events +- type: entity + id: WarpPointNFMcDelivery + parent: WarpPoint + suffix: Event, McDelivery + categories: [ HideSpawnMenu ] + components: + - type: WarpPoint + location: McDelivery + - type: entity id: WarpPointNFCave parent: WarpPoint diff --git a/Resources/Prototypes/_NF/Events/nf_bluespace_dungeons_events.yml b/Resources/Prototypes/_NF/Events/nf_bluespace_dungeons_events.yml new file mode 100644 index 00000000000..71cd177b60a --- /dev/null +++ b/Resources/Prototypes/_NF/Events/nf_bluespace_dungeons_events.yml @@ -0,0 +1,34 @@ +# Example use case of a DunGen-based bluespace event + +# - type: entity +# id: BluespaceDungeon +# parent: BaseStationEventShortDelay +# components: +# - type: StationEvent +# startAnnouncement: station-event-bluespace-dungeon-start-announcement +# startAudio: +# path: /Audio/Announcements/attention.ogg +# warningAnnouncement: station-event-bluespace-dungeon-warning-announcement +# endAnnouncement: station-event-bluespace-dungeon-end-announcement +# earliestStart: 100 +# weight: 5 +# duration: 120 # Temp +# maxDuration: 120 # Temp +# warningDurationLeft: 60 # Temp +# reoccurrenceDelay: 480 # 8 hours +# - type: BluespaceErrorRule +# groups: +# vgroid: !type:DungeonSpawnGroup +# nameDataset: names_borer +# minimumDistance: 1500 +# maximumDistance: 2500 +# addComponents: +# - type: Gravity +# enabled: true +# inherent: true +# - type: IFF +# - type: Shuttle +# angularDamping: 999999 +# linearDamping: 999999 +# protos: +# - NFVGRoid diff --git a/Resources/Prototypes/_NF/Events/nf_bluespace_grids_events.yml b/Resources/Prototypes/_NF/Events/nf_bluespace_grids_events.yml new file mode 100644 index 00000000000..5fad838aebc --- /dev/null +++ b/Resources/Prototypes/_NF/Events/nf_bluespace_grids_events.yml @@ -0,0 +1,279 @@ +- type: entity + id: BluespaceCacheError + parent: BaseStationEventShortDelay + components: + - type: StationEvent + startAnnouncement: station-event-bluespace-cache-start-announcement + startAudio: + path: /Audio/Announcements/attention.ogg + warningAnnouncement: station-event-bluespace-cache-warning-announcement + endAnnouncement: station-event-bluespace-cache-end-announcement + earliestStart: 100 + weight: 5 + duration: 1350 + maxDuration: 1560 + reoccurrenceDelay: 480 # 8 hours + requiredJobs: + Sheriff: 1 + - type: BluespaceErrorRule + groups: + grid: !type:GridSpawnGroup + nameLoc: + - station-event-bluespace-name-SyndicateWeaponsCache + minimumDistance: 1500 + maximumDistance: 2500 + addComponents: + - type: Gravity + enabled: true + inherent: true + - type: IFF + color: "#E10F9B" + - type: Shuttle + angularDamping: 999999 + linearDamping: 999999 + paths: + - /Maps/_NF/Bluespace/cache.yml + nfsdRewardFactor: 1 + +- type: entity + id: BluespaceVaultError + parent: BaseStationEventShortDelay + components: + - type: StationEvent + startAnnouncement: station-event-bluespace-vault-start-announcement + startAudio: + path: /Audio/Announcements/attention.ogg + warningAnnouncement: station-event-bluespace-vault-warning-announcement + endAnnouncement: station-event-bluespace-vault-end-announcement + earliestStart: 100 + weight: 5 + duration: 1020 + maxDuration: 1350 + reoccurrenceDelay: 480 # 8 hours + requiredJobs: + Sheriff: 1 + - type: BluespaceErrorRule + groups: + grid: !type:GridSpawnGroup + nameLoc: + - station-event-bluespace-name-SecureNTVault + minimumDistance: 1500 + maximumDistance: 2500 + addComponents: + - type: Gravity + enabled: true + inherent: true + - type: IFF + color: "#E10F9B" + - type: Shuttle + angularDamping: 999999 + linearDamping: 999999 + paths: + - /Maps/_NF/Bluespace/vault.yml + nfsdRewardFactor: 1 + +- type: entity + id: BluespaceVaultSmallError + parent: BaseStationEventShortDelay + components: + - type: StationEvent + startAnnouncement: station-event-bluespace-vault-start-announcement + startAudio: + path: /Audio/Announcements/attention.ogg + warningAnnouncement: station-event-bluespace-vault-warning-announcement + endAnnouncement: station-event-bluespace-vault-end-announcement + earliestStart: 100 + maximumPlayers: 30 + weight: 5 + duration: 590 + maxDuration: 780 + reoccurrenceDelay: 480 # 8 hours + requiredJobs: + Sheriff: 1 + - type: BluespaceErrorRule + groups: + grid: !type:GridSpawnGroup + nameLoc: + - station-event-bluespace-name-SecureNTVault + minimumDistance: 1500 + maximumDistance: 2500 + addComponents: + - type: Gravity + enabled: true + inherent: true + - type: IFF + color: "#E10F9B" + - type: Shuttle + angularDamping: 999999 + linearDamping: 999999 + paths: + - /Maps/_NF/Bluespace/vaultsmall.yml + nfsdRewardFactor: 1 + +- type: entity + id: BluespaceSyndicateFTLInterception + parent: BaseStationEventShortDelay + components: + - type: StationEvent + startAnnouncement: station-event-bluespace-generic-ftl-start-announcement + startAudio: + path: /Audio/Misc/notice1.ogg + warningAnnouncement: station-event-bluespace-generic-ftl-warning-announcement + endAnnouncement: station-event-bluespace-generic-ftl-end-announcement + earliestStart: 80 + minimumPlayers: 15 + weight: 1 + duration: 1800 + maxDuration: 2400 + reoccurrenceDelay: 480 # Only once per shift possible + - type: BluespaceErrorRule + groups: + grid: !type:GridSpawnGroup + nameLoc: + - station-event-bluespace-name-UnidentifiedVessel + minimumDistance: 1500 + maximumDistance: 2500 + addComponents: + - type: Gravity + enabled: true + inherent: true + - type: IFF + color: "#E10F9B" + - type: Shuttle + angularDamping: 999999 + linearDamping: 999999 + paths: + - /Maps/_NF/Bluespace/syndieftlintercept.yml + +- type: entity + id: BluespaceWizardFederationScout + parent: BaseStationEventShortDelay + components: + - type: StationEvent + startAnnouncement: station-event-bluespace-generic-ftl-start-announcement + startAudio: + path: /Audio/Misc/notice1.ogg + warningAnnouncement: station-event-bluespace-generic-ftl-warning-announcement + endAnnouncement: station-event-bluespace-generic-ftl-end-announcement + earliestStart: 100 + minimumPlayers: 15 + weight: 1 + duration: 900 + maxDuration: 1200 + reoccurrenceDelay: 480 # 8 hours + - type: BluespaceErrorRule + groups: + grid: !type:GridSpawnGroup + nameLoc: + - station-event-bluespace-name-UnidentifiedVessel + minimumDistance: 1500 + maximumDistance: 2500 + addComponents: + - type: Gravity + enabled: true + inherent: true + - type: IFF + color: "#E10F9B" + - type: Shuttle + angularDamping: 999999 + linearDamping: 999999 + paths: + - /Maps/_NF/Bluespace/wizardprobealt.yml + +- type: entity + id: BluespaceBloodMoon + parent: BaseStationEventShortDelay + components: + - type: StationEvent + startAnnouncement: station-event-bluespace-generic-ftl-start-announcement + startAudio: + path: /Audio/Misc/notice1.ogg + warningAnnouncement: station-event-bluespace-generic-ftl-warning-announcement + endAnnouncement: station-event-bluespace-generic-ftl-end-announcement + earliestStart: 80 + minimumPlayers: 15 + weight: 1 + duration: 1800 + maxDuration: 2400 + reoccurrenceDelay: 480 # 8 hours + - type: BluespaceErrorRule + groups: + grid: !type:GridSpawnGroup + nameLoc: + - station-event-bluespace-name-UnidentifiedVessel + minimumDistance: 1500 + maximumDistance: 2500 + addComponents: + - type: Gravity + enabled: true + inherent: true + - type: IFF + color: "#E10F9B" + - type: Shuttle + angularDamping: 999999 + linearDamping: 999999 + paths: + - /Maps/_NF/Bluespace/bloodmoon.yml + +- type: entity + id: BluespaceCave + parent: BaseStationEventShortDelay + components: + - type: StationEvent + startAnnouncement: station-event-bluespace-generic-ftl-start-announcement + startAudio: + path: /Audio/Misc/notice1.ogg + warningAnnouncement: station-event-bluespace-generic-ftl-warning-announcement + endAnnouncement: station-event-bluespace-generic-ftl-end-announcement + earliestStart: 20 + weight: 1 + duration: 1800 + maxDuration: 2400 + maxOccurrences: 1 + - type: BluespaceErrorRule + groups: + grid: !type:GridSpawnGroup + nameLoc: + - station-event-bluespace-name-Cave + minimumDistance: 1500 + maximumDistance: 2500 + addComponents: + - type: Gravity + enabled: true + inherent: true + - type: IFF + - type: Shuttle + angularDamping: 999999 + linearDamping: 999999 + paths: + - /Maps/_NF/Bluespace/cave.yml + +- type: entity + id: BluespaceBrokenMcDelivery + parent: BaseStationEventShortDelay + components: + - type: StationEvent + startAnnouncement: station-event-bluespace-generic-ftl-start-announcement + startAudio: + path: /Audio/Misc/notice1.ogg + warningAnnouncement: station-event-bluespace-generic-ftl-warning-announcement + endAnnouncement: station-event-bluespace-generic-ftl-end-announcement + earliestStart: 20 + maximumPlayers: 20 + weight: 5 + duration: 900 + maxDuration: 1800 + reoccurrenceDelay: 240 # once per 4 hours + - type: BluespaceErrorRule + groups: + grid: !type:GridSpawnGroup + nameLoc: + - station-event-bluespace-name-BrokenMcDelivery + minCount: 2 + maxCount: 3 + minimumDistance: 1500 + maximumDistance: 2500 + addComponents: + - type: IFF + paths: + - /Maps/_NF/Bluespace/mcevent.yml diff --git a/Resources/Prototypes/_NF/Events/nf_events_bluespace.yml b/Resources/Prototypes/_NF/Events/nf_events_bluespace.yml deleted file mode 100644 index e168bf6529c..00000000000 --- a/Resources/Prototypes/_NF/Events/nf_events_bluespace.yml +++ /dev/null @@ -1,157 +0,0 @@ -- type: entity - id: BluespaceCacheError - parent: BaseStationEventShortDelay - components: - - type: StationEvent - startAnnouncement: station-event-bluespace-cache-start-announcement - startAudio: - path: /Audio/Announcements/attention.ogg - endAnnouncement: station-event-bluespace-cache-end-announcement - earliestStart: 100 - weight: 5 - duration: 1350 - maxDuration: 1560 - reoccurrenceDelay: 480 # 8 hours - requiredJobs: - Sheriff: 1 - - type: BluespaceErrorRule - gridPaths: - - /Maps/_NF/Bluespace/cache.yml - rewardFactor: 1 - -- type: entity - id: BluespaceVaultError - parent: BaseStationEventShortDelay - components: - - type: StationEvent - startAnnouncement: station-event-bluespace-vault-start-announcement - startAudio: - path: /Audio/Announcements/attention.ogg - endAnnouncement: station-event-bluespace-vault-end-announcement - earliestStart: 100 - weight: 5 - duration: 1020 - maxDuration: 1350 - reoccurrenceDelay: 480 # 8 hours - requiredJobs: - Sheriff: 1 - - type: BluespaceErrorRule - gridPaths: - - /Maps/_NF/Bluespace/vault.yml - rewardFactor: 1 - -- type: entity - id: BluespaceVaultSmallError - parent: BaseStationEventShortDelay - components: - - type: StationEvent - startAnnouncement: station-event-bluespace-vault-start-announcement - startAudio: - path: /Audio/Announcements/attention.ogg - endAnnouncement: station-event-bluespace-vault-end-announcement - earliestStart: 100 - maximumPlayers: 30 - weight: 5 - duration: 590 - maxDuration: 780 - reoccurrenceDelay: 480 # 8 hours - requiredJobs: - Sheriff: 1 - - type: BluespaceErrorRule - gridPaths: - - /Maps/_NF/Bluespace/vaultsmall.yml - rewardFactor: 1 - -- type: entity - id: BluespaceSyndicateFTLInterception - parent: BaseStationEventShortDelay - components: - - type: StationEvent - startAnnouncement: station-event-bluespace-generic-ftl-start-announcement - startAudio: - path: /Audio/Misc/notice1.ogg - endAnnouncement: station-event-bluespace-generic-ftl-end-announcement - earliestStart: 80 - minimumPlayers: 20 - weight: 1 - duration: 1800 - maxDuration: 2400 - reoccurrenceDelay: 480 # Only once per shift possible - - type: BluespaceErrorRule - gridPaths: - - /Maps/_NF/Bluespace/syndieftlintercept.yml - -- type: entity - id: BluespaceWizardFederationScout - parent: BaseStationEventShortDelay - components: - - type: StationEvent - startAnnouncement: station-event-bluespace-generic-ftl-start-announcement - startAudio: - path: /Audio/Misc/notice1.ogg - endAnnouncement: station-event-bluespace-generic-ftl-end-announcement - earliestStart: 100 - minimumPlayers: 20 - weight: 1 - duration: 900 - maxDuration: 1200 - reoccurrenceDelay: 480 # 8 hours - - type: BluespaceErrorRule - gridPaths: - - /Maps/_NF/Bluespace/wizardprobealt.yml - -- type: entity - id: BluespaceBloodMoon - parent: BaseStationEventShortDelay - components: - - type: StationEvent - startAnnouncement: station-event-bluespace-generic-ftl-start-announcement - startAudio: - path: /Audio/Misc/notice1.ogg - endAnnouncement: station-event-bluespace-generic-ftl-end-announcement - earliestStart: 80 - minimumPlayers: 20 - weight: 1 - duration: 1800 - maxDuration: 2400 - reoccurrenceDelay: 480 # 8 hours - - type: BluespaceErrorRule - gridPaths: - - /Maps/_NF/Bluespace/bloodmoon.yml - -- type: entity - id: BluespaceCave - parent: BaseStationEventShortDelay - components: - - type: StationEvent - startAnnouncement: station-event-bluespace-generic-ftl-start-announcement - startAudio: - path: /Audio/Misc/notice1.ogg - endAnnouncement: station-event-bluespace-generic-ftl-end-announcement - earliestStart: 20 - weight: 1 - duration: 1800 - maxDuration: 2400 - maxOccurrences: 1 - - type: BluespaceErrorRule - gridPaths: - - /Maps/_NF/Bluespace/cave.yml - -- type: entity - id: BluespaceBrokenMcDelivery - parent: BaseStationEventShortDelay - components: - - type: StationEvent - startAnnouncement: station-event-bluespace-generic-ftl-start-announcement - startAudio: - path: /Audio/Misc/notice1.ogg - endAnnouncement: station-event-bluespace-generic-ftl-end-announcement - earliestStart: 20 - maximumPlayers: 20 - weight: 5 - duration: 900 - maxDuration: 1800 - reoccurrenceDelay: 240 # once per 4 hours - - type: BluespaceErrorRule - gridPaths: - - /Maps/_NF/Bluespace/mcevent.yml diff --git a/Resources/Prototypes/_NF/GameRules/roundstart.yml b/Resources/Prototypes/_NF/GameRules/roundstart.yml index dd326898397..d983a0950a1 100644 --- a/Resources/Prototypes/_NF/GameRules/roundstart.yml +++ b/Resources/Prototypes/_NF/GameRules/roundstart.yml @@ -4,7 +4,7 @@ categories: [ HideSpawnMenu ] components: - type: AdventureRule - spaceDungeons: + spaceDungeons: # TODO: Remove with new system - CaveFactory - MedSci - FactoryDorms diff --git a/Resources/Prototypes/_NF/World/Biomes/basic.yml b/Resources/Prototypes/_NF/World/Biomes/basic.yml index 86715b05c94..388932b3ecd 100644 --- a/Resources/Prototypes/_NF/World/Biomes/basic.yml +++ b/Resources/Prototypes/_NF/World/Biomes/basic.yml @@ -145,4 +145,5 @@ - type: NoiseRangeCarver ranges: - 0.4, 0.6 - noiseChannel: Carver \ No newline at end of file + noiseChannel: Carver +