mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-17 13:37:47 +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)
205 lines
7.6 KiB
C#
205 lines
7.6 KiB
C#
using System.Linq;
|
||
using Content.Server.Anomaly.Components;
|
||
using Content.Server.DeviceLinking.Systems;
|
||
using Content.Server.Power.Components;
|
||
using Content.Server.Power.EntitySystems;
|
||
using Content.Shared.Anomaly.Components;
|
||
using Content.Shared.Examine;
|
||
using Content.Shared.Interaction;
|
||
using Content.Shared.Popups;
|
||
using Content.Shared.Power;
|
||
using Robust.Shared.Audio.Systems;
|
||
using Content.Shared.Verbs;
|
||
|
||
namespace Content.Server.Anomaly;
|
||
|
||
/// <summary>
|
||
/// a device that allows you to translate anomaly activity into multitool signals.
|
||
/// </summary>
|
||
public sealed partial class AnomalySynchronizerSystem : EntitySystem
|
||
{
|
||
[Dependency] private readonly AnomalySystem _anomaly = default!;
|
||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||
[Dependency] private readonly EntityLookupSystem _entityLookup = default!;
|
||
[Dependency] private readonly DeviceLinkSystem _signal = default!;
|
||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||
[Dependency] private readonly PowerReceiverSystem _power = default!;
|
||
|
||
public override void Initialize()
|
||
{
|
||
base.Initialize();
|
||
|
||
SubscribeLocalEvent<AnomalySynchronizerComponent, InteractHandEvent>(OnInteractHand);
|
||
SubscribeLocalEvent<AnomalySynchronizerComponent, PowerChangedEvent>(OnPowerChanged);
|
||
SubscribeLocalEvent<AnomalySynchronizerComponent, ExaminedEvent>(OnExamined);
|
||
SubscribeLocalEvent<AnomalySynchronizerComponent, GetVerbsEvent<InteractionVerb>>(OnGetInteractionVerbs);
|
||
|
||
SubscribeLocalEvent<AnomalyPulseEvent>(OnAnomalyPulse);
|
||
SubscribeLocalEvent<AnomalySeverityChangedEvent>(OnAnomalySeverityChanged);
|
||
SubscribeLocalEvent<AnomalyStabilityChangedEvent>(OnAnomalyStabilityChanged);
|
||
}
|
||
|
||
/// <summary>
|
||
/// If powered, try to attach a nearby anomaly.
|
||
/// </summary>
|
||
public bool TryAttachNearbyAnomaly(Entity<AnomalySynchronizerComponent> ent, EntityUid? user = null)
|
||
{
|
||
if (!_power.IsPowered(ent))
|
||
{
|
||
if (user is not null)
|
||
_popup.PopupEntity(Loc.GetString("base-computer-ui-component-not-powered", ("machine", ent)), ent, user.Value);
|
||
|
||
return false;
|
||
}
|
||
|
||
var coords = _transform.GetMapCoordinates(ent);
|
||
var anomaly = _entityLookup.GetEntitiesInRange<AnomalyComponent>(coords, ent.Comp.AttachRange).FirstOrDefault();
|
||
|
||
if (anomaly.Owner is { Valid: false }) // no anomaly in range
|
||
{
|
||
if (user is not null)
|
||
_popup.PopupEntity(Loc.GetString("anomaly-sync-no-anomaly"), ent, user.Value);
|
||
|
||
return false;
|
||
}
|
||
|
||
ConnectToAnomaly(ent, anomaly);
|
||
return true;
|
||
}
|
||
|
||
private void OnPowerChanged(Entity<AnomalySynchronizerComponent> ent, ref PowerChangedEvent args)
|
||
{
|
||
if (args.Powered)
|
||
return;
|
||
|
||
if (!TryComp<AnomalyComponent>(ent.Comp.ConnectedAnomaly, out var anomaly))
|
||
return;
|
||
|
||
DisconneсtFromAnomaly(ent, anomaly);
|
||
}
|
||
|
||
private void OnExamined(Entity<AnomalySynchronizerComponent> ent, ref ExaminedEvent args)
|
||
{
|
||
args.PushMarkup(Loc.GetString(ent.Comp.ConnectedAnomaly.HasValue ? "anomaly-sync-examine-connected" : "anomaly-sync-examine-not-connected"));
|
||
}
|
||
|
||
private void OnGetInteractionVerbs(Entity<AnomalySynchronizerComponent> ent, ref GetVerbsEvent<InteractionVerb> args)
|
||
{
|
||
if (!args.CanAccess || !args.CanInteract || args.Hands is null || ent.Comp.ConnectedAnomaly.HasValue)
|
||
return;
|
||
|
||
var user = args.User;
|
||
args.Verbs.Add(new()
|
||
{
|
||
Act = () =>
|
||
{
|
||
TryAttachNearbyAnomaly(ent, user);
|
||
},
|
||
Message = Loc.GetString("anomaly-sync-connect-verb-message", ("machine", ent)),
|
||
Text = Loc.GetString("anomaly-sync-connect-verb-text"),
|
||
});
|
||
}
|
||
|
||
private void OnInteractHand(Entity<AnomalySynchronizerComponent> ent, ref InteractHandEvent args)
|
||
{
|
||
TryAttachNearbyAnomaly(ent, args.User);
|
||
}
|
||
|
||
private void ConnectToAnomaly(Entity<AnomalySynchronizerComponent> ent, Entity<AnomalyComponent> anomaly)
|
||
{
|
||
if (ent.Comp.ConnectedAnomaly == anomaly)
|
||
return;
|
||
|
||
ent.Comp.ConnectedAnomaly = anomaly;
|
||
//move the anomaly to the center of the synchronizer, for aesthetics.
|
||
var targetXform = _transform.GetWorldPosition(ent);
|
||
_transform.SetWorldPosition(anomaly, targetXform);
|
||
|
||
if (ent.Comp.PulseOnConnect)
|
||
_anomaly.DoAnomalyPulse(anomaly, anomaly);
|
||
|
||
_popup.PopupEntity(Loc.GetString("anomaly-sync-connected"), ent, PopupType.Medium);
|
||
_audio.PlayPvs(ent.Comp.ConnectedSound, ent);
|
||
}
|
||
|
||
//TO DO: disconnection from the anomaly should also be triggered if the anomaly is far away from the synchronizer.
|
||
//Currently only bluespace anomaly can do this, but for some reason it is the only one that cannot be connected to the synchronizer.
|
||
private void DisconneсtFromAnomaly(Entity<AnomalySynchronizerComponent> ent, AnomalyComponent anomaly)
|
||
{
|
||
if (ent.Comp.ConnectedAnomaly == null)
|
||
return;
|
||
|
||
if (ent.Comp.PulseOnDisconnect)
|
||
_anomaly.DoAnomalyPulse(ent.Comp.ConnectedAnomaly.Value, anomaly);
|
||
|
||
_popup.PopupEntity(Loc.GetString("anomaly-sync-disconnected"), ent, PopupType.Large);
|
||
_audio.PlayPvs(ent.Comp.ConnectedSound, ent);
|
||
|
||
ent.Comp.ConnectedAnomaly = null;
|
||
}
|
||
|
||
private void OnAnomalyPulse(ref AnomalyPulseEvent args)
|
||
{
|
||
var query = EntityQueryEnumerator<AnomalySynchronizerComponent>();
|
||
while (query.MoveNext(out var uid, out var component))
|
||
{
|
||
if (args.Anomaly != component.ConnectedAnomaly)
|
||
continue;
|
||
|
||
if (!_power.IsPowered(uid))
|
||
continue;
|
||
|
||
_signal.InvokePort(uid, component.PulsePort);
|
||
}
|
||
}
|
||
|
||
private void OnAnomalySeverityChanged(ref AnomalySeverityChangedEvent args)
|
||
{
|
||
var query = EntityQueryEnumerator<AnomalySynchronizerComponent>();
|
||
while (query.MoveNext(out var ent, out var component))
|
||
{
|
||
if (args.Anomaly != component.ConnectedAnomaly)
|
||
continue;
|
||
|
||
if (!_power.IsPowered(ent))
|
||
continue;
|
||
|
||
//The superscritical port is invoked not at the AnomalySupercriticalEvent,
|
||
//but at the moment the growth animation starts. Otherwise, there is no point in this port.
|
||
//ATTENTION! the console command supercriticalanomaly does not work here,
|
||
//as it forcefully causes growth to start without increasing severity.
|
||
if (args.Severity >= 1)
|
||
_signal.InvokePort(ent, component.SupercritPort);
|
||
}
|
||
}
|
||
|
||
private void OnAnomalyStabilityChanged(ref AnomalyStabilityChangedEvent args)
|
||
{
|
||
Entity<AnomalyComponent> anomaly = (args.Anomaly, Comp<AnomalyComponent>(args.Anomaly));
|
||
|
||
var query = EntityQueryEnumerator<AnomalySynchronizerComponent>();
|
||
while (query.MoveNext(out var ent, out var component))
|
||
{
|
||
if (component.ConnectedAnomaly != anomaly)
|
||
continue;
|
||
|
||
if (!_power.IsPowered(ent))
|
||
continue;
|
||
|
||
if (args.Stability < anomaly.Comp.DecayThreshold)
|
||
{
|
||
_signal.InvokePort(ent, component.DecayingPort);
|
||
}
|
||
else if (args.Stability > anomaly.Comp.GrowthThreshold)
|
||
{
|
||
_signal.InvokePort(ent, component.GrowingPort);
|
||
}
|
||
else
|
||
{
|
||
_signal.InvokePort(ent, component.StabilizePort);
|
||
}
|
||
}
|
||
}
|
||
}
|