Artifact container (#7822)
Co-authored-by: Kara <lunarautomaton6@gmail.com>
@@ -145,6 +145,7 @@ namespace Content.Client.Entry
|
||||
"VentCritterSpawnLocation",
|
||||
"RadiateArtifact",
|
||||
"TemperatureArtifact",
|
||||
"SuppressArtifactContainer",
|
||||
"DisposalHolder",
|
||||
"DisposalTagger",
|
||||
"DisposalRouter",
|
||||
@@ -290,6 +291,7 @@ namespace Content.Client.Entry
|
||||
"AmbientOnPowered",
|
||||
"DoorSignalControl",
|
||||
"Wieldable",
|
||||
"ArtifactStorage",
|
||||
"IncreaseDamageOnWield",
|
||||
"TabletopGame",
|
||||
"LitOnPowered",
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
using Content.Server.Xenoarchaeology.XenoArtifacts;
|
||||
|
||||
namespace Content.Server.Storage.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed class ArtifactStorageComponent : EntityStorageComponent
|
||||
{
|
||||
[Dependency] private readonly IEntityManager _entMan = default!;
|
||||
|
||||
public override bool CanFit(EntityUid entity)
|
||||
{
|
||||
return _entMan.HasComponent<ArtifactComponent>(entity);
|
||||
}
|
||||
}
|
||||
@@ -232,6 +232,27 @@ namespace Content.Server.Storage.Components
|
||||
if (entity.IsInContainer())
|
||||
continue;
|
||||
|
||||
if (!CanFit(entity))
|
||||
continue;
|
||||
|
||||
// finally, AddToContents
|
||||
if (!AddToContents(entity))
|
||||
continue;
|
||||
|
||||
count++;
|
||||
if (count >= _storageCapacityMax)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ModifyComponents();
|
||||
SoundSystem.Play(Filter.Pvs(Owner), _closeSound.GetSound(), Owner);
|
||||
LastInternalOpenAttempt = default;
|
||||
}
|
||||
|
||||
public virtual bool CanFit(EntityUid entity)
|
||||
{
|
||||
// conditions are complicated because of pizzabox-related issues, so follow this guide
|
||||
// 0. Accomplish your goals at all costs.
|
||||
// 1. AddToContents can block anything
|
||||
@@ -243,7 +264,7 @@ namespace Content.Server.Storage.Components
|
||||
|
||||
// Let's not insert admin ghosts, yeah? This is really a a hack and should be replaced by attempt events
|
||||
if (_entMan.HasComponent<GhostComponent>(entity))
|
||||
continue;
|
||||
return false;
|
||||
|
||||
// checks
|
||||
|
||||
@@ -251,10 +272,7 @@ namespace Content.Server.Storage.Components
|
||||
var targetIsMob = _entMan.HasComponent<SharedBodyComponent>(entity);
|
||||
var storageIsItem = _entMan.HasComponent<SharedItemComponent>(Owner);
|
||||
|
||||
var allowedToEat = false;
|
||||
|
||||
if (targetIsItem)
|
||||
allowedToEat = true;
|
||||
var allowedToEat = targetIsItem;
|
||||
|
||||
// BEFORE REPLACING THIS WITH, I.E. A PROPERTY:
|
||||
// Make absolutely 100% sure you have worked out how to stop people ending up in backpacks.
|
||||
@@ -272,24 +290,7 @@ namespace Content.Server.Storage.Components
|
||||
}
|
||||
}
|
||||
|
||||
if (!allowedToEat)
|
||||
continue;
|
||||
|
||||
// finally, AddToContents
|
||||
|
||||
if (!AddToContents(entity))
|
||||
continue;
|
||||
|
||||
count++;
|
||||
if (count >= _storageCapacityMax)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ModifyComponents();
|
||||
SoundSystem.Play(Filter.Pvs(Owner), _closeSound.GetSound(), Owner);
|
||||
LastInternalOpenAttempt = default;
|
||||
return allowedToEat;
|
||||
}
|
||||
|
||||
protected virtual void OpenStorage()
|
||||
|
||||
@@ -28,5 +28,12 @@ public sealed class ArtifactComponent : Component
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public double CooldownTime = 10;
|
||||
|
||||
/// <summary>
|
||||
/// Is this artifact under some suppression device?
|
||||
/// If true, will ignore all trigger activations attempts.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool IsSuppressed;
|
||||
|
||||
public TimeSpan LastActivationTime;
|
||||
}
|
||||
|
||||
@@ -49,6 +49,10 @@ public sealed class ArtifactSystem : EntitySystem
|
||||
if (!Resolve(uid, ref component))
|
||||
return false;
|
||||
|
||||
// check if artifact is under suppression field
|
||||
if (component.IsSuppressed)
|
||||
return false;
|
||||
|
||||
// check if artifact isn't under cooldown
|
||||
var timeDif = _gameTiming.CurTime - component.LastActivationTime;
|
||||
if (timeDif.TotalSeconds < component.CooldownTime)
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Content.Server.Xenoarchaeology.XenoArtifacts.Equipment.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Suppress artifact activation, when entity is placed inside this container.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed class SuppressArtifactContainerComponent : Component
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using Content.Server.Xenoarchaeology.XenoArtifacts.Equipment.Components;
|
||||
using Robust.Shared.Containers;
|
||||
|
||||
namespace Content.Server.Xenoarchaeology.XenoArtifacts.Equipment.Systems;
|
||||
|
||||
public sealed class SuppressArtifactContainerSystem : EntitySystem
|
||||
{
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<SuppressArtifactContainerComponent, EntInsertedIntoContainerMessage>(OnInserted);
|
||||
SubscribeLocalEvent<SuppressArtifactContainerComponent, EntRemovedFromContainerMessage>(OnRemoved);
|
||||
}
|
||||
|
||||
private void OnInserted(EntityUid uid, SuppressArtifactContainerComponent component, EntInsertedIntoContainerMessage args)
|
||||
{
|
||||
if (!TryComp(args.Entity, out ArtifactComponent? artifact))
|
||||
return;
|
||||
|
||||
artifact.IsSuppressed = true;
|
||||
}
|
||||
|
||||
private void OnRemoved(EntityUid uid, SuppressArtifactContainerComponent component, EntRemovedFromContainerMessage args)
|
||||
{
|
||||
if (!TryComp(args.Entity, out ArtifactComponent? artifact))
|
||||
return;
|
||||
|
||||
artifact.IsSuppressed = false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
- type: cargoProduct
|
||||
name: "Artifact Container"
|
||||
id: ArtifactContainer
|
||||
description: Used to safely contain and move artifacts.
|
||||
icon:
|
||||
sprite: Structures/Storage/Crates/artifact.rsi
|
||||
state: artifact_container_icon
|
||||
product: CrateArtifactContainer
|
||||
cost: 2000
|
||||
category: Science
|
||||
group: market
|
||||
|
||||
@@ -162,6 +162,7 @@
|
||||
- AtmosphericsOxygen
|
||||
- AtmosphericsNitrogen
|
||||
- AtmosphericsCarbonDioxide
|
||||
- ArtifactContainer
|
||||
- type: CrewMonitoringConsole
|
||||
snap: false
|
||||
precision: 3
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
- type: entity
|
||||
id: CrateArtifactContainer
|
||||
name: artifact container
|
||||
description: Used to safely contain and move artifacts.
|
||||
parent: BaseStructureDynamic
|
||||
components:
|
||||
- type: Transform
|
||||
noRot: true
|
||||
- type: AccessReader
|
||||
access: [["Research"], ["Salvage"]]
|
||||
- type: Lock
|
||||
- type: Sprite
|
||||
drawdepth: Objects
|
||||
netsync: false
|
||||
sprite: Structures/Storage/Crates/artifact.rsi
|
||||
layers:
|
||||
- state: artifact_container
|
||||
- state: artifact_container_door
|
||||
map: ["enum.StorageVisualLayers.Door"]
|
||||
- state: welded
|
||||
visible: false
|
||||
map: ["enum.StorageVisualLayers.Welded"]
|
||||
- state: locked
|
||||
map: ["enum.StorageVisualLayers.Lock"]
|
||||
shader: unshaded
|
||||
- type: InteractionOutline
|
||||
- type: Physics
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
- shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.45
|
||||
mass: 150
|
||||
mask:
|
||||
- Impassable
|
||||
layer:
|
||||
- Opaque
|
||||
- MobImpassable
|
||||
- SmallImpassable
|
||||
- type: Icon
|
||||
sprite: Structures/Storage/Crates/artifact.rsi
|
||||
state: artifact_container_icon
|
||||
- type: ArtifactStorage
|
||||
Capacity: 1
|
||||
CanWeldShut: true
|
||||
- type: SuppressArtifactContainer
|
||||
- type: PlaceableSurface
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
damageModifierSet: Metallic
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 50
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: ["Destruction"]
|
||||
- type: PaperLabel
|
||||
labelSlot:
|
||||
insertVerbText: Attach Label
|
||||
ejectVerbText: Remove Label
|
||||
whitelist:
|
||||
components:
|
||||
- Paper
|
||||
- type: Appearance
|
||||
visuals:
|
||||
- type: StorageVisualizer
|
||||
state_open: artifact_container_open
|
||||
state_closed: artifact_container_door
|
||||
@@ -6,6 +6,7 @@
|
||||
abstract: true
|
||||
components:
|
||||
- type: Sprite
|
||||
drawdepth: SmallObjects
|
||||
sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi
|
||||
netsync: false
|
||||
state: ano01
|
||||
|
||||
@@ -412,6 +412,7 @@
|
||||
- AtmosphericsOxygen
|
||||
- AtmosphericsNitrogen
|
||||
- AtmosphericsCarbonDioxide
|
||||
- ArtifactContainer
|
||||
# - AtmosphericsWaterVapor
|
||||
# - AtmosphericsPlasma
|
||||
# - AtmosphericsTritium
|
||||
|
||||
|
After Width: | Height: | Size: 494 B |
|
After Width: | Height: | Size: 393 B |
|
After Width: | Height: | Size: 575 B |
|
After Width: | Height: | Size: 404 B |
|
After Width: | Height: | Size: 198 B |
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"version": 1,
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Taken from baystation at commit https://github.com/Baystation12/Baystation12/commit/a929584d9db319eb7484113221be25cfa1d5dc09",
|
||||
"states": [
|
||||
{
|
||||
"name": "artifact_container"
|
||||
},
|
||||
{
|
||||
"name": "artifact_container_door"
|
||||
},
|
||||
{
|
||||
"name": "artifact_container_open"
|
||||
},
|
||||
{
|
||||
"name": "artifact_container_icon"
|
||||
},
|
||||
{
|
||||
"name": "locked"
|
||||
},
|
||||
{
|
||||
"name": "unlocked"
|
||||
},
|
||||
{
|
||||
"name": "welded"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 203 B |
|
After Width: | Height: | Size: 375 B |