BodySystem.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // SPDX-FileCopyrightText: 2022 DrSmugleaf <DrSmugleaf@users.noreply.github.com>
  2. // SPDX-FileCopyrightText: 2022 Jezithyr <Jezithyr@gmail.com>
  3. // SPDX-FileCopyrightText: 2022 metalgearsloth <metalgearsloth@gmail.com>
  4. // SPDX-FileCopyrightText: 2023 metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
  5. // SPDX-FileCopyrightText: 2024 Piras314 <p1r4s@proton.me>
  6. // SPDX-FileCopyrightText: 2024 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
  7. // SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
  8. //
  9. // SPDX-License-Identifier: AGPL-3.0-or-later
  10. using Content.Shared.Body.Systems;
  11. // Shitmed Change Start
  12. using Content.Shared._Shitmed.Body.Part;
  13. using Content.Shared.Humanoid;
  14. using Content.Shared.Humanoid.Markings;
  15. using Robust.Client.GameObjects;
  16. using Robust.Shared.Utility;
  17. // Shitmed Change End
  18. namespace Content.Client.Body.Systems;
  19. public sealed class BodySystem : SharedBodySystem
  20. {
  21. // Shitmed Change Start
  22. [Dependency] private readonly MarkingManager _markingManager = default!;
  23. private void ApplyMarkingToPart(MarkingPrototype markingPrototype,
  24. IReadOnlyList<Color>? colors,
  25. bool visible,
  26. SpriteComponent sprite)
  27. {
  28. for (var j = 0; j < markingPrototype.Sprites.Count; j++)
  29. {
  30. var markingSprite = markingPrototype.Sprites[j];
  31. if (markingSprite is not SpriteSpecifier.Rsi rsi)
  32. continue;
  33. var layerId = $"{markingPrototype.ID}-{rsi.RsiState}";
  34. if (!sprite.LayerMapTryGet(layerId, out _))
  35. {
  36. var layer = sprite.AddLayer(markingSprite, j + 1);
  37. sprite.LayerMapSet(layerId, layer);
  38. sprite.LayerSetSprite(layerId, rsi);
  39. }
  40. sprite.LayerSetVisible(layerId, visible);
  41. if (!visible)
  42. continue;
  43. // Okay so if the marking prototype is modified but we load old marking data this may no longer be valid
  44. // and we need to check the index is correct. So if that happens just default to white?
  45. if (colors != null && j < colors.Count)
  46. sprite.LayerSetColor(layerId, colors[j]);
  47. else
  48. sprite.LayerSetColor(layerId, Color.White);
  49. }
  50. }
  51. protected override void ApplyPartMarkings(EntityUid target, BodyPartAppearanceComponent component)
  52. {
  53. if (!TryComp(target, out SpriteComponent? sprite))
  54. return;
  55. if (component.Color != null)
  56. sprite.Color = component.Color.Value;
  57. foreach (var (visualLayer, markingList) in component.Markings)
  58. foreach (var marking in markingList)
  59. {
  60. if (!_markingManager.TryGetMarking(marking, out var markingPrototype))
  61. continue;
  62. ApplyMarkingToPart(markingPrototype, marking.MarkingColors, marking.Visible, sprite);
  63. }
  64. }
  65. protected override void RemoveBodyMarkings(EntityUid target, BodyPartAppearanceComponent partAppearance, HumanoidAppearanceComponent bodyAppearance)
  66. {
  67. return;
  68. }
  69. // Shitmed Change End
  70. }