Specifically if a grid splits under the cvar size it doesn't get a label. This also stops stuff like shuttles splitting in half creating new entries for the new grids. Splitting code leaves the largest grid as the existing one so this will always prefer to keep it large (but if there's multiple splits it won't adjust).
115 lines
3.5 KiB
C#
115 lines
3.5 KiB
C#
using Content.Server.Shuttles.Components;
|
|
using Content.Shared.CCVar;
|
|
using Content.Shared.Shuttles.BUIStates;
|
|
using Content.Shared.Shuttles.Components;
|
|
using Content.Shared.Shuttles.Events;
|
|
|
|
namespace Content.Server.Shuttles.Systems;
|
|
|
|
public sealed partial class ShuttleSystem
|
|
{
|
|
private void InitializeIFF()
|
|
{
|
|
SubscribeLocalEvent<IFFConsoleComponent, AnchorStateChangedEvent>(OnIFFConsoleAnchor);
|
|
SubscribeLocalEvent<IFFConsoleComponent, IFFShowIFFMessage>(OnIFFShow);
|
|
SubscribeLocalEvent<IFFConsoleComponent, IFFShowVesselMessage>(OnIFFShowVessel);
|
|
SubscribeLocalEvent<GridSplitEvent>(OnGridSplit);
|
|
}
|
|
|
|
private void OnGridSplit(ref GridSplitEvent ev)
|
|
{
|
|
var splitMass = _cfg.GetCVar(CCVars.HideSplitGridsUnder);
|
|
|
|
if (splitMass < 0)
|
|
return;
|
|
|
|
foreach (var grid in ev.NewGrids)
|
|
{
|
|
if (!_physicsQuery.TryGetComponent(grid, out var physics) ||
|
|
physics.Mass > splitMass)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
AddIFFFlag(grid, IFFFlags.HideLabel);
|
|
}
|
|
}
|
|
|
|
private void OnIFFShow(EntityUid uid, IFFConsoleComponent component, IFFShowIFFMessage args)
|
|
{
|
|
if (!TryComp(uid, out TransformComponent? xform) || xform.GridUid == null ||
|
|
(component.AllowedFlags & IFFFlags.HideLabel) == 0x0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!args.Show)
|
|
{
|
|
AddIFFFlag(xform.GridUid.Value, IFFFlags.HideLabel);
|
|
}
|
|
else
|
|
{
|
|
RemoveIFFFlag(xform.GridUid.Value, IFFFlags.HideLabel);
|
|
}
|
|
}
|
|
|
|
private void OnIFFShowVessel(EntityUid uid, IFFConsoleComponent component, IFFShowVesselMessage args)
|
|
{
|
|
if (!TryComp(uid, out TransformComponent? xform) || xform.GridUid == null ||
|
|
(component.AllowedFlags & IFFFlags.Hide) == 0x0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!args.Show)
|
|
{
|
|
AddIFFFlag(xform.GridUid.Value, IFFFlags.Hide);
|
|
}
|
|
else
|
|
{
|
|
RemoveIFFFlag(xform.GridUid.Value, IFFFlags.Hide);
|
|
}
|
|
}
|
|
|
|
private void OnIFFConsoleAnchor(EntityUid uid, IFFConsoleComponent component, ref AnchorStateChangedEvent args)
|
|
{
|
|
// If we anchor / re-anchor then make sure flags up to date.
|
|
if (!args.Anchored ||
|
|
!TryComp(uid, out TransformComponent? xform) ||
|
|
!TryComp<IFFComponent>(xform.GridUid, out var iff))
|
|
{
|
|
_uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
|
|
{
|
|
AllowedFlags = component.AllowedFlags,
|
|
Flags = IFFFlags.None,
|
|
});
|
|
}
|
|
else
|
|
{
|
|
_uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
|
|
{
|
|
AllowedFlags = component.AllowedFlags,
|
|
Flags = iff.Flags,
|
|
});
|
|
}
|
|
}
|
|
|
|
protected override void UpdateIFFInterfaces(EntityUid gridUid, IFFComponent component)
|
|
{
|
|
base.UpdateIFFInterfaces(gridUid, component);
|
|
|
|
var query = AllEntityQuery<IFFConsoleComponent, TransformComponent>();
|
|
while (query.MoveNext(out var uid, out var comp, out var xform))
|
|
{
|
|
if (xform.GridUid != gridUid)
|
|
continue;
|
|
|
|
_uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
|
|
{
|
|
AllowedFlags = comp.AllowedFlags,
|
|
Flags = component.Flags,
|
|
});
|
|
}
|
|
}
|
|
}
|