| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- using Content.Shared.Clothing.Components;
- using Content.Shared.Clothing.EntitySystems;
- using Content.Shared.Movement.Components;
- using Content.Shared.Movement.Systems;
- using Robust.Client.GameObjects;
- using Robust.Shared.Map;
- using Robust.Shared.Map.Components;
- using Robust.Shared.Physics.Components;
- using Robust.Shared.Timing;
- namespace Content.Client.Movement.Systems;
- public sealed class JetpackSystem : SharedJetpackSystem
- {
- [Dependency] private readonly IGameTiming _timing = default!;
- [Dependency] private readonly ClothingSystem _clothing = default!;
- [Dependency] private readonly SharedTransformSystem _transform = default!;
- [Dependency] private readonly SharedMapSystem _mapSystem = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<JetpackComponent, AppearanceChangeEvent>(OnJetpackAppearance);
- }
- protected override bool CanEnable(EntityUid uid, JetpackComponent component)
- {
- // No predicted atmos so you'd have to do a lot of funny to get this working.
- return false;
- }
- private void OnJetpackAppearance(EntityUid uid, JetpackComponent component, ref AppearanceChangeEvent args)
- {
- Appearance.TryGetData<bool>(uid, JetpackVisuals.Enabled, out var enabled, args.Component);
- var state = "icon" + (enabled ? "-on" : "");
- args.Sprite?.LayerSetState(0, state);
- if (TryComp<ClothingComponent>(uid, out var clothing))
- _clothing.SetEquippedPrefix(uid, enabled ? "on" : null, clothing);
- }
- public override void Update(float frameTime)
- {
- base.Update(frameTime);
- if (!_timing.IsFirstTimePredicted)
- return;
- // TODO: Please don't copy-paste this I beg
- // make a generic particle emitter system / actual particles instead.
- var query = EntityQueryEnumerator<ActiveJetpackComponent>();
- while (query.MoveNext(out var uid, out var comp))
- {
- if (_timing.CurTime < comp.TargetTime)
- continue;
- comp.TargetTime = _timing.CurTime + TimeSpan.FromSeconds(comp.EffectCooldown);
- CreateParticles(uid);
- }
- }
- private void CreateParticles(EntityUid uid)
- {
- var uidXform = Transform(uid);
- // Don't show particles unless the user is moving.
- if (Container.TryGetContainingContainer((uid, uidXform, null), out var container) &&
- TryComp<PhysicsComponent>(container.Owner, out var body) &&
- body.LinearVelocity.LengthSquared() < 1f)
- {
- return;
- }
- var coordinates = uidXform.Coordinates;
- var gridUid = _transform.GetGrid(coordinates);
- if (TryComp<MapGridComponent>(gridUid, out var grid))
- {
- coordinates = new EntityCoordinates(gridUid.Value, _mapSystem.WorldToLocal(gridUid.Value, grid, _transform.ToMapCoordinates(coordinates).Position));
- }
- else if (uidXform.MapUid != null)
- {
- coordinates = new EntityCoordinates(uidXform.MapUid.Value, _transform.GetWorldPosition(uidXform));
- }
- else
- {
- return;
- }
- Spawn("JetpackEffect", coordinates);
- }
- }
|