Files
tbd-station-14/Content.Server/Damage/Systems/ExaminableDamageSystem.cs
Moomoobeef cf0d6c482e ExaminableDamage now puts its message at the bottom and in color (#32820)
* the examineableDamage component now puts its messages at the bottom, and in color

* god help us if something is priority -100 :godo:
2024-11-01 01:21:05 +01:00

71 lines
2.3 KiB
C#

using System.Linq;
using Content.Server.Damage.Components;
using Content.Server.Destructible;
using Content.Server.Destructible.Thresholds.Triggers;
using Content.Shared.Damage;
using Content.Shared.Damage.Prototypes;
using Content.Shared.Examine;
using Content.Shared.Rounding;
using Robust.Shared.Prototypes;
namespace Content.Server.Damage.Systems;
public sealed class ExaminableDamageSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ExaminableDamageComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<ExaminableDamageComponent, ExaminedEvent>(OnExamine);
}
private void OnInit(EntityUid uid, ExaminableDamageComponent component, ComponentInit args)
{
if (component.MessagesProtoId == null)
return;
component.MessagesProto = _prototype.Index<ExaminableDamagePrototype>(component.MessagesProtoId);
}
private void OnExamine(EntityUid uid, ExaminableDamageComponent component, ExaminedEvent args)
{
if (component.MessagesProto == null)
return;
var messages = component.MessagesProto.Messages;
if (messages.Length == 0)
return;
var level = GetDamageLevel(uid, component);
var msg = Loc.GetString(messages[level]);
args.PushMarkup(msg,-99);
}
private int GetDamageLevel(EntityUid uid, ExaminableDamageComponent? component = null,
DamageableComponent? damageable = null, DestructibleComponent? destructible = null)
{
if (!Resolve(uid, ref component, ref damageable, ref destructible))
return 0;
if (component.MessagesProto == null)
return 0;
var maxLevels = component.MessagesProto.Messages.Length - 1;
if (maxLevels <= 0)
return 0;
var trigger = (DamageTrigger?) destructible.Thresholds
.LastOrDefault(threshold => threshold.Trigger is DamageTrigger)?.Trigger;
if (trigger == null)
return 0;
var damage = damageable.TotalDamage;
var damageThreshold = trigger.Damage;
var fraction = damageThreshold == 0 ? 0f : (float) damage / damageThreshold;
var level = ContentHelpers.RoundToNearestLevels(fraction, 1, maxLevels);
return level;
}
}