ExaminableDamageSystem.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System.Linq;
  2. using Content.Server.Damage.Components;
  3. using Content.Server.Destructible;
  4. using Content.Server.Destructible.Thresholds.Triggers;
  5. using Content.Shared.Damage;
  6. using Content.Shared.Damage.Prototypes;
  7. using Content.Shared.Examine;
  8. using Content.Shared.Rounding;
  9. using Robust.Shared.Prototypes;
  10. namespace Content.Server.Damage.Systems;
  11. public sealed class ExaminableDamageSystem : EntitySystem
  12. {
  13. [Dependency] private readonly IPrototypeManager _prototype = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. SubscribeLocalEvent<ExaminableDamageComponent, ComponentInit>(OnInit);
  18. SubscribeLocalEvent<ExaminableDamageComponent, ExaminedEvent>(OnExamine);
  19. }
  20. private void OnInit(EntityUid uid, ExaminableDamageComponent component, ComponentInit args)
  21. {
  22. if (component.MessagesProtoId == null)
  23. return;
  24. component.MessagesProto = _prototype.Index<ExaminableDamagePrototype>(component.MessagesProtoId);
  25. }
  26. private void OnExamine(EntityUid uid, ExaminableDamageComponent component, ExaminedEvent args)
  27. {
  28. if (component.MessagesProto == null)
  29. return;
  30. var messages = component.MessagesProto.Messages;
  31. if (messages.Length == 0)
  32. return;
  33. var level = GetDamageLevel(uid, component);
  34. var msg = Loc.GetString(messages[level]);
  35. args.PushMarkup(msg,-99);
  36. }
  37. private int GetDamageLevel(EntityUid uid, ExaminableDamageComponent? component = null,
  38. DamageableComponent? damageable = null, DestructibleComponent? destructible = null)
  39. {
  40. if (!Resolve(uid, ref component, ref damageable, ref destructible))
  41. return 0;
  42. if (component.MessagesProto == null)
  43. return 0;
  44. var maxLevels = component.MessagesProto.Messages.Length - 1;
  45. if (maxLevels <= 0)
  46. return 0;
  47. var trigger = (DamageTrigger?) destructible.Thresholds
  48. .LastOrDefault(threshold => threshold.Trigger is DamageTrigger)?.Trigger;
  49. if (trigger == null)
  50. return 0;
  51. var damage = damageable.TotalDamage;
  52. var damageThreshold = trigger.Damage;
  53. var fraction = damageThreshold == 0 ? 0f : (float) damage / damageThreshold;
  54. var level = ContentHelpers.RoundToNearestLevels(fraction, 1, maxLevels);
  55. return level;
  56. }
  57. }