Files
wwdpublic/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs
SimpleStation14 3b2a19d9ec Mirror: Code cleanup: Purge calls to obsolete EntityCoordinates methods (#289)
## Mirror of PR #26292: [Code cleanup: Purge calls to obsolete
EntityCoordinates
methods](https://github.com/space-wizards/space-station-14/pull/26292)
from <img src="https://avatars.githubusercontent.com/u/10567778?v=4"
alt="space-wizards" width="22"/>
[space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14)

###### `f4cb02fb0ca385c858569c07c51afb0d24ade949`

PR opened by <img
src="https://avatars.githubusercontent.com/u/85356?v=4" width="16"/><a
href="https://github.com/Tayrtahn"> Tayrtahn</a> at 2024-03-20 16:04:43
UTC

---

PR changed 34 files with 70 additions and 56 deletions.

The PR had the following labels:
- Status: Needs Review


---

<details open="true"><summary><h1>Original Body</h1></summary>

> <!-- Please read these guidelines before opening your PR:
https://docs.spacestation14.io/en/getting-started/pr-guideline -->
> <!-- The text between the arrows are comments - they will not be
visible on your PR. -->
> 
> ## About the PR
> <!-- What did you change in this PR? -->
> Cleaned up some outdated code.
> 
> ## Why / Balance
> <!-- Why was it changed? Link any discussions or issues here. Please
discuss how this would affect game balance. -->
> Clean code is happy code.
> 
> ## Technical details
> <!-- If this is a code change, summarize at high level how your new
code works. This makes it easier to review. -->
> Updated all calls to obsolete EntityCoordinates methods (ToMap,
ToMapPos, FromMap, ToVector2i, InRange) to non-obsolete ones (by passing
in SharedTransformSystem as an arg).
> 
> ## Media
> <!-- 
> PRs which make ingame changes (adding clothing, items, new features,
etc) are required to have media attached that showcase the changes.
> Small fixes/refactors are exempt.
> Any media may be used in SS14 progress reports, with clear credit
given.
> 
> If you're unsure whether your PR will require media, ask a maintainer.
> 
> Check the box below to confirm that you have in fact seen this (put an
X in the brackets, like [X]):
> -->
> Code
> - [X] I have added screenshots/videos to this PR showcasing its
changes ingame, **or** this PR does not require an ingame showcase
> 
> ## Breaking changes
> <!--
> List any breaking changes, including namespace, public
class/method/field changes, prototype renames; and provide instructions
for fixing them. This will be pasted in #codebase-changes.
> -->
> 
> **Changelog**
> <!--
> Make players aware of new features and changes that could affect how
they play the game by adding a Changelog entry. Please read the
Changelog guidelines located at:
https://docs.spacestation14.io/en/getting-started/pr-guideline#changelog
> -->
> 
> <!--
> Make sure to take this Changelog template out of the comment block in
order for it to show up.
> 🆑
> - add: Added fun!
> - remove: Removed fun!
> - tweak: Changed fun!
> - fix: Fixed fun!
> -->
> 


</details>

---------

Signed-off-by: VMSolidus <evilexecutive@gmail.com>
Co-authored-by: SimpleStation14 <Unknown>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2024-05-28 23:36:53 -04:00

102 lines
3.6 KiB
C#

using Content.Server.Physics.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.Singularity.Components;
using Content.Shared.Singularity.Components;
using Robust.Shared.Map;
using Robust.Shared.Timing;
using System.Numerics;
namespace Content.Server.Singularity.EntitySystems;
/// <summary>
/// Handles singularity attractors.
/// </summary>
public sealed class SingularityAttractorSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
/// <summary>
/// The minimum range at which the attraction will act.
/// Prevents division by zero problems.
/// </summary>
public const float MinAttractRange = 0.00001f;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SingularityAttractorComponent, MapInitEvent>(OnMapInit);
}
/// <summary>
/// Updates the pulse cooldowns of all singularity attractors.
/// If they are off cooldown it makes them emit an attraction pulse and reset their cooldown.
/// </summary>
/// <param name="frameTime">The time elapsed since the last set of updates.</param>
public override void Update(float frameTime)
{
if (!_timing.IsFirstTimePredicted)
return;
var query = EntityQueryEnumerator<SingularityAttractorComponent, TransformComponent>();
var now = _timing.CurTime;
while (query.MoveNext(out var uid, out var attractor, out var xform))
{
if (attractor.LastPulseTime + attractor.TargetPulsePeriod <= now)
Update(uid, attractor, xform);
}
}
/// <summary>
/// Makes an attractor attract all singularities and puts it on cooldown.
/// </summary>
/// <param name="uid">The uid of the attractor to make pulse.</param>
/// <param name="attractor">The state of the attractor to make pulse.</param>
/// <param name="xform">The transform of the attractor to make pulse.</param>
private void Update(EntityUid uid, SingularityAttractorComponent? attractor = null, TransformComponent? xform = null)
{
if (!Resolve(uid, ref attractor, ref xform))
return;
if (!this.IsPowered(uid, EntityManager))
return;
attractor.LastPulseTime = _timing.CurTime;
var mapPos = xform.Coordinates.ToMap(EntityManager, _transform);
if (mapPos == MapCoordinates.Nullspace)
return;
var query = EntityQuery<SingularityComponent, RandomWalkComponent, TransformComponent>();
foreach (var (singulo, walk, singuloXform) in query)
{
var singuloMapPos = singuloXform.Coordinates.ToMap(EntityManager, _transform);
if (singuloMapPos.MapId != mapPos.MapId)
continue;
var biasBy = mapPos.Position - singuloMapPos.Position;
var length = biasBy.Length();
if (length <= MinAttractRange)
return;
biasBy = Vector2.Normalize(biasBy) * (attractor.BaseRange / length);
walk.BiasVector += biasBy;
}
}
/// <summary>
/// Resets the pulse timings of the attractor when the component starts up.
/// </summary>
/// <param name="uid">The uid of the attractor to start up.</param>
/// <param name="comp">The state of the attractor to start up.</param>
/// <param name="args">The startup prompt arguments.</param>
private void OnMapInit(Entity<SingularityAttractorComponent> ent, ref MapInitEvent args)
{
ent.Comp.LastPulseTime = _timing.CurTime;
}
}