Artifact container (#7822)

Co-authored-by: Kara <lunarautomaton6@gmail.com>
This commit is contained in:
Alex Evgrashin
2022-04-29 01:03:39 +03:00
committed by GitHub
parent 6dbc37a690
commit 2d34ded94d
20 changed files with 226 additions and 42 deletions

View File

@@ -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",

View File

@@ -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);
}
}

View File

@@ -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()

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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
{
}

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -162,6 +162,7 @@
- AtmosphericsOxygen
- AtmosphericsNitrogen
- AtmosphericsCarbonDioxide
- ArtifactContainer
- type: CrewMonitoringConsole
snap: false
precision: 3

View File

@@ -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

View File

@@ -6,6 +6,7 @@
abstract: true
components:
- type: Sprite
drawdepth: SmallObjects
sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi
netsync: false
state: ano01

View File

@@ -412,6 +412,7 @@
- AtmosphericsOxygen
- AtmosphericsNitrogen
- AtmosphericsCarbonDioxide
- ArtifactContainer
# - AtmosphericsWaterVapor
# - AtmosphericsPlasma
# - AtmosphericsTritium

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 575 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

View File

@@ -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"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B