1
0

JetpackSystem.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Content.Shared.Clothing.Components;
  2. using Content.Shared.Clothing.EntitySystems;
  3. using Content.Shared.Movement.Components;
  4. using Content.Shared.Movement.Systems;
  5. using Robust.Client.GameObjects;
  6. using Robust.Shared.Map;
  7. using Robust.Shared.Map.Components;
  8. using Robust.Shared.Physics.Components;
  9. using Robust.Shared.Timing;
  10. namespace Content.Client.Movement.Systems;
  11. public sealed class JetpackSystem : SharedJetpackSystem
  12. {
  13. [Dependency] private readonly IGameTiming _timing = default!;
  14. [Dependency] private readonly ClothingSystem _clothing = default!;
  15. [Dependency] private readonly SharedTransformSystem _transform = default!;
  16. [Dependency] private readonly SharedMapSystem _mapSystem = default!;
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<JetpackComponent, AppearanceChangeEvent>(OnJetpackAppearance);
  21. }
  22. protected override bool CanEnable(EntityUid uid, JetpackComponent component)
  23. {
  24. // No predicted atmos so you'd have to do a lot of funny to get this working.
  25. return false;
  26. }
  27. private void OnJetpackAppearance(EntityUid uid, JetpackComponent component, ref AppearanceChangeEvent args)
  28. {
  29. Appearance.TryGetData<bool>(uid, JetpackVisuals.Enabled, out var enabled, args.Component);
  30. var state = "icon" + (enabled ? "-on" : "");
  31. args.Sprite?.LayerSetState(0, state);
  32. if (TryComp<ClothingComponent>(uid, out var clothing))
  33. _clothing.SetEquippedPrefix(uid, enabled ? "on" : null, clothing);
  34. }
  35. public override void Update(float frameTime)
  36. {
  37. base.Update(frameTime);
  38. if (!_timing.IsFirstTimePredicted)
  39. return;
  40. // TODO: Please don't copy-paste this I beg
  41. // make a generic particle emitter system / actual particles instead.
  42. var query = EntityQueryEnumerator<ActiveJetpackComponent>();
  43. while (query.MoveNext(out var uid, out var comp))
  44. {
  45. if (_timing.CurTime < comp.TargetTime)
  46. continue;
  47. comp.TargetTime = _timing.CurTime + TimeSpan.FromSeconds(comp.EffectCooldown);
  48. CreateParticles(uid);
  49. }
  50. }
  51. private void CreateParticles(EntityUid uid)
  52. {
  53. var uidXform = Transform(uid);
  54. // Don't show particles unless the user is moving.
  55. if (Container.TryGetContainingContainer((uid, uidXform, null), out var container) &&
  56. TryComp<PhysicsComponent>(container.Owner, out var body) &&
  57. body.LinearVelocity.LengthSquared() < 1f)
  58. {
  59. return;
  60. }
  61. var coordinates = uidXform.Coordinates;
  62. var gridUid = _transform.GetGrid(coordinates);
  63. if (TryComp<MapGridComponent>(gridUid, out var grid))
  64. {
  65. coordinates = new EntityCoordinates(gridUid.Value, _mapSystem.WorldToLocal(gridUid.Value, grid, _transform.ToMapCoordinates(coordinates).Position));
  66. }
  67. else if (uidXform.MapUid != null)
  68. {
  69. coordinates = new EntityCoordinates(uidXform.MapUid.Value, _transform.GetWorldPosition(uidXform));
  70. }
  71. else
  72. {
  73. return;
  74. }
  75. Spawn("JetpackEffect", coordinates);
  76. }
  77. }