public List<int> SelectedSets = new();
[DataField]
- public SoundSpecifier ApproveSound = new SoundPathSpecifier("/Audio/Effects/rustle1.ogg");
+ public SoundCollectionSpecifier ApproveSound = new SoundCollectionSpecifier("storageRustle");
/// <summary>
/// Max number of sets you can select.
/// </summary>
[DataField]
public int MaxSelectedSets = 2;
+
+ /// <summary>
+ /// What entity all the spawned items will appear inside of
+ /// If null, will instead drop on the ground.
+ /// </summary>
+ [DataField]
+ public EntProtoId? SpawnedStoragePrototype;
}
using Content.Server.Thief.Components;
+using Content.Shared.Hands.EntitySystems;
using Content.Shared.Item;
+using Content.Shared.Storage.EntitySystems;
using Content.Shared.Thief;
using Robust.Server.GameObjects;
using Robust.Server.Audio;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
+ [Dependency] private readonly SharedStorageSystem _storage = default!;
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
public override void Initialize()
{
if (backpack.Comp.SelectedSets.Count != backpack.Comp.MaxSelectedSets)
return;
+ EntityUid? spawnedStorage = null;
+ if (backpack.Comp.SpawnedStoragePrototype != null)
+ spawnedStorage = Spawn(backpack.Comp.SpawnedStoragePrototype, _transform.GetMapCoordinates(backpack.Owner));
+
foreach (var i in backpack.Comp.SelectedSets)
{
var set = _proto.Index(backpack.Comp.PossibleSets[i]);
{
var ent = Spawn(item, _transform.GetMapCoordinates(backpack.Owner));
if (TryComp<ItemComponent>(ent, out var itemComponent))
- _transform.DropNextTo(ent, backpack.Owner);
+ {
+ if (spawnedStorage != null)
+ _storage.Insert(spawnedStorage.Value, ent, out _, playSound: false);
+ else
+ _transform.DropNextTo(ent, backpack.Owner);
+ }
}
}
- _audio.PlayPvs(backpack.Comp.ApproveSound, backpack.Owner);
+
+ if (spawnedStorage != null)
+ _hands.TryPickupAnyHand(args.Actor, spawnedStorage.Value);
+
+ // Play the sound on coordinates of the backpack/toolbox. The reason being, since we immediately delete it, the sound gets deleted alongside it.
+ _audio.PlayPvs(backpack.Comp.ApproveSound, Transform(backpack.Owner).Coordinates);
QueueDel(backpack);
}
private void OnChangeSet(Entity<ThiefUndeterminedBackpackComponent> backpack, ref ThiefBackpackChangeSetMessage args)
Steal things that you like.
thief-role-greeting-equipment =
- You have a toolbox of thieves'
+ You have a satchel of thieves'
tools and chameleon thieves' gloves.
Choose your starting equipment,
and do your work stealthily.
-thief-backpack-window-title = thief toolbox
+thief-backpack-window-title = thieving kit
thief-backpack-window-description =
Inside are your tools of the trade, which will dissolve when you're ready.
sprite: /Textures/Clothing/OuterClothing/Misc/black_hoodie.rsi
state: icon
content:
- - ChameleonPDA
- - ClothingUniformJumpsuitChameleon
- - ClothingOuterChameleon
- - ClothingNeckChameleon
- - ClothingMaskGasChameleon
- - ClothingHeadHatChameleon
- - ClothingEyesChameleon
- - ClothingHeadsetChameleon
- - ClothingShoesChameleon
- - BarberScissors
+ - ClothingBackpackChameleonFill
- ChameleonProjector
- FakeMindShieldImplanter
- AgentIDCard
id: ClothingBackpackSatchelSmuggler
name: smuggler's satchel
suffix: Empty
- description: A dingy, suspicious looking satchel.
+ description: A handy, suspicious looking satchel. Just flat enough to fit underneath floor tiles.
components:
- type: Sprite
sprite: Clothing/Back/Satchels/smuggler.rsi
id: ClothingBackpackSatchelSmugglerUnanchored
name: smuggler's satchel
suffix: Empty, Unanchored
- description: A dingy, suspicious looking satchel.
+ description: A handy, suspicious looking satchel. Just flat enough to fit underneath floor tiles.
components:
- type: Sprite
sprite: Clothing/Back/Satchels/smuggler.rsi
--- /dev/null
+- type: entity
+ parent: BaseMinorContraband
+ id: ThiefBeacon
+ name: thieving beacon
+ description: A device that will teleport everything around it to the thief's vault at the end of the shift.
+ components:
+ - type: ThiefBeacon
+ - type: StealArea
+ range: 2 # Slightly larger than fulton beacon's random offset
+ - type: Item
+ size: Normal
+ - type: Physics
+ bodyType: Dynamic
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeAabb
+ bounds: "-0.25,-0.4,0.25,0.1"
+ density: 20
+ mask:
+ - Impassable
+ - type: Foldable
+ folded: true
+ - type: Clickable
+ - type: InteractionOutline
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.FoldedVisuals.State:
+ foldedLayer:
+ True: { state: folded_extraction }
+ False: { state: extraction_point }
+ - type: Sprite
+ sprite: Objects/Tools/thief_beacon.rsi
+ drawdepth: SmallObjects
+ noRot: true
+ layers:
+ - state: extraction_point
+ map: [ "foldedLayer" ]
+
+- type: entity
+ id: ToolboxThief
+ name: undetermined thieving toolbox
+ description: This is where your favorite thief's supplies lie. Try to remember which ones.
+ parent: [ BaseItem, BaseMinorContraband ]
+ components:
+ - type: Sprite
+ sprite: Objects/Tools/Toolboxes/toolbox_thief.rsi
+ state: icon
+ - type: ThiefUndeterminedBackpack
+ possibleSets:
+ # TODO Thief pinpointer needed
+ - ChemistrySet
+ - ToolsSet
+ - ChameleonSet # TODO Chameleon stump PR needed
+ - SyndieSet
+ - SleeperSet
+ - CommunicatorSet
+ - SmugglerSet
+ - type: ActivatableUI
+ key: enum.ThiefBackpackUIKey.Key
+ - type: UserInterface
+ interfaces:
+ enum.ThiefBackpackUIKey.Key:
+ type: ThiefBackpackBoundUserInterface
+
+- type: entity
+ id: SatchelThief
+ name: undetermined thieving satchel
+ description: This is where your favorite thief's supplies lie. Folded for your convenience.
+ parent: ToolboxThief
+ components:
+ - type: Sprite
+ sprite: Clothing/Back/Satchels/smuggler.rsi
+ state: folded
+ - type: Item
+ storedRotation: 90
+ - type: ThiefUndeterminedBackpack
+ spawnedStoragePrototype: ClothingBackpackSatchelSmugglerUnanchored
+++ /dev/null
-- type: entity
- parent: BaseMinorContraband
- id: ThiefBeacon
- name: thieving beacon
- description: A device that will teleport everything around it to the thief's vault at the end of the shift.
- components:
- - type: ThiefBeacon
- - type: StealArea
- range: 2 # Slightly larger than fulton beacon's random offset
- - type: Item
- size: Normal
- - type: Physics
- bodyType: Dynamic
- - type: Fixtures
- fixtures:
- fix1:
- shape:
- !type:PhysShapeAabb
- bounds: "-0.25,-0.4,0.25,0.1"
- density: 20
- mask:
- - Impassable
- - type: Foldable
- folded: true
- - type: Clickable
- - type: InteractionOutline
- - type: Appearance
- - type: GenericVisualizer
- visuals:
- enum.FoldedVisuals.State:
- foldedLayer:
- True: { state: folded_extraction }
- False: { state: extraction_point }
- - type: Sprite
- sprite: Objects/Tools/thief_beacon.rsi
- drawdepth: SmallObjects
- noRot: true
- layers:
- - state: extraction_point
- map: [ "foldedLayer" ]
state: icon
- type: Item
sprite: Objects/Tools/Toolboxes/toolbox_gold.rsi
-
-- type: entity
- id: ToolboxThief
- name: thief undetermined toolbox
- description: This is where your favorite thief's supplies lie. Try to remember which ones.
- parent: [ BaseItem, BaseMinorContraband ]
- components:
- - type: Sprite
- sprite: Objects/Tools/Toolboxes/toolbox_thief.rsi
- state: icon
- - type: ThiefUndeterminedBackpack
- possibleSets:
- # TODO Thief pinpointer needed
- - ChemistrySet
- - ToolsSet
- - ChameleonSet # TODO Chameleon stump PR needed
- - SyndieSet
- - SleeperSet
- - CommunicatorSet
- - SmugglerSet
- - type: ActivatableUI
- key: enum.ThiefBackpackUIKey.Key
- - type: UserInterface
- interfaces:
- enum.ThiefBackpackUIKey.Key:
- type: ThiefBackpackBoundUserInterface
storage:
back:
- ThiefBeacon
- - ToolboxThief
+ - SatchelThief
- ClothingHandsChameleonThief
<Document>
# Thieves
-
+
<Box>
[color=#999999][italic]"Yoink! I'll be taking that! And that! Ooh, don't mind if I do!"[/italic][/color]
</Box>
</Box>
## Tools of the Trade
- You've got two more aces up your stolen sleeves: your [color=cyan]beacon[/color] and your [color=cyan]toolbox.[/color]
+ You've got two more aces up your stolen sleeves: your [color=cyan]beacon[/color] and your [color=cyan]satchel.[/color]
Your [color=cyan]beacon[/color] provides safe passage home for trinkets that may not be easy to carry with you on the evac shuttle. Simply find a secluded part of the station to unfold the beacon, then set its coordinates to your hideout.
Any shinies near it will be [bold]teleported to your vault when the shift ends,[/bold] fulfilling your objectives.
<GuideEntityEmbed Entity="ThiefBeacon"/>
</Box>
- Your [color=cyan]toolbox[/color] contains... well, whatever you remembered to pack. [bold]You can select two pre-made kits[/bold] to help you complete grander heists.
- Approve your choices in a safe place, as the toolbox will dissolve and the gear will drop at your feet.
+ Your [color=cyan]satchel[/color] contains... well, whatever you remembered to pack. [bold]You can select two pre-made kits[/bold] to help you complete grander heists.
<Box>
- <GuideEntityEmbed Entity="ToolboxThief"/>
+ <GuideEntityEmbed Entity="SatchelThief"/>
</Box>
<Box>
<GuideEntityEmbed Entity="StorageImplanter" Caption="Anatomy"/>
## Centerpiece of the Collection
Your kleptomania will take you places. One day, you'll feel like stealing a few figurines. Another day, you'll feel like stealing an industrial machine.
-
+
No matter. They'll all be a part of your collection within a matter of time.
You can steal items by [bold]having them on your person[/bold] when you get to CentComm. Failing this, you can steal larger items by [bold]leaving them by your beacon.[/bold]
Some of the more [italic]animate[/italic] objectives may not cooperate with you. Make sure they're alive and with you or your beacon when the shift ends.
Things that you may desire include but are not limited to:
-
+
<Box>
<GuideEntityEmbed Entity="ToyFigurineGreytider" Caption="Figurines"/>
<GuideEntityEmbed Entity="PassengerIDCard" Caption="ID cards"/>
<GuideEntityEmbed Entity="ChemDispenser" Caption="Structures"/>
<GuideEntityEmbed Entity="MobCorgiIan" Caption="Animals/Pets"/>
</Box>
-
+
</Document>
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/a8056c6ba7f5367934ef829116e57d743226e1f0",
+ "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/a8056c6ba7f5367934ef829116e57d743226e1f0, folded by princesscheeseballs (Discord)(https://github.com/Pronana).",
"size": {
"x": 32,
"y": 32
{
"name": "icon"
},
+ {
+ "name": "folded"
+ },
{
"name": "equipped-BACKPACK",
"directions": 4