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..534fb75baee --- /dev/null +++ b/Content.Shared/_DVA/Movement/Systems/SharedJetpackSystem.cs @@ -0,0 +1,76 @@ +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) + { + var pack = EnsureComp(user); + pack.Jetpack = jetpack; + Dirty(user, pack); + } + + } +} 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.