MousetrapSystem.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Content.Server.Damage.Systems;
  2. using Content.Server.Explosion.EntitySystems;
  3. using Content.Server.Popups;
  4. using Content.Shared.Interaction.Events;
  5. using Content.Shared.Inventory;
  6. using Content.Shared.Mousetrap;
  7. using Content.Shared.StepTrigger;
  8. using Content.Shared.StepTrigger.Systems;
  9. using Robust.Server.GameObjects;
  10. using Robust.Shared.Physics.Components;
  11. using Robust.Shared.Player;
  12. namespace Content.Server.Mousetrap;
  13. public sealed class MousetrapSystem : EntitySystem
  14. {
  15. [Dependency] private readonly PopupSystem _popupSystem = default!;
  16. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  17. public override void Initialize()
  18. {
  19. SubscribeLocalEvent<MousetrapComponent, UseInHandEvent>(OnUseInHand);
  20. SubscribeLocalEvent<MousetrapComponent, BeforeDamageUserOnTriggerEvent>(BeforeDamageOnTrigger);
  21. SubscribeLocalEvent<MousetrapComponent, StepTriggerAttemptEvent>(OnStepTriggerAttempt);
  22. SubscribeLocalEvent<MousetrapComponent, TriggerEvent>(OnTrigger);
  23. }
  24. private void OnUseInHand(EntityUid uid, MousetrapComponent component, UseInHandEvent args)
  25. {
  26. if (args.Handled)
  27. return;
  28. component.IsActive = !component.IsActive;
  29. _popupSystem.PopupEntity(component.IsActive
  30. ? Loc.GetString("mousetrap-on-activate")
  31. : Loc.GetString("mousetrap-on-deactivate"),
  32. uid,
  33. args.User);
  34. UpdateVisuals(uid);
  35. args.Handled = true;
  36. }
  37. private void OnStepTriggerAttempt(EntityUid uid, MousetrapComponent component, ref StepTriggerAttemptEvent args)
  38. {
  39. args.Continue |= component.IsActive;
  40. }
  41. private void BeforeDamageOnTrigger(EntityUid uid, MousetrapComponent component, BeforeDamageUserOnTriggerEvent args)
  42. {
  43. if (TryComp(args.Tripper, out PhysicsComponent? physics) && physics.Mass != 0)
  44. {
  45. // The idea here is inverse,
  46. // Small - big damage,
  47. // Large - small damage
  48. // yes i punched numbers into a calculator until the graph looked right
  49. var scaledDamage = -50 * Math.Atan(physics.Mass - component.MassBalance) + (25 * Math.PI);
  50. args.Damage *= scaledDamage;
  51. }
  52. }
  53. private void OnTrigger(EntityUid uid, MousetrapComponent component, TriggerEvent args)
  54. {
  55. component.IsActive = false;
  56. UpdateVisuals(uid);
  57. }
  58. private void UpdateVisuals(EntityUid uid, MousetrapComponent? mousetrap = null, AppearanceComponent? appearance = null)
  59. {
  60. if (!Resolve(uid, ref mousetrap, ref appearance, false))
  61. {
  62. return;
  63. }
  64. _appearance.SetData(uid, MousetrapVisuals.Visual,
  65. mousetrap.IsActive ? MousetrapVisuals.Armed : MousetrapVisuals.Unarmed, appearance);
  66. }
  67. }