mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-17 21:48:58 +03:00
* Psionics It's a ton of stuff relating to the basic Psionics system and all the powers. I'm saving this as a bit of a sanity check before moving forward. Left to do: 1. Implementing the Psionic faction so that the chat works as intended. 2. Adding the start-state cooldown timers to the actions. * Cleaned up everything with the word 'Psionic' on it. Got the psionic chat working. Got some other stuff working * Some final psionic cleanup. The last batch of content. * Update RobustToolbox * rebased * Revert "Update RobustToolbox" This reverts commit c0cf35d03f828f6ccfeb05fcffd91cf074818fc9. * Update RobustToolbox * Revert "Update RobustToolbox" This reverts commit c4dc828df7912e063ea856b2a83a790bc88d1e09. * Update RobustToolbox * Psionics It's a ton of stuff relating to the basic Psionics system and all the powers. I'm saving this as a bit of a sanity check before moving forward. Left to do: 1. Implementing the Psionic faction so that the chat works as intended. 2. Adding the start-state cooldown timers to the actions. * Cleaned up everything with the word 'Psionic' on it. Got the psionic chat working. Got some other stuff working * Some final psionic cleanup. The last batch of content. * rebased * Cleaned up everything with the word 'Psionic' on it. Got the psionic chat working. Got some other stuff working * Broken Commit With these changes in place, the unit does not work. Recording them so i don't lose my work. * Brings it All Together. Dawn of the final Commit. Rebase completed. * Update RobustToolbox * Changed 'Station Events' to 'StationEvents' and cleaned up the Delta-V Events.yml file of duplicate events. * Delete ghost_roles.yml Duplicate. * Update familiars.yml * Update familiars.yml * Update GlimmerReactiveSystem.cs * Makes tinfoil hats craftable. * Decided I'm not dealing with adding fugitives or Glimmer Wisps right now. * Psionic invisibility won't work now that Eye component exists. Or at least, the integrator test won't psas. * Update special.yml * Added #nyanotrasen code or //Nyanotrasen code to many, many files. * Properly fixes comments. --------- Signed-off-by: Colin-Tel <113523727+Colin-Tel@users.noreply.github.com> Signed-off-by: PHCodes <47927305+PHCodes@users.noreply.github.com> Co-authored-by: Debug <sidneymaatman@gmail.com> Co-authored-by: Colin-Tel <113523727+Colin-Tel@users.noreply.github.com>
220 lines
8.2 KiB
C#
220 lines
8.2 KiB
C#
using Content.Server.Anomaly.Components;
|
|
using Content.Server.Construction;
|
|
using Content.Server.Power.EntitySystems;
|
|
using Content.Shared.Anomaly;
|
|
using Content.Shared.Anomaly.Components;
|
|
using Content.Shared.Examine;
|
|
using Content.Shared.Interaction;
|
|
using Content.Shared.Research.Components;
|
|
using Content.Server.Psionics.Glimmer;
|
|
|
|
namespace Content.Server.Anomaly;
|
|
|
|
/// <summary>
|
|
/// This handles anomalous vessel as well as
|
|
/// the calculations for how many points they
|
|
/// should produce.
|
|
/// </summary>
|
|
public sealed partial class AnomalySystem
|
|
{
|
|
private void InitializeVessel()
|
|
{
|
|
SubscribeLocalEvent<AnomalyVesselComponent, ComponentShutdown>(OnVesselShutdown);
|
|
SubscribeLocalEvent<AnomalyVesselComponent, MapInitEvent>(OnVesselMapInit);
|
|
SubscribeLocalEvent<AnomalyVesselComponent, RefreshPartsEvent>(OnRefreshParts);
|
|
SubscribeLocalEvent<AnomalyVesselComponent, UpgradeExamineEvent>(OnUpgradeExamine);
|
|
SubscribeLocalEvent<AnomalyVesselComponent, InteractUsingEvent>(OnVesselInteractUsing);
|
|
SubscribeLocalEvent<AnomalyVesselComponent, ExaminedEvent>(OnExamined);
|
|
SubscribeLocalEvent<AnomalyVesselComponent, ResearchServerGetPointsPerSecondEvent>(OnVesselGetPointsPerSecond);
|
|
SubscribeLocalEvent<AnomalyVesselComponent, EntityUnpausedEvent>(OnUnpaused);
|
|
SubscribeLocalEvent<AnomalyShutdownEvent>(OnShutdown);
|
|
SubscribeLocalEvent<AnomalyStabilityChangedEvent>(OnStabilityChanged);
|
|
}
|
|
|
|
private void OnStabilityChanged(ref AnomalyStabilityChangedEvent args)
|
|
{
|
|
OnVesselAnomalyStabilityChanged(ref args);
|
|
OnScannerAnomalyStabilityChanged(ref args);
|
|
}
|
|
|
|
private void OnShutdown(ref AnomalyShutdownEvent args)
|
|
{
|
|
OnVesselAnomalyShutdown(ref args);
|
|
OnScannerAnomalyShutdown(ref args);
|
|
}
|
|
|
|
private void OnExamined(EntityUid uid, AnomalyVesselComponent component, ExaminedEvent args)
|
|
{
|
|
if (!args.IsInDetailsRange)
|
|
return;
|
|
|
|
args.PushText(component.Anomaly == null
|
|
? Loc.GetString("anomaly-vessel-component-not-assigned")
|
|
: Loc.GetString("anomaly-vessel-component-assigned"));
|
|
}
|
|
|
|
private void OnVesselShutdown(EntityUid uid, AnomalyVesselComponent component, ComponentShutdown args)
|
|
{
|
|
if (component.Anomaly is not { } anomaly)
|
|
return;
|
|
|
|
if (!TryComp<AnomalyComponent>(anomaly, out var anomalyComp))
|
|
return;
|
|
|
|
anomalyComp.ConnectedVessel = null;
|
|
}
|
|
|
|
private void OnVesselMapInit(EntityUid uid, AnomalyVesselComponent component, MapInitEvent args)
|
|
{
|
|
UpdateVesselAppearance(uid, component);
|
|
}
|
|
|
|
private void OnRefreshParts(EntityUid uid, AnomalyVesselComponent component, RefreshPartsEvent args)
|
|
{
|
|
var modifierRating = args.PartRatings[component.MachinePartPointModifier] - 1;
|
|
component.PointMultiplier = MathF.Pow(component.PartRatingPointModifier, modifierRating);
|
|
}
|
|
|
|
private void OnUpgradeExamine(EntityUid uid, AnomalyVesselComponent component, UpgradeExamineEvent args)
|
|
{
|
|
args.AddPercentageUpgrade("anomaly-vessel-component-upgrade-output", component.PointMultiplier);
|
|
}
|
|
|
|
private void OnVesselInteractUsing(EntityUid uid, AnomalyVesselComponent component, InteractUsingEvent args)
|
|
{
|
|
if (component.Anomaly != null ||
|
|
!TryComp<AnomalyScannerComponent>(args.Used, out var scanner) ||
|
|
scanner.ScannedAnomaly is not { } anomaly)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!TryComp<AnomalyComponent>(anomaly, out var anomalyComponent) || anomalyComponent.ConnectedVessel != null)
|
|
return;
|
|
|
|
// Nyano - Summary - Begin modified code block: tie anomaly harvesting to glimmer rate.
|
|
if (this.IsPowered(uid, EntityManager) &&
|
|
TryComp<GlimmerSourceComponent>(anomaly, out var glimmerSource))
|
|
{
|
|
glimmerSource.Active = true;
|
|
}
|
|
// Nyano - End modified code block.
|
|
|
|
component.Anomaly = scanner.ScannedAnomaly;
|
|
anomalyComponent.ConnectedVessel = uid;
|
|
UpdateVesselAppearance(uid, component);
|
|
Popup.PopupEntity(Loc.GetString("anomaly-vessel-component-anomaly-assigned"), uid);
|
|
}
|
|
|
|
private void OnVesselGetPointsPerSecond(EntityUid uid, AnomalyVesselComponent component, ref ResearchServerGetPointsPerSecondEvent args)
|
|
{
|
|
if (!this.IsPowered(uid, EntityManager) || component.Anomaly is not {} anomaly)
|
|
return;
|
|
|
|
args.Points += (int) (GetAnomalyPointValue(anomaly) * component.PointMultiplier);
|
|
}
|
|
|
|
private void OnUnpaused(EntityUid uid, AnomalyVesselComponent component, ref EntityUnpausedEvent args)
|
|
{
|
|
component.NextBeep += args.PausedTime;
|
|
}
|
|
|
|
private void OnVesselAnomalyShutdown(ref AnomalyShutdownEvent args)
|
|
{
|
|
var query = EntityQueryEnumerator<AnomalyVesselComponent>();
|
|
while (query.MoveNext(out var ent, out var component))
|
|
{
|
|
if (args.Anomaly != component.Anomaly)
|
|
continue;
|
|
|
|
component.Anomaly = null;
|
|
UpdateVesselAppearance(ent, component);
|
|
|
|
if (!args.Supercritical)
|
|
continue;
|
|
_explosion.TriggerExplosive(ent);
|
|
}
|
|
}
|
|
|
|
private void OnVesselAnomalyStabilityChanged(ref AnomalyStabilityChangedEvent args)
|
|
{
|
|
var query = EntityQueryEnumerator<AnomalyVesselComponent>();
|
|
while (query.MoveNext(out var ent, out var component))
|
|
{
|
|
if (args.Anomaly != component.Anomaly)
|
|
continue;
|
|
|
|
UpdateVesselAppearance(ent, component);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates the appearance of an anomaly vessel
|
|
/// based on whether or not it has an anomaly
|
|
/// </summary>
|
|
/// <param name="uid"></param>
|
|
/// <param name="component"></param>
|
|
public void UpdateVesselAppearance(EntityUid uid, AnomalyVesselComponent? component = null)
|
|
{
|
|
if (!Resolve(uid, ref component))
|
|
return;
|
|
|
|
var on = component.Anomaly != null;
|
|
|
|
if (!TryComp<AppearanceComponent>(uid, out var appearanceComponent))
|
|
return;
|
|
|
|
Appearance.SetData(uid, AnomalyVesselVisuals.HasAnomaly, on, appearanceComponent);
|
|
if (_pointLight.TryGetLight(uid, out var pointLightComponent))
|
|
_pointLight.SetEnabled(uid, on, pointLightComponent);
|
|
|
|
// arbitrary value for the generic visualizer to use.
|
|
// i didn't feel like making an enum for this.
|
|
var value = 1;
|
|
if (TryComp<AnomalyComponent>(component.Anomaly, out var anomalyComp))
|
|
{
|
|
if (anomalyComp.Stability <= anomalyComp.DecayThreshold)
|
|
{
|
|
value = 2;
|
|
}
|
|
else if (anomalyComp.Stability >= anomalyComp.GrowthThreshold)
|
|
{
|
|
value = 3;
|
|
}
|
|
}
|
|
Appearance.SetData(uid, AnomalyVesselVisuals.AnomalyState, value, appearanceComponent);
|
|
|
|
_ambient.SetAmbience(uid, on);
|
|
}
|
|
|
|
private void UpdateVessels()
|
|
{
|
|
var query = EntityQueryEnumerator<AnomalyVesselComponent>();
|
|
while (query.MoveNext(out var vesselEnt, out var vessel))
|
|
{
|
|
if (vessel.Anomaly is not { } anomUid)
|
|
continue;
|
|
|
|
if (!TryComp<AnomalyComponent>(anomUid, out var anomaly))
|
|
continue;
|
|
|
|
if (Timing.CurTime < vessel.NextBeep)
|
|
continue;
|
|
|
|
// a lerp between the max and min values for each threshold.
|
|
// longer beeps that get shorter as the anomaly gets more extreme
|
|
float timerPercentage;
|
|
if (anomaly.Stability <= anomaly.DecayThreshold)
|
|
timerPercentage = (anomaly.DecayThreshold - anomaly.Stability) / anomaly.DecayThreshold;
|
|
else if (anomaly.Stability >= anomaly.GrowthThreshold)
|
|
timerPercentage = (anomaly.Stability - anomaly.GrowthThreshold) / (1 - anomaly.GrowthThreshold);
|
|
else //it's not unstable
|
|
continue;
|
|
|
|
Audio.PlayPvs(vessel.BeepSound, vesselEnt);
|
|
var beepInterval = (vessel.MaxBeepInterval - vessel.MinBeepInterval) * (1 - timerPercentage) + vessel.MinBeepInterval;
|
|
vessel.NextBeep = beepInterval + Timing.CurTime;
|
|
}
|
|
}
|
|
}
|