diff --git a/Content.Server/Gravity/EntitySystems/WeightlessSystem.cs b/Content.Server/Gravity/EntitySystems/WeightlessSystem.cs index 9d0f5c256d..4c670b0844 100644 --- a/Content.Server/Gravity/EntitySystems/WeightlessSystem.cs +++ b/Content.Server/Gravity/EntitySystems/WeightlessSystem.cs @@ -1,6 +1,7 @@ using Content.Shared.Alert; using Content.Shared.GameTicking; using Content.Shared.Gravity; +using Content.Shared.Movement.Components; using JetBrains.Annotations; using Robust.Shared.Map; using Robust.Shared.Utility; @@ -21,7 +22,7 @@ namespace Content.Server.Gravity.EntitySystems SubscribeLocalEvent(Reset); SubscribeLocalEvent(GravityChanged); - SubscribeLocalEvent(EntParentChanged); + SubscribeLocalEvent(EntParentChanged); SubscribeLocalEvent(HandleAlertSyncEvent); } @@ -32,12 +33,12 @@ namespace Content.Server.Gravity.EntitySystems public void AddAlert(AlertsComponent status) { - var gridId = EntityManager.GetComponent(status.Owner).GridID; - var alerts = _alerts.GetOrNew(gridId); + var xform = Transform(status.Owner); + var alerts = _alerts.GetOrNew(xform.GridID); alerts.Add(status); - if (_mapManager.TryGetGrid(EntityManager.GetComponent(status.Owner).GridID, out var grid)) + if (_mapManager.TryGetGrid(xform.GridID, out var grid)) { if (EntityManager.GetComponent(grid.GridEntityId).Enabled) { @@ -94,13 +95,9 @@ namespace Content.Server.Gravity.EntitySystems _alertsSystem.ClearAlert(euid, AlertType.Weightless); } - private void EntParentChanged(ref EntParentChangedMessage ev) + private void EntParentChanged(EntityUid uid, AlertsComponent status, ref EntParentChangedMessage ev) { - if (!EntityManager.TryGetComponent(ev.Entity, out AlertsComponent? status)) - { - return; - } - + // First, update the `_alerts` dictionary if (ev.OldParent is {Valid: true} old && EntityManager.TryGetComponent(old, out IMapGridComponent? mapGrid)) { @@ -112,10 +109,21 @@ namespace Content.Server.Gravity.EntitySystems } } - var newGrid = EntityManager.GetComponent(ev.Entity).GridID; + var newGrid = ev.Transform.GridID; var newStatuses = _alerts.GetOrNew(newGrid); newStatuses.Add(status); + + // then update the actual alert. The alert is only removed if either the player is on a grid with gravity, + // or if they ignore gravity-based movement altogether. + // TODO: update this when planets and the like are added. + // TODO: update alert when the ignore-gravity component is added or removed. + if (_mapManager.TryGetGrid(newGrid, out var grid) + && TryComp(grid.GridEntityId, out GravityComponent? gravity) + && gravity.Enabled) + RemoveWeightless(status.Owner); + else if (!HasComp(uid)) + AddWeightless(status.Owner); } private void HandleAlertSyncEvent(EntityUid uid, AlertsComponent component, AlertSyncEvent args)