From 2395a4e4348f6c4d4a8bd052223c6095c0daa6e2 Mon Sep 17 00:00:00 2001 From: TNE Date: Wed, 29 Jul 2026 20:56:29 +0200 Subject: [PATCH 1/2] Port automatic jetpack activation https://github.com/DeltaV-Station/Delta-v/pull/5776 DCO: https://github.com/DeltaV-Station/Acceleration/issues/1#issuecomment-5073895501 --- .../Movement/Components/JetpackComponent.cs | 15 ++++ .../Movement/Systems/SharedJetpackSystem.cs | 38 ++++++---- .../DVAutomaticJetpackUserComponent.cs | 16 +++++ .../Movement/Systems/SharedJetpackSystem.cs | 70 +++++++++++++++++++ .../Locale/en-US/_DVA/movement/jetpacks.ftl | 4 ++ 5 files changed, 129 insertions(+), 14 deletions(-) create mode 100644 Content.Shared/_DVA/Movement/Components/DVAutomaticJetpackUserComponent.cs create mode 100644 Content.Shared/_DVA/Movement/Systems/SharedJetpackSystem.cs create mode 100644 Resources/Locale/en-US/_DVA/movement/jetpacks.ftl diff --git a/Content.Shared/Movement/Components/JetpackComponent.cs b/Content.Shared/Movement/Components/JetpackComponent.cs index a84de7f196d..d5dd2bf5b80 100644 --- a/Content.Shared/Movement/Components/JetpackComponent.cs +++ b/Content.Shared/Movement/Components/JetpackComponent.cs @@ -25,4 +25,19 @@ public sealed partial class JetpackComponent : Component [ViewVariables(VVAccess.ReadWrite), DataField("weightlessModifier")] public float WeightlessModifier = 1.2f; + + // DeltaV Start - Jetpacks automatically toggle on. + /// + /// When toggling the jetpack, this will turn true/false. + /// Upon leaving a grid, this will determine if the jetpack activates. + /// + [DataField, AutoNetworkedField] + public bool AutomaticMode; + + /// + /// The user whose jetpack is waiting to activate. + /// + [DataField, AutoNetworkedField] + public EntityUid? AutomaticUser; + // DeltaV End - Jetpacks automatically toggle on. } diff --git a/Content.Shared/Movement/Systems/SharedJetpackSystem.cs b/Content.Shared/Movement/Systems/SharedJetpackSystem.cs index 113967335bf..3f091a10645 100644 --- a/Content.Shared/Movement/Systems/SharedJetpackSystem.cs +++ b/Content.Shared/Movement/Systems/SharedJetpackSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared._DVA.Movement.Components; // DeltaV - Jetpacks automatically toggle on. using Content.Shared.Actions; using Content.Shared.Gravity; using Content.Shared.Interaction.Events; @@ -36,6 +37,7 @@ public override void Initialize() SubscribeLocalEvent(OnJetpackUserGravityChanged); SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnAutomaticJetpackEntParentChanged); // DeltaV - Jetpacks automatically toggle on. } private void OnJetpackUserWeightlessMovement(Entity ent, ref RefreshWeightlessModifiersEvent args) @@ -71,13 +73,17 @@ private void OnJetpackUserGravityChanged(ref GravityChangedEvent ev) private void OnJetpackDropped(EntityUid uid, JetpackComponent component, DroppedEvent args) { + RemoveAutomaticJetpack((uid, component)); // DeltaV - Jetpacks automatically toggle on. SetEnabled(uid, component, false, args.User); } private void OnJetpackMoved(Entity ent, ref EntGotInsertedIntoContainerMessage args) { if (args.Container.Owner != ent.Comp.JetpackUser) + { + RemoveAutomaticJetpack(ent); // DeltaV - Jetpacks automatically toggle on. SetEnabled(ent, ent.Comp, false, ent.Comp.JetpackUser); + } } private void OnJetpackUserCanWeightless(EntityUid uid, JetpackUserComponent component, ref CanWeightlessMoveEvent args) @@ -125,20 +131,22 @@ private void RemoveUser(EntityUid uid, JetpackComponent component) _movementSpeedModifier.RefreshWeightlessModifiers(uid); } - private void OnJetpackToggle(EntityUid uid, JetpackComponent component, ToggleJetpackEvent args) - { - if (args.Handled) - return; - - if (TryComp(uid, out TransformComponent? xform) && !CanEnableOnGrid(xform.GridUid)) - { - _popup.PopupEntity(Loc.GetString("jetpack-no-station"), uid, args.Performer); - - return; - } - - SetEnabled(uid, component, !IsEnabled(uid)); - } + /// DeltaV Start - Replaced with DeltaV method in + // private void OnJetpackToggle(EntityUid uid, JetpackComponent component, ToggleJetpackEvent args) + // { + // if (args.Handled) + // return; + // + // if (TryComp(uid, out TransformComponent? xform) && !CanEnableOnGrid(xform.GridUid)) + // { + // _popup.PopupClient(Loc.GetString("jetpack-no-station"), uid, args.Performer); + // + // return; + // } + // + // SetEnabled(uid, component, !IsEnabled(uid)); + // } + // DeltaV End - Replaced with DeltaV method. private bool CanEnableOnGrid(EntityUid? gridUid) { @@ -171,6 +179,8 @@ public void SetEnabled(EntityUid uid, JetpackComponent component, bool enabled, user = container.Owner; } + RefreshAutomaticJetpack((uid, component), user.Value, enabled); // DeltaV - Jetpacks automatically turn on when toggled. + if (enabled) { // If the user is already using another jetpack, disable it first diff --git a/Content.Shared/_DVA/Movement/Components/DVAutomaticJetpackUserComponent.cs b/Content.Shared/_DVA/Movement/Components/DVAutomaticJetpackUserComponent.cs new file mode 100644 index 00000000000..b571f6a5565 --- /dev/null +++ b/Content.Shared/_DVA/Movement/Components/DVAutomaticJetpackUserComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._DVA.Movement.Components; + +/// +/// Added when someone holds a jetpack that is toggled active and waits to turn on. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class DVAutomaticJetpackUserComponent : Component +{ + /// + /// The jetpack that will automatically activate. + /// + [DataField, AutoNetworkedField] + public EntityUid Jetpack; +} diff --git a/Content.Shared/_DVA/Movement/Systems/SharedJetpackSystem.cs b/Content.Shared/_DVA/Movement/Systems/SharedJetpackSystem.cs new file mode 100644 index 00000000000..0f1d615b4fe --- /dev/null +++ b/Content.Shared/_DVA/Movement/Systems/SharedJetpackSystem.cs @@ -0,0 +1,70 @@ +using Content.Shared._DVA.Movement.Components; +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Events; + +namespace Content.Shared.Movement.Systems; + +public abstract partial class SharedJetpackSystem +{ + [Dependency] private SharedTransformSystem _transform = default!; + + private void OnJetpackToggle(Entity jetpack, ref ToggleJetpackEvent args) + { + if (args.Handled) + return; + + jetpack.Comp.AutomaticMode = !jetpack.Comp.AutomaticMode; + jetpack.Comp.AutomaticUser = args.Performer; + Dirty(jetpack); + + if (!CanEnableOnGrid(_transform.GetGrid(jetpack.Owner))) + { + if (jetpack.Comp.AutomaticMode) + { + var autoUser = EnsureComp(args.Performer); + autoUser.Jetpack = jetpack; + Dirty(args.Performer, autoUser); + } + else + { + RemComp(args.Performer); + } + + var message = jetpack.Comp.AutomaticMode ? "jetpack-activated-on-grid" : "jetpack-deactivated"; + _popup.PopupEntity(Loc.GetString(message), jetpack, args.Performer); + return; + } + + var messageOffGrid = jetpack.Comp.AutomaticMode ? "jetpack-activated-off-grid" : "jetpack-deactivated"; + _popup.PopupEntity(Loc.GetString(messageOffGrid), jetpack, args.Performer); + + SetEnabled(jetpack.Owner, jetpack.Comp, !IsEnabled(jetpack.Owner)); + } + + private void OnAutomaticJetpackEntParentChanged(Entity jetpackUser, ref EntParentChangedMessage args) + { + if (!TryComp(jetpackUser.Comp.Jetpack, out var jetpack) + || args.Transform.GridUid != null) + return; + + SetEnabled(jetpackUser.Comp.Jetpack, jetpack, true, args.Entity); + _popup.PopupEntity(Loc.GetString("jetpack-activates-automatically"), args.Entity, args.Entity); + } + + private void RemoveAutomaticJetpack(Entity jetpack) + { + jetpack.Comp.AutomaticMode = false; + if (jetpack.Comp.AutomaticUser.HasValue) + RemComp(jetpack.Comp.AutomaticUser.Value); + jetpack.Comp.AutomaticUser = null; + } + + private void RefreshAutomaticJetpack(Entity jetpack, EntityUid user, bool jetpackEnabled) + { + if (jetpackEnabled) + RemComp(user); + else if (jetpack.Comp.AutomaticMode) // DeltaV - Jetpacks automatically turn on when toggled. + EnsureComp(user).Jetpack = jetpack; + + } +} diff --git a/Resources/Locale/en-US/_DVA/movement/jetpacks.ftl b/Resources/Locale/en-US/_DVA/movement/jetpacks.ftl new file mode 100644 index 00000000000..19f9dd10fa5 --- /dev/null +++ b/Resources/Locale/en-US/_DVA/movement/jetpacks.ftl @@ -0,0 +1,4 @@ +jetpack-activated-on-grid = The jetpack will automatically turn on when leaving the station. +jetpack-activated-off-grid = The jetpack turns on. +jetpack-activates-automatically = The jetpack automatically turns on. +jetpack-deactivated = The jetpack will no longer turn on. From 5c92bad07fa74488c2f97b76c71ad87e1561a036 Mon Sep 17 00:00:00 2001 From: TNE <38938720+JustTNE@users.noreply.github.com> Date: Thu, 30 Jul 2026 03:39:47 +0200 Subject: [PATCH 2/2] Applied review suggestion Co-authored-by: pathetic meowmeow --- .../_DVA/Movement/Systems/SharedJetpackSystem.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Content.Shared/_DVA/Movement/Systems/SharedJetpackSystem.cs b/Content.Shared/_DVA/Movement/Systems/SharedJetpackSystem.cs index 0f1d615b4fe..534fb75baee 100644 --- a/Content.Shared/_DVA/Movement/Systems/SharedJetpackSystem.cs +++ b/Content.Shared/_DVA/Movement/Systems/SharedJetpackSystem.cs @@ -62,9 +62,15 @@ private void RemoveAutomaticJetpack(Entity jetpack) private void RefreshAutomaticJetpack(Entity jetpack, EntityUid user, bool jetpackEnabled) { if (jetpackEnabled) + { RemComp(user); - else if (jetpack.Comp.AutomaticMode) // DeltaV - Jetpacks automatically turn on when toggled. - EnsureComp(user).Jetpack = jetpack; + } + else if (jetpack.Comp.AutomaticMode) + { + var pack = EnsureComp(user); + pack.Jetpack = jetpack; + Dirty(user, pack); + } } }