106 lines
3.6 KiB
C#
106 lines
3.6 KiB
C#
using Content.Server.Item;
|
|
using Content.Server.Popups;
|
|
using Content.Shared.Damage;
|
|
using Content.Shared.Examine;
|
|
using Content.Shared.FixedPoint;
|
|
using Content.Shared.Item.ItemToggle.Components;
|
|
using Robust.Shared.Audio;
|
|
using Robust.Shared.Audio.Systems;
|
|
|
|
namespace Content.Server._White.Other.RechargeableSystem;
|
|
|
|
|
|
public sealed class RechargeableSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly PopupSystem _popup = default!;
|
|
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
|
[Dependency] private readonly ItemToggleSystem _itemToggle = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<RechargeableComponent, ComponentInit>(OnInit);
|
|
SubscribeLocalEvent<RechargeableComponent, DamageChangedEvent>(OnDamageChanged);
|
|
SubscribeLocalEvent<RechargeableComponent, ExaminedEvent>(OnExamined);
|
|
SubscribeLocalEvent<RechargeableComponent, ItemToggleActivateAttemptEvent>(OnTryActivate);
|
|
}
|
|
|
|
private void OnTryActivate(Entity<RechargeableComponent> ent, ref ItemToggleActivateAttemptEvent args)
|
|
{
|
|
if (!ent.Comp.Discharged)
|
|
return;
|
|
|
|
args.Cancelled = true;
|
|
|
|
_audio.PlayPvs(_audio.GetSound(ent.Comp.TurnOnFailSound), ent, AudioParams.Default.WithVariation(0.25f));
|
|
_popup.PopupEntity(Loc.GetString("stunbaton-component-low-charge"), args.User ?? ent);
|
|
}
|
|
|
|
private void OnExamined(EntityUid uid, RechargeableComponent component, ExaminedEvent args)
|
|
{
|
|
if (component.Discharged)
|
|
{
|
|
var remainingTime = (int) (component.RechargeDelay - component.AccumulatedFrametime);
|
|
args.PushMarkup("Он [color=red]разряжен[/color].");
|
|
args.PushMarkup($"Осталось времени для зарядки: [color=green]{remainingTime}[/color] секунд.");
|
|
return;
|
|
}
|
|
|
|
var currentCharge = (int) (100 * component.Charge / component.MaxCharge);
|
|
args.PushMarkup($"Текущий заряд: [color=green]{currentCharge}%[/color]");
|
|
}
|
|
|
|
public override void Update(float frameTime)
|
|
{
|
|
base.Update(frameTime);
|
|
|
|
foreach (var rechargeable in EntityManager.EntityQuery<RechargeableComponent>())
|
|
{
|
|
if (!rechargeable.Discharged && rechargeable.Charge == rechargeable.MaxCharge)
|
|
continue;
|
|
|
|
rechargeable.AccumulatedFrametime += frameTime;
|
|
|
|
var delay = rechargeable.Discharged ? rechargeable.RechargeDelay : 1f;
|
|
|
|
if (rechargeable.AccumulatedFrametime < delay)
|
|
continue;
|
|
|
|
rechargeable.AccumulatedFrametime -= delay;
|
|
|
|
if (rechargeable.Discharged)
|
|
{
|
|
rechargeable.Discharged = false;
|
|
rechargeable.Charge = rechargeable.MaxCharge;
|
|
}
|
|
else
|
|
{
|
|
rechargeable.Charge = FixedPoint2.Min(rechargeable.MaxCharge,
|
|
rechargeable.Charge + rechargeable.ChargePerSecond);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnDamageChanged(EntityUid uid, RechargeableComponent component, DamageChangedEvent args)
|
|
{
|
|
if (component.Discharged || args.DamageDelta == null)
|
|
return;
|
|
|
|
var totalDamage = args.DamageDelta.GetTotal();
|
|
|
|
component.Charge = FixedPoint2.Max(FixedPoint2.Zero, component.Charge - totalDamage);
|
|
|
|
if (component.Charge > FixedPoint2.Zero)
|
|
return;
|
|
|
|
component.Discharged = true;
|
|
_itemToggle.TryDeactivate(uid);
|
|
}
|
|
|
|
private void OnInit(EntityUid uid, RechargeableComponent component, ComponentInit args)
|
|
{
|
|
component.Charge = component.MaxCharge;
|
|
}
|
|
}
|