ChemMaster/Chemistry Dispenser constructability, fixed edition (#5125)
This commit is contained in:
@@ -101,6 +101,7 @@ namespace Content.Client.Entry
|
|||||||
"SoundOnTrigger",
|
"SoundOnTrigger",
|
||||||
"TriggerOnCollide",
|
"TriggerOnCollide",
|
||||||
"DeleteOnTrigger",
|
"DeleteOnTrigger",
|
||||||
|
"EmptyOnMachineDeconstruct",
|
||||||
"ExplodeOnTrigger",
|
"ExplodeOnTrigger",
|
||||||
"Utensil",
|
"Utensil",
|
||||||
"UnarmedCombat",
|
"UnarmedCombat",
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ namespace Content.Server.Chemistry.Components
|
|||||||
UserInterface.OnReceiveMessage += OnUiReceiveMessage;
|
UserInterface.OnReceiveMessage += OnUiReceiveMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Name relied upon by construction graph machine.yml to ensure beaker doesn't get deleted
|
||||||
BeakerContainer =
|
BeakerContainer =
|
||||||
ContainerHelpers.EnsureContainer<ContainerSlot>(Owner, $"{Name}-reagentContainerContainer");
|
ContainerHelpers.EnsureContainer<ContainerSlot>(Owner, $"{Name}-reagentContainerContainer");
|
||||||
|
|
||||||
@@ -434,6 +435,11 @@ namespace Content.Server.Chemistry.Components
|
|||||||
{
|
{
|
||||||
Owner.PopupMessage(args.User,
|
Owner.PopupMessage(args.User,
|
||||||
Loc.GetString("chem-master-component-cannot-put-entity-message", ("entity", activeHandEntity)));
|
Loc.GetString("chem-master-component-cannot-put-entity-message", ("entity", activeHandEntity)));
|
||||||
|
// TBD: This is very definitely hax so that Construction & Wires get a chance to handle things.
|
||||||
|
// When this is ECS'd, drop this in favour of proper prioritization.
|
||||||
|
// Since this is a catch-all handler, that means do this last!
|
||||||
|
// Also note ReagentDispenserComponent did something similar before I got here.
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ namespace Content.Server.Chemistry.Components
|
|||||||
UserInterface.OnReceiveMessage += OnUiReceiveMessage;
|
UserInterface.OnReceiveMessage += OnUiReceiveMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Name relied upon by construction graph machine.yml to ensure beaker doesn't get deleted
|
||||||
BeakerContainer =
|
BeakerContainer =
|
||||||
ContainerHelpers.EnsureContainer<ContainerSlot>(Owner, $"{Name}-reagentContainerContainer");
|
ContainerHelpers.EnsureContainer<ContainerSlot>(Owner, $"{Name}-reagentContainerContainer");
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
using Content.Shared.Verbs;
|
using Content.Shared.Verbs;
|
||||||
using Content.Server.Chemistry.Components;
|
using Content.Server.Chemistry.Components;
|
||||||
using Content.Server.Chemistry.Components.SolutionManager;
|
using Content.Server.Chemistry.Components.SolutionManager;
|
||||||
|
using Content.Server.Construction.Components;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Content.Shared.ActionBlocker;
|
using Content.Shared.ActionBlocker;
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
using Content.Shared.Verbs;
|
using Content.Shared.Verbs;
|
||||||
using Content.Server.Chemistry.Components;
|
using Content.Server.Chemistry.Components;
|
||||||
using Content.Server.Chemistry.Components.SolutionManager;
|
using Content.Server.Chemistry.Components.SolutionManager;
|
||||||
|
using Content.Server.Construction.Components;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Content.Shared.ActionBlocker;
|
using Content.Shared.ActionBlocker;
|
||||||
@@ -57,12 +59,6 @@ namespace Content.Server.Chemistry.EntitySystems
|
|||||||
!_actionBlockerSystem.CanDrop(args.User))
|
!_actionBlockerSystem.CanDrop(args.User))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!args.Using.HasComponent<FitsInDispenserComponent>() ||
|
|
||||||
!_solutionContainerSystem.TryGetSolution(args.Using.Uid, "beaker", out _))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Verb verb = new();
|
Verb verb = new();
|
||||||
verb.Act = () =>
|
verb.Act = () =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Robust.Shared.Containers;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
|
using Robust.Shared.Serialization.Manager.Attributes;
|
||||||
|
using Robust.Shared.ViewVariables;
|
||||||
|
|
||||||
|
namespace Content.Server.Containers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Empties a list of containers when the machine is deconstructed via MachineDeconstructedEvent.
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent]
|
||||||
|
public class EmptyOnMachineDeconstructComponent : Component
|
||||||
|
{
|
||||||
|
public override string Name => "EmptyOnMachineDeconstruct";
|
||||||
|
|
||||||
|
[ViewVariables]
|
||||||
|
[DataField("containers")]
|
||||||
|
public HashSet<string> Containers { get; set; } = new();
|
||||||
|
}
|
||||||
|
}
|
||||||
37
Content.Server/Containers/EmptyOnMachineDeconstructSystem.cs
Normal file
37
Content.Server/Containers/EmptyOnMachineDeconstructSystem.cs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
using Content.Shared.Verbs;
|
||||||
|
using Content.Server.Construction.Components;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Shared.Containers;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
|
||||||
|
namespace Content.Server.Containers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Implements functionality of EmptyOnMachineDeconstructComponent.
|
||||||
|
/// </summary>
|
||||||
|
[UsedImplicitly]
|
||||||
|
public class EmptyOnMachineDeconstructSystem : EntitySystem
|
||||||
|
{
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
SubscribeLocalEvent<EmptyOnMachineDeconstructComponent, MachineDeconstructedEvent>(OnDeconstruct);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDeconstruct(EntityUid uid, EmptyOnMachineDeconstructComponent component, MachineDeconstructedEvent ev)
|
||||||
|
{
|
||||||
|
if (!EntityManager.TryGetComponent<IContainerManager>(uid, out var mComp))
|
||||||
|
return;
|
||||||
|
var baseCoords = component.Owner.Transform.Coordinates;
|
||||||
|
foreach (var v in component.Containers)
|
||||||
|
{
|
||||||
|
if (mComp.TryGetContainer(v, out var container))
|
||||||
|
{
|
||||||
|
container.EmptyContainer(true, baseCoords);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -97,6 +97,23 @@
|
|||||||
- Dropper
|
- Dropper
|
||||||
- Syringe
|
- Syringe
|
||||||
|
|
||||||
|
- type: technology
|
||||||
|
name: "medical machinery"
|
||||||
|
id: MedicalMachinery
|
||||||
|
description: More machine power for more healing efficiency.
|
||||||
|
icon:
|
||||||
|
sprite: Structures/Machines/cloning.rsi
|
||||||
|
state: pod_0
|
||||||
|
requiredPoints: 15000
|
||||||
|
requiredTechnologies:
|
||||||
|
- BiologicalTechnology
|
||||||
|
- ChemistryTechnology
|
||||||
|
unlockedRecipes:
|
||||||
|
- CloningPodMachineCircuitboard
|
||||||
|
- MedicalScannerMachineCircuitboard
|
||||||
|
- ChemMasterMachineCircuitboard
|
||||||
|
- ChemDispenserMachineCircuitboard
|
||||||
|
|
||||||
# Security Technology Tree
|
# Security Technology Tree
|
||||||
|
|
||||||
- type: technology
|
- type: technology
|
||||||
@@ -228,7 +245,7 @@
|
|||||||
description: Try not to fry yourself.
|
description: Try not to fry yourself.
|
||||||
icon:
|
icon:
|
||||||
sprite: Structures/Power/apc.rsi
|
sprite: Structures/Power/apc.rsi
|
||||||
state: apcewires
|
state: apc0
|
||||||
requiredPoints: 10000
|
requiredPoints: 10000
|
||||||
requiredTechnologies:
|
requiredTechnologies:
|
||||||
- BasicResearch
|
- BasicResearch
|
||||||
@@ -241,8 +258,6 @@
|
|||||||
- FirelockElectronics
|
- FirelockElectronics
|
||||||
- DoorElectronics
|
- DoorElectronics
|
||||||
- APCElectronics
|
- APCElectronics
|
||||||
- CloningPodMachineCircuitboard
|
|
||||||
- MedicalScannerMachineCircuitboard
|
|
||||||
- HydroponicsTrayMachineCircuitboard
|
- HydroponicsTrayMachineCircuitboard
|
||||||
- SolarControlComputerCircuitboard
|
- SolarControlComputerCircuitboard
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,37 @@
|
|||||||
Glass: 1
|
Glass: 1
|
||||||
Cable: 1
|
Cable: 1
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
id: ChemMasterMachineCircuitboard
|
||||||
|
parent: BaseMachineCircuitboard
|
||||||
|
name: Chem Master (Machine Board)
|
||||||
|
components:
|
||||||
|
- type: MachineBoard
|
||||||
|
prototype: chem_master
|
||||||
|
requirements:
|
||||||
|
Manipulator: 1
|
||||||
|
materialRequirements:
|
||||||
|
Glass: 1
|
||||||
|
tagRequirements:
|
||||||
|
GlassBeaker:
|
||||||
|
Amount: 2
|
||||||
|
DefaultPrototype: Beaker
|
||||||
|
ExamineName: Glass Beaker
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
id: ChemDispenserMachineCircuitboard
|
||||||
|
parent: BaseMachineCircuitboard
|
||||||
|
name: Chem Dispenser (Machine Board)
|
||||||
|
components:
|
||||||
|
- type: MachineBoard
|
||||||
|
prototype: chem_dispenser
|
||||||
|
requirements:
|
||||||
|
Capacitor: 1
|
||||||
|
Manipulator: 1
|
||||||
|
MatterBin: 2
|
||||||
|
materialRequirements:
|
||||||
|
Glass: 1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: HydroponicsTrayMachineCircuitboard
|
id: HydroponicsTrayMachineCircuitboard
|
||||||
parent: BaseMachineCircuitboard
|
parent: BaseMachineCircuitboard
|
||||||
|
|||||||
@@ -11,3 +11,26 @@
|
|||||||
pack: ChemDispenserStandardInventory
|
pack: ChemDispenserStandardInventory
|
||||||
- type: ApcPowerReceiver
|
- type: ApcPowerReceiver
|
||||||
- type: ExtensionCableReceiver
|
- type: ExtensionCableReceiver
|
||||||
|
- type: Construction
|
||||||
|
graph: machine
|
||||||
|
node: machine
|
||||||
|
- type: Destructible
|
||||||
|
thresholds:
|
||||||
|
- trigger:
|
||||||
|
!type:DamageTrigger
|
||||||
|
damage: 100
|
||||||
|
behaviors:
|
||||||
|
- !type:ChangeConstructionNodeBehavior
|
||||||
|
node: machineFrame
|
||||||
|
- !type:DoActsBehavior
|
||||||
|
acts: ["Destruction"]
|
||||||
|
- type: Machine
|
||||||
|
board: ChemDispenserMachineCircuitboard
|
||||||
|
- type: MaterialStorage
|
||||||
|
- type: Wires
|
||||||
|
BoardName: "chem_dispenser"
|
||||||
|
LayoutId: chem_dispenser
|
||||||
|
- type: EmptyOnMachineDeconstruct
|
||||||
|
containers:
|
||||||
|
- ReagentDispenser-reagentContainerContainer
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
- type: entity
|
- type: entity
|
||||||
id: chem_master
|
id: chem_master
|
||||||
parent: BaseStructure
|
parent: BaseMachinePowered
|
||||||
name: ChemMaster 4000
|
name: ChemMaster 4000
|
||||||
description: An industrial grade chemical manipulator with pill and bottle production included.
|
description: An industrial grade chemical manipulator with pill and bottle production included.
|
||||||
placement:
|
placement:
|
||||||
@@ -16,10 +16,6 @@
|
|||||||
sprite: Structures/Machines/mixer.rsi
|
sprite: Structures/Machines/mixer.rsi
|
||||||
state: mixer_loaded
|
state: mixer_loaded
|
||||||
- type: ChemMaster
|
- type: ChemMaster
|
||||||
- type: ApcPowerReceiver
|
|
||||||
- type: ExtensionCableReceiver
|
|
||||||
- type: InteractionOutline
|
|
||||||
- type: Anchorable
|
|
||||||
- type: Physics
|
- type: Physics
|
||||||
bodyType: Static
|
bodyType: Static
|
||||||
fixtures:
|
fixtures:
|
||||||
@@ -32,73 +28,31 @@
|
|||||||
layer:
|
layer:
|
||||||
- Opaque
|
- Opaque
|
||||||
- MobImpassable
|
- MobImpassable
|
||||||
- type: Damageable
|
|
||||||
damageContainer: Inorganic
|
|
||||||
damageModifierSet: Metallic
|
|
||||||
- type: Destructible
|
- type: Destructible
|
||||||
thresholds:
|
thresholds:
|
||||||
- trigger:
|
- trigger:
|
||||||
!type:DamageTrigger
|
!type:DamageTrigger
|
||||||
damage: 50
|
damage: 50
|
||||||
behaviors:
|
behaviors:
|
||||||
- !type:SpawnEntitiesBehavior
|
- !type:ChangeConstructionNodeBehavior
|
||||||
spawn:
|
node: machineFrame
|
||||||
chem_master_broken:
|
|
||||||
min: 1
|
|
||||||
max: 1
|
|
||||||
- !type:DoActsBehavior
|
- !type:DoActsBehavior
|
||||||
acts: [ "Destruction" ]
|
acts: [ "Destruction" ]
|
||||||
- type: UserInterface
|
- type: UserInterface
|
||||||
interfaces:
|
interfaces:
|
||||||
- key: enum.ChemMasterUiKey.Key
|
- key: enum.ChemMasterUiKey.Key
|
||||||
type: ChemMasterBoundUserInterface
|
type: ChemMasterBoundUserInterface
|
||||||
|
# Machine / Construction stuff
|
||||||
|
- type: Wires
|
||||||
|
BoardName: "chem_master"
|
||||||
|
LayoutId: chem_master
|
||||||
|
- type: Machine
|
||||||
|
board: ChemMasterMachineCircuitboard
|
||||||
|
- type: MaterialStorage
|
||||||
|
- type: Construction
|
||||||
|
graph: machine
|
||||||
|
node: machine
|
||||||
|
- type: EmptyOnMachineDeconstruct
|
||||||
|
containers:
|
||||||
|
- ChemMaster-reagentContainerContainer
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: chem_master_broken
|
|
||||||
parent: BaseStructureDynamic
|
|
||||||
name: ChemMaster 4000
|
|
||||||
description: "An industrial grade chemical manipulator with pill and bottle production included. It's broken."
|
|
||||||
abstract: true
|
|
||||||
suffix: Broken
|
|
||||||
components:
|
|
||||||
- type: Sprite
|
|
||||||
sprite: Structures/Machines/mixer.rsi
|
|
||||||
layers:
|
|
||||||
- state: mixer_empty
|
|
||||||
- state: mixer_screen_broken
|
|
||||||
shader: unshaded
|
|
||||||
- type: Icon
|
|
||||||
sprite: Structures/Machines/mixer.rsi
|
|
||||||
state: mixer_broken
|
|
||||||
- type: InteractionOutline
|
|
||||||
- type: Physics
|
|
||||||
bodyType: Dynamic
|
|
||||||
fixtures:
|
|
||||||
- shape:
|
|
||||||
!type:PhysShapeAabb
|
|
||||||
bounds: "-0.25,-0.4,0.25,0.4"
|
|
||||||
mass: 25
|
|
||||||
mask:
|
|
||||||
- SmallImpassable
|
|
||||||
layer:
|
|
||||||
- Opaque
|
|
||||||
- MobImpassable
|
|
||||||
- type: Damageable
|
|
||||||
damageContainer: Inorganic
|
|
||||||
- type: Destructible
|
|
||||||
thresholds:
|
|
||||||
- trigger:
|
|
||||||
!type:DamageTrigger
|
|
||||||
damage: 25
|
|
||||||
behaviors:
|
|
||||||
- !type:SpawnEntitiesBehavior
|
|
||||||
spawn:
|
|
||||||
SheetSteel1:
|
|
||||||
min: 1
|
|
||||||
max: 1
|
|
||||||
- !type:DoActsBehavior
|
|
||||||
acts: [ "Destruction" ]
|
|
||||||
- type: UserInterface
|
|
||||||
interfaces:
|
|
||||||
- key: enum.ChemMasterUiKey.Key
|
|
||||||
type: ChemMasterBoundUserInterface
|
|
||||||
|
|||||||
@@ -174,6 +174,8 @@
|
|||||||
- APCElectronics
|
- APCElectronics
|
||||||
- CloningPodMachineCircuitboard
|
- CloningPodMachineCircuitboard
|
||||||
- MedicalScannerMachineCircuitboard
|
- MedicalScannerMachineCircuitboard
|
||||||
|
- ChemMasterMachineCircuitboard
|
||||||
|
- ChemDispenserMachineCircuitboard
|
||||||
- HydroponicsTrayMachineCircuitboard
|
- HydroponicsTrayMachineCircuitboard
|
||||||
- SolarControlComputerCircuitboard
|
- SolarControlComputerCircuitboard
|
||||||
- Bucket
|
- Bucket
|
||||||
|
|||||||
@@ -91,3 +91,4 @@
|
|||||||
steps:
|
steps:
|
||||||
- tool: Prying
|
- tool: Prying
|
||||||
doAfter: 0.25
|
doAfter: 0.25
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,24 @@
|
|||||||
Steel: 100
|
Steel: 100
|
||||||
Glass: 100
|
Glass: 100
|
||||||
|
|
||||||
|
- type: latheRecipe
|
||||||
|
id: ChemMasterMachineCircuitboard
|
||||||
|
icon: Objects/Misc/module.rsi/id_mod.png
|
||||||
|
result: ChemMasterMachineCircuitboard
|
||||||
|
completetime: 1000
|
||||||
|
materials:
|
||||||
|
Steel: 100
|
||||||
|
Glass: 100
|
||||||
|
|
||||||
|
- type: latheRecipe
|
||||||
|
id: ChemDispenserMachineCircuitboard
|
||||||
|
icon: Objects/Misc/module.rsi/id_mod.png
|
||||||
|
result: ChemDispenserMachineCircuitboard
|
||||||
|
completetime: 1000
|
||||||
|
materials:
|
||||||
|
Steel: 100
|
||||||
|
Glass: 100
|
||||||
|
|
||||||
- type: latheRecipe
|
- type: latheRecipe
|
||||||
id: SolarControlComputerCircuitboard
|
id: SolarControlComputerCircuitboard
|
||||||
icon: Objects/Misc/module.rsi/id_mod.png
|
icon: Objects/Misc/module.rsi/id_mod.png
|
||||||
|
|||||||
Reference in New Issue
Block a user