Solution Entities (#21916)
* Creates Content.Shared.Chemistry.Solutions Copies Solution class to new namespace Obsoletes old Solution class * Switches over to the Solutions.Solution Solution * Creates Content.Shared.Chemistry.Containers Copies relevant components/systems to the new namespace Obsoletes old versions * Switches over to the Containers.XYZ namespace * Creates SolutionSystem and obsoletes old SolutionContainerSystem methods * Start using SolutionSystem for Solution manipulation * EnumerateSolutions * Move TryGetMixableSolution * Move EnsureSolution to Server * Create Solution Entities * Stop using obsolete solution system methods * Fix prototype component tests * Add using ..Audio.Systems; back * Wrap solution container slots in ContainerSlots * Actually add the slot to the solution container map * Dirty SolutionContainerComponent when ensuring solutions * Revert namespace changes * Remerge SolutionSystem and SolutionContainerSystem * SolutionContainerManagerComponent refactor * Avoid wrapping necessary code in DebugTools.Assert as it is removed when compiling for release * Readd examine reagent sorting * Fix errors * Poke tests * Fix solution names not being applied * Fix WoolyComponent including statement * Fix merge skew * Fix compile errors * Make reactions use solntities * Reindent solution class namespace * Field attribute changes * AutoGenerateComponentState for SolutionContainerComponent * SolutionContainerComponent -> ContainedSolutionComponent * ref ReactionAttemptEvent * Denetwork preinit solutions * Misc 1 * Nullable TryGetSolution out vars * Cache associated solutions * Fix merge skew * Use explicit regions in SharedSolutionContainerSystem.Capabilities * Add debug assert * Use explicit regions in SharedSolutionContainerSystem.Relay + ref SolutionContainerChangedEvent * ContainedSolutionComponent.Name -> ContainedSolutionComponent.ContainerName * SolutionComponent doc comments * Implicit DataField names and property purge * ReagentEffect DataField names * Local variables for readability * Sort using statements + Entity<T> event handlers * Fix compile erros * Fix compile errors --------- Co-authored-by: ElectroJr <leonsfriedrich@gmail.com>
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using Content.Server.Chemistry.Components;
|
||||
using Content.Server.Chemistry.Containers.EntitySystems;
|
||||
using Content.Server.Labels;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Storage.EntitySystems;
|
||||
@@ -19,6 +18,8 @@ using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Prototypes;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
|
||||
namespace Content.Server.Chemistry.EntitySystems
|
||||
{
|
||||
@@ -47,7 +48,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<ChemMasterComponent, ComponentStartup>(SubscribeUpdateUiState);
|
||||
SubscribeLocalEvent<ChemMasterComponent, SolutionChangedEvent>(SubscribeUpdateUiState);
|
||||
SubscribeLocalEvent<ChemMasterComponent, SolutionContainerChangedEvent>(SubscribeUpdateUiState);
|
||||
SubscribeLocalEvent<ChemMasterComponent, EntInsertedIntoContainerMessage>(SubscribeUpdateUiState);
|
||||
SubscribeLocalEvent<ChemMasterComponent, EntRemovedFromContainerMessage>(SubscribeUpdateUiState);
|
||||
SubscribeLocalEvent<ChemMasterComponent, BoundUIOpenedEvent>(SubscribeUpdateUiState);
|
||||
@@ -67,7 +68,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
private void UpdateUiState(Entity<ChemMasterComponent> ent, bool updateLabel = false)
|
||||
{
|
||||
var (owner, chemMaster) = ent;
|
||||
if (!_solutionContainerSystem.TryGetSolution(owner, SharedChemMaster.BufferSolutionName, out var bufferSolution))
|
||||
if (!_solutionContainerSystem.TryGetSolution(owner, SharedChemMaster.BufferSolutionName, out _, out var bufferSolution))
|
||||
return;
|
||||
var inputContainer = _itemSlotsSystem.GetItemOrNull(owner, SharedChemMaster.InputSlotName);
|
||||
var outputContainer = _itemSlotsSystem.GetItemOrNull(owner, SharedChemMaster.OutputSlotName);
|
||||
@@ -130,8 +131,8 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
{
|
||||
var container = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.InputSlotName);
|
||||
if (container is null ||
|
||||
!_solutionContainerSystem.TryGetFitsInDispenser(container.Value, out var containerSolution) ||
|
||||
!_solutionContainerSystem.TryGetSolution(chemMaster, SharedChemMaster.BufferSolutionName, out var bufferSolution))
|
||||
!_solutionContainerSystem.TryGetFitsInDispenser(container.Value, out var containerSoln, out var containerSolution) ||
|
||||
!_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.BufferSolutionName, out _, out var bufferSolution))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -140,12 +141,12 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
{
|
||||
amount = FixedPoint2.Min(amount, containerSolution.AvailableVolume);
|
||||
amount = bufferSolution.RemoveReagent(id, amount);
|
||||
_solutionContainerSystem.TryAddReagent(container.Value, containerSolution, id, amount, out var _);
|
||||
_solutionContainerSystem.TryAddReagent(containerSoln.Value, id, amount, out var _);
|
||||
}
|
||||
else // Container to buffer
|
||||
{
|
||||
amount = FixedPoint2.Min(amount, containerSolution.GetReagentQuantity(id));
|
||||
_solutionContainerSystem.RemoveReagent(container.Value, containerSolution, id, amount);
|
||||
_solutionContainerSystem.RemoveReagent(containerSoln.Value, id, amount);
|
||||
bufferSolution.AddReagent(id, amount);
|
||||
}
|
||||
|
||||
@@ -156,7 +157,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
{
|
||||
if (fromBuffer)
|
||||
{
|
||||
if (_solutionContainerSystem.TryGetSolution(chemMaster, SharedChemMaster.BufferSolutionName, out var bufferSolution))
|
||||
if (_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.BufferSolutionName, out _, out var bufferSolution))
|
||||
bufferSolution.RemoveReagent(id, amount);
|
||||
else
|
||||
return;
|
||||
@@ -165,9 +166,9 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
{
|
||||
var container = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.InputSlotName);
|
||||
if (container is not null &&
|
||||
_solutionContainerSystem.TryGetFitsInDispenser(container.Value, out var containerSolution))
|
||||
_solutionContainerSystem.TryGetFitsInDispenser(container.Value, out var containerSolution, out _))
|
||||
{
|
||||
_solutionContainerSystem.RemoveReagent(container.Value, containerSolution, id, amount);
|
||||
_solutionContainerSystem.RemoveReagent(containerSolution.Value, id, amount);
|
||||
}
|
||||
else
|
||||
return;
|
||||
@@ -210,10 +211,8 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
_storageSystem.Insert(container, item, out _, user: user, storage);
|
||||
_labelSystem.Label(item, message.Label);
|
||||
|
||||
var itemSolution = _solutionContainerSystem.EnsureSolution(item, SharedChemMaster.PillSolutionName);
|
||||
|
||||
_solutionContainerSystem.TryAddSolution(
|
||||
item, itemSolution, withdrawal.SplitSolution(message.Dosage));
|
||||
var itemSolution = _solutionContainerSystem.EnsureSolutionEntity(item, SharedChemMaster.PillSolutionName, message.Dosage, null, out _);
|
||||
_solutionContainerSystem.TryAddSolution(itemSolution, withdrawal.SplitSolution(message.Dosage));
|
||||
|
||||
var pill = EnsureComp<PillComponent>(item);
|
||||
pill.PillType = chemMaster.Comp.PillType;
|
||||
@@ -223,13 +222,13 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
{
|
||||
// Log pill creation by a user
|
||||
_adminLogger.Add(LogType.Action, LogImpact.Low,
|
||||
$"{ToPrettyString(user.Value):user} printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution)}");
|
||||
$"{ToPrettyString(user.Value):user} printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Log pill creation by magic? This should never happen... right?
|
||||
_adminLogger.Add(LogType.Action, LogImpact.Low,
|
||||
$"Unknown printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution)}");
|
||||
$"Unknown printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -242,8 +241,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
var user = message.Session.AttachedEntity;
|
||||
var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName);
|
||||
if (maybeContainer is not { Valid: true } container
|
||||
|| !_solutionContainerSystem.TryGetSolution(
|
||||
container, SharedChemMaster.BottleSolutionName, out var solution))
|
||||
|| !_solutionContainerSystem.TryGetSolution(container, SharedChemMaster.BottleSolutionName, out var soln, out var solution))
|
||||
{
|
||||
return; // output can't fit reagents
|
||||
}
|
||||
@@ -260,8 +258,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
return;
|
||||
|
||||
_labelSystem.Label(container, message.Label);
|
||||
_solutionContainerSystem.TryAddSolution(
|
||||
container, solution, withdrawal);
|
||||
_solutionContainerSystem.TryAddSolution(soln.Value, withdrawal);
|
||||
|
||||
if (user.HasValue)
|
||||
{
|
||||
@@ -287,8 +284,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
{
|
||||
outputSolution = null;
|
||||
|
||||
if (!_solutionContainerSystem.TryGetSolution(
|
||||
chemMaster, SharedChemMaster.BufferSolutionName, out var solution))
|
||||
if (!_solutionContainerSystem.TryGetSolution(chemMaster.Owner, SharedChemMaster.BufferSolutionName, out _, out var solution))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -323,7 +319,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
return null;
|
||||
|
||||
if (!TryComp(container, out FitsInDispenserComponent? fits)
|
||||
|| !_solutionContainerSystem.TryGetSolution(container.Value, fits.Solution, out var solution))
|
||||
|| !_solutionContainerSystem.TryGetSolution(container.Value, fits.Solution, out _, out var solution))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -339,7 +335,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
var name = Name(container.Value);
|
||||
{
|
||||
if (_solutionContainerSystem.TryGetSolution(
|
||||
container.Value, SharedChemMaster.BottleSolutionName, out var solution))
|
||||
container.Value, SharedChemMaster.BottleSolutionName, out _, out var solution))
|
||||
{
|
||||
return BuildContainerInfo(name, solution);
|
||||
}
|
||||
@@ -350,7 +346,7 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
|
||||
var pills = storage.Container.ContainedEntities.Select((Func<EntityUid, (string, FixedPoint2 quantity)>) (pill =>
|
||||
{
|
||||
_solutionContainerSystem.TryGetSolution(pill, SharedChemMaster.PillSolutionName, out var solution);
|
||||
_solutionContainerSystem.TryGetSolution(pill, SharedChemMaster.PillSolutionName, out _, out var solution);
|
||||
var quantity = solution?.Volume ?? FixedPoint2.Zero;
|
||||
return (Name(pill), quantity);
|
||||
})).ToList();
|
||||
|
||||
Reference in New Issue
Block a user