Files
tbd-station-14/Content.Client/Weapons/Melee/EnergySwordVisualizer.cs
2022-02-16 18:23:23 +11:00

97 lines
3.2 KiB
C#

using Content.Shared.Item;
using Content.Shared.Weapons.Melee;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Maths;
namespace Content.Client.Weapons.Melee;
public sealed class EnergySwordVisualizer : AppearanceVisualizer
{
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
var entManager = IoCManager.Resolve<IEntityManager>();
component.TryGetData(EnergySwordVisuals.State, out EnergySwordStatus? status);
status ??= EnergySwordStatus.Off;
component.TryGetData(EnergySwordVisuals.Color, out Color? color);
color ??= Color.DodgerBlue;
entManager.TryGetComponent(component.Owner, out SpriteComponent? spriteComponent);
if ((status & EnergySwordStatus.On) != 0x0)
{
TurnOn(component, status.Value, color.Value, entManager, spriteComponent);
}
else
{
TurnOff(component, status.Value, entManager, spriteComponent);
}
}
private void TurnOn(
AppearanceComponent component,
EnergySwordStatus status,
Color color,
IEntityManager entManager,
SpriteComponent? spriteComponent = null)
{
if ((status & EnergySwordStatus.Hacked) != 0x0)
{
if (entManager.TryGetComponent(component.Owner, out SharedItemComponent? itemComponent))
{
itemComponent.EquippedPrefix = "on-rainbow";
}
//todo: figure out how to use the RGBLightControllerSystem to phase out the rainbow sprite AND add lights.
spriteComponent?.LayerSetColor(1, Color.White);
spriteComponent?.LayerSetVisible(1, false);
spriteComponent?.LayerSetState(0, "e_sword_rainbow_on");
}
else
{
if (entManager.TryGetComponent(component.Owner, out SharedItemComponent? itemComponent))
{
itemComponent.EquippedPrefix = "on";
itemComponent.Color = color;
}
spriteComponent?.LayerSetColor(1, color);
spriteComponent?.LayerSetVisible(1, true);
if (entManager.TryGetComponent(component.Owner, out PointLightComponent? pointLightComponent))
{
pointLightComponent.Color = color;
pointLightComponent.Enabled = true;
}
}
}
private void TurnOff(
AppearanceComponent component,
EnergySwordStatus status,
IEntityManager entManager,
SpriteComponent? spriteComponent = null)
{
if (entManager.TryGetComponent(component.Owner, out SharedItemComponent? itemComponent))
{
itemComponent.EquippedPrefix = "off";
}
if ((status & EnergySwordStatus.Hacked) != 0x0)
{
spriteComponent?.LayerSetState(0, "e_sword");
}
else
{
spriteComponent?.LayerSetVisible(1, false);
}
if (entManager.TryGetComponent(component.Owner, out PointLightComponent? pointLightComponent))
{
pointLightComponent.Enabled = false;
}
}
}