private void SetupUser(EntityUid uid, JetpackComponent component)
    {
        var user  = EnsureComp <JetpackUserComponent>(uid);
        var relay = EnsureComp <RelayInputMoverComponent>(uid);

        relay.RelayEntity = component.Owner;
        user.Jetpack      = component.Owner;
    }
    private void SetupUser(EntityUid uid, JetpackComponent component)
    {
        var user = EnsureComp <JetpackUserComponent>(uid);

        user.Acceleration       = component.Acceleration;
        user.Friction           = component.Friction;
        user.WeightlessModifier = component.WeightlessModifier;
    }
    private void OnJetpackToggle(EntityUid uid, JetpackComponent component, ToggleJetpackEvent args)
    {
        if (args.Handled)
        {
            return;
        }

        SetEnabled(component, !IsEnabled(uid));
    }
    private void OnJetpackAppearance(EntityUid uid, JetpackComponent component, ref AppearanceChangeEvent args)
    {
        args.Component.TryGetData(JetpackVisuals.Enabled, out bool enabled);

        var state = "icon" + (enabled ? "-on" : "");

        args.Sprite?.LayerSetState(0, state);

        if (TryComp <ClothingComponent>(uid, out var clothing))
        {
            clothing.EquippedPrefix = enabled ? "on" : null;
        }
    }
    public void SetEnabled(JetpackComponent component, bool enabled, EntityUid?user = null)
    {
        if (IsEnabled(component.Owner) == enabled ||
            enabled && !CanEnable(component))
        {
            return;
        }

        if (enabled)
        {
            EnsureComp <ActiveJetpackComponent>(component.Owner);
        }
        else
        {
            RemComp <ActiveJetpackComponent>(component.Owner);
        }

        if (user == null)
        {
            Container.TryGetContainingContainer(component.Owner, out var container);
            user = container?.Owner;
        }

        // Can't activate if no one's using.
        if (user == null && enabled)
        {
            return;
        }

        if (user != null)
        {
            if (enabled)
            {
                SetupUser(user.Value, component);
            }
            else
            {
                RemoveUser(user.Value);
            }

            MovementSpeedModifier.RefreshMovementSpeedModifiers(user.Value);
        }

        TryComp <AppearanceComponent>(component.Owner, out var appearance);
        appearance?.SetData(JetpackVisuals.Enabled, enabled);
        Dirty(component);
    }
    private void OnJetpackToggle(EntityUid uid, JetpackComponent component, ToggleJetpackEvent args)
    {
        if (args.Handled)
        {
            return;
        }

        if (TryComp <TransformComponent>(uid, out var xform) && !CanEnableOnGrid(xform.GridUid))
        {
            if (_timing.IsFirstTimePredicted)
            {
                _popups.PopupEntity(Loc.GetString("jetpack-no-station"), uid, Filter.Entities(args.Performer));
            }

            return;
        }

        SetEnabled(component, !IsEnabled(uid));
    }
 protected override bool CanEnable(JetpackComponent component)
 {
     return(TryComp <GasTankComponent>(component.Owner, out var gasTank) && !(gasTank.Air.TotalMoles < component.MoleUsage));
 }
 private void OnJetpackDropped(EntityUid uid, JetpackComponent component, DroppedEvent args)
 {
     SetEnabled(component, false, args.User);
 }
 private void OnJetpackCanWeightlessMove(EntityUid uid, JetpackComponent component, ref CanWeightlessMoveEvent args)
 {
     args.CanMove = true;
 }
 protected virtual bool CanEnable(JetpackComponent component)
 {
     return(true);
 }
 private void OnJetpackGetAction(EntityUid uid, JetpackComponent component, GetItemActionsEvent args)
 {
     args.Actions.Add(component.ToggleAction);
 }
 protected override bool CanEnable(JetpackComponent component)
 {
     // No predicted atmos so you'd have to do a lot of funny to get this working.
     return(false);
 }
 protected abstract bool CanEnable(JetpackComponent component);