salvage magnet status indicator (#12585)

This commit is contained in:
Justin Trotter
2022-11-14 01:45:45 -06:00
committed by GitHub
parent bd50d4b6cd
commit c4dca43d78
15 changed files with 181 additions and 6 deletions

View File

@@ -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)