From cc858242c5c2d75faa09169f85ca50043dc4ea7c Mon Sep 17 00:00:00 2001 From: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com> Date: Tue, 14 Jan 2025 04:47:56 -0400 Subject: [PATCH 1/2] FTL Fixes (#1539) This does cause it to warp onto the wrong airlock (at arrivals), but that's a map issue. (Yes, I tested it) # Changelog :cl: - fix: Fixes arrivals destroying all nearby doors/walls/etc. --------- Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Co-authored-by: Gansu <68031780+GansuLalan@users.noreply.github.com> Co-authored-by: aa5g21 Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- .../Systems/ShuttleSystem.FasterThanLight.cs | 244 +++++++++++------- .../Shuttles/Systems/ShuttleSystem.cs | 2 + .../Shuttles/Components/FTLComponent.cs | 3 + .../Entities/Structures/Machines/nuke.yml | 1 + 4 files changed, 161 insertions(+), 89 deletions(-) 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/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 From 90db21ade366abd5837ecf36ab3b46b94060f64c Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 14 Jan 2025 08:48:23 +0000 Subject: [PATCH 2/2] Automatic Changelog Update (#1539) --- Resources/Changelog/Changelog.yml | 7 +++++++ 1 file changed, 7 insertions(+) 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