diff --git a/Content.Shared/GameObjects/Components/SubFloorHideComponent.cs b/Content.Shared/GameObjects/Components/SubFloorHideComponent.cs index 64eef269e2..24dd54ac39 100644 --- a/Content.Shared/GameObjects/Components/SubFloorHideComponent.cs +++ b/Content.Shared/GameObjects/Components/SubFloorHideComponent.cs @@ -1,6 +1,6 @@ #nullable enable +using Content.Shared.GameObjects.EntitySystems; using Robust.Shared.GameObjects; -using Robust.Shared.Log; namespace Content.Shared.GameObjects.Components { @@ -13,60 +13,7 @@ namespace Content.Shared.GameObjects.Components [RegisterComponent] public sealed class SubFloorHideComponent : Component { - [ComponentDependency(nameof(OnAddSnapGrid))] - private SnapGridComponent? _snapGridComponent; - /// public override string Name => "SubFloorHide"; - - /// - protected override void Startup() - { - base.Startup(); - - Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, new SubFloorHideDirtyEvent(Owner)); - } - - /// - protected override void Shutdown() - { - base.Shutdown(); - - if (Owner.Transform.Running == false) - return; - - if (_snapGridComponent != null) - { - _snapGridComponent.OnPositionChanged -= SnapGridOnPositionChanged; - } - - Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, new SubFloorHideDirtyEvent(Owner)); - } - - private void OnAddSnapGrid() - { - if (_snapGridComponent == null) - { - // Shouldn't happen but allows us to use nullables. OnPositionChanged needs to be componentbus anyway. - Logger.Error("Snapgrid was null for subfloor {Owner}"); - return; - } - _snapGridComponent.OnPositionChanged += SnapGridOnPositionChanged; - } - - private void SnapGridOnPositionChanged() - { - Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, new SubFloorHideDirtyEvent(Owner)); - } - } - - internal sealed class SubFloorHideDirtyEvent : EntityEventArgs - { - public IEntity Sender { get; } - - public SubFloorHideDirtyEvent(IEntity sender) - { - Sender = sender; - } } } diff --git a/Content.Shared/GameObjects/EntitySystems/SubFloorHideSystem.cs b/Content.Shared/GameObjects/EntitySystems/SubFloorHideSystem.cs index c1be2b7ade..0f60fbb50e 100644 --- a/Content.Shared/GameObjects/EntitySystems/SubFloorHideSystem.cs +++ b/Content.Shared/GameObjects/EntitySystems/SubFloorHideSystem.cs @@ -1,6 +1,7 @@ #nullable enable using Content.Shared.GameObjects.Components; using Content.Shared.Maps; +using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Map; @@ -12,6 +13,7 @@ namespace Content.Shared.GameObjects.EntitySystems /// /// Entity system backing . /// + [UsedImplicitly] public class SubFloorHideSystem : EntitySystem { [Dependency] private readonly IMapManager _mapManager = default!; @@ -52,18 +54,44 @@ namespace Content.Shared.GameObjects.EntitySystems _mapManager.GridChanged += MapManagerOnGridChanged; _mapManager.TileChanged += MapManagerOnTileChanged; - SubscribeLocalEvent(HandleDirtyEvent); + // TODO: Make this sane when EntityStarted becomes a directed event. + EntityManager.EntityStarted += OnEntityStarted; + + SubscribeLocalEvent(OnSubFloorTerminating); + SubscribeLocalEvent(OnSnapGridPositionChanged); } - private void HandleDirtyEvent(SubFloorHideDirtyEvent ev) + public override void Shutdown() { - if (!_mapManager.TryGetGrid(ev.Sender.Transform.GridID, out var grid)) - { - return; - } + base.Shutdown(); - var indices = grid.WorldToTile(ev.Sender.Transform.WorldPosition); - UpdateTile(grid, indices); + _mapManager.GridChanged -= MapManagerOnGridChanged; + _mapManager.TileChanged -= MapManagerOnTileChanged; + + EntityManager.EntityStarted -= OnEntityStarted; + + UnsubscribeLocalEvent(OnSubFloorTerminating); + UnsubscribeLocalEvent(OnSnapGridPositionChanged); + } + + private void OnEntityStarted(object? sender, EntityUid uid) + { + if (ComponentManager.HasComponent(uid)) + { + UpdateEntity(uid); + } + } + + private void OnSubFloorTerminating(EntityUid uid, SubFloorHideComponent component, EntityTerminatingEvent args) + { + UpdateEntity(uid); + } + + private void OnSnapGridPositionChanged(EntityUid uid, SubFloorHideComponent component, SnapGridPositionChangedEvent ev) + { + // We do this directly instead of calling UpdateEntity. + if(_mapManager.TryGetGrid(ev.NewGrid, out var grid)) + UpdateTile(grid, ev.Position); } private void MapManagerOnTileChanged(object? sender, TileChangedEventArgs e) @@ -79,6 +107,14 @@ namespace Content.Shared.GameObjects.EntitySystems } } + private void UpdateEntity(EntityUid uid) + { + if (!ComponentManager.TryGetComponent(uid, out ITransformComponent? transform) || + !_mapManager.TryGetGrid(transform.GridID, out var grid)) return; + + UpdateTile(grid, grid.WorldToTile(transform.WorldPosition)); + } + private void UpdateTile(IMapGrid grid, Vector2i position) { var tile = grid.GetTileRef(position);