mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-17 05:27:38 +03:00
<!-- This is a semi-strict format, you can add/remove sections as needed but the order/format should be kept the same Remove these comments before submitting --> # Description the adding AI is now up to y'all because i'm not touching loadout code for name datasets, but it shouldn't be too bad from here --------- Signed-off-by: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com> Signed-off-by: SolStar <44028047+ewokswagger@users.noreply.github.com> Signed-off-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: themias <89101928+themias@users.noreply.github.com> Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com> Co-authored-by: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Co-authored-by: Sphiral <145869023+SphiraI@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com> Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com> Co-authored-by: ravage <142820619+ravage123321@users.noreply.github.com> Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: Intoxicating-Innocence <188202277+Intoxicating-Innocence@users.noreply.github.com> Co-authored-by: Saphire <lattice@saphi.re> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> Co-authored-by: CaasGit <87243814+CaasGit@users.noreply.github.com> Co-authored-by: BramvanZijp <56019239+BramvanZijp@users.noreply.github.com> Co-authored-by: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Co-authored-by: NakataRin <45946146+NakataRin@users.noreply.github.com> Co-authored-by: Kara <lunarautomaton6@gmail.com> Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: SlamBamActionman <slambamactionman@gmail.com> Co-authored-by: Doomsdrayk <robotdoughnut@comcast.net> Co-authored-by: Brandon Hu <103440971+Brandon-Huu@users.noreply.github.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: ElectroJr <leonsfriedrich@gmail.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com> Co-authored-by: Julian Giebel <juliangiebel@live.de> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: Repo <47093363+Titian3@users.noreply.github.com> Co-authored-by: Chief-Engineer <119664036+Chief-Engineer@users.noreply.github.com> Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com> Co-authored-by: AJCM-git <60196617+AJCM-git@users.noreply.github.com> Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Co-authored-by: no <165581243+pissdemon@users.noreply.github.com> Co-authored-by: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> Co-authored-by: osjarw <62134478+osjarw@users.noreply.github.com> Co-authored-by: Simon <63975668+Simyon264@users.noreply.github.com> Co-authored-by: TGRCDev <tgrc@tgrc.dev> Co-authored-by: Milon <milonpl.git@proton.me> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Co-authored-by: Fildrance <fildrance@gmail.com> Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru> Co-authored-by: chavonadelal <156101927+chavonadelal@users.noreply.github.com> Co-authored-by: SolStar <44028047+ewokswagger@users.noreply.github.com> Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: ArchRBX <5040911+ArchRBX@users.noreply.github.com> Co-authored-by: archrbx <punk.gear5260@fastmail.com> Co-authored-by: Radezolid <snappednexus@gmail.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: EmoGarbage404 <retron404@gmail.com> Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Co-authored-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Co-authored-by: Velcroboy <velcroboy333@hotmail.com> Co-authored-by: neuPanda <chriseparton@gmail.com> Co-authored-by: neuPanda <spainman0@yahoo.com> Co-authored-by: Dvir <39403717+dvir001@users.noreply.github.com> Co-authored-by: Whatstone <whatston3@gmail.com> Co-authored-by: VideoKompany <135313844+VlaDOS1408@users.noreply.github.com> (cherry picked from commit 93ed70acfeda357133a701f637d3faeec02749bb)
179 lines
8.1 KiB
C#
179 lines
8.1 KiB
C#
using Content.Server.Atmos.Piping.Unary.EntitySystems;
|
|
using Content.Shared.Atmos.Piping.Unary.Components;
|
|
using Content.Shared.Atmos.Visuals;
|
|
using Content.Shared.Examine;
|
|
using Content.Shared.Destructible;
|
|
using Content.Server.Atmos.Piping.Components;
|
|
using Content.Server.Atmos.EntitySystems;
|
|
using Content.Server.Power.Components;
|
|
using Content.Server.NodeContainer;
|
|
using Robust.Server.GameObjects;
|
|
using Content.Server.NodeContainer.Nodes;
|
|
using Content.Server.NodeContainer.NodeGroups;
|
|
using Content.Server.Audio;
|
|
using Content.Server.Administration.Logs;
|
|
using Content.Server.Construction;
|
|
using Content.Server.NodeContainer.EntitySystems;
|
|
using Content.Shared.Atmos;
|
|
using Content.Shared.Database;
|
|
using Content.Shared.Power;
|
|
|
|
namespace Content.Server.Atmos.Portable
|
|
{
|
|
public sealed class PortableScrubberSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly GasVentScrubberSystem _scrubberSystem = default!;
|
|
[Dependency] private readonly GasCanisterSystem _canisterSystem = default!;
|
|
[Dependency] private readonly GasPortableSystem _gasPortableSystem = default!;
|
|
[Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
|
|
[Dependency] private readonly TransformSystem _transformSystem = default!;
|
|
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
|
[Dependency] private readonly AmbientSoundSystem _ambientSound = default!;
|
|
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
|
[Dependency] private readonly NodeContainerSystem _nodeContainer = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
SubscribeLocalEvent<PortableScrubberComponent, AtmosDeviceUpdateEvent>(OnDeviceUpdated);
|
|
SubscribeLocalEvent<PortableScrubberComponent, AnchorStateChangedEvent>(OnAnchorChanged);
|
|
SubscribeLocalEvent<PortableScrubberComponent, PowerChangedEvent>(OnPowerChanged);
|
|
SubscribeLocalEvent<PortableScrubberComponent, ExaminedEvent>(OnExamined);
|
|
SubscribeLocalEvent<PortableScrubberComponent, DestructionEventArgs>(OnDestroyed);
|
|
SubscribeLocalEvent<PortableScrubberComponent, GasAnalyzerScanEvent>(OnScrubberAnalyzed);
|
|
SubscribeLocalEvent<PortableScrubberComponent, RefreshPartsEvent>(OnRefreshParts);
|
|
SubscribeLocalEvent<PortableScrubberComponent, UpgradeExamineEvent>(OnUpgradeExamine);
|
|
}
|
|
|
|
private bool IsFull(PortableScrubberComponent component)
|
|
{
|
|
return component.Air.Pressure >= component.MaxPressure;
|
|
}
|
|
|
|
private void OnDeviceUpdated(EntityUid uid, PortableScrubberComponent component, ref AtmosDeviceUpdateEvent args)
|
|
{
|
|
var timeDelta = args.dt;
|
|
|
|
if (!component.Enabled)
|
|
return;
|
|
|
|
// If we are on top of a connector port, empty into it.
|
|
if (_nodeContainer.TryGetNode(uid, component.PortName, out PortablePipeNode? portableNode)
|
|
&& portableNode.ConnectionsEnabled)
|
|
{
|
|
_atmosphereSystem.React(component.Air, portableNode);
|
|
if (portableNode.NodeGroup is PipeNet {NodeCount: > 1} net)
|
|
_canisterSystem.MixContainerWithPipeNet(component.Air, net.Air);
|
|
}
|
|
|
|
if (IsFull(component))
|
|
{
|
|
UpdateAppearance(uid, true, false);
|
|
return;
|
|
}
|
|
|
|
if (args.Grid is not {} grid)
|
|
return;
|
|
|
|
var position = _transformSystem.GetGridTilePositionOrDefault(uid);
|
|
var environment = _atmosphereSystem.GetTileMixture(grid, args.Map, position, true);
|
|
|
|
var running = Scrub(timeDelta, component, environment);
|
|
|
|
UpdateAppearance(uid, false, running);
|
|
// We scrub once to see if we can and set the animation
|
|
if (!running)
|
|
return;
|
|
|
|
// widenet
|
|
var enumerator = _atmosphereSystem.GetAdjacentTileMixtures(grid, position, false, true);
|
|
while (enumerator.MoveNext(out var adjacent))
|
|
{
|
|
Scrub(timeDelta, component, adjacent);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// If there is a port under us, let us connect with adjacent atmos pipes.
|
|
/// </summary>
|
|
private void OnAnchorChanged(EntityUid uid, PortableScrubberComponent component, ref AnchorStateChangedEvent args)
|
|
{
|
|
if (!_nodeContainer.TryGetNode(uid, component.PortName, out PipeNode? portableNode))
|
|
return;
|
|
|
|
portableNode.ConnectionsEnabled = (args.Anchored && _gasPortableSystem.FindGasPortIn(Transform(uid).GridUid, Transform(uid).Coordinates, out _));
|
|
|
|
_appearance.SetData(uid, PortableScrubberVisuals.IsDraining, portableNode.ConnectionsEnabled);
|
|
}
|
|
|
|
private void OnPowerChanged(EntityUid uid, PortableScrubberComponent component, ref PowerChangedEvent args)
|
|
{
|
|
UpdateAppearance(uid, IsFull(component), args.Powered);
|
|
component.Enabled = args.Powered;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Examining tells you how full it is as a %.
|
|
/// </summary>
|
|
private void OnExamined(EntityUid uid, PortableScrubberComponent component, ExaminedEvent args)
|
|
{
|
|
if (args.IsInDetailsRange)
|
|
{
|
|
var percentage = Math.Round(((component.Air.Pressure) / component.MaxPressure) * 100);
|
|
args.PushMarkup(Loc.GetString("portable-scrubber-fill-level", ("percent", percentage)));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// When this is destroyed, we dump out all the gas inside.
|
|
/// </summary>
|
|
private void OnDestroyed(EntityUid uid, PortableScrubberComponent component, DestructionEventArgs args)
|
|
{
|
|
var environment = _atmosphereSystem.GetContainingMixture(uid, false, true);
|
|
|
|
if (environment != null)
|
|
_atmosphereSystem.Merge(environment, component.Air);
|
|
|
|
_adminLogger.Add(LogType.CanisterPurged, LogImpact.Medium, $"Portable scrubber {ToPrettyString(uid):canister} purged its contents of {component.Air} into the environment.");
|
|
component.Air.Clear();
|
|
}
|
|
|
|
private bool Scrub(float timeDelta, PortableScrubberComponent scrubber, GasMixture? tile)
|
|
{
|
|
return _scrubberSystem.Scrub(timeDelta, scrubber.TransferRate * _atmosphereSystem.PumpSpeedup(), ScrubberPumpDirection.Scrubbing, scrubber.FilterGases, tile, scrubber.Air);
|
|
}
|
|
|
|
private void UpdateAppearance(EntityUid uid, bool isFull, bool isRunning)
|
|
{
|
|
_ambientSound.SetAmbience(uid, isRunning);
|
|
|
|
_appearance.SetData(uid, PortableScrubberVisuals.IsFull, isFull);
|
|
_appearance.SetData(uid, PortableScrubberVisuals.IsRunning, isRunning);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the gas mixture for the gas analyzer
|
|
/// </summary>
|
|
private void OnScrubberAnalyzed(EntityUid uid, PortableScrubberComponent component, GasAnalyzerScanEvent args)
|
|
{
|
|
args.GasMixtures ??= new List<(string, GasMixture?)>();
|
|
args.GasMixtures.Add((Name(uid), component.Air));
|
|
}
|
|
|
|
private void OnRefreshParts(EntityUid uid, PortableScrubberComponent component, RefreshPartsEvent args)
|
|
{
|
|
var pressureRating = args.PartRatings[component.MachinePartMaxPressure];
|
|
var transferRating = args.PartRatings[component.MachinePartTransferRate];
|
|
|
|
component.MaxPressure = component.BaseMaxPressure * MathF.Pow(component.PartRatingMaxPressureModifier, pressureRating - 1);
|
|
component.TransferRate = component.BaseTransferRate * MathF.Pow(component.PartRatingTransferRateModifier, transferRating - 1);
|
|
}
|
|
|
|
private void OnUpgradeExamine(EntityUid uid, PortableScrubberComponent component, UpgradeExamineEvent args)
|
|
{
|
|
args.AddPercentageUpgrade("portable-scrubber-component-upgrade-max-pressure", component.MaxPressure / component.BaseMaxPressure);
|
|
args.AddPercentageUpgrade("portable-scrubber-component-upgrade-transfer-rate", component.TransferRate / component.BaseTransferRate);
|
|
}
|
|
}
|
|
}
|