* Refactor battery/powercell assets and add new ones. * committing before I fuck things up * slot component doned I think * dictionary update * Fixes * Moving flashlight to powerslotcomponent * har har i am using the message tubes * Better documentation comment * Reverting this overengineered garbage. * Off with ye I said * Examine texts. * Some minor fixes to IDE complaints * slot size from yaml * Ignored component + removing a useless typo entry * Making stunbatons use this * Handle the message and remove some unnecessary dirtiness * actionblocker checks * remove unused file * remove updatevisual * make these nullable * make these nullable too * Unrename sprite folder * check itemcomponent on insertion * Use SendMessage over Owner.SendMessage * Add support for auto-recharging batteries, an auto-recharging cell, and make flashlight status update correctly if one is inserted in it. * get rid of public fields which are Bad * add a description for the stun baton while i'm in here * one more public field * Add the blinky animation to the atomic cell * Fix the charge indicator being STUPID * better comments * this is a better function * add pause for flashlight, remove unnecessary imports from battery * potato battery copyright link * WHO DID THAT * mr clean has come * Random pitch * pausing * round to nearest levels
117 lines
3.6 KiB
C#
117 lines
3.6 KiB
C#
using System;
|
|
using Content.Shared.GameObjects.Components;
|
|
using Content.Shared.Utility;
|
|
using Robust.Client.Graphics.Drawing;
|
|
using Robust.Client.UserInterface;
|
|
using Robust.Client.UserInterface.Controls;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.Maths;
|
|
using Robust.Shared.Timing;
|
|
using Robust.Shared.ViewVariables;
|
|
|
|
namespace Content.Client.GameObjects.Components
|
|
{
|
|
[RegisterComponent]
|
|
public sealed class HandheldLightComponent : SharedHandheldLightComponent, IItemStatus
|
|
{
|
|
private bool _hasCell;
|
|
|
|
[ViewVariables] public float? Charge { get; private set; }
|
|
[ViewVariables] protected override bool HasCell => _hasCell;
|
|
|
|
public Control MakeControl()
|
|
{
|
|
return new StatusControl(this);
|
|
}
|
|
|
|
public override void HandleComponentState(ComponentState curState, ComponentState nextState)
|
|
{
|
|
if (!(curState is HandheldLightComponentState cast))
|
|
return;
|
|
|
|
Charge = cast.Charge;
|
|
_hasCell = cast.HasCell;
|
|
}
|
|
|
|
private sealed class StatusControl : Control
|
|
{
|
|
private const float TimerCycle = 1;
|
|
|
|
private readonly HandheldLightComponent _parent;
|
|
private readonly PanelContainer[] _sections = new PanelContainer[5];
|
|
|
|
private float _timer;
|
|
|
|
private static readonly StyleBoxFlat _styleBoxLit = new StyleBoxFlat
|
|
{
|
|
BackgroundColor = Color.Green
|
|
};
|
|
|
|
private static readonly StyleBoxFlat _styleBoxUnlit = new StyleBoxFlat
|
|
{
|
|
BackgroundColor = Color.Black
|
|
};
|
|
|
|
public StatusControl(HandheldLightComponent parent)
|
|
{
|
|
_parent = parent;
|
|
|
|
var wrapper = new HBoxContainer
|
|
{
|
|
SeparationOverride = 4,
|
|
SizeFlagsHorizontal = SizeFlags.ShrinkCenter
|
|
};
|
|
|
|
AddChild(wrapper);
|
|
|
|
for (var i = 0; i < _sections.Length; i++)
|
|
{
|
|
var panel = new PanelContainer {CustomMinimumSize = (20, 20)};
|
|
wrapper.AddChild(panel);
|
|
_sections[i] = panel;
|
|
}
|
|
}
|
|
|
|
protected override void Update(FrameEventArgs args)
|
|
{
|
|
base.Update(args);
|
|
|
|
_timer += args.DeltaSeconds;
|
|
_timer %= TimerCycle;
|
|
|
|
var charge = _parent.Charge ?? 0;
|
|
|
|
int level;
|
|
|
|
if (MathHelper.CloseTo(charge, 0))
|
|
{
|
|
level = 0;
|
|
}
|
|
else
|
|
{
|
|
level = ContentHelpers.RoundToNearestLevels(charge, 1.0, 6) + 1;
|
|
}
|
|
|
|
if (level == 0)
|
|
{
|
|
_sections[0].PanelOverride = _styleBoxUnlit;
|
|
}
|
|
else if (level == 1)
|
|
{
|
|
// Flash the last light.
|
|
_sections[0].PanelOverride = _timer > TimerCycle / 2 ? _styleBoxLit : _styleBoxUnlit;
|
|
}
|
|
else
|
|
{
|
|
_sections[0].PanelOverride = _styleBoxLit;
|
|
}
|
|
|
|
_sections[1].PanelOverride = level >= 3 ? _styleBoxLit : _styleBoxUnlit;
|
|
_sections[2].PanelOverride = level >= 4 ? _styleBoxLit : _styleBoxUnlit;
|
|
_sections[3].PanelOverride = level >= 5 ? _styleBoxLit : _styleBoxUnlit;
|
|
_sections[4].PanelOverride = level >= 6 ? _styleBoxLit : _styleBoxUnlit;
|
|
}
|
|
}
|
|
}
|
|
}
|