public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponent>
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
+ [Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
// the layer key just doesn't exist, we skip it.
foreach (var key in damageVisComp.TargetLayers)
{
- if (!spriteComponent.LayerMapTryGet(key, out var index))
+ if (!_sprite.LayerMapTryGet((entity, spriteComponent), key, out var index, false))
{
Log.Warning($"Layer at key {key} was invalid for entity {entity}.");
continue;
foreach (var layer in damageVisComp.TargetLayerMapKeys)
{
var layerCount = spriteComponent.AllLayers.Count();
- var index = spriteComponent.LayerMapGet(layer);
+ var index = _sprite.LayerMapGet((entity, spriteComponent), layer);
// var layerState = spriteComponent.LayerGetState(index).ToString()!;
if (index + 1 != layerCount)
{
foreach (var (group, sprite) in damageVisComp.DamageOverlayGroups)
{
- AddDamageLayerToSprite(spriteComponent,
+ AddDamageLayerToSprite((entity, spriteComponent),
sprite,
$"{layer}_{group}_{damageVisComp.Thresholds[1]}",
$"{layer}{group}",
// was taken.
else if (damageVisComp.DamageOverlay != null)
{
- AddDamageLayerToSprite(spriteComponent,
+ AddDamageLayerToSprite((entity, spriteComponent),
damageVisComp.DamageOverlay,
$"{layer}_{damageVisComp.Thresholds[1]}",
$"{layer}trackDamage",
{
foreach (var (group, sprite) in damageVisComp.DamageOverlayGroups)
{
- AddDamageLayerToSprite(spriteComponent,
+ AddDamageLayerToSprite((entity, spriteComponent),
sprite,
$"DamageOverlay_{group}_{damageVisComp.Thresholds[1]}",
$"DamageOverlay{group}");
}
else if (damageVisComp.DamageOverlay != null)
{
- AddDamageLayerToSprite(spriteComponent,
+ AddDamageLayerToSprite((entity, spriteComponent),
damageVisComp.DamageOverlay,
$"DamageOverlay_{damageVisComp.Thresholds[1]}",
"DamageOverlay");
/// <summary>
/// Adds a damage tracking layer to a given sprite component.
/// </summary>
- private void AddDamageLayerToSprite(SpriteComponent spriteComponent, DamageVisualizerSprite sprite, string state, string mapKey, int? index = null)
+ private void AddDamageLayerToSprite(Entity<SpriteComponent?> spriteEnt, DamageVisualizerSprite sprite, string state, string mapKey, int? index = null)
{
- var newLayer = spriteComponent.AddLayer(
+ var newLayer = _sprite.AddLayer(
+ spriteEnt,
new SpriteSpecifier.Rsi(
- new (sprite.Sprite), state
- ), index);
- spriteComponent.LayerMapSet(mapKey, newLayer);
+ new(sprite.Sprite), state
+ ),
+ index
+ );
+ _sprite.LayerMapSet(spriteEnt, mapKey, newLayer);
if (sprite.Color != null)
- spriteComponent.LayerSetColor(newLayer, Color.FromHex(sprite.Color));
- spriteComponent.LayerSetVisible(newLayer, false);
+ _sprite.LayerSetColor(spriteEnt, newLayer, Color.FromHex(sprite.Color));
+ _sprite.LayerSetVisible(spriteEnt, newLayer, false);
}
protected override void OnAppearanceChange(EntityUid uid, DamageVisualsComponent damageVisComp, ref AppearanceChangeEvent args)
UpdateDisabledLayers(uid, spriteComponent, component, damageVisComp);
if (damageVisComp.Overlay && damageVisComp.DamageOverlayGroups != null && damageVisComp.TargetLayers == null)
- CheckOverlayOrdering(spriteComponent, damageVisComp);
+ CheckOverlayOrdering((uid, spriteComponent), damageVisComp);
if (AppearanceSystem.TryGetData<bool>(uid, DamageVisualizerKeys.ForceUpdate, out var update, component)
&& update)
{
- ForceUpdateLayers(damageComponent, spriteComponent, damageVisComp);
+ ForceUpdateLayers((uid, damageComponent, spriteComponent, damageVisComp));
return;
}
if (damageVisComp.TrackAllDamage)
{
- UpdateDamageVisuals(damageComponent, spriteComponent, damageVisComp);
+ UpdateDamageVisuals((uid, damageComponent, spriteComponent, damageVisComp));
return;
}
data = new DamageVisualizerGroupData(Comp<DamageableComponent>(uid).DamagePerGroup.Keys.ToList());
}
- UpdateDamageVisuals(data.GroupList, damageComponent, spriteComponent, damageVisComp);
+ UpdateDamageVisuals(data.GroupList, (uid, damageComponent, spriteComponent, damageVisComp));
}
/// <summary>
damageVisComp.DisabledLayers[layer] = disabled;
if (damageVisComp.TrackAllDamage)
{
- spriteComponent.LayerSetVisible($"{layer}trackDamage", !disabled);
+ _sprite.LayerSetVisible((uid, spriteComponent), $"{layer}trackDamage", !disabled);
continue;
}
foreach (var damageGroup in damageVisComp.DamageOverlayGroups.Keys)
{
- spriteComponent.LayerSetVisible($"{layer}{damageGroup}", !disabled);
+ _sprite.LayerSetVisible((uid, spriteComponent), $"{layer}{damageGroup}", !disabled);
}
}
}
/// most layer doesn't match, the sprite
/// layers are recreated and placed on top.
/// </summary>
- private void CheckOverlayOrdering(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp)
+ private void CheckOverlayOrdering(Entity<SpriteComponent> spriteEnt, DamageVisualsComponent damageVisComp)
{
- if (spriteComponent[damageVisComp.TopMostLayerKey] != spriteComponent[spriteComponent.AllLayers.Count() - 1])
+ if (spriteEnt.Comp[damageVisComp.TopMostLayerKey] != spriteEnt.Comp[spriteEnt.Comp.AllLayers.Count() - 1])
{
if (!damageVisComp.TrackAllDamage && damageVisComp.DamageOverlayGroups != null)
{
foreach (var (damageGroup, sprite) in damageVisComp.DamageOverlayGroups)
{
var threshold = damageVisComp.LastThresholdPerGroup[damageGroup];
- ReorderOverlaySprite(spriteComponent,
+ ReorderOverlaySprite(spriteEnt,
damageVisComp,
sprite,
$"DamageOverlay{damageGroup}",
}
else if (damageVisComp.TrackAllDamage && damageVisComp.DamageOverlay != null)
{
- ReorderOverlaySprite(spriteComponent,
+ ReorderOverlaySprite(spriteEnt,
damageVisComp,
damageVisComp.DamageOverlay,
$"DamageOverlay",
}
}
- private void ReorderOverlaySprite(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, DamageVisualizerSprite sprite, string key, string statePrefix, FixedPoint2 threshold)
+ private void ReorderOverlaySprite(Entity<SpriteComponent> spriteEnt, DamageVisualsComponent damageVisComp, DamageVisualizerSprite sprite, string key, string statePrefix, FixedPoint2 threshold)
{
- spriteComponent.LayerMapTryGet(key, out var spriteLayer);
- var visibility = spriteComponent[spriteLayer].Visible;
- spriteComponent.RemoveLayer(spriteLayer);
+ _sprite.LayerMapTryGet(spriteEnt.AsNullable(), key, out var spriteLayer, false);
+ var visibility = spriteEnt.Comp[spriteLayer].Visible;
+ _sprite.RemoveLayer(spriteEnt.AsNullable(), spriteLayer);
if (threshold == FixedPoint2.Zero) // these should automatically be invisible
threshold = damageVisComp.Thresholds[1];
- spriteLayer = spriteComponent.AddLayer(
+ spriteLayer = _sprite.AddLayer(
+ spriteEnt.AsNullable(),
new SpriteSpecifier.Rsi(
- new (sprite.Sprite),
+ new(sprite.Sprite),
$"{statePrefix}_{threshold}"
),
spriteLayer);
- spriteComponent.LayerMapSet(key, spriteLayer);
- spriteComponent.LayerSetVisible(spriteLayer, visibility);
+ _sprite.LayerMapSet(spriteEnt.AsNullable(), key, spriteLayer);
+ _sprite.LayerSetVisible(spriteEnt.AsNullable(), spriteLayer, visibility);
// this is somewhat iffy since it constantly reallocates
damageVisComp.TopMostLayerKey = key;
}
/// Updates damage visuals without tracking
/// any damage groups.
/// </summary>
- private void UpdateDamageVisuals(DamageableComponent damageComponent, SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp)
+ private void UpdateDamageVisuals(Entity<DamageableComponent, SpriteComponent, DamageVisualsComponent> entity)
{
+ var damageComponent = entity.Comp1;
+ var spriteComponent = entity.Comp2;
+ var damageVisComp = entity.Comp3;
+
if (!CheckThresholdBoundary(damageComponent.TotalDamage, damageVisComp.LastDamageThreshold, damageVisComp, out var threshold))
return;
{
foreach (var layerMapKey in damageVisComp.TargetLayerMapKeys)
{
- UpdateTargetLayer(spriteComponent, damageVisComp, layerMapKey, threshold);
+ UpdateTargetLayer((entity, spriteComponent), damageVisComp, layerMapKey, threshold);
}
}
else
{
- UpdateOverlay(spriteComponent, threshold);
+ UpdateOverlay((entity, spriteComponent), threshold);
}
}
/// according to the list of damage groups
/// passed into it.
/// </summary>
- private void UpdateDamageVisuals(List<string> delta, DamageableComponent damageComponent, SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp)
+ private void UpdateDamageVisuals(List<string> delta, Entity<DamageableComponent, SpriteComponent, DamageVisualsComponent> entity)
{
+ var damageComponent = entity.Comp1;
+ var spriteComponent = entity.Comp2;
+ var damageVisComp = entity.Comp3;
+
foreach (var damageGroup in delta)
{
if (!damageVisComp.Overlay && damageGroup != damageVisComp.DamageGroup)
{
foreach (var layerMapKey in damageVisComp.TargetLayerMapKeys)
{
- UpdateTargetLayer(spriteComponent, damageVisComp, layerMapKey, damageGroup, threshold);
+ UpdateTargetLayer((entity, spriteComponent, damageVisComp), layerMapKey, damageGroup, threshold);
}
}
else
{
- UpdateOverlay(spriteComponent, damageVisComp, damageGroup, threshold);
+ UpdateOverlay((entity, spriteComponent, damageVisComp), damageGroup, threshold);
}
}
/// Does different things depending on
/// the configuration of the visualizer.
/// </summary>
- private void ForceUpdateLayers(DamageableComponent damageComponent, SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp)
+ private void ForceUpdateLayers(Entity<DamageableComponent, SpriteComponent, DamageVisualsComponent> entity)
{
+ var damageVisComp = entity.Comp3;
+
if (damageVisComp.DamageOverlayGroups != null)
{
- UpdateDamageVisuals(damageVisComp.DamageOverlayGroups.Keys.ToList(), damageComponent, spriteComponent, damageVisComp);
+ UpdateDamageVisuals(damageVisComp.DamageOverlayGroups.Keys.ToList(), entity);
}
else if (damageVisComp.DamageGroup != null)
{
- UpdateDamageVisuals(new List<string>(){ damageVisComp.DamageGroup }, damageComponent, spriteComponent, damageVisComp);
+ UpdateDamageVisuals(new List<string>() { damageVisComp.DamageGroup }, entity);
}
else if (damageVisComp.DamageOverlay != null)
{
- UpdateDamageVisuals(damageComponent, spriteComponent, damageVisComp);
+ UpdateDamageVisuals(entity);
}
}
/// it assumes you're updating a layer that is tracking all
/// damage.
/// </summary>
- private void UpdateTargetLayer(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, object layerMapKey, FixedPoint2 threshold)
+ private void UpdateTargetLayer(Entity<SpriteComponent> spriteEnt, DamageVisualsComponent damageVisComp, object layerMapKey, FixedPoint2 threshold)
{
if (damageVisComp.Overlay && damageVisComp.DamageOverlayGroups != null)
{
if (!damageVisComp.DisabledLayers[layerMapKey])
{
var layerState = damageVisComp.LayerMapKeyStates[layerMapKey];
- spriteComponent.LayerMapTryGet($"{layerMapKey}trackDamage", out var spriteLayer);
+ _sprite.LayerMapTryGet(spriteEnt.AsNullable(), $"{layerMapKey}trackDamage", out var spriteLayer, false);
- UpdateDamageLayerState(spriteComponent,
+ UpdateDamageLayerState(spriteEnt,
spriteLayer,
$"{layerState}",
threshold);
else if (!damageVisComp.Overlay)
{
var layerState = damageVisComp.LayerMapKeyStates[layerMapKey];
- spriteComponent.LayerMapTryGet(layerMapKey, out var spriteLayer);
+ _sprite.LayerMapTryGet(spriteEnt.AsNullable(), $"{layerMapKey}", out var spriteLayer, false);
- UpdateDamageLayerState(spriteComponent,
+ UpdateDamageLayerState(spriteEnt,
spriteLayer,
$"{layerState}",
threshold);
/// <summary>
/// Updates a target layer by damage group.
/// </summary>
- private void UpdateTargetLayer(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, object layerMapKey, string damageGroup, FixedPoint2 threshold)
+ private void UpdateTargetLayer(Entity<SpriteComponent, DamageVisualsComponent> entity, object layerMapKey, string damageGroup, FixedPoint2 threshold)
{
+ var spriteComponent = entity.Comp1;
+ var damageVisComp = entity.Comp2;
+
if (damageVisComp.Overlay && damageVisComp.DamageOverlayGroups != null)
{
if (damageVisComp.DamageOverlayGroups.ContainsKey(damageGroup) && !damageVisComp.DisabledLayers[layerMapKey])
{
var layerState = damageVisComp.LayerMapKeyStates[layerMapKey];
- spriteComponent.LayerMapTryGet($"{layerMapKey}{damageGroup}", out var spriteLayer);
+ _sprite.LayerMapTryGet((entity, spriteComponent), $"{layerMapKey}{damageGroup}", out var spriteLayer, false);
- UpdateDamageLayerState(spriteComponent,
+ UpdateDamageLayerState(
+ (entity, spriteComponent),
spriteLayer,
$"{layerState}_{damageGroup}",
threshold);
else if (!damageVisComp.Overlay)
{
var layerState = damageVisComp.LayerMapKeyStates[layerMapKey];
- spriteComponent.LayerMapTryGet(layerMapKey, out var spriteLayer);
+ _sprite.LayerMapTryGet((entity, spriteComponent), $"{layerMapKey}", out var spriteLayer, false);
- UpdateDamageLayerState(spriteComponent,
+ UpdateDamageLayerState(
+ (entity, spriteComponent),
spriteLayer,
$"{layerState}_{damageGroup}",
threshold);
/// <summary>
/// Updates an overlay that is tracking all damage.
/// </summary>
- private void UpdateOverlay(SpriteComponent spriteComponent, FixedPoint2 threshold)
+ private void UpdateOverlay(Entity<SpriteComponent> spriteEnt, FixedPoint2 threshold)
{
- spriteComponent.LayerMapTryGet($"DamageOverlay", out var spriteLayer);
+ _sprite.LayerMapTryGet(spriteEnt.AsNullable(), $"DamageOverlay", out var spriteLayer, false);
- UpdateDamageLayerState(spriteComponent,
+ UpdateDamageLayerState(spriteEnt,
spriteLayer,
$"DamageOverlay",
threshold);
/// <summary>
/// Updates an overlay based on damage group.
/// </summary>
- private void UpdateOverlay(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, string damageGroup, FixedPoint2 threshold)
+ private void UpdateOverlay(Entity<SpriteComponent, DamageVisualsComponent> entity, string damageGroup, FixedPoint2 threshold)
{
+ var spriteComponent = entity.Comp1;
+ var damageVisComp = entity.Comp2;
+
if (damageVisComp.DamageOverlayGroups != null)
{
if (damageVisComp.DamageOverlayGroups.ContainsKey(damageGroup))
{
- spriteComponent.LayerMapTryGet($"DamageOverlay{damageGroup}", out var spriteLayer);
+ _sprite.LayerMapTryGet((entity, spriteComponent), $"DamageOverlay{damageGroup}", out var spriteLayer, false);
- UpdateDamageLayerState(spriteComponent,
+ UpdateDamageLayerState(
+ (entity, spriteComponent),
spriteLayer,
$"DamageOverlay_{damageGroup}",
threshold);
/// function calls it), and what threshold
/// was passed into it.
/// </summary>
- private void UpdateDamageLayerState(SpriteComponent spriteComponent, int spriteLayer, string statePrefix, FixedPoint2 threshold)
+ private void UpdateDamageLayerState(Entity<SpriteComponent> spriteEnt, int spriteLayer, string statePrefix, FixedPoint2 threshold)
{
if (threshold == 0)
{
- spriteComponent.LayerSetVisible(spriteLayer, false);
+ _sprite.LayerSetVisible(spriteEnt.AsNullable(), spriteLayer, false);
}
else
{
- if (!spriteComponent[spriteLayer].Visible)
+ if (!spriteEnt.Comp[spriteLayer].Visible)
{
- spriteComponent.LayerSetVisible(spriteLayer, true);
+ _sprite.LayerSetVisible(spriteEnt.AsNullable(), spriteLayer, true);
}
- spriteComponent.LayerSetState(spriteLayer, $"{statePrefix}_{threshold}");
+ _sprite.LayerSetRsiState(spriteEnt.AsNullable(), spriteLayer, $"{statePrefix}_{threshold}");
}
}
}