using System.Numerics;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
+using Robust.Shared.Utility;
namespace Content.Server.Dragon;
comp.State = DragonRiftState.AlmostFinished;
Dirty(uid, comp);
- var location = xform.LocalPosition;
- _chat.DispatchGlobalAnnouncement(Loc.GetString("carp-rift-warning", ("location", location)), playSound: false, colorOverride: Color.Red);
+ var msg = Loc.GetString("carp-rift-warning",
+ ("location", FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((uid, xform)))));
+ _chat.DispatchGlobalAnnouncement(msg, playSound: false, colorOverride: Color.Red);
_audio.PlayGlobal("/Audio/Misc/notice1.ogg", Filter.Broadcast(), true);
_navMap.SetBeaconEnabled(uid, true);
}
using Content.Server.Chemistry.Containers.EntitySystems;
using Content.Server.Explosion.Components;
using Content.Server.Flash;
+using Content.Server.Pinpointer;
using Content.Shared.Flash.Components;
using Content.Server.Radio.EntitySystems;
using Content.Shared.Chemistry.Components;
using Robust.Shared.Random;
using Robust.Shared.Player;
using Content.Shared.Coordinates;
+using Robust.Shared.Utility;
namespace Content.Server.Explosion.EntitySystems
{
[Dependency] private readonly BodySystem _body = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
+ [Dependency] private readonly NavMapSystem _navMap = default!;
[Dependency] private readonly RadioSystem _radioSystem = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
return;
// Gets location of the implant
- var ownerXform = Transform(uid);
- var pos = ownerXform.MapPosition;
- var x = (int) pos.X;
- var y = (int) pos.Y;
- var posText = $"({x}, {y})";
-
+ var posText = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString(uid));
var critMessage = Loc.GetString(component.CritMessage, ("user", implanted.ImplantedEntity.Value), ("position", posText));
var deathMessage = Loc.GetString(component.DeathMessage, ("user", implanted.ImplantedEntity.Value), ("position", posText));
using Robust.Shared.Map.Components;
using Robust.Shared.Player;
using Robust.Shared.Random;
+using Robust.Shared.Utility;
namespace Content.Server.Nuke;
// warn a crew
var announcement = Loc.GetString("nuke-component-announcement-armed",
- ("time", (int) component.RemainingTime), ("position", posText));
+ ("time", (int) component.RemainingTime),
+ ("location", FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((uid, nukeXform)))));
var sender = Loc.GetString("nuke-component-announcement-sender");
_chatSystem.DispatchStationAnnouncement(stationUid ?? uid, announcement, sender, false, null, Color.Red);
+using System.Diagnostics.CodeAnalysis;
using Content.Server.Administration.Logs;
using Content.Server.Station.Systems;
using Content.Server.Warps;
using Content.Shared.Database;
using Content.Shared.Examine;
+using Content.Shared.Localizations;
using Content.Shared.Pinpointer;
using Content.Shared.Tag;
+using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Shared.GameStates;
+using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly TagSystem _tags = default!;
[Dependency] private readonly MapSystem _map = default!;
+ [Dependency] private readonly IMapManager _mapManager = default!;
+ [Dependency] private readonly TransformSystem _transform = default!;
private EntityQuery<PhysicsComponent> _physicsQuery;
private EntityQuery<TagComponent> _tagQuery;
+ public const float CloseDistance = 15f;
+ public const float FarDistance = 30f;
+
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<NavMapComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<GridSplitEvent>(OnNavMapSplit);
+ SubscribeLocalEvent<NavMapBeaconComponent, MapInitEvent>(OnNavMapBeaconMapInit);
SubscribeLocalEvent<NavMapBeaconComponent, ComponentStartup>(OnNavMapBeaconStartup);
SubscribeLocalEvent<NavMapBeaconComponent, AnchorStateChangedEvent>(OnNavMapBeaconAnchor);
RefreshGrid(ev.GridId, comp, Comp<MapGridComponent>(ev.GridId));
}
+ private void OnNavMapBeaconMapInit(EntityUid uid, NavMapBeaconComponent component, MapInitEvent args)
+ {
+ if (component.DefaultText == null || component.Text != null)
+ return;
+
+ component.Text = Loc.GetString(component.DefaultText);
+ Dirty(uid, component);
+ RefreshNavGrid(uid);
+ }
+
private void OnNavMapBeaconStartup(EntityUid uid, NavMapBeaconComponent component, ComponentStartup args)
{
RefreshNavGrid(uid);
SetBeaconEnabled(uid, !comp.Enabled, comp);
}
+
+ /// <summary>
+ /// For a given position, tries to find the nearest configurable beacon that is marked as visible.
+ /// This is used for things like announcements where you want to find the closest "landmark" to something.
+ /// </summary>
+ [PublicAPI]
+ public bool TryGetNearestBeacon(Entity<TransformComponent?> ent,
+ [NotNullWhen(true)] out Entity<NavMapBeaconComponent>? beacon,
+ [NotNullWhen(true)] out MapCoordinates? beaconCoords)
+ {
+ beacon = null;
+ beaconCoords = null;
+ if (!Resolve(ent, ref ent.Comp))
+ return false;
+
+ return TryGetNearestBeacon(_transform.GetMapCoordinates(ent, ent.Comp), out beacon, out beaconCoords);
+ }
+
+ /// <summary>
+ /// For a given position, tries to find the nearest configurable beacon that is marked as visible.
+ /// This is used for things like announcements where you want to find the closest "landmark" to something.
+ /// </summary>
+ public bool TryGetNearestBeacon(MapCoordinates coordinates,
+ [NotNullWhen(true)] out Entity<NavMapBeaconComponent>? beacon,
+ [NotNullWhen(true)] out MapCoordinates? beaconCoords)
+ {
+ beacon = null;
+ beaconCoords = null;
+ var minDistance = float.PositiveInfinity;
+
+ var query = EntityQueryEnumerator<ConfigurableNavMapBeaconComponent, NavMapBeaconComponent, TransformComponent>();
+ while (query.MoveNext(out var uid, out _, out var navBeacon, out var xform))
+ {
+ if (!navBeacon.Enabled)
+ continue;
+
+ if (navBeacon.Text == null)
+ continue;
+
+ if (coordinates.MapId != xform.MapID)
+ continue;
+
+ var coords = _transform.GetWorldPosition(xform);
+ var distanceSquared = (coordinates.Position - coords).LengthSquared();
+ if (!float.IsInfinity(minDistance) && distanceSquared >= minDistance)
+ continue;
+
+ minDistance = distanceSquared;
+ beacon = (uid, navBeacon);
+ beaconCoords = new MapCoordinates(coords, xform.MapID);
+ }
+
+ return beacon != null;
+ }
+
+ [PublicAPI]
+ public string GetNearestBeaconString(Entity<TransformComponent?> ent)
+ {
+ if (!Resolve(ent, ref ent.Comp))
+ return Loc.GetString("nav-beacon-pos-no-beacons");
+
+ return GetNearestBeaconString(_transform.GetMapCoordinates(ent, ent.Comp));
+ }
+
+ public string GetNearestBeaconString(MapCoordinates coordinates)
+ {
+ if (!TryGetNearestBeacon(coordinates, out var beacon, out var pos))
+ return Loc.GetString("nav-beacon-pos-no-beacons");
+
+ var gridOffset = Angle.Zero;
+ if (_mapManager.TryFindGridAt(pos.Value, out var grid, out _))
+ gridOffset = Transform(grid).LocalRotation;
+
+ // get the angle between the two positions, adjusted for the grid rotation so that
+ // we properly preserve north in relation to the grid.
+ var dir = (pos.Value.Position - coordinates.Position).ToWorldAngle();
+ var adjustedDir = (dir - gridOffset).GetDir();
+
+ var length = (pos.Value.Position - coordinates.Position).Length();
+ if (length < CloseDistance)
+ {
+ return Loc.GetString("nav-beacon-pos-format",
+ ("color", beacon.Value.Comp.Color),
+ ("marker", beacon.Value.Comp.Text!));
+ }
+
+ var modifier = length > FarDistance
+ ? Loc.GetString("nav-beacon-pos-format-direction-mod-far")
+ : string.Empty;
+
+ // we can null suppress the text being null because TRyGetNearestVisibleStationBeacon always gives us a beacon with not-null text.
+ return Loc.GetString("nav-beacon-pos-format-direction",
+ ("modifier", modifier),
+ ("direction", ContentLocalizationManager.FormatDirection(adjustedDir).ToLowerInvariant()),
+ ("color", beacon.Value.Comp.Color),
+ ("marker", beacon.Value.Comp.Text!));
+ }
}
using Content.Server.DeviceNetwork.Components;
using Content.Server.DeviceNetwork.Systems;
using Content.Server.GameTicking.Events;
+using Content.Server.Pinpointer;
using Content.Server.Popups;
using Content.Server.RoundEnd;
using Content.Server.Screens.Components;
using Robust.Shared.Player;
using Robust.Shared.Random;
using Robust.Shared.Timing;
+using Robust.Shared.Utility;
namespace Content.Server.Shuttles.Systems;
[Dependency] private readonly DockingSystem _dock = default!;
[Dependency] private readonly EntityManager _entityManager = default!;
[Dependency] private readonly IdCardSystem _idSystem = default!;
+ [Dependency] private readonly NavMapSystem _navMap = default!;
[Dependency] private readonly MapLoaderSystem _map = default!;
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly RoundEndSystem _roundEnd = default!;
}
else
{
- if (TryComp<TransformComponent>(targetGrid.Value, out var targetXform))
- {
- var angle = _dock.GetAngle(stationShuttle.EmergencyShuttle.Value, xform, targetGrid.Value, targetXform, xformQuery);
- _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-nearby", ("direction", angle.GetDir())), playDefaultSound: false);
- }
+ var location = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((stationShuttle.EmergencyShuttle.Value, xform)));
+ _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-nearby", ("direction", location)), playDefaultSound: false);
_logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} unable to find a valid docking port for {ToPrettyString(stationUid)}");
// TODO: Need filter extensions or something don't blame me.
};
}
+ /// <summary>
+ /// Formats a direction struct as a human-readable string.
+ /// </summary>
+ public static string FormatDirection(Direction dir)
+ {
+ return Loc.GetString($"zzzz-fmt-direction-{dir.ToString()}");
+ }
+
private static ILocValue FormatLoc(LocArgs args)
{
var id = ((LocValueString) args.Args[0]).Value;
[AutoNetworkedField]
public string? Text;
+ /// <summary>
+ /// A localization string that populates <see cref="Text"/> if it is null at mapinit.
+ /// Used so that mappers can still override Text while mapping.
+ /// </summary>
+ [DataField]
+ public LocId? DefaultText;
+
[ViewVariables(VVAccess.ReadWrite), DataField]
[AutoNetworkedField]
public Color Color = Color.Orange;
{
public const byte ChunkSize = 4;
- public override void Initialize()
- {
- base.Initialize();
-
- SubscribeLocalEvent<NavMapBeaconComponent, MapInitEvent>(OnNavMapBeaconMapInit);
- }
-
/// <summary>
/// Converts the chunk's tile into a bitflag for the slot.
/// </summary>
return new Vector2i(x, y);
}
- private void OnNavMapBeaconMapInit(EntityUid uid, NavMapBeaconComponent component, MapInitEvent args)
- {
- component.Text ??= string.Empty;
- component.Text = Loc.GetString(component.Text);
- Dirty(uid, component);
- }
-
[Serializable, NetSerializable]
protected sealed class NavMapComponentState : ComponentState
{
--- /dev/null
+zzzz-fmt-direction-North = North
+zzzz-fmt-direction-South = South
+zzzz-fmt-direction-East = East
+zzzz-fmt-direction-West = West
+zzzz-fmt-direction-NorthEast = NorthEast
+zzzz-fmt-direction-SouthEast = SouthEast
+zzzz-fmt-direction-NorthWest = NorthWest
+zzzz-fmt-direction-SouthWest = SouthWest
-carp-rift-warning = A rift is causing an unnaturally large energy flux at {$location}. Stop it at all costs!
+carp-rift-warning = A rift is causing an unnaturally large energy flux {$location}. Stop it at all costs!
carp-rift-duplicate = Cannot have 2 charging rifts at the same time!
carp-rift-examine = It is [color=yellow]{$percentage}%[/color] charged!
carp-rift-max = You have reached your maximum amount of rifts
## Implant Messages
-deathrattle-implant-dead-message = {$user} has died at {$position}.
-deathrattle-implant-critical-message = {$user} life signs critical, immediate assistance required at {$position}.
+deathrattle-implant-dead-message = {$user} has died {$position}.
+deathrattle-implant-critical-message = {$user} life signs critical, immediate assistance required {$position}.
[true] forestgreen]on
*[false] crimson]off
}[/color] and the display reads [color={$color}]"{$label}"[/color]
+
+nav-beacon-pos-no-beacons = in the middle of nowhere
+nav-beacon-pos-format = [color={$color}]near {$marker}[/color]
+nav-beacon-pos-format-direction = [color={$color}]{$modifier}{$direction} of {$marker}[/color]
+nav-beacon-pos-format-direction-mod-far = far {""}
nuke-component-cant-anchor-floor = The anchoring bolts fail to lock into the floor!
nuke-component-announcement-sender = Nuclear Fission Explosive
-nuke-component-announcement-armed = Attention! The station's self-destruct mechanism has been engaged at global coordinates {$position}. {$time} seconds until detonation. If this was made in error, the mechanism may still be disarmed.
+nuke-component-announcement-armed = Attention! The station's self-destruct mechanism has been engaged {$location}. {$time} seconds until detonation. If this was made in error, the mechanism may still be disarmed.
nuke-component-announcement-unarmed = The station's self-destruct was deactivated! Have a nice day!
nuke-component-announcement-send-codes = Attention! Self-destruction codes have been sent to designated fax machines.
nuke-component-doafter-warning = You start fiddling with wires and knobs in order to disarm the nuke.. This may take a while.
emergency-shuttle-launch-time = The emergency shuttle will launch in {$consoleAccumulator} seconds.
emergency-shuttle-docked = The Emergency Shuttle has docked with the station on the {$direction} side. It will leave in {$time} seconds.
emergency-shuttle-good-luck = The Emergency Shuttle is unable to find a station. Good luck.
-emergency-shuttle-nearby = The Emergency Shuttle is unable to find a valid docking port. It has warped in {$direction} of the station.
+emergency-shuttle-nearby = The Emergency Shuttle is unable to find a valid docking port. It has warped {$direction}.
# Emergency shuttle console popup / announcement
emergency-shuttle-console-no-early-launches = Early launch is disabled
False: {state: icon}
- type: ConfigurableNavMapBeacon
- type: NavMapBeacon
- text: station-beacon-general
+ defaultText: station-beacon-general
color: "#D4D4D496"
- type: WarpPoint
- type: ActivatableUI
suffix: Command
components:
- type: NavMapBeacon
- text: station-beacon-command
+ defaultText: station-beacon-command
color: "#FFFF00"
- type: entity
suffix: Bridge
components:
- type: NavMapBeacon
- text: station-beacon-bridge
+ defaultText: station-beacon-bridge
- type: entity
parent: DefaultStationBeaconCommand
suffix: Vault
components:
- type: NavMapBeacon
- text: station-beacon-vault
+ defaultText: station-beacon-vault
- type: entity
parent: DefaultStationBeaconCommand
suffix: Captain's Quarters
components:
- type: NavMapBeacon
- text: station-beacon-captain
+ defaultText: station-beacon-captain
- type: entity
parent: DefaultStationBeaconCommand
suffix: HOP's Office
components:
- type: NavMapBeacon
- text: station-beacon-hop
+ defaultText: station-beacon-hop
- type: entity
parent: DefaultStationBeacon
suffix: Security
components:
- type: NavMapBeacon
- text: station-beacon-security
+ defaultText: station-beacon-security
color: "#DE3A3A"
- type: entity
suffix: Brig
components:
- type: NavMapBeacon
- text: station-beacon-brig
+ defaultText: station-beacon-brig
- type: entity
parent: DefaultStationBeaconSecurity
suffix: Warden's Office
components:
- type: NavMapBeacon
- text: station-beacon-warden
+ defaultText: station-beacon-warden
- type: entity
parent: DefaultStationBeaconSecurity
suffix: HOS’s Room
components:
- type: NavMapBeacon
- text: station-beacon-hos
+ defaultText: station-beacon-hos
- type: entity
parent: DefaultStationBeaconSecurity
suffix: Armory
components:
- type: NavMapBeacon
- text: station-beacon-armory
+ defaultText: station-beacon-armory
- type: entity
parent: DefaultStationBeaconSecurity
suffix: Perma Brig
components:
- type: NavMapBeacon
- text: station-beacon-perma-brig
+ defaultText: station-beacon-perma-brig
- type: entity
parent: DefaultStationBeaconSecurity
suffix: Detective's Room
components:
- type: NavMapBeacon
- text: station-beacon-detective
+ defaultText: station-beacon-detective
- type: entity
parent: DefaultStationBeaconSecurity
suffix: Courtroom
components:
- type: NavMapBeacon
- text: station-beacon-courtroom
+ defaultText: station-beacon-courtroom
- type: entity
parent: DefaultStationBeaconSecurity
suffix: Law Office
components:
- type: NavMapBeacon
- text: station-beacon-law
+ defaultText: station-beacon-law
- type: entity
parent: DefaultStationBeaconSecurity
suffix: Sec Checkpoint
components:
- type: NavMapBeacon
- text: station-beacon-security-checkpoint
+ defaultText: station-beacon-security-checkpoint
- type: entity
parent: DefaultStationBeacon
suffix: Medical
components:
- type: NavMapBeacon
- text: station-beacon-medical
+ defaultText: station-beacon-medical
color: "#52B4E9"
- type: entity
suffix: Medbay
components:
- type: NavMapBeacon
- text: station-beacon-medbay
+ defaultText: station-beacon-medbay
- type: entity
parent: DefaultStationBeaconMedical
suffix: Chemistry
components:
- type: NavMapBeacon
- text: station-beacon-chemistry
+ defaultText: station-beacon-chemistry
- type: entity
parent: DefaultStationBeaconMedical
suffix: Cryonics
components:
- type: NavMapBeacon
- text: station-beacon-cryonics
+ defaultText: station-beacon-cryonics
- type: entity
parent: DefaultStationBeaconMedical
suffix: CMO's room
components:
- type: NavMapBeacon
- text: station-beacon-cmo
+ defaultText: station-beacon-cmo
- type: entity
parent: DefaultStationBeaconMedical
suffix: Morgue
components:
- type: NavMapBeacon
- text: station-beacon-morgue
+ defaultText: station-beacon-morgue
- type: entity
parent: DefaultStationBeaconMedical
suffix: Surgery
components:
- type: NavMapBeacon
- text: station-beacon-surgery
+ defaultText: station-beacon-surgery
- type: entity
parent: DefaultStationBeacon
suffix: Science
components:
- type: NavMapBeacon
- text: station-beacon-science
+ defaultText: station-beacon-science
color: "#D381C9"
- type: entity
suffix: Research and Development
components:
- type: NavMapBeacon
- text: station-beacon-research-and-development
+ defaultText: station-beacon-research-and-development
- type: entity
parent: DefaultStationBeaconScience
suffix: Research Server Room
components:
- type: NavMapBeacon
- text: station-beacon-research-server
+ defaultText: station-beacon-research-server
- type: entity
parent: DefaultStationBeaconScience
suffix: RD's Room
components:
- type: NavMapBeacon
- text: station-beacon-research-director
+ defaultText: station-beacon-research-director
- type: entity
parent: DefaultStationBeaconScience
suffix: Robotics
components:
- type: NavMapBeacon
- text: station-beacon-robotics
+ defaultText: station-beacon-robotics
- type: entity
parent: DefaultStationBeaconScience
suffix: Artifact Lab
components:
- type: NavMapBeacon
- text: station-beacon-artifact-lab
+ defaultText: station-beacon-artifact-lab
- type: entity
parent: DefaultStationBeaconScience
suffix: Anomaly Generator
components:
- type: NavMapBeacon
- text: station-beacon-anomaly-gen
+ defaultText: station-beacon-anomaly-gen
- type: entity
parent: DefaultStationBeacon
suffix: Supply
components:
- type: NavMapBeacon
- text: station-beacon-supply
+ defaultText: station-beacon-supply
color: "#A46106"
- type: entity
suffix: Cargo Reception
components:
- type: NavMapBeacon
- text: station-beacon-cargo
+ defaultText: station-beacon-cargo
- type: entity
parent: DefaultStationBeaconSupply
suffix: Cargo Bay
components:
- type: NavMapBeacon
- text: station-beacon-cargo-bay
+ defaultText: station-beacon-cargo-bay
- type: entity
parent: DefaultStationBeaconSupply
suffix: QM's Room
components:
- type: NavMapBeacon
- text: station-beacon-qm
+ defaultText: station-beacon-qm
- type: entity
parent: DefaultStationBeaconSupply
suffix: Salvage
components:
- type: NavMapBeacon
- text: station-beacon-salvage
+ defaultText: station-beacon-salvage
- type: entity
parent: DefaultStationBeacon
suffix: Engineering
components:
- type: NavMapBeacon
- text: station-beacon-engineering
+ defaultText: station-beacon-engineering
color: "#EFB341"
- type: entity
suffix: CE's Room
components:
- type: NavMapBeacon
- text: station-beacon-ce
+ defaultText: station-beacon-ce
- type: entity
parent: DefaultStationBeaconEngineering
suffix: AME
components:
- type: NavMapBeacon
- text: station-beacon-ame
+ defaultText: station-beacon-ame
- type: entity
parent: DefaultStationBeaconEngineering
suffix: Solars
components:
- type: NavMapBeacon
- text: station-beacon-solars
+ defaultText: station-beacon-solars
- type: entity
parent: DefaultStationBeaconEngineering
suffix: Grav Gen
components:
- type: NavMapBeacon
- text: station-beacon-gravgen
+ defaultText: station-beacon-gravgen
- type: entity
parent: DefaultStationBeaconEngineering
suffix: PA Control
components:
- type: NavMapBeacon
- text: station-beacon-pa
+ defaultText: station-beacon-pa
- type: entity
parent: DefaultStationBeaconEngineering
suffix: SMES Power Bank
components:
- type: NavMapBeacon
- text: station-beacon-smes
+ defaultText: station-beacon-smes
- type: entity
parent: DefaultStationBeaconEngineering
suffix: Telecoms
components:
- type: NavMapBeacon
- text: station-beacon-telecoms
+ defaultText: station-beacon-telecoms
- type: entity
parent: DefaultStationBeaconEngineering
suffix: Atmospherics
components:
- type: NavMapBeacon
- text: station-beacon-atmos
+ defaultText: station-beacon-atmos
- type: entity
parent: DefaultStationBeaconEngineering
suffix: TEG
components:
- type: NavMapBeacon
- text: station-beacon-teg
+ defaultText: station-beacon-teg
- type: entity
parent: DefaultStationBeaconEngineering
suffix: Tech Vault
components:
- type: NavMapBeacon
- text: station-beacon-tech-vault
+ defaultText: station-beacon-tech-vault
- type: entity
parent: DefaultStationBeacon
suffix: Service
components:
- type: NavMapBeacon
- text: station-beacon-service
+ defaultText: station-beacon-service
color: "#9FED58"
- type: entity
suffix: Kitchen
components:
- type: NavMapBeacon
- text: station-beacon-kitchen
+ defaultText: station-beacon-kitchen
- type: entity
parent: DefaultStationBeaconService
suffix: Bar
components:
- type: NavMapBeacon
- text: station-beacon-bar
+ defaultText: station-beacon-bar
- type: entity
parent: DefaultStationBeaconService
suffix: Botany
components:
- type: NavMapBeacon
- text: station-beacon-botany
+ defaultText: station-beacon-botany
- type: entity
parent: DefaultStationBeaconService
suffix: Janitor's Closet
components:
- type: NavMapBeacon
- text: station-beacon-janitor
+ defaultText: station-beacon-janitor
- type: entity
parent: DefaultStationBeacon
suffix: AI
components:
- type: NavMapBeacon
- text: station-beacon-ai
+ defaultText: station-beacon-ai
color: "#2ed2fd"
- type: entity
suffix: AI Satellite
components:
- type: NavMapBeacon
- text: station-beacon-ai-sat
+ defaultText: station-beacon-ai-sat
- type: entity
parent: DefaultStationBeaconAI
suffix: AI Core
components:
- type: NavMapBeacon
- text: station-beacon-ai-core
+ defaultText: station-beacon-ai-core
- type: entity
parent: DefaultStationBeacon
suffix: Arrivals
components:
- type: NavMapBeacon
- text: station-beacon-arrivals
+ defaultText: station-beacon-arrivals
- type: entity
parent: DefaultStationBeacon
suffix: Evac
components:
- type: NavMapBeacon
- text: station-beacon-evac
+ defaultText: station-beacon-evac
- type: entity
parent: DefaultStationBeacon
suffix: EVA Storage
components:
- type: NavMapBeacon
- text: station-beacon-eva-storage
+ defaultText: station-beacon-eva-storage
- type: entity
parent: DefaultStationBeacon
suffix: Chapel
components:
- type: NavMapBeacon
- text: station-beacon-chapel
+ defaultText: station-beacon-chapel
- type: entity
parent: DefaultStationBeacon
suffix: Library
components:
- type: NavMapBeacon
- text: station-beacon-library
+ defaultText: station-beacon-library
- type: entity
parent: DefaultStationBeacon
suffix: Theater
components:
- type: NavMapBeacon
- text: station-beacon-theater
+ defaultText: station-beacon-theater
- type: entity
parent: DefaultStationBeacon
suffix: Dorms
components:
- type: NavMapBeacon
- text: station-beacon-dorms
+ defaultText: station-beacon-dorms
- type: entity
parent: DefaultStationBeacon
suffix: Tool Room
components:
- type: NavMapBeacon
- text: station-beacon-tools
+ defaultText: station-beacon-tools
- type: entity
parent: DefaultStationBeacon
suffix: Disposals
components:
- type: NavMapBeacon
- text: station-beacon-disposals
+ defaultText: station-beacon-disposals
- type: entity
parent: DefaultStationBeacon
suffix: Cryosleep
components:
- type: NavMapBeacon
- text: station-beacon-cryosleep
+ defaultText: station-beacon-cryosleep
- type: entity
parent: DefaultStationBeacon
suffix: Escape Pod
components:
- type: NavMapBeacon
- text: station-beacon-escape-pod
+ defaultText: station-beacon-escape-pod