fish-station/Content.Server/_Sunrise/EnergyShield/EnergyShieldSystem.cs
Copilot 5c5900f367
Запретить активацию и автоматически отключать энергетический щит в контейнерах (#2997)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: VigersRay <60344369+VigersRay@users.noreply.github.com>
Co-authored-by: Vigers Ray <vigersray@gmail.com>
2025-09-10 02:46:20 +03:00

72 lines
2.3 KiB
C#

using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Shared.Damage;
using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Item.ItemToggle;
using Content.Shared.Popups;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Containers;
namespace Content.Server._Sunrise.EnergyShield;
public sealed class EnergyShieldSystem : EntitySystem
{
[Dependency] private readonly BatterySystem _battery = default!;
[Dependency] private readonly ItemToggleSystem _itemToggle = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
public override void Initialize()
{
SubscribeLocalEvent<EnergyShieldComponent, DamageChangedEvent>(OnDamage);
SubscribeLocalEvent<EnergyShieldComponent, ItemToggleActivateAttemptEvent>(OnToggleAttempt);
}
private void OnDamage(Entity<EnergyShieldComponent> ent, ref DamageChangedEvent args)
{
if (!_itemToggle.IsActivated(ent.Owner))
return;
if (args.DamageDelta == null)
return;
if (!TryComp<BatteryComponent>(ent, out var battery))
return;
var totalDamage = args.DamageDelta.GetTotal();
if (totalDamage <= 0)
return;
var cost = totalDamage.Float() * ent.Comp.EnergyCostPerDamage;
_battery.UseCharge(ent, cost, battery);
_audio.PlayPvs(ent.Comp.AbsorbSound, ent);
if (battery.CurrentCharge <= 0)
{
_itemToggle.Toggle(ent.Owner);
_audio.PlayPvs(ent.Comp.ShutdownSound, ent);
}
}
private void OnToggleAttempt(Entity<EnergyShieldComponent> ent, ref ItemToggleActivateAttemptEvent args)
{
if (TryComp<BatteryComponent>(ent, out var battery) &&
battery.CurrentCharge >= battery.MaxCharge * ent.Comp.MinChargeFractionForActivation)
{
return;
}
if (Exists(args.User))
{
_popup.PopupEntity(
Loc.GetString("stunbaton-component-low-charge"),
args.User.Value,
args.User.Value,
PopupType.Small
);
}
args.Cancelled = true;
}
}