Atmos device performance improvements (#26493)
* Atmos device performance improvements * AtmosDirection perf improvements * Fix errors * Add GasTileOverlayComponent arguments * Make excite no longer invalidate a tile
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Numerics;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Atmos
|
||||
@@ -15,6 +16,8 @@ namespace Content.Shared.Atmos
|
||||
South = 1 << 1, // 2
|
||||
East = 1 << 2, // 4
|
||||
West = 1 << 3, // 8
|
||||
// If more directions are added, note that AtmosDirectionHelpers.ToOppositeIndex() expects opposite directions
|
||||
// to come in pairs
|
||||
|
||||
NorthEast = North | East, // 5
|
||||
SouthEast = South | East, // 6
|
||||
@@ -42,6 +45,22 @@ namespace Content.Shared.Atmos
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This returns the index that corresponds to the opposite direction of some other direction index.
|
||||
/// I.e., <c>1<<OppositeIndex(i) == (1<<i).GetOpposite()</c>
|
||||
/// </summary>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static int ToOppositeIndex(this int index)
|
||||
{
|
||||
return index ^ 1;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static AtmosDirection ToOppositeDir(this int index)
|
||||
{
|
||||
return (AtmosDirection) (1 << (index ^ 1));
|
||||
}
|
||||
|
||||
public static Direction ToDirection(this AtmosDirection direction)
|
||||
{
|
||||
return direction switch
|
||||
@@ -119,10 +138,11 @@ namespace Content.Shared.Atmos
|
||||
return angle.GetDir().ToAtmosDirection();
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static int ToIndex(this AtmosDirection direction)
|
||||
{
|
||||
// This will throw if you pass an invalid direction. Not this method's fault, but yours!
|
||||
return (int) Math.Log2((int) direction);
|
||||
return BitOperations.Log2((uint)direction);
|
||||
}
|
||||
|
||||
public static AtmosDirection WithFlag(this AtmosDirection direction, AtmosDirection other)
|
||||
|
||||
@@ -15,14 +15,7 @@ public sealed class WeldableSystem : EntitySystem
|
||||
[Dependency] private readonly SharedToolSystem _toolSystem = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
|
||||
public bool IsWelded(EntityUid uid, WeldableComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component, false))
|
||||
return false;
|
||||
|
||||
return component.IsWelded;
|
||||
}
|
||||
private EntityQuery<WeldableComponent> _query;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -31,6 +24,13 @@ public sealed class WeldableSystem : EntitySystem
|
||||
SubscribeLocalEvent<WeldableComponent, WeldFinishedEvent>(OnWeldFinished);
|
||||
SubscribeLocalEvent<LayerChangeOnWeldComponent, WeldableChangedEvent>(OnWeldChanged);
|
||||
SubscribeLocalEvent<WeldableComponent, ExaminedEvent>(OnExamine);
|
||||
|
||||
_query = GetEntityQuery<WeldableComponent>();
|
||||
}
|
||||
|
||||
public bool IsWelded(EntityUid uid, WeldableComponent? component = null)
|
||||
{
|
||||
return _query.Resolve(uid, ref component, false) && component.IsWelded;
|
||||
}
|
||||
|
||||
private void OnExamine(EntityUid uid, WeldableComponent component, ExaminedEvent args)
|
||||
@@ -49,7 +49,7 @@ public sealed class WeldableSystem : EntitySystem
|
||||
|
||||
private bool CanWeld(EntityUid uid, EntityUid tool, EntityUid user, WeldableComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component))
|
||||
if (!_query.Resolve(uid, ref component))
|
||||
return false;
|
||||
|
||||
// Other component systems
|
||||
@@ -63,7 +63,7 @@ public sealed class WeldableSystem : EntitySystem
|
||||
|
||||
private bool TryWeld(EntityUid uid, EntityUid tool, EntityUid user, WeldableComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component))
|
||||
if (!_query.Resolve(uid, ref component))
|
||||
return false;
|
||||
|
||||
if (!CanWeld(uid, tool, user, component))
|
||||
@@ -115,17 +115,13 @@ public sealed class WeldableSystem : EntitySystem
|
||||
|
||||
private void UpdateAppearance(EntityUid uid, WeldableComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component))
|
||||
return;
|
||||
|
||||
if (!TryComp(uid, out AppearanceComponent? appearance))
|
||||
return;
|
||||
_appearance.SetData(uid, WeldableVisuals.IsWelded, component.IsWelded, appearance);
|
||||
if (_query.Resolve(uid, ref component))
|
||||
_appearance.SetData(uid, WeldableVisuals.IsWelded, component.IsWelded);
|
||||
}
|
||||
|
||||
public void SetWeldedState(EntityUid uid, bool state, WeldableComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component))
|
||||
if (!_query.Resolve(uid, ref component))
|
||||
return;
|
||||
|
||||
if (component.IsWelded == state)
|
||||
@@ -141,7 +137,7 @@ public sealed class WeldableSystem : EntitySystem
|
||||
|
||||
public void SetWeldingTime(EntityUid uid, TimeSpan time, WeldableComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component))
|
||||
if (!_query.Resolve(uid, ref component))
|
||||
return;
|
||||
|
||||
if (component.WeldingTime.Equals(time))
|
||||
|
||||
Reference in New Issue
Block a user