--- /dev/null
+using Content.Shared.FixedPoint;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Emp;
+
+/// <summary>
+/// An entity with this component resists or is fully immune to EMPs.
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+[Access(typeof(SharedEmpSystem))]
+public sealed partial class EmpResistanceComponent : Component
+{
+ /// <summary>
+ /// The proportion of the EMP effect that is resisted. 1.00 indicates full immunity while 0.00 indicates no resistance.
+ /// </summary>
+ [DataField, AutoNetworkedField]
+ public FixedPoint2 Resistance = FixedPoint2.Zero;
+}
using Robust.Shared.Timing;
using Robust.Shared.Network;
using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
namespace Content.Shared.Emp;
SubscribeLocalEvent<EmpDisabledComponent, ExaminedEvent>(OnExamine);
SubscribeLocalEvent<EmpDisabledComponent, ComponentRemove>(OnRemove);
SubscribeLocalEvent<EmpDisabledComponent, RejuvenateEvent>(OnRejuvenate);
+
+ SubscribeLocalEvent<EmpResistanceComponent, EmpAttemptEvent>(OnResistEmpAttempt);
+ SubscribeLocalEvent<EmpResistanceComponent, EmpPulseEvent>(OnResistEmpPulse);
}
public static readonly EntProtoId EmpPulseEffectPrototype = "EffectEmpPulse";
{
RemCompDeferred<EmpDisabledComponent>(ent);
}
+
+ private void OnResistEmpAttempt(Entity<EmpResistanceComponent> ent, ref EmpAttemptEvent args)
+ {
+ if (ent.Comp.Resistance >= 1)
+ args.Cancelled = true;
+ }
+
+ private void OnResistEmpPulse(Entity<EmpResistanceComponent> ent, ref EmpPulseEvent args)
+ {
+ var empStrengthMultiplier = 1 - ent.Comp.Resistance;
+
+ if (empStrengthMultiplier <= 0)
+ return;
+
+ args.Duration *= (float) empStrengthMultiplier;
+ args.EnergyConsumption *= (float) empStrengthMultiplier;
+ }
}
/// <summary>
SubscribeLocalEvent<NinjaSuitComponent, CreateItemAttemptEvent>(OnCreateStarAttempt);
SubscribeLocalEvent<NinjaSuitComponent, ItemToggleActivateAttemptEvent>(OnActivateAttempt);
SubscribeLocalEvent<NinjaSuitComponent, GotUnequippedEvent>(OnUnequipped);
- SubscribeLocalEvent<NinjaSuitComponent, EmpAttemptEvent>(OnEmpAttempt);
}
private void OnEquipped(Entity<NinjaSuitComponent> ent, ref ClothingGotEquippedEvent args)
if (user.Comp.Gloves is { } uid)
_toggle.TryDeactivate(uid, user: user);
}
-
- private void OnEmpAttempt(Entity<NinjaSuitComponent> ent, ref EmpAttemptEvent args)
- {
- // ninja suit (battery) is immune to emp
- // powercell relays the event to suit
- args.Cancelled = true;
- }
}
sprite: Clothing/Ears/Headsets/ninja.rsi
- type: Clothing
sprite: Clothing/Ears/Headsets/ninja.rsi
+ - type: EmpResistance
+ resistance: 1
noPowerPopup: ninja-no-power
# core ninja suit stuff
- type: NinjaSuit
+ - type: EmpResistance
+ resistance: 1
- type: UseDelay
delay: 5 # disable time
- type: PowerCellSlot