diff --git a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs index b91e92078f8..ed2a2f3ecb8 100644 --- a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs +++ b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs @@ -12,6 +12,8 @@ namespace Content.Client.Humanoid; public sealed partial class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem { + + private const string AnimatedMarkingSuffix = "Animated"; // Forge-Change [Dependency] private IPrototypeManager _prototypeManager = default!; [Dependency] private MarkingManager _markingManager = default!; @@ -238,7 +240,7 @@ private void ClearAllMarkings(HumanoidAppearanceComponent humanoid, SpriteCompon { foreach (var marking in markingList) { - RemoveMarking(marking, sprite); + ClearMarking(marking, sprite); // Forge-Change: RemoveMarking > ClearMarking } } @@ -248,11 +250,32 @@ private void ClearAllMarkings(HumanoidAppearanceComponent humanoid, SpriteCompon { foreach (var marking in markingList) { - RemoveMarking(marking, sprite); + ClearMarking(marking, sprite); // Forge-Change: RemoveMarking > ClearMarking } } } + // Forge-Change-start: remove stale static/animated counterpart layers when refreshing markings. + private void ClearMarking(Marking marking, SpriteComponent spriteComp) + { + RemoveMarking(marking, spriteComp); + RemoveAnimatedCounterpart(marking, spriteComp); + } + + private void RemoveAnimatedCounterpart(Marking marking, SpriteComponent spriteComp) + { + var markingId = marking.MarkingId; + var counterpartId = markingId.EndsWith(AnimatedMarkingSuffix, StringComparison.Ordinal) + ? markingId[..^AnimatedMarkingSuffix.Length] + : $"{markingId}{AnimatedMarkingSuffix}"; + + if (!_prototypeManager.TryIndex(counterpartId, out var counterpart)) + return; + + RemoveMarking(counterpart, spriteComp); + } + // Forge-Change-end + private void RemoveMarking(Marking marking, SpriteComponent spriteComp) { if (!_markingManager.TryGetMarking(marking, out var prototype)) @@ -260,6 +283,10 @@ private void RemoveMarking(Marking marking, SpriteComponent spriteComp) return; } + RemoveMarking(prototype, spriteComp); + } + private void RemoveMarking(MarkingPrototype prototype, SpriteComponent spriteComp) + { // Forge-Change foreach (var sprite in prototype.Sprites) { if (sprite is not SpriteSpecifier.Rsi rsi) @@ -267,7 +294,8 @@ private void RemoveMarking(Marking marking, SpriteComponent spriteComp) continue; } - var layerId = $"{marking.MarkingId}-{rsi.RsiState}"; + var layerId = $"{prototype.ID}-{rsi.RsiState}"; // Forge-Change: marking.MarkingId > prototype.ID + if (!spriteComp.LayerMapTryGet(layerId, out var index)) { continue; @@ -277,6 +305,7 @@ private void RemoveMarking(Marking marking, SpriteComponent spriteComp) spriteComp.RemoveLayer(index); } } + private void ApplyMarking(MarkingPrototype markingPrototype, IReadOnlyList? colors, bool visible, diff --git a/Content.Client/_Mono/FireControl/UI/FireControlWindow.xaml b/Content.Client/_Mono/FireControl/UI/FireControlWindow.xaml index b10713f6a0c..d0831486185 100644 --- a/Content.Client/_Mono/FireControl/UI/FireControlWindow.xaml +++ b/Content.Client/_Mono/FireControl/UI/FireControlWindow.xaml @@ -32,6 +32,15 @@