+++ /dev/null
-using Content.Shared.Store;
-using Robust.Shared.Prototypes;
-
-namespace Content.Server.Objectives.Components;
-
-/// <summary>
-/// Unlocks store listings that use <see cref="ObjectiveUnlockCondition"/>.
-/// </summary>
-[RegisterComponent]
-public sealed partial class StoreUnlockerComponent : Component
-{
- [DataField(required: true)]
- public List<ProtoId<ListingPrototype>> Listings = new();
-}
+++ /dev/null
-using Content.Server.Objectives.Components;
-using Content.Shared.Mind;
-
-namespace Content.Server.Objectives.Systems;
-
-/// <summary>
-/// Provides api for listings with <c>ObjectiveUnlockRequirement</c> to use.
-/// </summary>
-public sealed class StoreUnlockerSystem : EntitySystem
-{
- private EntityQuery<StoreUnlockerComponent> _query;
-
- public override void Initialize()
- {
- _query = GetEntityQuery<StoreUnlockerComponent>();
- }
-
- /// <summary>
- /// Returns true if a listing id is unlocked by any objectives on a mind.
- /// </summary>
- public bool IsUnlocked(MindComponent mind, string id)
- {
- foreach (var obj in mind.Objectives)
- {
- if (!_query.TryComp(obj, out var comp))
- continue;
-
- if (comp.Listings.Contains(id))
- return true;
- }
-
- return false;
- }
-}
+++ /dev/null
-using Content.Shared.Mind;
-using Content.Shared.Store;
-using Content.Server.Objectives.Systems;
-
-namespace Content.Server.Store.Conditions;
-
-/// <summary>
-/// Requires that the buyer have an objective that unlocks this listing.
-/// </summary>
-public sealed partial class ObjectiveUnlockCondition : ListingCondition
-{
- public override bool Condition(ListingConditionArgs args)
- {
- var minds = args.EntityManager.System<SharedMindSystem>();
- if (!minds.TryGetMind(args.Buyer, out _, out var mind))
- return false;
-
- var unlocker = args.EntityManager.System<StoreUnlockerSystem>();
- return unlocker.IsUnlocked(mind, args.Listing.ID);
- }
-}
[Dependency] private readonly OpenableSystem _openable = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
- private EntityQuery<ItemCabinetComponent> _cabinetQuery = default!;
- private EntityQuery<ItemSlotsComponent> _slotsQuery = default!;
-
/// <inheritdoc/>
public override void Initialize()
{
base.Initialize();
- _cabinetQuery = GetEntityQuery<ItemCabinetComponent>();
- _slotsQuery = GetEntityQuery<ItemSlotsComponent>();
-
SubscribeLocalEvent<ItemCabinetComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<ItemCabinetComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<ItemCabinetComponent, EntInsertedIntoContainerMessage>(OnContainerModified);
private void OnMapInit(Entity<ItemCabinetComponent> ent, ref MapInitEvent args)
{
// update at mapinit to avoid copy pasting locked: true and locked: false for each closed/open prototype
- SetSlotLock((ent, ent.Comp), !_openable.IsOpen(ent));
+ SetSlotLock(ent, !_openable.IsOpen(ent));
}
private void UpdateAppearance(Entity<ItemCabinetComponent> ent)
{
- _appearance.SetData(ent, ItemCabinetVisuals.ContainsItem, HasItem((ent, ent.Comp)));
+ _appearance.SetData(ent, ItemCabinetVisuals.ContainsItem, HasItem(ent));
}
private void OnContainerModified(EntityUid uid, ItemCabinetComponent component, ContainerModifiedMessage args)
private void OnOpened(Entity<ItemCabinetComponent> ent, ref OpenableOpenedEvent args)
{
- SetSlotLock((ent, ent.Comp), false);
+ SetSlotLock(ent, false);
}
private void OnClosed(Entity<ItemCabinetComponent> ent, ref OpenableClosedEvent args)
{
- SetSlotLock((ent, ent.Comp), true);
+ SetSlotLock(ent, true);
}
/// <summary>
/// Tries to get the cabinet's item slot.
/// </summary>
- public bool TryGetSlot(Entity<ItemCabinetComponent?> ent, [NotNullWhen(true)] out ItemSlot? slot)
+ public bool TryGetSlot(Entity<ItemCabinetComponent> ent, [NotNullWhen(true)] out ItemSlot? slot)
{
slot = null;
- if (!_cabinetQuery.Resolve(ent, ref ent.Comp))
- return false;
-
- if (!_slotsQuery.TryComp(ent, out var slots))
+ if (!TryComp<ItemSlotsComponent>(ent, out var slots))
return false;
return _slots.TryGetSlot(ent, ent.Comp.Slot, out slot, slots);
/// <summary>
/// Returns true if the cabinet contains an item.
/// </summary>
- public bool HasItem(Entity<ItemCabinetComponent?> ent)
+ public bool HasItem(Entity<ItemCabinetComponent> ent)
{
return TryGetSlot(ent, out var slot) && slot.HasItem;
}
/// </summary>
public void SetSlotLock(Entity<ItemCabinetComponent> ent, bool closed)
{
- if (!_slotsQuery.TryComp(ent, out var slots))
+ if (!TryComp<ItemSlotsComponent>(ent, out var slots))
return;
if (_slots.TryGetSlot(ent, ent.Comp.Slot, out var slot, slots))
+++ /dev/null
-using Robust.Shared.GameStates;
-
-namespace Content.Shared.Cabinet;
-
-/// <summary>
-/// Item cabinet that cannot be opened if it has an item inside.
-/// The only way to open it after that is to emag it.
-/// </summary>
-[RegisterComponent, NetworkedComponent]
-public sealed partial class SealingCabinetComponent : Component
-{
- /// <summary>
- /// Popup shown when trying to open the cabinet once sealed.
- /// </summary>
- [DataField(required: true)]
- public LocId SealedPopup = string.Empty;
-
- /// <summary>
- /// Set to false to disable emag unsealing.
- /// </summary>
- [DataField]
- public bool Emaggable = true;
-}
+++ /dev/null
-using Content.Shared.Emag.Systems;
-using Content.Shared.Nutrition.Components;
-using Content.Shared.Nutrition.EntitySystems;
-using Content.Shared.Popups;
-
-namespace Content.Shared.Cabinet;
-
-public sealed class SealingCabinetSystem : EntitySystem
-{
- [Dependency] private readonly ItemCabinetSystem _cabinet = default!;
- [Dependency] private readonly OpenableSystem _openable = default!;
- [Dependency] private readonly SharedPopupSystem _popup = default!;
-
- public override void Initialize()
- {
- base.Initialize();
-
- SubscribeLocalEvent<SealingCabinetComponent, OpenableOpenAttemptEvent>(OnOpenAttempt);
- SubscribeLocalEvent<SealingCabinetComponent, GotEmaggedEvent>(OnEmagged);
- }
-
- private void OnOpenAttempt(Entity<SealingCabinetComponent> ent, ref OpenableOpenAttemptEvent args)
- {
- if (!_cabinet.HasItem(ent.Owner))
- return;
-
- args.Cancelled = true;
- if (args.User is {} user)
- _popup.PopupClient(Loc.GetString(ent.Comp.SealedPopup, ("container", ent.Owner)), ent, user);
- }
-
- private void OnEmagged(Entity<SealingCabinetComponent> ent, ref GotEmaggedEvent args)
- {
- if (!ent.Comp.Emaggable)
- return;
-
- if (!_cabinet.HasItem(ent.Owner) || _openable.IsOpen(ent))
- return;
-
- _openable.SetOpen(ent, true);
-
- args.Handled = true;
- args.Repeatable = true;
- }
-}
+++ /dev/null
-nuke-core-container-whitelist-fail-popup = That doesn't fit into the container.
-nuke-core-container-sealed-popup = The {$container} is sealed shut!
objective-condition-steal-description = We need you to steal {$itemName}. Don't get caught.
objective-condition-steal-station = station
-objective-condition-steal-nuclear-bomb = nuclear bomb
objective-condition-steal-Ian = head of personnel's corgi
objective-condition-thief-description = The {$itemName} would be a great addition to my collection!
store-category-job = Job
store-category-wearables = Wearables
store-category-pointless = Pointless
-store-category-objectives = Objectives
# Revenant
store-category-abilities = Abilities
uplink-backpack-syndicate-name = Syndicate backpack
uplink-backpack-syndicate-desc = Lightweight explosion-proof а backpack for holding various traitor goods
-
-# Objectives
-uplink-core-extraction-toolbox-name = Core Extraction Toolbox
-uplink-core-extraction-toolbox-desc = A toolbox containing everything you need to remove a nuclear bomb's plutonium core. Instructions not included.
tool-quality-rolling-tool-name = Rolling Pin
tool-quality-digging-name = Digging
-tool-quality-digging-tool-name = Shovel
-
-tool-quality-fine-screwing-name = Fine Screwing
-tool-quality-fine-screwing-tool-name = Thin-Tipped Screwdriver
+tool-quality-digging-tool-name = Shovel
\ No newline at end of file
- id: ClothingHandsGlovesCombat
- id: ClothingMaskGasSyndicate
-- type: entity
- parent: ToolboxSyndicate
- id: ToolboxSyndicateFilledCoreExtraction
- suffix: Filled, Core Extraction
- components:
- - type: StorageFill
- contents:
- - id: Crowbar
- - id: Welder
- - id: Wrench
- - id: ThinTippedScrewdriver
- - id: NukeCoreContainer
-
- type: entity
id: ToolboxGoldFilled
name: golden toolbox
blacklist:
components:
- SurplusBundle
-
-# Objective-specific
-- type: listing
- id: UplinkCoreExtractionToolbox
- name: uplink-core-extraction-toolbox-name
- description: uplink-core-extraction-toolbox-desc
- icon:
- sprite: Objects/Misc/nuke_core_container.rsi
- state: closed
- productEntity: ToolboxSyndicateFilledCoreExtraction
- categories:
- - UplinkObjectives
- conditions:
- - !type:ObjectiveUnlockCondition
- - !type:ListingLimitedStockCondition
- stock: 1
- - !type:BuyerWhitelistCondition
- blacklist:
- components:
- - SurplusBundle
+++ /dev/null
-- type: entity
- parent: BaseItem
- id: PlutoniumCore
- name: plutonium core
- description: Extremely radioactive, even looking at this with the naked eye is dangerous.
- components:
- - type: Sprite
- sprite: Objects/Misc/plutonium_core.rsi
- state: icon
- - type: StealTarget
- stealGroup: PlutoniumCore
- - type: RadiationSource
- intensity: 4
- slope: 1
- - type: StaticPrice
- price: 49000
- - type: Tag
- tags:
- - PlutoniumCore
-
-- type: entity
- parent: [BaseItem, BaseItemCabinet]
- id: NukeCoreContainer
- name: nuke core container
- description: Solid container for radioactive objects.
- components:
- - type: Sprite
- sprite: Objects/Misc/nuke_core_container.rsi
- layers:
- - state: closed
- map: [ "enum.OpenableVisuals.Layer" ]
- - state: core_closed
- map: [ "enum.ItemCabinetVisuals.Layer" ]
- visible: false
- shader: unshaded
- - type: Item
- size: Normal
- shape:
- - 0,0,1,1
- - type: RadiationBlockingContainer
- resistance: 4
- - type: SealingCabinet
- sealedPopup: nuke-core-container-sealed-popup
- - type: ItemSlots
- slots:
- ItemCabinet:
- whitelist:
- tags:
- - PlutoniumCore
- whitelistFailPopup: nuke-core-container-whitelist-fail-popup
- - type: GenericVisualizer
- visuals:
- enum.OpenableVisuals.Opened:
- enum.OpenableVisuals.Layer:
- True: { state: open }
- False: { state: closed }
- enum.ItemCabinetVisuals.Layer:
- True: { state: core_open }
- False: { state: core_closed }
- enum.ItemCabinetVisuals.ContainsItem:
- enum.ItemCabinetVisuals.Layer:
- True: { visible: true }
- False: { visible: false }
+++ /dev/null
-- type: entity
- parent: Screwdriver
- id: ThinTippedScrewdriver
- description: A screwdriver with an ultra thin tip that's carefully designed to boost screwing speed.
- suffix: DO NOT MAP
- components:
- - type: Tool
- qualities:
- - Screwing
- - FineScrewing
- type: entity
- abstract: true
parent: [BaseStructure, StructureWheeled]
- id: BaseNuclearBomb
+ id: NuclearBomb
name: nuclear fission explosive
+ description: You probably shouldn't stick around to see if this is armed.
components:
- type: Transform
anchored: true
- MachineMask
layer:
- HalfWallLayer
- - type: InteractionOutline
- - type: CargoSellBlacklist
- - type: ArrivalsBlacklist
- - type: WarpPoint
- follow: true
- location: nuclear bomb
- - type: StealTarget
- stealGroup: NuclearBomb
- - type: Construction
- graph: NuclearBomb
- deconstructionTarget: disarmed
-
-- type: entity
- parent: BaseNuclearBomb
- id: NuclearBomb
- description: You probably shouldn't stick around to see if this is armed.
- components:
- type: PointLight
enabled: false
radius: 4
- NukeDisk
alertLevelOnActivate: delta
alertLevelOnDeactivate: green
+ - type: InteractionOutline
- type: ActivatableUI
key: enum.NukeUiKey.Key
- type: UserInterface
type: NukeBoundUserInterface
- type: StaticPrice
price: 50000 # YOU STOLE A NUCLEAR FISSION EXPLOSIVE?!
+ - type: CargoSellBlacklist
+ - type: ArrivalsBlacklist
- type: ItemSlots
- type: ContainerContainer
containers:
Nuke: !type:ContainerSlot
- - type: Construction
- node: nuke
+ - type: StealTarget
+ stealGroup: NuclearBomb
+ - type: WarpPoint
+ follow: true
+ location: nuclear bomb
- type: entity
parent: NuclearBomb
- type: Physics
bodyType: Dynamic
-- type: entity
- parent: BaseNuclearBomb
- id: NuclearBombDisarmed
- suffix: Disarmed
- description: "You can clearly see that this can't be armed, given its lack of nuclear material."
- components:
- - type: StaticPrice
- price: 1000 # fancy paperweight
- - type: Construction
- node: disarmed
-
- type: entity
parent: StorageTank
id: NuclearBombKeg
CMOHyposprayStealObjective: 1
CMOCrewMonitorStealObjective: 1
RDHardsuitStealObjective: 1
+ NukeDiskStealObjective: 1
MagbootsStealObjective: 1
CorgiMeatStealObjective: 1
ClipboardStealObjective: 1
CaptainJetpackStealObjective: 0.5
HandTeleporterStealObjective: 0.5
SecretDocumentsStealObjective: 0.5
- PlutoniumCoreStealObjective: 0.5
- NukeDiskStealObjective: 0.25
- type: weightedRandom
id: TraitorObjectiveGroupKill
sprite: Objects/Misc/nukedisk.rsi
state: icon
-- type: stealTargetGroup
- id: PlutoniumCore
- name: plutonium core
- sprite:
- sprite: Objects/Misc/plutonium_core.rsi
- state: icon
-
# Thief Collection
- type: stealTargetGroup
- type: StealCondition
stealGroup: NukeDisk
owner: objective-condition-steal-station
-
-# Station
-
-- type: entity
- noSpawn: true
- parent: BaseTraitorStealObjective
- id: PlutoniumCoreStealObjective
- components:
- - type: Objective
- # its hard to steal and leaves evidence, but you can get away with it.
- difficulty: 3.5
- - type: NotCommandRequirement
- - type: StealCondition
- stealGroup: PlutoniumCore
- owner: objective-condition-steal-nuclear-bomb
- - type: StoreUnlocker
- listings:
- - UplinkCoreExtractionToolbox
+++ /dev/null
-- type: constructionGraph
- id: NuclearBomb
- start: disarmed
- graph:
- - node: disarmed
- entity: NuclearBombDisarmed
- edges:
- - to: core_exposed
- steps:
- - tag: PlutoniumCore
- name: "a plutonium core"
- icon:
- sprite: Objects/Misc/plutonium_core.rsi
- state: icon
- doAfter: 1
-
- - node: core_exposed
- edges:
- - to: disarmed
- completed:
- - !type:GivePrototype
- prototype: PlutoniumCore
- steps:
- - tool: Prying
- doAfter: 2
- - to: panel_removed
- steps:
- - material: Plasteel
- amount: 8
- doAfter: 2
- - tool: Welding
- doAfter: 4
-
- - node: panel_removed
- edges:
- - to: core_exposed
- completed:
- - !type:GivePrototype
- prototype: SheetPlasteel1
- amount: 8
- steps:
- - tool: Welding
- doAfter: 6
- - tool: Anchoring
- doAfter: 2
- - tool: Welding
- doAfter: 8
- - to: panel_exposed
- steps:
- - material: Plasteel
- amount: 4
- doAfter: 2
- - tool: Welding
- doAfter: 2
-
- - node: panel_exposed
- edges:
- - to: panel_removed
- completed:
- - !type:GivePrototype
- prototype: SheetPlasteel1
- amount: 4
- steps:
- - tool: Welding
- doAfter: 2
- - tool: Prying
- doAfter: 2
- - to: nuke
- steps:
- - tool: FineScrewing
- doAfter: 2
-
- - node: nuke
- entity: NuclearBomb
- edges:
- - to: panel_exposed
- steps:
- - tool: FineScrewing
- doAfter: 2
name: store-category-pointless
priority: 10
-- type: storeCategory
- id: UplinkObjectives
- name: store-category-objectives
- priority: 11
-
#revenant
- type: storeCategory
id: RevenantAbilities
- UplinkWearables
- UplinkJob
- UplinkPointless
- - UplinkObjectives
currencyWhitelist:
- Telecrystal
balance:
- type: Tag
id: PlushieSharkPink
-- type: Tag
- id: PlutoniumCore
-
- type: Tag
id: Potato
toolName: tool-quality-rolling-tool-name
spawn: RollingPin
icon: { sprite: Objects/Tools/rolling_pin.rsi, state: icon }
-
-# do not give this to normal tools, its for nuke deconstruction
-- type: tool
- id: FineScrewing
- name: tool-quality-fine-screwing
- toolName: tool-quality-fine-screwing-tool-name
- spawn: ThinTippedScrewdriver
- icon: { sprite: Objects/Tools/screwdriver.rsi, state: screwdriver-map }
+++ /dev/null
-{
- "version": 1,
- "license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/blob/c34d56a45b0461f5e0fad3cc75e81580c3357119/icons/obj/antags/syndicate_tools.dmi",
- "size": {
- "x": 32,
- "y": 32
- },
- "states": [
- {
- "name": "open"
- },
- {
- "name": "closed"
- },
- {
- "name": "core_open",
- "delays": [
- [
- 2.3,
- 0.3,
- 0.3,
- 0.3
- ]
- ]
- },
- {
- "name": "core_closed",
- "delays": [
- [
- 2.3,
- 0.3,
- 0.3,
- 0.3
- ]
- ]
- },
- {
- "name": "inhand-left",
- "directions": 4
- },
- {
- "name": "inhand-right",
- "directions": 4
- }
- ]
-}
+++ /dev/null
-{
- "version": 1,
- "license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/blob/c34d56a45b0461f5e0fad3cc75e81580c3357119/icons/obj/antags/syndicate_tools.dmi",
- "size": {
- "x": 32,
- "y": 32
- },
- "states": [
- {
- "name": "icon",
- "delays": [
- [
- 2,
- 0.3,
- 0.3,
- 0.3,
- 0.3
- ]
- ]
- }
- ]
-}