diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs
index 83a2ec385bf..dfeb8aaa3ef 100644
--- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs
@@ -25,6 +25,7 @@
using Robust.Shared.Map.Components;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
+using Robust.Shared.Player;
using Robust.Shared.Utility;
using FTLMapComponent = Content.Shared.Shuttles.Components.FTLMapComponent;
@@ -66,7 +67,7 @@ public sealed partial class ShuttleSystem
///
/// How many times we try to proximity warp close to something before falling back to map-wideAABB.
///
- private const int FTLProximityIterations = 3;
+ private const int FTLProximityIterations = 5;
private readonly HashSet _lookupEnts = new();
private readonly HashSet _immuneEnts = new();
@@ -117,7 +118,7 @@ private void OnStationPostInit(ref StationPostInitEvent ev)
continue;
}
- TryAddFTLDestination(gridXform.MapID, true, out _);
+ TryAddFTLDestination(gridXform.MapID, true, false, false, out _);
}
}
@@ -133,13 +134,12 @@ private EntityUid EnsureFTLMap()
return uid;
}
- var mapId = _mapManager.CreateMap();
- var mapUid = _mapManager.GetMapEntityId(mapId);
+ var mapUid = _mapSystem.CreateMap(out var mapId);
var ftlMap = AddComp(mapUid);
_metadata.SetEntityName(mapUid, "FTL");
Log.Debug($"Setup hyperspace map at {mapUid}");
- DebugTools.Assert(!_mapManager.IsMapPaused(mapId));
+ DebugTools.Assert(!_mapSystem.IsPaused(mapId));
var parallax = EnsureComp(mapUid);
parallax.Parallax = ftlMap.Parallax;
@@ -187,7 +187,12 @@ public void SetFTLWhitelist(Entity entity, EntityWhite
///
public bool TryAddFTLDestination(MapId mapId, bool enabled, [NotNullWhen(true)] out FTLDestinationComponent? component)
{
- var mapUid = _mapManager.GetMapEntityId(mapId);
+ return TryAddFTLDestination(mapId, enabled, true, false, out component);
+ }
+
+ public bool TryAddFTLDestination(MapId mapId, bool enabled, bool requireDisk, bool beaconsOnly, [NotNullWhen(true)] out FTLDestinationComponent? component)
+ {
+ var mapUid = _mapSystem.GetMapOrInvalid(mapId);
component = null;
if (!Exists(mapUid))
@@ -195,10 +200,13 @@ public bool TryAddFTLDestination(MapId mapId, bool enabled, [NotNullWhen(true)]
component = EnsureComp(mapUid);
- if (component.Enabled == enabled)
+ if (component.Enabled == enabled && component.RequireCoordinateDisk == requireDisk && component.BeaconsOnly == beaconsOnly)
return true;
component.Enabled = enabled;
+ component.RequireCoordinateDisk = requireDisk;
+ component.BeaconsOnly = beaconsOnly;
+
_console.RefreshShuttleConsoles();
Dirty(mapUid, component);
return true;
@@ -284,8 +292,8 @@ public void FTLToCoordinates(
_console.RefreshShuttleConsoles(shuttleUid);
- var mapId = coordinates.GetMapId(EntityManager);
- var mapUid = _mapManager.GetMapEntityId(mapId);
+ var mapId = _transform.GetMapId(coordinates);
+ var mapUid = _mapSystem.GetMap(mapId);
var ev = new FTLRequestEvent(mapUid);
RaiseLocalEvent(shuttleUid, ref ev, true);
}
@@ -324,7 +332,7 @@ public void FTLToDock(
hyperspace.TargetCoordinates = config.Coordinates;
hyperspace.TargetAngle = config.Angle;
}
- else if (TryGetFTLProximity(shuttleUid, target, out var coords, out var targAngle))
+ else if (TryGetFTLProximity(shuttleUid, new EntityCoordinates(target, Vector2.Zero), out var coords, out var targAngle))
{
hyperspace.TargetCoordinates = coords;
hyperspace.TargetAngle = targAngle;
@@ -355,16 +363,8 @@ private bool TrySetupFTL(EntityUid uid, ShuttleComponent shuttle, [NotNullWhen(t
component = AddComp(uid);
component.State = FTLState.Starting;
var audio = _audio.PlayPvs(_startupSound, uid);
-
- if (audio == null)
- return false;
-
- audio!.Value.Component.Flags |= AudioFlags.GridAudio;
-
- if (_physicsQuery.TryGetComponent(uid, out var gridPhysics))
- {
- _transform.SetLocalPosition(audio.Value.Entity, gridPhysics.LocalCenter);
- }
+ _audio.SetGridAudio(audio);
+ component.StartupStream = audio?.Entity;
// TODO: Play previs here for docking arrival.
@@ -388,10 +388,23 @@ private void UpdateFTLStarting(Entity entity)
var fromMatrix = _transform.GetWorldMatrix(xform);
var fromRotation = _transform.GetWorldRotation(xform);
- var width = Comp(uid).LocalAABB.Width;
+ var grid = Comp(uid);
+ var width = grid.LocalAABB.Width;
var ftlMap = EnsureFTLMap();
var body = _physicsQuery.GetComponent(entity);
- var shuttleCenter = body.LocalCenter;
+ var shuttleCenter = grid.LocalAABB.Center;
+
+ // Leave audio at the old spot
+ // Just so we don't clip
+ if (fromMapUid != null && TryComp(comp.StartupStream, out AudioComponent? startupAudio))
+ {
+ var clippedAudio = _audio.PlayStatic(_startupSound, Filter.Broadcast(),
+ new EntityCoordinates(fromMapUid.Value, _mapSystem.GetGridPosition(entity.Owner)), true, startupAudio.Params);
+
+ _audio.SetPlaybackPosition(clippedAudio, entity.Comp1.StartupTime);
+ if (clippedAudio != null)
+ clippedAudio.Value.Component.Flags |= AudioFlags.NoOcclusion;
+ }
// Offset the start by buffer range just to avoid overlap.
var ftlStart = new EntityCoordinates(ftlMap, new Vector2(_index + width / 2f, 0f) - shuttleCenter);
@@ -423,15 +436,7 @@ private void UpdateFTLStarting(Entity entity)
// Audio
var wowdio = _audio.PlayPvs(comp.TravelSound, uid);
comp.TravelStream = wowdio?.Entity;
- if (wowdio?.Component != null)
- {
- wowdio.Value.Component.Flags |= AudioFlags.GridAudio;
-
- if (_physicsQuery.TryGetComponent(uid, out var gridPhysics))
- {
- _transform.SetLocalPosition(wowdio.Value.Entity, gridPhysics.LocalCenter);
- }
- }
+ _audio.SetGridAudio(wowdio);
}
///
@@ -492,7 +497,7 @@ private void UpdateFTLArriving(Entity entity)
var map = maps.Min(o => o.GetHashCode());
mapId = new MapId(map);
- TryFTLProximity(uid, _mapManager.GetMapEntityId(mapId));
+ TryFTLProximity(uid, _mapSystem.GetMap(mapId));
}
// Docking FTL
else if (HasComp(target.EntityId) &&
@@ -516,7 +521,8 @@ private void UpdateFTLArriving(Entity entity)
// Position ftl
else
{
- mapId = target.GetMapId(EntityManager);
+ // TODO: This should now use tryftlproximity
+ mapId = _transform.GetMapId(target);
_transform.SetCoordinates(uid, xform, target, rotation: entity.Comp1.TargetAngle);
}
@@ -541,17 +547,7 @@ private void UpdateFTLArriving(Entity entity)
comp.TravelStream = _audio.Stop(comp.TravelStream);
var audio = _audio.PlayPvs(_arrivalSound, uid);
-
- if (audio == null)
- return;
-
- audio!.Value.Component.Flags |= AudioFlags.GridAudio;
- // TODO: Shitcode til engine fix
-
- if (_physicsQuery.TryGetComponent(uid, out var gridPhysics))
- {
- _transform.SetLocalPosition(audio.Value.Entity, gridPhysics.LocalCenter);
- }
+ _audio.SetGridAudio(audio);
if (TryComp(uid, out var dest))
{
@@ -564,7 +560,7 @@ private void UpdateFTLArriving(Entity entity)
_mapManager.SetMapPaused(mapId, false);
Smimsh(uid, xform: xform);
- var ftlEvent = new FTLCompletedEvent(uid, _mapManager.GetMapEntityId(mapId));
+ var ftlEvent = new FTLCompletedEvent(uid, _mapSystem.GetMap(mapId));
RaiseLocalEvent(uid, ref ftlEvent, true);
}
@@ -640,7 +636,7 @@ private void DoTheDinosaur(TransformComponent xform)
// If the guy we knocked down is on a spaced tile, throw them too
if (grid != null)
- TossIfSpaced(grid, shuttleBody, child);
+ TossIfSpaced((xform.GridUid.Value, grid, shuttleBody), child);
}
}
}
@@ -688,13 +684,15 @@ private void KnockOverKids(TransformComponent xform, ref ValueList to
///
/// Throws people who are standing on a spaced tile, tries to throw them towards a neighbouring space tile
///
- private void TossIfSpaced(MapGridComponent shuttleGrid, PhysicsComponent shuttleBody, EntityUid tossed)
+ private void TossIfSpaced(Entity shuttleEntity, EntityUid tossed)
{
- if (!_xformQuery.TryGetComponent(tossed, out var childXform) )
+ var shuttleGrid = shuttleEntity.Comp1;
+ var shuttleBody = shuttleEntity.Comp2;
+ if (!_xformQuery.TryGetComponent(tossed, out var childXform))
return;
// only toss if its on lattice/space
- var tile = shuttleGrid.GetTileRef(childXform.Coordinates);
+ var tile = _mapSystem.GetTileRef(shuttleEntity, shuttleGrid, childXform.Coordinates);
if (!tile.IsSpace(_tileDefManager))
return;
@@ -711,8 +709,28 @@ private void TossIfSpaced(MapGridComponent shuttleGrid, PhysicsComponent shuttle
/// Tries to dock with the target grid, otherwise falls back to proximity.
/// This bypasses FTL travel time.
///
- public bool TryFTLDock(EntityUid shuttleUid, ShuttleComponent component, EntityUid targetUid, string? priorityTag = null)
+ public bool TryFTLDock(
+ EntityUid shuttleUid,
+ ShuttleComponent component,
+ EntityUid targetUid,
+ string? priorityTag = null)
+ {
+ return TryFTLDock(shuttleUid, component, targetUid, out _, priorityTag);
+ }
+
+ ///
+ /// Tries to dock with the target grid, otherwise falls back to proximity.
+ /// This bypasses FTL travel time.
+ ///
+ public bool TryFTLDock(
+ EntityUid shuttleUid,
+ ShuttleComponent component,
+ EntityUid targetUid,
+ [NotNullWhen(true)] out DockingConfig? config,
+ string? priorityTag = null)
{
+ config = null;
+
if (!_xformQuery.TryGetComponent(shuttleUid, out var shuttleXform) ||
!_xformQuery.TryGetComponent(targetUid, out var targetXform) ||
targetXform.MapUid == null ||
@@ -721,7 +739,7 @@ public bool TryFTLDock(EntityUid shuttleUid, ShuttleComponent component, EntityU
return false;
}
- var config = _dockSystem.GetDockingConfig(shuttleUid, targetUid, priorityTag);
+ config = _dockSystem.GetDockingConfig(shuttleUid, targetUid, priorityTag);
if (config != null)
{
@@ -740,7 +758,7 @@ public void FTLDock(Entity shuttle, DockingConfig config)
{
// Set position
var mapCoordinates = _transform.ToMapCoordinates(config.Coordinates);
- var mapUid = _mapManager.GetMapEntityId(mapCoordinates.MapId);
+ var mapUid = _mapSystem.GetMap(mapCoordinates.MapId);
_transform.SetCoordinates(shuttle.Owner, shuttle.Comp, new EntityCoordinates(mapUid, mapCoordinates.Position), rotation: config.Angle);
// Connect everything
@@ -751,16 +769,23 @@ public void FTLDock(Entity shuttle, DockingConfig config)
}
///
- /// Tries to get the target position to FTL near to another grid.
+ /// Tries to get the target position to FTL near the target coordinates.
+ /// If the target coordinates have a mapgrid then will try to offset the AABB.
///
- private bool TryGetFTLProximity(EntityUid shuttleUid, EntityUid targetUid,
+ /// Min offset for the final FTL.
+ /// Max offset for the final FTL from the box we spawn.
+ private bool TryGetFTLProximity(
+ EntityUid shuttleUid,
+ EntityCoordinates targetCoordinates,
out EntityCoordinates coordinates, out Angle angle,
+ float minOffset = 0f, float maxOffset = 64f,
TransformComponent? xform = null, TransformComponent? targetXform = null)
{
+ DebugTools.Assert(minOffset < maxOffset);
coordinates = EntityCoordinates.Invalid;
angle = Angle.Zero;
- if (!Resolve(targetUid, ref targetXform) ||
+ if (!Resolve(targetCoordinates.EntityId, ref targetXform) ||
targetXform.MapUid == null ||
!targetXform.MapUid.Value.IsValid() ||
!Resolve(shuttleUid, ref xform))
@@ -768,26 +793,24 @@ private bool TryGetFTLProximity(EntityUid shuttleUid, EntityUid targetUid,
return false;
}
-
- var xformQuery = GetEntityQuery();
- var shuttleAABB = Comp(shuttleUid).LocalAABB;
- Box2 targetLocalAABB;
-
- // Spawn nearby.
// We essentially expand the Box2 of the target area until nothing else is added then we know it's valid.
// Can't just get an AABB of every grid as we may spawn very far away.
- if (TryComp(targetXform.GridUid, out var targetGrid))
- {
- targetLocalAABB = targetGrid.LocalAABB;
- }
- else
- {
- targetLocalAABB = new Box2();
- }
-
- var targetAABB = _transform.GetWorldMatrix(targetXform, xformQuery)
- .TransformBox(targetLocalAABB).Enlarged(shuttleAABB.Size.Length());
var nearbyGrids = new HashSet();
+ var shuttleAABB = Comp(shuttleUid).LocalAABB;
+
+ // Start with small point.
+ // If our target pos is offset we mot even intersect our target's AABB so we don't include it.
+ var targetLocalAABB = Box2.CenteredAround(targetCoordinates.Position, Vector2.One);
+
+ // How much we expand the target AABB be.
+ // We half it because we only need the width / height in each direction if it's placed at a particular spot.
+ var expansionAmount = MathF.Max(shuttleAABB.Width / 2f, shuttleAABB.Height / 2f);
+
+ // Expand the starter AABB so we have something to query to start with.
+ var targetAABB = _transform.GetWorldMatrix(targetXform)
+ .TransformBox(targetLocalAABB)
+ .Enlarged(expansionAmount);
+
var iteration = 0;
var lastCount = nearbyGrids.Count;
var mapId = targetXform.MapID;
@@ -796,15 +819,21 @@ private bool TryGetFTLProximity(EntityUid shuttleUid, EntityUid targetUid,
while (iteration < FTLProximityIterations)
{
grids.Clear();
- _mapManager.FindGridsIntersecting(mapId, targetAABB, ref grids);
+ // We pass in an expanded offset here so we can safely do a random offset later.
+ // We don't include this in the actual targetAABB because then we would be double-expanding it.
+ // Once in this loop, then again when placing the shuttle later.
+ // Note that targetAABB already has expansionAmount factored in already.
+ _mapManager.FindGridsIntersecting(mapId, targetAABB.Enlarged(maxOffset), ref grids);
foreach (var grid in grids)
{
if (!nearbyGrids.Add(grid))
continue;
- targetAABB = targetAABB.Union(_transform.GetWorldMatrix(grid, xformQuery)
- .TransformBox(Comp(grid).LocalAABB));
+ // Include the other grid's AABB (expanded by ours) as well.
+ targetAABB = targetAABB.Union(
+ _transform.GetWorldMatrix(grid)
+ .TransformBox(Comp(grid).LocalAABB.Enlarged(expansionAmount)));
}
// Can do proximity
@@ -813,7 +842,6 @@ private bool TryGetFTLProximity(EntityUid shuttleUid, EntityUid targetUid,
break;
}
- targetAABB = targetAABB.Enlarged(shuttleAABB.Size.Length() / 2f);
iteration++;
lastCount = nearbyGrids.Count;
@@ -828,13 +856,15 @@ private bool TryGetFTLProximity(EntityUid shuttleUid, EntityUid targetUid,
if (nearbyGrids.Contains(uid))
continue;
- targetAABB = targetAABB.Union(_transform.GetWorldMatrix(uid, xformQuery)
- .TransformBox(Comp(uid).LocalAABB));
+ targetAABB = targetAABB.Union(
+ _transform.GetWorldMatrix(uid)
+ .TransformBox(Comp(uid).LocalAABB.Enlarged(expansionAmount)));
}
break;
}
+ // Now we have a targetAABB. This has already been expanded to account for our fat ass.
Vector2 spawnPos;
if (TryComp(shuttleUid, out var shuttleBody))
@@ -843,21 +873,32 @@ private bool TryGetFTLProximity(EntityUid shuttleUid, EntityUid targetUid,
_physics.SetAngularVelocity(shuttleUid, 0f, body: shuttleBody);
}
+ // TODO: This should prefer the position's angle instead.
// TODO: This is pretty crude for multiple landings.
if (nearbyGrids.Count > 1 || !HasComp(targetXform.GridUid))
{
- var minRadius = (MathF.Max(targetAABB.Width, targetAABB.Height) + MathF.Max(shuttleAABB.Width, shuttleAABB.Height)) / 2f;
- spawnPos = targetAABB.Center + _random.NextVector2(minRadius, minRadius + 64f);
+ // Pick a random angle
+ var offsetAngle = _random.NextAngle();
+
+ // Our valid spawn positions are away.
+ var minRadius = MathF.Max(targetAABB.Width / 2f, targetAABB.Height / 2f);
+ spawnPos = targetAABB.Center + offsetAngle.RotateVec(new Vector2(_random.NextFloat(minRadius + minOffset, minRadius + maxOffset), 0f));
}
else if (shuttleBody != null)
{
- var (targetPos, targetRot) = _transform.GetWorldPositionRotation(targetXform, xformQuery);
- var transform = new Transform(targetPos, targetRot);
- spawnPos = Robust.Shared.Physics.Transform.Mul(transform, -shuttleBody.LocalCenter);
+ (spawnPos, angle) = _transform.GetWorldPositionRotation(targetXform);
}
else
{
- spawnPos = _transform.GetWorldPosition(targetXform, xformQuery);
+ spawnPos = _transform.GetWorldPosition(targetXform);
+ }
+
+ var offset = Vector2.Zero;
+
+ // Offset it because transform does not correspond to AABB position.
+ if (TryComp(shuttleUid, out MapGridComponent? shuttleGrid))
+ {
+ offset = -shuttleGrid.LocalAABB.Center;
}
if (!HasComp(targetXform.GridUid))
@@ -869,7 +910,11 @@ private bool TryGetFTLProximity(EntityUid shuttleUid, EntityUid targetUid,
angle = Angle.Zero;
}
- coordinates = new EntityCoordinates(targetXform.MapUid.Value, spawnPos);
+ // Rotate our localcenter around so we spawn exactly where we "think" we should (center of grid on the dot).
+ var transform = new Transform(spawnPos, angle);
+ spawnPos = Robust.Shared.Physics.Transform.Mul(transform, offset);
+
+ coordinates = new EntityCoordinates(targetXform.MapUid.Value, spawnPos - offset);
return true;
}
@@ -886,13 +931,31 @@ public bool TryFTLProximity(EntityUid shuttleUid, EntityUid targetUid, Transform
return false;
}
- if (!TryGetFTLProximity(shuttleUid, targetUid, out var coords, out var angle, xform, targetXform))
+ if (!TryGetFTLProximity(shuttleUid, new EntityCoordinates(targetUid, Vector2.Zero), out var coords, out var angle, xform: xform, targetXform: targetXform))
return false;
_transform.SetCoordinates(shuttleUid, xform, coords, rotation: angle);
return true;
}
+ ///
+ /// Tries to FTL to the target coordinates; will move nearby if not possible.
+ ///
+ public bool TryFTLProximity(Entity shuttle, EntityCoordinates targetCoordinates)
+ {
+ if (!Resolve(shuttle.Owner, ref shuttle.Comp) ||
+ _transform.GetMap(targetCoordinates)?.IsValid() != true)
+ {
+ return false;
+ }
+
+ if (!TryGetFTLProximity(shuttle, targetCoordinates, out var coords, out var angle))
+ return false;
+
+ _transform.SetCoordinates(shuttle, shuttle.Comp, coords, rotation: angle);
+ return true;
+ }
+
///
/// Flattens / deletes everything under the grid upon FTL.
///
@@ -901,8 +964,11 @@ private void Smimsh(EntityUid uid, FixturesComponent? manager = null, MapGridCom
if (!Resolve(uid, ref manager, ref grid, ref xform) || xform.MapUid == null)
return;
+ if (!TryComp(xform.MapUid, out BroadphaseComponent? lookup))
+ return;
+
// Flatten anything not parented to a grid.
- var transform = _physics.GetPhysicsTransform(uid, xform);
+ var transform = _physics.GetRelativePhysicsTransform((uid, xform), xform.MapUid.Value);
var aabbs = new List(manager.Fixtures.Count);
var tileSet = new List<(Vector2i, Tile)>();
@@ -914,7 +980,6 @@ private void Smimsh(EntityUid uid, FixturesComponent? manager = null, MapGridCom
var aabb = fixture.Shape.ComputeAABB(transform, 0);
// Shift it slightly
- aabb = aabb.Translated(-grid.TileSizeHalfVector);
// Create a small border around it.
aabb = aabb.Enlarged(0.2f);
aabbs.Add(aabb);
@@ -925,7 +990,7 @@ private void Smimsh(EntityUid uid, FixturesComponent? manager = null, MapGridCom
_lookupEnts.Clear();
_immuneEnts.Clear();
// TODO: Ideally we'd query first BEFORE moving grid but needs adjustments above.
- _lookup.GetEntitiesIntersecting(xform.MapID, fixture.Shape, transform, _lookupEnts, LookupFlags.Uncontained);
+ _lookup.GetLocalEntitiesIntersecting(xform.MapUid.Value, fixture.Shape, transform, _lookupEnts, flags: LookupFlags.Uncontained, lookup: lookup);
foreach (var ent in _lookupEnts)
{
@@ -940,6 +1005,7 @@ private void Smimsh(EntityUid uid, FixturesComponent? manager = null, MapGridCom
continue;
}
+ // If it has the FTLSmashImmuneComponent ignore it.
if (_immuneQuery.HasComponent(ent))
{
continue;
diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.cs
index 95f0bf93d43..6a630bfcdb6 100644
--- a/Content.Server/Shuttles/Systems/ShuttleSystem.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleSystem.cs
@@ -43,6 +43,7 @@ public sealed partial class ShuttleSystem : SharedShuttleSystem
[Dependency] private readonly MetaDataSystem _metadata = default!;
[Dependency] private readonly PvsOverrideSystem _pvs = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly SharedMapSystem _maps = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly ShuttleConsoleSystem _console = default!;
@@ -52,6 +53,7 @@ public sealed partial class ShuttleSystem : SharedShuttleSystem
[Dependency] private readonly ThrusterSystem _thruster = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly IAdminLogManager _logger = default!;
+ [Dependency] private readonly SharedMapSystem _mapSystem = default!;
public const float TileMassMultiplier = 0.5f;
diff --git a/Content.Shared/Shuttles/Components/FTLComponent.cs b/Content.Shared/Shuttles/Components/FTLComponent.cs
index 9acca7c1d45..6b236d3dcf0 100644
--- a/Content.Shared/Shuttles/Components/FTLComponent.cs
+++ b/Content.Shared/Shuttles/Components/FTLComponent.cs
@@ -56,6 +56,9 @@ public sealed partial class FTLComponent : Component
Params = AudioParams.Default.WithVolume(-3f).WithLoop(true)
};
+ [DataField]
+ public EntityUid? StartupStream;
+
[DataField]
public EntityUid? TravelStream;
}
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index ba552f77e97..23647f6721d 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -9862,3 +9862,10 @@ Entries:
id: 6689
time: '2025-01-14T06:08:50.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1525
+- author: sleepyyapril
+ changes:
+ - type: Fix
+ message: Fixes arrivals destroying all nearby doors/walls/etc.
+ id: 6690
+ time: '2025-01-14T08:47:56.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/1539
diff --git a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml
index bc4581d7b65..c6c0029c45d 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml
@@ -103,6 +103,7 @@
- type: WarpPoint
follow: true
location: nuclear bomb
+ - type: FTLSmashImmune
- type: entity
parent: NuclearBomb