using System.Collections.Generic; using Content.Server.Alert; using Content.Shared.Alert; using Content.Shared.GameTicking; using Content.Shared.Gravity; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Utility; namespace Content.Server.Gravity.EntitySystems { [UsedImplicitly] public class WeightlessSystem : EntitySystem { [Dependency] private readonly IMapManager _mapManager = default!; private readonly Dictionary> _alerts = new(); public override void Initialize() { base.Initialize(); SubscribeLocalEvent(Reset); SubscribeLocalEvent(GravityChanged); SubscribeLocalEvent(EntParentChanged); } public void Reset(RoundRestartCleanupEvent ev) { _alerts.Clear(); } public void AddAlert(ServerAlertsComponent status) { var gridId = IoCManager.Resolve().GetComponent(status.Owner).GridID; var alerts = _alerts.GetOrNew(gridId); alerts.Add(status); if (_mapManager.TryGetGrid(IoCManager.Resolve().GetComponent(status.Owner).GridID, out var grid)) { var gridgrid.GridEntityId if (IoCManager.Resolve().GetComponent(gridEntity).Enabled) { RemoveWeightless(status); } else { AddWeightless(status); } } } public void RemoveAlert(ServerAlertsComponent status) { var grid = IoCManager.Resolve().GetComponent(status.Owner).GridID; if (!_alerts.TryGetValue(grid, out var statuses)) { return; } statuses.Remove(status); } private void GravityChanged(GravityChangedMessage ev) { if (!_alerts.TryGetValue(ev.ChangedGridIndex, out var statuses)) { return; } if (ev.HasGravity) { foreach (var status in statuses) { RemoveWeightless(status); } } else { foreach (var status in statuses) { AddWeightless(status); } } } private void AddWeightless(ServerAlertsComponent status) { status.ShowAlert(AlertType.Weightless); } private void RemoveWeightless(ServerAlertsComponent status) { status.ClearAlert(AlertType.Weightless); } private void EntParentChanged(ref EntParentChangedMessage ev) { if (!IoCManager.Resolve().TryGetComponent(ev.Entity, out ServerAlertsComponent? status)) { return; } if (ev.OldParent != null && IoCManager.Resolve().TryGetComponent(ev.OldParent, out IMapGridComponent? mapGrid)) { var oldGrid = mapGrid.GridIndex; if (_alerts.TryGetValue(oldGrid, out var oldStatuses)) { oldStatuses.Remove(status); } } var newGrid = IoCManager.Resolve().GetComponent(ev.Entity).GridID; var newStatuses = _alerts.GetOrNew(newGrid); newStatuses.Add(status); } } }