EmpReactionEffect.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using Content.Server.Emp;
  2. using Content.Shared.EntityEffects;
  3. using Content.Shared.Chemistry.Reagent;
  4. using Robust.Server.GameObjects;
  5. using Robust.Shared.Prototypes;
  6. namespace Content.Server.EntityEffects.Effects;
  7. [DataDefinition]
  8. public sealed partial class EmpReactionEffect : EntityEffect
  9. {
  10. /// <summary>
  11. /// Impulse range per unit of quantity
  12. /// </summary>
  13. [DataField("rangePerUnit")]
  14. public float EmpRangePerUnit = 0.5f;
  15. /// <summary>
  16. /// Maximum impulse range
  17. /// </summary>
  18. [DataField("maxRange")]
  19. public float EmpMaxRange = 10;
  20. /// <summary>
  21. /// How much energy will be drain from sources
  22. /// </summary>
  23. [DataField]
  24. public float EnergyConsumption = 12500;
  25. /// <summary>
  26. /// Amount of time entities will be disabled
  27. /// </summary>
  28. [DataField("duration")]
  29. public float DisableDuration = 15;
  30. protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
  31. => Loc.GetString("reagent-effect-guidebook-emp-reaction-effect", ("chance", Probability));
  32. public override void Effect(EntityEffectBaseArgs args)
  33. {
  34. var tSys = args.EntityManager.System<TransformSystem>();
  35. var transform = args.EntityManager.GetComponent<TransformComponent>(args.TargetEntity);
  36. var range = EmpRangePerUnit;
  37. if (args is EntityEffectReagentArgs reagentArgs)
  38. {
  39. range = MathF.Min((float) (reagentArgs.Quantity * EmpRangePerUnit), EmpMaxRange);
  40. }
  41. args.EntityManager.System<EmpSystem>()
  42. .EmpPulse(tSys.GetMapCoordinates(args.TargetEntity, xform: transform),
  43. range,
  44. EnergyConsumption,
  45. DisableDuration);
  46. }
  47. }