diff --git a/Content.Client/Damage/DamageVisualsSystem.cs b/Content.Client/Damage/DamageVisualsSystem.cs index e275f13f93..b38e70f6cc 100644 --- a/Content.Client/Damage/DamageVisualsSystem.cs +++ b/Content.Client/Damage/DamageVisualsSystem.cs @@ -27,6 +27,7 @@ namespace Content.Client.Damage; public sealed class DamageVisualsSystem : VisualizerSystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly SpriteSystem _sprite = default!; public override void Initialize() { @@ -228,7 +229,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem /// Adds a damage tracking layer to a given sprite component. /// - private void AddDamageLayerToSprite(SpriteComponent spriteComponent, DamageVisualizerSprite sprite, string state, string mapKey, int? index = null) + private void AddDamageLayerToSprite(Entity 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) @@ -362,18 +366,18 @@ public sealed class DamageVisualsSystem : VisualizerSystem(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; } @@ -383,7 +387,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem(uid).DamagePerGroup.Keys.ToList()); } - UpdateDamageVisuals(data.GroupList, damageComponent, spriteComponent, damageVisComp); + UpdateDamageVisuals(data.GroupList, (uid, damageComponent, spriteComponent, damageVisComp)); } /// @@ -406,7 +410,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem - private void CheckOverlayOrdering(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp) + private void CheckOverlayOrdering(Entity 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}", @@ -446,7 +450,7 @@ public sealed class DamageVisualsSystem : VisualizerSystem 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; } @@ -479,8 +484,12 @@ public sealed class DamageVisualsSystem : VisualizerSystem - private void UpdateDamageVisuals(DamageableComponent damageComponent, SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp) + private void UpdateDamageVisuals(Entity entity) { + var damageComponent = entity.Comp1; + var spriteComponent = entity.Comp2; + var damageVisComp = entity.Comp3; + if (!CheckThresholdBoundary(damageComponent.TotalDamage, damageVisComp.LastDamageThreshold, damageVisComp, out var threshold)) return; @@ -490,12 +499,12 @@ public sealed class DamageVisualsSystem : VisualizerSystem - private void UpdateDamageVisuals(List delta, DamageableComponent damageComponent, SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp) + private void UpdateDamageVisuals(List delta, Entity entity) { + var damageComponent = entity.Comp1; + var spriteComponent = entity.Comp2; + var damageVisComp = entity.Comp3; + foreach (var damageGroup in delta) { if (!damageVisComp.Overlay && damageGroup != damageVisComp.DamageGroup) @@ -525,12 +538,12 @@ public sealed class DamageVisualsSystem : VisualizerSystem - private void ForceUpdateLayers(DamageableComponent damageComponent, SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp) + private void ForceUpdateLayers(Entity 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(){ damageVisComp.DamageGroup }, damageComponent, spriteComponent, damageVisComp); + UpdateDamageVisuals(new List() { damageVisComp.DamageGroup }, entity); } else if (damageVisComp.DamageOverlay != null) { - UpdateDamageVisuals(damageComponent, spriteComponent, damageVisComp); + UpdateDamageVisuals(entity); } } @@ -588,16 +603,16 @@ public sealed class DamageVisualsSystem : VisualizerSystem - private void UpdateTargetLayer(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, object layerMapKey, FixedPoint2 threshold) + private void UpdateTargetLayer(Entity 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); @@ -606,9 +621,9 @@ public sealed class DamageVisualsSystem : VisualizerSystem /// Updates a target layer by damage group. /// - private void UpdateTargetLayer(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, object layerMapKey, string damageGroup, FixedPoint2 threshold) + private void UpdateTargetLayer(Entity 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); @@ -636,9 +655,10 @@ public sealed class DamageVisualsSystem : VisualizerSystem /// Updates an overlay that is tracking all damage. /// - private void UpdateOverlay(SpriteComponent spriteComponent, FixedPoint2 threshold) + private void UpdateOverlay(Entity 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); @@ -661,15 +681,19 @@ public sealed class DamageVisualsSystem : VisualizerSystem /// Updates an overlay based on damage group. /// - private void UpdateOverlay(SpriteComponent spriteComponent, DamageVisualsComponent damageVisComp, string damageGroup, FixedPoint2 threshold) + private void UpdateOverlay(Entity 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); @@ -683,19 +707,19 @@ public sealed class DamageVisualsSystem : VisualizerSystem - private void UpdateDamageLayerState(SpriteComponent spriteComponent, int spriteLayer, string statePrefix, FixedPoint2 threshold) + private void UpdateDamageLayerState(Entity 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}"); } } }