wall mounted lockers (#11382)
@@ -12,9 +12,9 @@ using Content.Shared.Interaction;
|
||||
using Content.Shared.Item;
|
||||
using Content.Shared.Placeable;
|
||||
using Content.Shared.Storage;
|
||||
using Content.Shared.Wall;
|
||||
using Content.Shared.Whitelist;
|
||||
using Robust.Server.Containers;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Physics;
|
||||
@@ -24,6 +24,8 @@ namespace Content.Server.Storage.EntitySystems;
|
||||
|
||||
public sealed class EntityStorageSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly ConstructionSystem _construction = default!;
|
||||
[Dependency] private readonly ContainerSystem _container = default!;
|
||||
[Dependency] private readonly EntityLookupSystem _lookup = default!;
|
||||
@@ -148,7 +150,7 @@ public sealed class EntityStorageSystem : EntitySystem
|
||||
component.Open = true;
|
||||
EmptyContents(uid, component);
|
||||
ModifyComponents(uid, component);
|
||||
SoundSystem.Play(component.OpenSound.GetSound(), Filter.Pvs(component.Owner), component.Owner);
|
||||
_audio.PlayPvs(component.OpenSound, component.Owner);
|
||||
ReleaseGas(uid, component);
|
||||
RaiseLocalEvent(uid, new StorageAfterOpenEvent());
|
||||
}
|
||||
@@ -187,7 +189,7 @@ public sealed class EntityStorageSystem : EntitySystem
|
||||
|
||||
TakeGas(uid, component);
|
||||
ModifyComponents(uid, component);
|
||||
SoundSystem.Play(component.CloseSound.GetSound(), Filter.Pvs(uid), uid);
|
||||
_audio.PlayPvs(component.CloseSound, component.Owner);
|
||||
component.LastInternalOpenAttempt = default;
|
||||
RaiseLocalEvent(uid, new StorageAfterCloseEvent());
|
||||
}
|
||||
@@ -265,15 +267,14 @@ public sealed class EntityStorageSystem : EntitySystem
|
||||
}
|
||||
|
||||
//Checks to see if the opening position, if offset, is inside of a wall.
|
||||
if (component.EnteringOffset != (0, 0)) //if the entering position is offset
|
||||
if (component.EnteringOffset != (0, 0) && !HasComp<WallMountComponent>(target)) //if the entering position is offset
|
||||
{
|
||||
var targetXform = Transform(target);
|
||||
var newCoords = new EntityCoordinates(target, component.EnteringOffset);
|
||||
if (!_interactionSystem.InRangeUnobstructed(target, newCoords, collisionMask: component.EnteringOffsetCollisionFlags))
|
||||
if (!_interactionSystem.InRangeUnobstructed(target, newCoords, 0, collisionMask: component.EnteringOffsetCollisionFlags))
|
||||
{
|
||||
if (!silent)
|
||||
_popupSystem.PopupEntity(Loc.GetString("entity-storage-component-cannot-open-no-space"), target, Filter.Pvs(target));
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -301,8 +302,10 @@ public sealed class EntityStorageSystem : EntitySystem
|
||||
return false;
|
||||
|
||||
if (TryComp<IPhysBody>(toAdd, out var phys))
|
||||
{
|
||||
if (component.MaxSize < phys.GetWorldAABB().Size.X || component.MaxSize < phys.GetWorldAABB().Size.Y)
|
||||
return false;
|
||||
}
|
||||
|
||||
return Insert(toAdd, container, component);
|
||||
}
|
||||
@@ -326,10 +329,7 @@ public sealed class EntityStorageSystem : EntitySystem
|
||||
|
||||
var targetIsMob = HasComp<SharedBodyComponent>(toInsert);
|
||||
var storageIsItem = HasComp<ItemComponent>(container);
|
||||
|
||||
var allowedToEat = whitelist == null
|
||||
? HasComp<ItemComponent>(toInsert)
|
||||
: whitelist.IsValid(toInsert);
|
||||
var allowedToEat = whitelist?.IsValid(toInsert) ?? HasComp<ItemComponent>(toInsert);
|
||||
|
||||
// BEFORE REPLACING THIS WITH, I.E. A PROPERTY:
|
||||
// Make absolutely 100% sure you have worked out how to stop people ending up in backpacks.
|
||||
@@ -379,11 +379,8 @@ public sealed class EntityStorageSystem : EntitySystem
|
||||
if (TryComp<PlaceableSurfaceComponent>(uid, out var surface))
|
||||
_placeableSurface.SetPlaceable(uid, component.Open, surface);
|
||||
|
||||
if (TryComp<AppearanceComponent>(uid, out var appearance))
|
||||
{
|
||||
appearance.SetData(StorageVisuals.Open, component.Open);
|
||||
appearance.SetData(StorageVisuals.HasContents, component.Contents.ContainedEntities.Any());
|
||||
}
|
||||
_appearance.SetData(uid, StorageVisuals.Open, component.Open);
|
||||
_appearance.SetData(uid, StorageVisuals.HasContents, component.Contents.ContainedEntities.Count > 0);
|
||||
}
|
||||
|
||||
private void TakeGas(EntityUid uid, EntityStorageComponent component)
|
||||
|
||||
@@ -16,6 +16,25 @@
|
||||
- id: Ointment
|
||||
amount: 2
|
||||
|
||||
- type: entity
|
||||
id: LockerWallMedicalFilled
|
||||
suffix: Filled
|
||||
parent: LockerWallMedical
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: BoxPillCanister
|
||||
amount: 1
|
||||
- id: BoxSyringe
|
||||
amount: 1
|
||||
- id: EpinephrineChemistryBottle
|
||||
amount: 3
|
||||
- id: Brutepack
|
||||
amount: 2
|
||||
- id: Ointment
|
||||
amount: 2
|
||||
|
||||
|
||||
- type: entity
|
||||
id: LockerMedicalFilled
|
||||
suffix: Filled
|
||||
|
||||
@@ -38,6 +38,32 @@
|
||||
- id: BoxMRE
|
||||
prob: 0.1
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallEmergencyFilledRandom
|
||||
parent: ClosetWallEmergency
|
||||
suffix: Filled, Random
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: ToolboxEmergencyFilled
|
||||
prob: 0.4
|
||||
- id: ClothingMaskBreath
|
||||
prob: 0.4
|
||||
- id: ClothingMaskBreath
|
||||
prob: 0.25
|
||||
- id: EmergencyOxygenTankFilled
|
||||
prob: 0.4
|
||||
- id: OxygenTankFilled
|
||||
prob: 0.2
|
||||
- id: MedkitOxygenFilled
|
||||
prob: 0.2
|
||||
- id: WeaponFlareGun
|
||||
prob: 0.05
|
||||
- id: ClothingOuterSuitEmergency
|
||||
prob: 0.5
|
||||
- id: BoxMRE
|
||||
prob: 0.1
|
||||
|
||||
- type: entity
|
||||
id: ClosetFireFilled
|
||||
parent: ClosetFire
|
||||
@@ -54,6 +80,22 @@
|
||||
- id: ClothingHeadHelmetFire
|
||||
prob: 0.75
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallFireFilledRandom
|
||||
parent: ClosetWallFire
|
||||
suffix: Filled
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: YellowOxygenTankFilled
|
||||
prob: 0.6
|
||||
- id: ClothingOuterSuitFire
|
||||
prob: 0.75
|
||||
- id: ClothingMaskGas
|
||||
prob: 0.75
|
||||
- id: ClothingHeadHelmetFire
|
||||
prob: 0.75
|
||||
|
||||
- type: entity
|
||||
id: ClosetMaintenanceFilledRandom
|
||||
suffix: Filled, Random
|
||||
@@ -93,3 +135,29 @@
|
||||
prob: 0.1
|
||||
- id: ClothingHandsGlovesColorYellowBudget
|
||||
prob: 0.33
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallMaintenanceFilledRandom
|
||||
parent: ClosetWall
|
||||
suffix: Filled, Random
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: ToolboxEmergencyFilled
|
||||
prob: 0.4
|
||||
- id: ClothingMaskBreath
|
||||
prob: 0.4
|
||||
- id: ClothingMaskBreath
|
||||
prob: 0.25
|
||||
- id: EmergencyOxygenTankFilled
|
||||
prob: 0.4
|
||||
- id: OxygenTankFilled
|
||||
prob: 0.2
|
||||
- id: MedkitOxygenFilled
|
||||
prob: 0.2
|
||||
- id: WeaponFlareGun
|
||||
prob: 0.05
|
||||
- id: ClothingOuterSuitEmergency
|
||||
prob: 0.5
|
||||
- id: BoxMRE
|
||||
prob: 0.1
|
||||
@@ -70,3 +70,85 @@
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: generic_door
|
||||
|
||||
#Wall Closet
|
||||
- type: entity
|
||||
id: BaseWallCloset
|
||||
placement:
|
||||
mode: SnapgridCenter
|
||||
abstract: true
|
||||
name: wall closet
|
||||
description: A standard-issue Nanotrasen storage unit, now on walls.
|
||||
components:
|
||||
- type: InteractionOutline
|
||||
- type: Clickable
|
||||
- type: ResistLocker
|
||||
- type: Weldable
|
||||
- type: WallMount
|
||||
arc: 180
|
||||
- type: Transform
|
||||
noRot: false
|
||||
- type: Sprite
|
||||
drawdepth: WallMountedItems
|
||||
netsync: false
|
||||
noRot: false
|
||||
sprite: Structures/Storage/wall_locker.rsi
|
||||
layers:
|
||||
- state: generic
|
||||
- state: generic_door
|
||||
map: ["enum.StorageVisualLayers.Door"]
|
||||
- state: welded
|
||||
visible: false
|
||||
map: ["enum.WeldableLayers.BaseWelded"]
|
||||
- type: EntityStorage
|
||||
isCollidableWhenOpen: true
|
||||
enteringOffset: 0, -0.8
|
||||
closeSound:
|
||||
path: /Audio/Items/deconstruct.ogg
|
||||
openSound:
|
||||
path: /Audio/Items/deconstruct.ogg
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
entity_storage: !type:Container
|
||||
ents: []
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
damageModifierSet: Metallic
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 150
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: ["Destruction"]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
path: /Audio/Effects/metalbreak.ogg
|
||||
- !type:SpawnEntitiesBehavior
|
||||
spawn:
|
||||
SheetSteel1:
|
||||
min: 1
|
||||
max: 1
|
||||
|
||||
#Wall locker
|
||||
- type: entity
|
||||
id: BaseWallLocker
|
||||
parent: BaseWallCloset
|
||||
abstract: true
|
||||
components:
|
||||
- type: AccessReader
|
||||
- type: Lock
|
||||
- type: Sprite
|
||||
netsync: false
|
||||
sprite: Structures/Storage/wall_locker.rsi
|
||||
layers:
|
||||
- state: generic
|
||||
- state: generic_door
|
||||
map: ["enum.StorageVisualLayers.Door"]
|
||||
- state: locked
|
||||
map: ["enum.StorageVisualLayers.Lock"]
|
||||
shader: unshaded
|
||||
- state: welded
|
||||
visible: false
|
||||
map: ["enum.WeldableLayers.BaseWelded"]
|
||||
|
||||
@@ -1,48 +1,180 @@
|
||||
- type: entity
|
||||
id: BaseWallLocker
|
||||
placement:
|
||||
mode: SnapgridCenter
|
||||
abstract: true
|
||||
id: ClosetWall
|
||||
parent: BaseWallCloset
|
||||
name: maintenance wall closet
|
||||
description: It's a storage unit.
|
||||
components:
|
||||
- type: Clickable
|
||||
- type: InteractionOutline
|
||||
- type: WallMount
|
||||
arc: 180
|
||||
- type: Sprite
|
||||
drawdepth: WallMountedItems
|
||||
netsync: false
|
||||
sprite: Structures/Storage/wall_locker.rsi
|
||||
layers:
|
||||
- state: door
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 50
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: ["Destruction"]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
path: /Audio/Effects/metalbreak.ogg
|
||||
- !type:SpawnEntitiesBehavior
|
||||
spawn:
|
||||
SheetSteel1:
|
||||
min: 1
|
||||
max: 2
|
||||
- type: Storage
|
||||
capacity: 100
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
- key: enum.StorageUiKey.Key
|
||||
type: StorageBoundUserInterface
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: generic_door
|
||||
|
||||
- type: entity
|
||||
id: WallLocker
|
||||
id: ClosetWallEmergency
|
||||
name: emergency wall closet
|
||||
parent: BaseWallCloset
|
||||
description: It's a storage unit for emergency breath masks and O2 tanks.
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: emergency
|
||||
state_open: emergency_open
|
||||
state_closed: emergency_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallFire
|
||||
name: fire-safety wall closet
|
||||
parent: BaseWallCloset
|
||||
description: It's a storage unit for fire-fighting supplies.
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: fire
|
||||
state_open: fire_open
|
||||
state_closed: fire_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallBlue
|
||||
parent: BaseWallCloset
|
||||
name: blue wall closet
|
||||
description: "A wardrobe packed with stylish blue clothing."
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: blue_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallPink
|
||||
parent: BaseWallCloset
|
||||
name: pink wall closet
|
||||
description: "A wardrobe packed with fabulous pink clothing."
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: pink_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallBlack
|
||||
parent: BaseWallCloset
|
||||
name: black wall closet
|
||||
description: "A wardrobe packed with stylish black clothing."
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: black_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallGreen
|
||||
parent: BaseWallCloset
|
||||
name: green wall closet
|
||||
description: "A wardrobe packed with stylish green clothing."
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: green_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallOrange
|
||||
parent: BaseWallCloset
|
||||
name: prison wall closet
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: orange_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallYellow
|
||||
parent: BaseWallCloset
|
||||
name: yellow wall closet
|
||||
description: "A wardrobe packed with stylish yellow clothing."
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: yellow_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallWhite
|
||||
parent: BaseWallCloset
|
||||
name: white wall closet
|
||||
description: "A wardrobe packed with stylish white clothing."
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: white_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallGrey
|
||||
parent: BaseWallCloset
|
||||
name: grey wall closet
|
||||
description: "A wardrobe packed with a tide of grey clothing."
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: gray_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallMixed
|
||||
parent: BaseWallCloset
|
||||
name: mixed wall closet
|
||||
description: "A wardrobe packed with a mix of colorful clothing."
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: mixed_door
|
||||
|
||||
- type: entity
|
||||
id: ClosetWallAtmospherics
|
||||
parent: BaseWallCloset
|
||||
name: atmospherics wall closet
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: generic
|
||||
state_open: generic_open
|
||||
state_closed: atmos_door
|
||||
|
||||
- type: entity
|
||||
id: LockerWallMedical
|
||||
parent: BaseWallLocker
|
||||
name: wall locker
|
||||
description: A locker built into the wall.
|
||||
name: medical doctor's wall locker
|
||||
components:
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state: med
|
||||
state_open: med_open
|
||||
state_closed: med_door
|
||||
- type: AccessReader
|
||||
access: [["Medical"]]
|
||||
|
After Width: | Height: | Size: 434 B |
|
After Width: | Height: | Size: 404 B |
|
After Width: | Height: | Size: 431 B |
|
Before Width: | Height: | Size: 223 B |
|
After Width: | Height: | Size: 272 B |
|
After Width: | Height: | Size: 364 B |
|
After Width: | Height: | Size: 280 B |
BIN
Resources/Textures/Structures/Storage/wall_locker.rsi/fire.png
Normal file
|
After Width: | Height: | Size: 254 B |
|
After Width: | Height: | Size: 344 B |
|
After Width: | Height: | Size: 291 B |
|
After Width: | Height: | Size: 274 B |
|
After Width: | Height: | Size: 341 B |
|
After Width: | Height: | Size: 291 B |
|
After Width: | Height: | Size: 404 B |
|
After Width: | Height: | Size: 439 B |
|
Before Width: | Height: | Size: 148 B After Width: | Height: | Size: 172 B |
BIN
Resources/Textures/Structures/Storage/wall_locker.rsi/med.png
Normal file
|
After Width: | Height: | Size: 248 B |
|
After Width: | Height: | Size: 361 B |
|
After Width: | Height: | Size: 230 B |
@@ -1,23 +1,37 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "https://github.com/space-wizards/space-station-14/pull/10673, modified from TGstation commit 4a274a6e4b195dfcaffd20d7348631131418ecb5",
|
||||
"copyright": "Taken from shiptest at commmit https://github.com/shiptest-ss13/Shiptest/commit/440a15fb476a20d77ba28c1fe315c1b659032ce8",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "door"
|
||||
},
|
||||
{
|
||||
"name": "locked"
|
||||
},
|
||||
{
|
||||
"name": "unlocked"
|
||||
},
|
||||
{
|
||||
"name": "welded"
|
||||
}
|
||||
{ "name": "atmos_door" },
|
||||
{ "name": "black_door" },
|
||||
{ "name": "blue_door" },
|
||||
{ "name": "emergency" },
|
||||
{ "name": "emergency_door" },
|
||||
{ "name": "emergency_open" },
|
||||
{ "name": "fire" },
|
||||
{ "name": "fire_door" },
|
||||
{ "name": "fire_open" },
|
||||
{ "name": "generic" },
|
||||
{ "name": "generic_door" },
|
||||
{ "name": "generic_open" },
|
||||
{ "name": "gray_door" },
|
||||
{ "name": "green_door" },
|
||||
{ "name": "locked" },
|
||||
{ "name": "med" },
|
||||
{ "name": "med_door" },
|
||||
{ "name": "med_open" },
|
||||
{ "name": "mixed_door" },
|
||||
{ "name": "orange_door" },
|
||||
{ "name": "pink_door" },
|
||||
{ "name": "red_door" },
|
||||
{ "name": "unlocked" },
|
||||
{ "name": "welded" },
|
||||
{ "name": "white_door" },
|
||||
{ "name": "yellow_door" }
|
||||
]
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 453 B |
|
After Width: | Height: | Size: 440 B |
|
After Width: | Height: | Size: 430 B |
|
After Width: | Height: | Size: 425 B |
|
Before Width: | Height: | Size: 148 B After Width: | Height: | Size: 177 B |
|
Before Width: | Height: | Size: 206 B After Width: | Height: | Size: 218 B |
|
After Width: | Height: | Size: 419 B |
|
After Width: | Height: | Size: 421 B |