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