114 lines
4.5 KiB
C#
114 lines
4.5 KiB
C#
using Content.Shared._CP14.MagicEnergy;
|
|
using Content.Shared.Bed.Sleep;
|
|
using Content.Shared.Damage;
|
|
using Content.Shared.IdentityManagement;
|
|
using Content.Shared.Popups;
|
|
using Content.Shared.StatusEffectNew;
|
|
using Content.Shared.Trigger.Systems;
|
|
|
|
namespace Content.Shared._CP14.MagicWeakness;
|
|
|
|
public abstract class CP14SharedMagicWeaknessSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly StatusEffectsSystem _statusEffects = default!;
|
|
[Dependency] private readonly DamageableSystem _damageable = default!;
|
|
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
|
[Dependency] private readonly TriggerSystem _trigger = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<CP14MagicUnsafeDamageComponent, CP14MagicEnergyBurnOutEvent>(OnMagicEnergyBurnOutDamage);
|
|
SubscribeLocalEvent<CP14MagicUnsafeDamageComponent, CP14MagicEnergyOverloadEvent>(OnMagicEnergyOverloadDamage);
|
|
|
|
SubscribeLocalEvent<CP14MagicUnsafeSleepComponent, CP14MagicEnergyBurnOutEvent>(OnMagicEnergyBurnOutSleep);
|
|
SubscribeLocalEvent<CP14MagicUnsafeSleepComponent, CP14MagicEnergyOverloadEvent>(OnMagicEnergyOverloadSleep);
|
|
|
|
SubscribeLocalEvent<CP14MagicUnsafeTriggerComponent, CP14MagicEnergyBurnOutEvent>(OnMagicEnergyBurnOutTrigger);
|
|
SubscribeLocalEvent<CP14MagicUnsafeTriggerComponent, CP14MagicEnergyOverloadEvent>(OnMagicEnergyOverloadTrigger);
|
|
}
|
|
|
|
private void OnMagicEnergyBurnOutSleep(Entity<CP14MagicUnsafeSleepComponent> ent,
|
|
ref CP14MagicEnergyBurnOutEvent args)
|
|
{
|
|
if (args.BurnOutEnergy > ent.Comp.SleepThreshold)
|
|
{
|
|
_popup.PopupEntity(Loc.GetString("cp14-magic-energy-damage-burn-out-fall"),
|
|
ent,
|
|
ent,
|
|
PopupType.LargeCaution);
|
|
_statusEffects.TryAddStatusEffectDuration(
|
|
ent,
|
|
SleepingSystem.StatusEffectForcedSleeping,
|
|
TimeSpan.FromSeconds(ent.Comp.SleepPerEnergy * (float)args.BurnOutEnergy));
|
|
}
|
|
}
|
|
|
|
private void OnMagicEnergyOverloadSleep(Entity<CP14MagicUnsafeSleepComponent> ent,
|
|
ref CP14MagicEnergyOverloadEvent args)
|
|
{
|
|
if (args.OverloadEnergy > ent.Comp.SleepThreshold)
|
|
{
|
|
_popup.PopupEntity(Loc.GetString("cp14-magic-energy-damage-burn-out-fall"),
|
|
ent,
|
|
ent,
|
|
PopupType.LargeCaution);
|
|
_statusEffects.TryAddStatusEffectDuration(
|
|
ent,
|
|
SleepingSystem.StatusEffectForcedSleeping,
|
|
TimeSpan.FromSeconds(ent.Comp.SleepPerEnergy * (float)args.OverloadEnergy));
|
|
}
|
|
}
|
|
|
|
private void OnMagicEnergyOverloadTrigger(Entity<CP14MagicUnsafeTriggerComponent> ent, ref CP14MagicEnergyOverloadEvent args)
|
|
{
|
|
_trigger.Trigger(ent);
|
|
}
|
|
|
|
private void OnMagicEnergyBurnOutTrigger(Entity<CP14MagicUnsafeTriggerComponent> ent, ref CP14MagicEnergyBurnOutEvent args)
|
|
{
|
|
_trigger.Trigger(ent);
|
|
}
|
|
|
|
private void OnMagicEnergyBurnOutDamage(Entity<CP14MagicUnsafeDamageComponent> ent,
|
|
ref CP14MagicEnergyBurnOutEvent args)
|
|
{
|
|
//TODO: Idk why this dont popup recipient
|
|
//Others popup
|
|
_popup.PopupPredicted(Loc.GetString("cp14-magic-energy-damage-burn-out"),
|
|
Loc.GetString("cp14-magic-energy-damage-burn-out-other", ("name", Identity.Name(ent, EntityManager))),
|
|
ent,
|
|
ent);
|
|
|
|
//Local self popup
|
|
_popup.PopupEntity(
|
|
Loc.GetString("cp14-magic-energy-damage-burn-out"),
|
|
ent,
|
|
ent,
|
|
PopupType.LargeCaution);
|
|
|
|
_damageable.TryChangeDamage(ent, ent.Comp.DamagePerEnergy * args.BurnOutEnergy, interruptsDoAfters: false);
|
|
}
|
|
|
|
private void OnMagicEnergyOverloadDamage(Entity<CP14MagicUnsafeDamageComponent> ent,
|
|
ref CP14MagicEnergyOverloadEvent args)
|
|
{
|
|
//TODO: Idk why this dont popup recipient
|
|
//Others popup
|
|
_popup.PopupPredicted(Loc.GetString("cp14-magic-energy-damage-overload"),
|
|
Loc.GetString("cp14-magic-energy-damage-overload-other", ("name", Identity.Name(ent, EntityManager))),
|
|
ent,
|
|
ent);
|
|
|
|
//Local self popup
|
|
_popup.PopupEntity(
|
|
Loc.GetString("cp14-magic-energy-damage-overload"),
|
|
ent,
|
|
ent,
|
|
PopupType.LargeCaution);
|
|
|
|
_damageable.TryChangeDamage(ent, ent.Comp.DamagePerEnergy * args.OverloadEnergy, interruptsDoAfters: false);
|
|
}
|
|
}
|