Fix damage visuals not resetting in some cases (#17399)

This commit is contained in:
Leon Friedrich
2023-06-19 05:22:41 +12:00
committed by GitHub
parent 0709660fbc
commit 4f8ea0c19b
2 changed files with 31 additions and 25 deletions

View File

@@ -351,22 +351,22 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
if (damageVisComp.Disabled) if (damageVisComp.Disabled)
return; return;
HandleDamage(args.Component, damageVisComp); HandleDamage(uid, args.Component, damageVisComp);
} }
private void HandleDamage(AppearanceComponent component, DamageVisualsComponent damageVisComp) private void HandleDamage(EntityUid uid, AppearanceComponent component, DamageVisualsComponent damageVisComp)
{ {
if (!TryComp(component.Owner, out SpriteComponent? spriteComponent) if (!TryComp(uid, out SpriteComponent? spriteComponent)
|| !TryComp(component.Owner, out DamageableComponent? damageComponent)) || !TryComp(uid, out DamageableComponent? damageComponent))
return; return;
if (damageVisComp.TargetLayers != null && damageVisComp.DamageOverlayGroups != null) if (damageVisComp.TargetLayers != null && damageVisComp.DamageOverlayGroups != null)
UpdateDisabledLayers(spriteComponent, component, damageVisComp); UpdateDisabledLayers(uid, spriteComponent, component, damageVisComp);
if (damageVisComp.Overlay && damageVisComp.DamageOverlayGroups != null && damageVisComp.TargetLayers == null) if (damageVisComp.Overlay && damageVisComp.DamageOverlayGroups != null && damageVisComp.TargetLayers == null)
CheckOverlayOrdering(spriteComponent, damageVisComp); CheckOverlayOrdering(spriteComponent, damageVisComp);
if (AppearanceSystem.TryGetData<bool>(component.Owner, DamageVisualizerKeys.ForceUpdate, out var update, component) if (AppearanceSystem.TryGetData<bool>(uid, DamageVisualizerKeys.ForceUpdate, out var update, component)
&& update) && update)
{ {
ForceUpdateLayers(damageComponent, spriteComponent, damageVisComp); ForceUpdateLayers(damageComponent, spriteComponent, damageVisComp);
@@ -376,11 +376,16 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
if (damageVisComp.TrackAllDamage) if (damageVisComp.TrackAllDamage)
{ {
UpdateDamageVisuals(damageComponent, spriteComponent, damageVisComp); UpdateDamageVisuals(damageComponent, spriteComponent, damageVisComp);
return;
} }
else if (AppearanceSystem.TryGetData<DamageVisualizerGroupData>(component.Owner, DamageVisualizerKeys.DamageUpdateGroups, out var data, component))
if (!AppearanceSystem.TryGetData<DamageVisualizerGroupData>(uid, DamageVisualizerKeys.DamageUpdateGroups,
out var data, component))
{ {
UpdateDamageVisuals(data.GroupList, damageComponent, spriteComponent, damageVisComp); data = new DamageVisualizerGroupData(Comp<DamageableComponent>(uid).DamagePerGroup.Keys.ToList());
} }
UpdateDamageVisuals(data.GroupList, damageComponent, spriteComponent, damageVisComp);
} }
/// <summary> /// <summary>
@@ -389,29 +394,30 @@ public sealed class DamageVisualsSystem : VisualizerSystem<DamageVisualsComponen
/// layer will no longer be visible, or obtain /// layer will no longer be visible, or obtain
/// any damage updates. /// any damage updates.
/// </summary> /// </summary>
private void UpdateDisabledLayers(SpriteComponent spriteComponent, AppearanceComponent component, DamageVisualsComponent damageVisComp) private void UpdateDisabledLayers(EntityUid uid, SpriteComponent spriteComponent, AppearanceComponent component, DamageVisualsComponent damageVisComp)
{ {
foreach (var layer in damageVisComp.TargetLayerMapKeys) foreach (var layer in damageVisComp.TargetLayerMapKeys)
{ {
bool? layerStatus = null; // I assume this gets set by something like body system if limbs are missing???
if (AppearanceSystem.TryGetData<bool>(component.Owner, layer, out var layerStateEnum, component)) // TODO is this actually used by anything anywhere?
layerStatus = layerStateEnum; AppearanceSystem.TryGetData(uid, layer, out bool disabled, component);
if (layerStatus == null) if (damageVisComp.DisabledLayers[layer] == disabled)
continue; continue;
if (damageVisComp.DisabledLayers[layer] != (bool) layerStatus) damageVisComp.DisabledLayers[layer] = disabled;
if (damageVisComp.TrackAllDamage)
{ {
damageVisComp.DisabledLayers[layer] = (bool) layerStatus; spriteComponent.LayerSetVisible($"{layer}trackDamage", !disabled);
if (!damageVisComp.TrackAllDamage && damageVisComp.DamageOverlayGroups != null) continue;
{ }
foreach (var damageGroup in damageVisComp.DamageOverlayGroups!.Keys)
{ if (damageVisComp.DamageOverlayGroups == null)
spriteComponent.LayerSetVisible($"{layer}{damageGroup}", damageVisComp.DisabledLayers[layer]); continue;
}
} foreach (var damageGroup in damageVisComp.DamageOverlayGroups.Keys)
else if (damageVisComp.TrackAllDamage) {
spriteComponent.LayerSetVisible($"{layer}trackDamage", damageVisComp.DisabledLayers[layer]); spriteComponent.LayerSetVisible($"{layer}{damageGroup}", !disabled);
} }
} }
} }

View File

@@ -124,7 +124,7 @@ namespace Content.Shared.Damage
if (EntityManager.TryGetComponent<AppearanceComponent>(uid, out var appearance) && damageDelta != null) if (EntityManager.TryGetComponent<AppearanceComponent>(uid, out var appearance) && damageDelta != null)
{ {
var data = new DamageVisualizerGroupData(damageDelta.GetDamagePerGroup(_prototypeManager).Keys.ToList()); var data = new DamageVisualizerGroupData(component.DamagePerGroup.Keys.ToList());
_appearance.SetData(uid, DamageVisualizerKeys.DamageUpdateGroups, data, appearance); _appearance.SetData(uid, DamageVisualizerKeys.DamageUpdateGroups, data, appearance);
} }
RaiseLocalEvent(uid, new DamageChangedEvent(component, damageDelta, interruptsDoAfters, origin)); RaiseLocalEvent(uid, new DamageChangedEvent(component, damageDelta, interruptsDoAfters, origin));