mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-17 21:48:58 +03:00
## 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>
254 lines
11 KiB
C#
254 lines
11 KiB
C#
using Content.Server.Atmos.Components;
|
|
using Content.Shared.Atmos;
|
|
using Content.Shared.Mobs.Components;
|
|
using Content.Shared.Physics;
|
|
using Robust.Shared.Audio;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Physics;
|
|
using Robust.Shared.Physics.Components;
|
|
using Robust.Shared.Random;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Content.Server.Atmos.EntitySystems
|
|
{
|
|
public sealed partial class AtmosphereSystem
|
|
{
|
|
private const int SpaceWindSoundCooldownCycles = 75;
|
|
|
|
private int _spaceWindSoundCooldown = 0;
|
|
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
public string? SpaceWindSound { get; private set; } = "/Audio/Effects/space_wind.ogg";
|
|
|
|
private readonly HashSet<Entity<MovedByPressureComponent>> _activePressures = new(8);
|
|
|
|
private void UpdateHighPressure(float frameTime)
|
|
{
|
|
var toRemove = new RemQueue<Entity<MovedByPressureComponent>>();
|
|
|
|
foreach (var ent in _activePressures)
|
|
{
|
|
var (uid, comp) = ent;
|
|
MetaDataComponent? metadata = null;
|
|
|
|
if (Deleted(uid, metadata))
|
|
{
|
|
toRemove.Add((uid, comp));
|
|
continue;
|
|
}
|
|
|
|
if (Paused(uid, metadata))
|
|
continue;
|
|
|
|
comp.Accumulator += frameTime;
|
|
|
|
if (comp.Accumulator < 2f)
|
|
continue;
|
|
|
|
// Reset it just for VV reasons even though it doesn't matter
|
|
comp.Accumulator = 0f;
|
|
toRemove.Add(ent);
|
|
|
|
if (HasComp<MobStateComponent>(uid) &&
|
|
TryComp<PhysicsComponent>(uid, out var body))
|
|
{
|
|
_physics.SetBodyStatus(uid, body, BodyStatus.OnGround);
|
|
}
|
|
|
|
if (TryComp<FixturesComponent>(uid, out var fixtures))
|
|
{
|
|
foreach (var (id, fixture) in fixtures.Fixtures)
|
|
{
|
|
_physics.AddCollisionMask(uid, id, fixture, (int) CollisionGroup.TableLayer, manager: fixtures);
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach (var comp in toRemove)
|
|
{
|
|
_activePressures.Remove(comp);
|
|
}
|
|
}
|
|
|
|
private void AddMobMovedByPressure(EntityUid uid, MovedByPressureComponent component, PhysicsComponent body)
|
|
{
|
|
if (!TryComp<FixturesComponent>(uid, out var fixtures))
|
|
return;
|
|
|
|
_physics.SetBodyStatus(uid, body, BodyStatus.InAir);
|
|
|
|
foreach (var (id, fixture) in fixtures.Fixtures)
|
|
{
|
|
_physics.RemoveCollisionMask(uid, id, fixture, (int) CollisionGroup.TableLayer, manager: fixtures);
|
|
}
|
|
|
|
// TODO: Make them dynamic type? Ehh but they still want movement so uhh make it non-predicted like weightless?
|
|
// idk it's hard.
|
|
|
|
component.Accumulator = 0f;
|
|
_activePressures.Add((uid, component));
|
|
}
|
|
|
|
private void HighPressureMovements(Entity<GridAtmosphereComponent> gridAtmosphere, TileAtmosphere tile, EntityQuery<PhysicsComponent> bodies, EntityQuery<TransformComponent> xforms, EntityQuery<MovedByPressureComponent> pressureQuery, EntityQuery<MetaDataComponent> metas)
|
|
{
|
|
// TODO ATMOS finish this
|
|
|
|
// Don't play the space wind sound on tiles that are on fire...
|
|
if (tile.PressureDifference > 15 && !tile.Hotspot.Valid)
|
|
{
|
|
if (_spaceWindSoundCooldown == 0 && !string.IsNullOrEmpty(SpaceWindSound))
|
|
{
|
|
var coordinates = _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.GridIndices);
|
|
_audio.PlayPvs(SpaceWindSound, coordinates, AudioParams.Default.WithVariation(0.125f).WithVolume(MathHelper.Clamp(tile.PressureDifference / 10, 10, 100)));
|
|
}
|
|
}
|
|
|
|
|
|
if (tile.PressureDifference > 100)
|
|
{
|
|
// TODO ATMOS Do space wind graphics here!
|
|
}
|
|
|
|
if (_spaceWindSoundCooldown++ > SpaceWindSoundCooldownCycles)
|
|
_spaceWindSoundCooldown = 0;
|
|
|
|
// No atmos yeets, return early.
|
|
if (!SpaceWind)
|
|
return;
|
|
|
|
// Used by ExperiencePressureDifference to correct push/throw directions from tile-relative to physics world.
|
|
var gridWorldRotation = xforms.GetComponent(gridAtmosphere).WorldRotation;
|
|
|
|
// If we're using monstermos, smooth out the yeet direction to follow the flow
|
|
if (MonstermosEqualization)
|
|
{
|
|
// We step through tiles according to the pressure direction on the current tile.
|
|
// The goal is to get a general direction of the airflow in the area.
|
|
// 3 is the magic number - enough to go around corners, but not U-turns.
|
|
var curTile = tile;
|
|
for (var i = 0; i < 3; i++)
|
|
{
|
|
if (curTile.PressureDirection == AtmosDirection.Invalid
|
|
|| !curTile.AdjacentBits.IsFlagSet(curTile.PressureDirection))
|
|
break;
|
|
curTile = curTile.AdjacentTiles[curTile.PressureDirection.ToIndex()]!;
|
|
}
|
|
|
|
if (curTile != tile)
|
|
tile.PressureSpecificTarget = curTile;
|
|
}
|
|
|
|
_entSet.Clear();
|
|
_lookup.GetLocalEntitiesIntersecting(tile.GridIndex, tile.GridIndices, _entSet, 0f);
|
|
|
|
foreach (var entity in _entSet)
|
|
{
|
|
// Ideally containers would have their own EntityQuery internally or something given recursively it may need to slam GetComp<T> anyway.
|
|
// Also, don't care about static bodies (but also due to collisionwakestate can't query dynamic directly atm).
|
|
if (!bodies.TryGetComponent(entity, out var body) ||
|
|
!pressureQuery.TryGetComponent(entity, out var pressure) ||
|
|
!pressure.Enabled)
|
|
continue;
|
|
|
|
if (_containers.IsEntityInContainer(entity, metas.GetComponent(entity))) continue;
|
|
|
|
var pressureMovements = EnsureComp<MovedByPressureComponent>(entity);
|
|
if (pressure.LastHighPressureMovementAirCycle < gridAtmosphere.Comp.UpdateCounter)
|
|
{
|
|
// tl;dr YEET
|
|
ExperiencePressureDifference(
|
|
(entity, pressureMovements),
|
|
gridAtmosphere.Comp.UpdateCounter,
|
|
tile.PressureDifference,
|
|
tile.PressureDirection, 0,
|
|
tile.PressureSpecificTarget != null ? _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.PressureSpecificTarget.GridIndices) : EntityCoordinates.Invalid,
|
|
gridWorldRotation,
|
|
xforms.GetComponent(entity),
|
|
body);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Called from AtmosphereSystem.LINDA.cs with SpaceWind CVar check handled there.
|
|
private void ConsiderPressureDifference(GridAtmosphereComponent gridAtmosphere, TileAtmosphere tile, AtmosDirection differenceDirection, float difference)
|
|
{
|
|
gridAtmosphere.HighPressureDelta.Add(tile);
|
|
|
|
if (difference <= tile.PressureDifference)
|
|
return;
|
|
|
|
tile.PressureDifference = difference;
|
|
tile.PressureDirection = differenceDirection;
|
|
}
|
|
|
|
public void ExperiencePressureDifference(
|
|
Entity<MovedByPressureComponent> ent,
|
|
int cycle,
|
|
float pressureDifference,
|
|
AtmosDirection direction,
|
|
float pressureResistanceProbDelta,
|
|
EntityCoordinates throwTarget,
|
|
Angle gridWorldRotation,
|
|
TransformComponent? xform = null,
|
|
PhysicsComponent? physics = null)
|
|
{
|
|
var (uid, component) = ent;
|
|
if (!Resolve(uid, ref physics, false))
|
|
return;
|
|
|
|
if (!Resolve(uid, ref xform))
|
|
return;
|
|
|
|
// TODO ATMOS stuns?
|
|
|
|
var maxForce = MathF.Sqrt(pressureDifference) * 2.25f;
|
|
var moveProb = 100f;
|
|
|
|
if (component.PressureResistance > 0)
|
|
moveProb = MathF.Abs((pressureDifference / component.PressureResistance * MovedByPressureComponent.ProbabilityBasePercent) -
|
|
MovedByPressureComponent.ProbabilityOffset);
|
|
|
|
// Can we yeet the thing (due to probability, strength, etc.)
|
|
if (moveProb > MovedByPressureComponent.ProbabilityOffset && _robustRandom.Prob(MathF.Min(moveProb / 100f, 1f))
|
|
&& !float.IsPositiveInfinity(component.MoveResist)
|
|
&& (physics.BodyType != BodyType.Static
|
|
&& (maxForce >= (component.MoveResist * MovedByPressureComponent.MoveForcePushRatio)))
|
|
|| (physics.BodyType == BodyType.Static && (maxForce >= (component.MoveResist * MovedByPressureComponent.MoveForceForcePushRatio))))
|
|
{
|
|
if (HasComp<MobStateComponent>(uid))
|
|
{
|
|
AddMobMovedByPressure(uid, component, physics);
|
|
}
|
|
|
|
if (maxForce > MovedByPressureComponent.ThrowForce)
|
|
{
|
|
var moveForce = maxForce;
|
|
moveForce /= (throwTarget != EntityCoordinates.Invalid) ? SpaceWindPressureForceDivisorThrow : SpaceWindPressureForceDivisorPush;
|
|
moveForce *= MathHelper.Clamp(moveProb, 0, 100);
|
|
|
|
// Apply a sanity clamp to prevent being thrown through objects.
|
|
var maxSafeForceForObject = SpaceWindMaxVelocity * physics.Mass;
|
|
moveForce = MathF.Min(moveForce, maxSafeForceForObject);
|
|
|
|
// Grid-rotation adjusted direction
|
|
var dirVec = (direction.ToAngle() + gridWorldRotation).ToWorldVec();
|
|
|
|
// TODO: Technically these directions won't be correct but uhh I'm just here for optimisations buddy not to fix my old bugs.
|
|
if (throwTarget != EntityCoordinates.Invalid)
|
|
{
|
|
var pos = ((throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition).Normalized() + dirVec).Normalized();
|
|
_physics.ApplyLinearImpulse(uid, pos * moveForce, body: physics);
|
|
}
|
|
else
|
|
{
|
|
moveForce = MathF.Min(moveForce, SpaceWindMaxPushForce);
|
|
_physics.ApplyLinearImpulse(uid, dirVec * moveForce, body: physics);
|
|
}
|
|
|
|
component.LastHighPressureMovementAirCycle = cycle;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|