6
2026-01-24 12:49:55 +03:00

99 lines
4.0 KiB
C#

using Content.Server.Administration.Logs;
using Content.Shared.Cargo.Components;
using Content.Server.Stack;
using Content.Shared.Silicon.BlindHealing;
using Content.Shared.Damage;
using Content.Shared.Database;
using Content.Shared.DoAfter;
using Content.Shared.Eye.Blinding.Components;
using Content.Shared.Eye.Blinding.Systems;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
using Content.Shared.Popups;
using Content.Shared.Stacks;
namespace Content.Server.Silicon.BlindHealing;
public sealed class BlindHealingSystem : SharedBlindHealingSystem
{
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly BlindableSystem _blindableSystem = default!;
[Dependency] private readonly StackSystem _stackSystem = default!;
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
public override void Initialize()
{
SubscribeLocalEvent<BlindHealingComponent, UseInHandEvent>(OnUse);
SubscribeLocalEvent<BlindHealingComponent, AfterInteractEvent>(OnInteract);
SubscribeLocalEvent<BlindHealingComponent, HealingDoAfterEvent>(OnHealingFinished);
}
private void OnHealingFinished(EntityUid uid, BlindHealingComponent component, HealingDoAfterEvent args)
{
if (args.Cancelled || args.Target == null
|| !TryComp<BlindableComponent>(args.Target, out var blindComp)
|| blindComp is { EyeDamage: 0 })
return;
if (TryComp<StackComponent>(uid, out var stackComponent)
&& TryComp<StackPriceComponent>(uid, out var stackPrice))
_stackSystem.SetCount(uid, (int) (_stackSystem.GetCount(uid, stackComponent) - stackPrice.Price), stackComponent);
_blindableSystem.AdjustEyeDamage((args.Target.Value, blindComp), -blindComp.EyeDamage);
_adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target}'s vision");
var str = Loc.GetString("comp-repairable-repair",
("target", uid),
("tool", args.Used!));
_popup.PopupEntity(str, uid, args.User);
}
private bool TryHealBlindness(EntityUid uid, EntityUid user, EntityUid target, float delay)
{
var doAfterEventArgs =
new DoAfterArgs(EntityManager, user, delay, new HealingDoAfterEvent(), uid, target: target, used: uid)
{
NeedHand = true,
BreakOnMove = true,
BreakOnWeightlessMove = false,
};
_doAfter.TryStartDoAfter(doAfterEventArgs);
return true;
}
private void OnInteract(EntityUid uid, BlindHealingComponent component, ref AfterInteractEvent args)
{
if (args.Handled
|| !TryComp<DamageableComponent>(args.User, out var damageable)
|| damageable.DamageContainerID != null && !component.DamageContainers.Contains(damageable.DamageContainerID)
|| !TryComp<BlindableComponent>(args.User, out var blindcomp)
|| blindcomp.EyeDamage == 0
|| args.User == args.Target && !component.AllowSelfHeal)
return;
TryHealBlindness(uid, args.User, args.User,
args.User == args.Target
? component.DoAfterDelay * component.SelfHealPenalty
: component.DoAfterDelay);
}
private void OnUse(EntityUid uid, BlindHealingComponent component, ref UseInHandEvent args)
{
if (args.Handled
|| !TryComp<DamageableComponent>(args.User, out var damageable)
|| damageable.DamageContainerID != null && !component.DamageContainers.Contains(damageable.DamageContainerID)
|| !TryComp<BlindableComponent>(args.User, out var blindcomp)
|| blindcomp.EyeDamage == 0
|| !component.AllowSelfHeal)
return;
TryHealBlindness(uid, args.User, args.User,
component.DoAfterDelay * component.SelfHealPenalty);
}
}