| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- using Content.Shared.Damage;
- using Content.Shared.Examine;
- using Content.Shared.FixedPoint;
- using Content.Shared.IdentityManagement;
- using Content.Shared.Verbs;
- using Robust.Shared.Utility;
- namespace Content.Shared.HealthExaminable;
- public sealed class HealthExaminableSystem : EntitySystem
- {
- [Dependency] private readonly ExamineSystemShared _examineSystem = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<HealthExaminableComponent, GetVerbsEvent<ExamineVerb>>(OnGetExamineVerbs);
- }
- private void OnGetExamineVerbs(EntityUid uid, HealthExaminableComponent component, GetVerbsEvent<ExamineVerb> args)
- {
- if (!TryComp<DamageableComponent>(uid, out var damage))
- return;
- var detailsRange = _examineSystem.IsInDetailsRange(args.User, uid);
- var verb = new ExamineVerb()
- {
- Act = () =>
- {
- var markup = CreateMarkup(uid, component, damage);
- _examineSystem.SendExamineTooltip(args.User, uid, markup, false, false);
- },
- Text = Loc.GetString("health-examinable-verb-text"),
- Category = VerbCategory.Examine,
- Disabled = !detailsRange,
- Message = detailsRange ? null : Loc.GetString("health-examinable-verb-disabled"),
- Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/rejuvenate.svg.192dpi.png"))
- };
- args.Verbs.Add(verb);
- }
- public FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent component, DamageableComponent damage)
- {
- var msg = new FormattedMessage();
- var first = true;
- foreach (var type in component.ExaminableTypes)
- {
- if (!damage.Damage.DamageDict.TryGetValue(type, out var dmg))
- continue;
- if (dmg == FixedPoint2.Zero)
- continue;
- FixedPoint2 closest = FixedPoint2.Zero;
- string chosenLocStr = string.Empty;
- foreach (var threshold in component.Thresholds)
- {
- var str = $"health-examinable-{component.LocPrefix}-{type}-{threshold}";
- var tempLocStr = Loc.GetString($"health-examinable-{component.LocPrefix}-{type}-{threshold}", ("target", Identity.Entity(uid, EntityManager)));
- // i.e., this string doesn't exist, because theres nothing for that threshold
- if (tempLocStr == str)
- continue;
- if (dmg > threshold && threshold > closest)
- {
- chosenLocStr = tempLocStr;
- closest = threshold;
- }
- }
- if (closest == FixedPoint2.Zero)
- continue;
- if (!first)
- {
- msg.PushNewline();
- }
- else
- {
- first = false;
- }
- msg.AddMarkupOrThrow(chosenLocStr);
- }
- if (msg.IsEmpty)
- {
- msg.AddMarkupOrThrow(Loc.GetString($"health-examinable-{component.LocPrefix}-none"));
- }
- // Anything else want to add on to this?
- RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg), true);
- return msg;
- }
- }
- /// <summary>
- /// A class raised on an entity whose health is being examined
- /// in order to add special text that is not handled by the
- /// damage thresholds.
- /// </summary>
- public sealed class HealthBeingExaminedEvent
- {
- public FormattedMessage Message;
- public HealthBeingExaminedEvent(FormattedMessage message)
- {
- Message = message;
- }
- }
|