diff --git a/Content.Server/Cargo/Components/CargoSellBlacklistComponent.cs b/Content.Server/Cargo/Components/CargoSellBlacklistComponent.cs
new file mode 100644
index 0000000000..757c86890e
--- /dev/null
+++ b/Content.Server/Cargo/Components/CargoSellBlacklistComponent.cs
@@ -0,0 +1,9 @@
+namespace Content.Server.Cargo.Components;
+
+///
+/// Marks an entity as unable to be sold through the cargo shuttle.
+///
+[RegisterComponent]
+public sealed class CargoSellBlacklistComponent : Component
+{
+}
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
index 9e81aa5c9f..195cc4f342 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
@@ -317,10 +317,15 @@ public sealed partial class CargoSystem
// Don't re-sell anything, sell anything anchored (e.g. light fixtures), or anything blacklisted
// (e.g. players).
if (toSell.Contains(ent) ||
- (xformQuery.TryGetComponent(ent, out var xform) && xform.Anchored)) continue;
+ (xformQuery.TryGetComponent(ent, out var xform) && xform.Anchored))
+ continue;
+
+ if (HasComp(ent))
+ continue;
var price = _pricing.GetPrice(ent);
- if (price == 0) continue;
+ if (price == 0)
+ continue;
toSell.Add(ent);
amount += price;
}
diff --git a/Content.Server/Nuke/NukeSystem.cs b/Content.Server/Nuke/NukeSystem.cs
index 4519605aa2..df0b3d1b7a 100644
--- a/Content.Server/Nuke/NukeSystem.cs
+++ b/Content.Server/Nuke/NukeSystem.cs
@@ -140,6 +140,13 @@ namespace Content.Server.Nuke
private void OnAnchorChanged(EntityUid uid, NukeComponent component, ref AnchorStateChangedEvent args)
{
UpdateUserInterface(uid, component);
+
+ if (args.Anchored == false && component.Status == NukeStatus.ARMED && component.RemainingTime > component.DisarmDoafterLength)
+ {
+ // yes, this means technically if you can find a way to unanchor the nuke, you can disarm it
+ // without the doafter. but that takes some effort, and it won't allow you to disarm a nuke that can't be disarmed by the doafter.
+ DisarmBomb(uid, component);
+ }
}
#endregion
diff --git a/Resources/Prototypes/Entities/Objects/Devices/nuke.yml b/Resources/Prototypes/Entities/Objects/Devices/nuke.yml
index 169bdc0c02..c1a04d0599 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/nuke.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/nuke.yml
@@ -1,5 +1,5 @@
- type: entity
- parent: BaseStructureDynamic
+ parent: BaseStructure
id: NuclearBomb
name: nuclear fission explosive
description: You probably shouldn't stick around to see if this is armed.
@@ -45,8 +45,9 @@
interfaces:
- key: enum.NukeUiKey.Key
type: NukeBoundUserInterface
- - type: StaticPrice # TODO: Make absolutely certain cargo cannot sell this, that'd be horrible. Presumably, add an export ban component so only the yarrs get a deal here.
+ - type: StaticPrice
price: 50000 # YOU STOLE A NUCLEAR FISSION EXPLOSIVE?!
+ - type: CargoSellBlacklist
- type: entity
parent: NuclearBomb
diff --git a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml
index ad2e5c28d6..4dde01f7cf 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml
@@ -11,6 +11,7 @@
state: icon
- type: StaticPrice
price: 2000
+ - type: CargoSellBlacklist
- type: WarpPoint
location: nuke disk