SharedTetherGunSystem.Force.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System.Numerics;
  2. using Content.Shared.Interaction;
  3. using Robust.Shared.Map;
  4. namespace Content.Shared.Weapons.Misc;
  5. public abstract partial class SharedTetherGunSystem
  6. {
  7. private void InitializeForce()
  8. {
  9. SubscribeLocalEvent<ForceGunComponent, AfterInteractEvent>(OnForceRanged);
  10. SubscribeLocalEvent<ForceGunComponent, ActivateInWorldEvent>(OnForceActivate);
  11. }
  12. private void OnForceActivate(EntityUid uid, ForceGunComponent component, ActivateInWorldEvent args)
  13. {
  14. if (!args.Complex)
  15. return;
  16. StopTether(uid, component);
  17. }
  18. private void OnForceRanged(EntityUid uid, ForceGunComponent component, AfterInteractEvent args)
  19. {
  20. if (IsTethered(component))
  21. {
  22. if (!args.ClickLocation.TryDistance(EntityManager, TransformSystem, Transform(uid).Coordinates,
  23. out var distance) ||
  24. distance > component.ThrowDistance)
  25. {
  26. return;
  27. }
  28. // URGH, soon
  29. // Need auto states to be nicer + powercelldraw to be nicer
  30. if (!_netManager.IsServer)
  31. return;
  32. // Launch
  33. var tethered = component.Tethered;
  34. StopTether(uid, component, land: false);
  35. _throwing.TryThrow(tethered!.Value, args.ClickLocation, component.ThrowForce, playSound: false);
  36. _audio.PlayPredicted(component.LaunchSound, uid, null);
  37. }
  38. else if (args.Target != null)
  39. {
  40. // Pickup
  41. if (TryTether(uid, args.Target.Value, args.User, component))
  42. TransformSystem.SetCoordinates(component.TetherEntity!.Value, new EntityCoordinates(uid, new Vector2(0f, 0f)));
  43. }
  44. }
  45. private bool IsTethered(ForceGunComponent component)
  46. {
  47. return component.Tethered != null;
  48. }
  49. }