salvage magnet status indicator (#12585)
This commit is contained in:
@@ -3,6 +3,7 @@ using Content.Shared.CCVar;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Salvage;
|
||||
using Robust.Server.Maps;
|
||||
using Robust.Shared.Configuration;
|
||||
using Robust.Shared.Map;
|
||||
@@ -27,6 +28,7 @@ namespace Content.Server.Salvage
|
||||
[Dependency] private readonly MapLoaderSystem _map = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly RadioSystem _radioSystem = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
|
||||
|
||||
private static readonly TimeSpan AttachingTime = TimeSpan.FromSeconds(30);
|
||||
private static readonly TimeSpan HoldTime = TimeSpan.FromMinutes(4);
|
||||
@@ -58,6 +60,42 @@ namespace Content.Server.Salvage
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateAppearance(EntityUid uid, SalvageMagnetComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component, false))
|
||||
return;
|
||||
|
||||
_appearanceSystem.SetData(uid, SalvageMagnetVisuals.ReadyBlinking, component.MagnetState.StateType == MagnetStateType.Attaching);
|
||||
_appearanceSystem.SetData(uid, SalvageMagnetVisuals.Ready, component.MagnetState.StateType == MagnetStateType.Holding);
|
||||
_appearanceSystem.SetData(uid, SalvageMagnetVisuals.Unready, component.MagnetState.StateType == MagnetStateType.CoolingDown);
|
||||
_appearanceSystem.SetData(uid, SalvageMagnetVisuals.UnreadyBlinking, component.MagnetState.StateType == MagnetStateType.Detaching);
|
||||
}
|
||||
|
||||
private void UpdateChargeStateAppearance(EntityUid uid, TimeSpan currentTime, SalvageMagnetComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component, false))
|
||||
return;
|
||||
|
||||
int timeLeft = (component.MagnetState.Until.Minutes * 60 + component.MagnetState.Until.Seconds) - (currentTime.Minutes * 60 + currentTime.Seconds);
|
||||
if (component.MagnetState.StateType == MagnetStateType.Inactive)
|
||||
component.ChargeRemaining = 5;
|
||||
else if (component.MagnetState.StateType == MagnetStateType.Holding)
|
||||
{
|
||||
component.ChargeRemaining = (timeLeft / ((HoldTime.Minutes * 60 + HoldTime.Seconds) / component.ChargeCapacity)) + 1;
|
||||
}
|
||||
else if (component.MagnetState.StateType == MagnetStateType.Detaching)
|
||||
component.ChargeRemaining = 0;
|
||||
else if (component.MagnetState.StateType == MagnetStateType.CoolingDown)
|
||||
{
|
||||
component.ChargeRemaining = component.ChargeCapacity - (timeLeft / ((CooldownTime.Minutes * 60 + CooldownTime.Seconds) / component.ChargeCapacity)) - 1;
|
||||
}
|
||||
if (component.PreviousCharge != component.ChargeRemaining)
|
||||
{
|
||||
_appearanceSystem.SetData(uid, SalvageMagnetVisuals.ChargeState, component.ChargeRemaining);
|
||||
component.PreviousCharge = component.ChargeRemaining;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGridRemoval(GridRemovalEvent ev)
|
||||
{
|
||||
// If we ever want to give magnets names, and announce them individually, we would need to loop this, before removing it.
|
||||
@@ -146,6 +184,7 @@ namespace Content.Server.Salvage
|
||||
return;
|
||||
args.Handled = true;
|
||||
StartMagnet(component, args.User);
|
||||
UpdateAppearance(uid, component);
|
||||
}
|
||||
|
||||
private void StartMagnet(SalvageMagnetComponent component, EntityUid user)
|
||||
@@ -356,6 +395,8 @@ namespace Content.Server.Salvage
|
||||
magnet.MagnetState = MagnetState.Inactive;
|
||||
break;
|
||||
}
|
||||
UpdateAppearance(magnet.Owner, magnet);
|
||||
UpdateChargeStateAppearance(magnet.Owner, currentTime, magnet);
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
@@ -373,8 +414,10 @@ namespace Content.Server.Salvage
|
||||
state.CurrentTime += secondsPassed;
|
||||
|
||||
var deleteQueue = new RemQueue<SalvageMagnetComponent>();
|
||||
|
||||
foreach(var magnet in state.ActiveMagnets)
|
||||
{
|
||||
UpdateChargeStateAppearance(magnet.Owner, state.CurrentTime, magnet);
|
||||
if (magnet.MagnetState.Until > state.CurrentTime) continue;
|
||||
Transition(magnet, state.CurrentTime);
|
||||
if (magnet.MagnetState.StateType == MagnetStateType.Inactive)
|
||||
|
||||
Reference in New Issue
Block a user