using Content.Server.Administration.Logs;
+using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Server.Medical.Components;
using Content.Server.Stack;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.Stacks;
+using Content.Server.Popups;
using Robust.Shared.Random;
namespace Content.Server.Medical;
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
[Dependency] private readonly MobThresholdSystem _mobThresholdSystem = default!;
+ [Dependency] private readonly PopupSystem _popupSystem = default!;
public override void Initialize()
{
private void OnDoAfter(EntityUid uid, DamageableComponent component, HealingDoAfterEvent args)
{
+ var dontRepeat = false;
+
if (!TryComp(args.Used, out HealingComponent? healing))
return;
// Heal some bloodloss damage.
if (healing.BloodlossModifier != 0)
+ {
+ if (!TryComp<BloodstreamComponent>(uid, out var bloodstream))
+ return;
+ var isBleeding = bloodstream.BleedAmount > 0;
_bloodstreamSystem.TryModifyBleedAmount(uid, healing.BloodlossModifier);
+ if (isBleeding != bloodstream.BleedAmount > 0)
+ {
+ dontRepeat = true;
+ _popupSystem.PopupEntity(Loc.GetString("medical-item-stop-bleeding"), uid);
+ }
+ }
// Restores missing blood
if (healing.ModifyBloodLevel != 0)
var total = healed?.Total ?? FixedPoint2.Zero;
- // Reverify that we can heal the damage.
+ // Re-verify that we can heal the damage.
_stacks.Use(args.Used.Value, 1);
if (uid != args.User)
+ {
_adminLogger.Add(LogType.Healed,
$"{EntityManager.ToPrettyString(args.User):user} healed {EntityManager.ToPrettyString(uid):target} for {total:damage} damage");
+ }
else
+ {
_adminLogger.Add(LogType.Healed,
$"{EntityManager.ToPrettyString(args.User):user} healed themselves for {total:damage} damage");
+ }
_audio.PlayPvs(healing.HealingEndSound, uid, AudioHelpers.WithVariation(0.125f, _random).WithVolume(-5f));
+ // Logic to determine the whether or not to repeat the healing action
+ args.Repeat = (HasDamage(component, healing) && !dontRepeat);
+ if (!args.Repeat && !dontRepeat)
+ _popupSystem.PopupEntity(Loc.GetString("medical-item-finished-using", ("item", args.Used)), uid);
args.Handled = true;
}
+ private bool HasDamage(DamageableComponent component, HealingComponent healing)
+ {
+ var damageableDict = component.Damage.DamageDict;
+ var healingDict = healing.Damage.DamageDict;
+ foreach (var type in healingDict)
+ {
+ if (damageableDict[type.Key].Value > 0)
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private void OnHealingUse(EntityUid uid, HealingComponent component, UseInHandEvent args)
{
if (args.Handled)
if (_mobStateSystem.IsDead(target) || !TryComp<DamageableComponent>(target, out var targetDamage))
return false;
- if (targetDamage.TotalDamage == 0)
- return false;
-
if (component.DamageContainerID is not null &&
!component.DamageContainerID.Equals(targetDamage.DamageContainerID))
return false;
if (!TryComp<StackComponent>(uid, out var stack) || stack.Count < 1)
return false;
+ if (!HasDamage(targetDamage, component))
+ {
+ _popupSystem.PopupEntity(Loc.GetString("medical-item-cant-use", ("item", uid)), uid);
+ return false;
+ }
+
if (component.HealingBeginSound != null)
+ {
_audio.PlayPvs(component.HealingBeginSound, uid,
AudioHelpers.WithVariation(0.125f, _random).WithVolume(-5f));
+ }
var isNotSelf = user != target;