Move pipe visualizers to systems. (#6565)

This commit is contained in:
Leon Friedrich
2022-02-14 16:20:35 +13:00
committed by GitHub
parent 60524f890f
commit ac23899a39
23 changed files with 340 additions and 568 deletions

View File

@@ -1,14 +1,11 @@
using Content.Shared.Atmos.Piping;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Maths;
namespace Content.Client.Atmos.Visualizers
{
[UsedImplicitly]
public class PipeColorVisualizer : AppearanceVisualizer
public sealed class PipeColorVisualizer : AppearanceVisualizer
{
public override void OnChangeData(AppearanceComponent component)
{
@@ -19,7 +16,9 @@ namespace Content.Client.Atmos.Visualizers
if (component.TryGetData(PipeColorVisuals.Color, out Color color))
{
sprite.LayerSetColor(Layers.Pipe, color);
// T-ray scanner / sub floor runs after this visualizer. Lets not bulldoze transparency.
var layer = sprite[Layers.Pipe];
layer.Color = color.WithAlpha(layer.Color.A);
}
}

View File

@@ -1,105 +0,0 @@
using System;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Piping;
using Content.Shared.SubFloor;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Log;
using Robust.Shared.Maths;
using Robust.Shared.Serialization;
using Robust.Shared.Serialization.Manager.Attributes;
namespace Content.Client.Atmos.Visualizers
{
[UsedImplicitly]
public class PipeConnectorVisualizer : AppearanceVisualizer, ISerializationHooks
{
[DataField("rsi")]
private string _rsi = "Structures/Piping/Atmospherics/pipe.rsi";
[DataField("baseState")]
private string _baseState = "pipeConnector";
private RSI? _connectorRsi;
void ISerializationHooks.AfterDeserialization()
{
var rsiString = SharedSpriteComponent.TextureRoot / _rsi;
var resourceCache = IoCManager.Resolve<IResourceCache>();
if (resourceCache.TryGetResource(rsiString, out RSIResource? rsi))
_connectorRsi = rsi.RSI;
else
Logger.Error($"{nameof(PipeConnectorVisualizer)} could not load to load RSI {rsiString}.");
}
public override void InitializeEntity(EntityUid entity)
{
base.InitializeEntity(entity);
var entities = IoCManager.Resolve<IEntityManager>();
if (!entities.TryGetComponent<ISpriteComponent?>(entity, out var sprite))
return;
if (_connectorRsi == null)
return;
foreach (Layer layerKey in Enum.GetValues(typeof(Layer)))
{
sprite.LayerMapReserveBlank(layerKey);
var layer = sprite.LayerMapGet(layerKey);
sprite.LayerSetRSI(layer, _connectorRsi);
var layerState = _baseState + ((PipeDirection) layerKey);
sprite.LayerSetState(layer, layerState);
}
}
public override void OnChangeData(AppearanceComponent component)
{
base.OnChangeData(component);
var entities = IoCManager.Resolve<IEntityManager>();
if (!entities.TryGetComponent<TransformComponent>(component.Owner, out var xform))
return;
if (!entities.TryGetComponent<ISpriteComponent>(component.Owner, out var sprite))
return;
if (!component.TryGetData(PipeColorVisuals.Color, out Color color))
color = Color.White;
if (!component.TryGetData(PipeVisuals.VisualState, out PipeDirection connectedDirections))
return;
if(!component.TryGetData(SubFloorVisuals.SubFloor, out bool subfloor))
subfloor = true;
var rotation = xform.LocalRotation;
foreach (Layer layerKey in Enum.GetValues(typeof(Layer)))
{
var layer = sprite.LayerMapGet(layerKey);
var dir = (PipeDirection) layerKey;
var visible = subfloor && connectedDirections.HasDirection(dir);
sprite.LayerSetVisible(layer, visible);
if (!visible) continue;
sprite.LayerSetRotation(layer, -rotation);
sprite.LayerSetColor(layer, color);
}
}
private enum Layer : byte
{
NorthConnection = PipeDirection.North,
SouthConnection = PipeDirection.South,
EastConnection = PipeDirection.East,
WestConnection = PipeDirection.West,
}
}
}