Chem stuff QoL (#321)
This commit is contained in:
@@ -1,12 +1,15 @@
|
||||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Chemistry.Components;
|
||||
using Content.Server.Chemistry.Containers.EntitySystems;
|
||||
using Content.Server.DeviceLinking.Systems;
|
||||
using Content.Shared.Chemistry;
|
||||
using Content.Shared.Chemistry.Dispenser;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.Containers.ItemSlots;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.DeviceLinking;
|
||||
using Content.Shared.DeviceLinking.Events;
|
||||
using Content.Shared.Emag.Components;
|
||||
using Content.Shared.Emag.Systems;
|
||||
using JetBrains.Annotations;
|
||||
@@ -16,6 +19,8 @@ using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Prototypes;
|
||||
using System.Linq;
|
||||
using Content.Shared.Chemistry.Components.SolutionManager;
|
||||
using Content.Shared.FixedPoint;
|
||||
|
||||
namespace Content.Server.Chemistry.EntitySystems
|
||||
{
|
||||
@@ -32,6 +37,9 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
[Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||
[Dependency] private readonly DeviceLinkSystem _signalSystem = default!; // WD
|
||||
[Dependency] private readonly ChemMasterSystem _chemMasterSystem = default!; // WD
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
@@ -41,6 +49,15 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, EntInsertedIntoContainerMessage>(SubscribeUpdateUiState);
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, EntRemovedFromContainerMessage>(SubscribeUpdateUiState);
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, BoundUIOpenedEvent>(SubscribeUpdateUiState);
|
||||
|
||||
// WD START
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, ComponentInit>(OnInit);
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, NewLinkEvent>(OnNewLink);
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, PortDisconnectedEvent>(OnPortDisconnected);
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, AnchorStateChangedEvent>(OnAnchorChanged);
|
||||
// WD END
|
||||
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, GotEmaggedEvent>(OnEmagged);
|
||||
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, ReagentDispenserSetDispenseAmountMessage>(OnSetDispenseAmountMessage);
|
||||
@@ -48,6 +65,90 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
SubscribeLocalEvent<ReagentDispenserComponent, ReagentDispenserClearContainerSolutionMessage>(OnClearContainerSolutionMessage);
|
||||
}
|
||||
|
||||
// WD START
|
||||
private void OnInit(EntityUid uid, ReagentDispenserComponent component, ComponentInit args)
|
||||
{
|
||||
_signalSystem.EnsureSourcePorts(uid, ReagentDispenserComponent.ChemMasterPort);
|
||||
}
|
||||
|
||||
private void OnMapInit(EntityUid uid, ReagentDispenserComponent component, MapInitEvent args)
|
||||
{
|
||||
if (!TryComp<DeviceLinkSourceComponent>(uid, out var receiver))
|
||||
return;
|
||||
|
||||
foreach (var port in receiver.Outputs.Values.SelectMany(ports => ports))
|
||||
{
|
||||
if (!TryComp<ChemMasterComponent>(port, out var master))
|
||||
continue;
|
||||
|
||||
UpdateConnection(uid, port, component, master);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnNewLink(EntityUid uid, ReagentDispenserComponent component, NewLinkEvent args)
|
||||
{
|
||||
if (TryComp<ChemMasterComponent>(args.Sink, out var master) && args.SourcePort == ReagentDispenserComponent.ChemMasterPort)
|
||||
UpdateConnection(uid, args.Sink, component, master);
|
||||
}
|
||||
|
||||
private void OnPortDisconnected(EntityUid uid, ReagentDispenserComponent component, PortDisconnectedEvent args)
|
||||
{
|
||||
if (args.Port != ReagentDispenserComponent.ChemMasterPort)
|
||||
return;
|
||||
|
||||
component.ChemMaster = null;
|
||||
component.ChemMasterInRange = false;
|
||||
}
|
||||
|
||||
private void OnAnchorChanged(EntityUid uid, ReagentDispenserComponent component, ref AnchorStateChangedEvent args)
|
||||
{
|
||||
if (args.Anchored)
|
||||
RecheckConnections(uid, component);
|
||||
}
|
||||
|
||||
public void UpdateConnection(EntityUid dispenser, EntityUid chemMaster,
|
||||
ReagentDispenserComponent? dispenserComp = null, ChemMasterComponent? chemMasterComp = null)
|
||||
{
|
||||
if (!Resolve(dispenser, ref dispenserComp) || !Resolve(chemMaster, ref chemMasterComp))
|
||||
return;
|
||||
|
||||
if (dispenserComp.ChemMaster.HasValue && dispenserComp.ChemMaster.Value != chemMaster &&
|
||||
TryComp(dispenserComp.ChemMaster, out ChemMasterComponent? oldMaster))
|
||||
{
|
||||
oldMaster.ConnectedDispenser = null;
|
||||
}
|
||||
|
||||
if (chemMasterComp.ConnectedDispenser.HasValue && chemMasterComp.ConnectedDispenser.Value != dispenser &&
|
||||
TryComp(dispenserComp.ChemMaster, out ReagentDispenserComponent? oldDispenser))
|
||||
{
|
||||
oldDispenser.ChemMaster = null;
|
||||
oldDispenser.ChemMasterInRange = false;
|
||||
}
|
||||
|
||||
dispenserComp.ChemMaster = chemMaster;
|
||||
chemMasterComp.ConnectedDispenser = dispenser;
|
||||
|
||||
RecheckConnections(dispenser, dispenserComp);
|
||||
}
|
||||
|
||||
private void RecheckConnections(EntityUid dispenser, ReagentDispenserComponent? component = null)
|
||||
{
|
||||
if (!Resolve(dispenser, ref component))
|
||||
return;
|
||||
|
||||
if (component.ChemMaster == null)
|
||||
{
|
||||
component.ChemMasterInRange = false;
|
||||
return;
|
||||
}
|
||||
|
||||
Transform(component.ChemMaster.Value).Coordinates
|
||||
.TryDistance(EntityManager, Transform(dispenser).Coordinates, out var distance);
|
||||
component.ChemMasterInRange = distance <= 1.5f;
|
||||
}
|
||||
// WD END
|
||||
|
||||
private void SubscribeUpdateUiState<T>(Entity<ReagentDispenserComponent> ent, ref T ev)
|
||||
{
|
||||
UpdateUiState(ent);
|
||||
@@ -124,7 +225,20 @@ namespace Content.Server.Chemistry.EntitySystems
|
||||
|
||||
var outputContainer = _itemSlotsSystem.GetItemOrNull(reagentDispenser, SharedReagentDispenser.OutputSlotName);
|
||||
if (outputContainer is not { Valid: true } || !_solutionContainerSystem.TryGetFitsInDispenser(outputContainer.Value, out var solution, out _))
|
||||
{ // WD EDIT START
|
||||
var chemMasterUid = reagentDispenser.Comp.ChemMaster;
|
||||
if (!reagentDispenser.Comp.ChemMasterInRange ||
|
||||
!TryComp(chemMasterUid, out ChemMasterComponent? chemMaster) ||
|
||||
!TryComp(chemMasterUid, out SolutionContainerManagerComponent? solutionContainer) ||
|
||||
!_solutionContainerSystem.TryGetSolution((chemMasterUid.Value, solutionContainer),
|
||||
SharedChemMaster.BufferSolutionName, out var bufferSolution))
|
||||
return;
|
||||
|
||||
bufferSolution.Value.Comp.Solution.AddReagent(message.ReagentId, FixedPoint2.New((int)reagentDispenser.Comp.DispenseAmount));
|
||||
_chemMasterSystem.UpdateUiState((chemMasterUid.Value, chemMaster));
|
||||
|
||||
return;
|
||||
} // WD EDIT END
|
||||
|
||||
if (_solutionContainerSystem.TryAddReagent(solution.Value, message.ReagentId, (int) reagentDispenser.Comp.DispenseAmount, out var dispensedAmount)
|
||||
&& message.Session.AttachedEntity is not null)
|
||||
|
||||
Reference in New Issue
Block a user