Files
tbd-station-14/Content.Client/GameObjects/EntitySystems/WindowSystem.cs
Acruid 00e01d51fd SnapGridComponent Removal (#3884)
* Removed SnapGridOffset, there is only center now.

* SnapGridComponent methods are now static.

* Removed SnapGridComponent.OnPositionChanged.

* Refactored static functions off SnapGridComponent to MapGrid.
Refactored away usages of SnapGridComponent.Position.

* Added Transform.Anchored for checking if an entity is a tile entity.
More refactoring for static MapGrid functions.

* Static snapgrid methods on MapGrid are no longer static.

* Add setter to ITransformComponent.Anchored.
Removed direct references to SnapGridComponent from content.

* Grid functions now deal with EntityUids instead of SnapGridComponents.
Began renaming public API functions from SnapGrid to Anchor.

* Remove the SnapGridComponent 'Offset' field from all yaml files. This was removed in code previously, so the yaml linter was upset.

* Update engine submodule to v0.4.46.
2021-04-28 10:49:37 -07:00

73 lines
2.1 KiB
C#

using System.Collections.Generic;
using Content.Client.GameObjects.Components;
using JetBrains.Annotations;
using Robust.Shared.GameObjects;
namespace Content.Client.GameObjects.EntitySystems
{
[UsedImplicitly]
public sealed class WindowSystem : EntitySystem
{
private readonly Queue<IEntity> _dirtyEntities = new();
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<WindowSmoothDirtyEvent>(HandleDirtyEvent);
SubscribeLocalEvent<WindowComponent, SnapGridPositionChangedEvent>(HandleSnapGridMove);
}
public override void Shutdown()
{
base.Shutdown();
UnsubscribeLocalEvent<WindowSmoothDirtyEvent>();
UnsubscribeLocalEvent<WindowComponent, SnapGridPositionChangedEvent>(HandleSnapGridMove);
}
private void HandleDirtyEvent(WindowSmoothDirtyEvent ev)
{
if (ev.Sender.HasComponent<WindowComponent>())
{
_dirtyEntities.Enqueue(ev.Sender);
}
}
private static void HandleSnapGridMove(EntityUid uid, WindowComponent component, SnapGridPositionChangedEvent args)
{
component.SnapGridOnPositionChanged();
}
public override void FrameUpdate(float frameTime)
{
base.FrameUpdate(frameTime);
// Performance: This could be spread over multiple updates, or made parallel.
while (_dirtyEntities.Count > 0)
{
var entity = _dirtyEntities.Dequeue();
if (entity.Deleted)
{
continue;
}
entity.GetComponent<WindowComponent>().UpdateSprite();
}
}
}
/// <summary>
/// Event raised by a <see cref="WindowComponent"/> when it needs to be recalculated.
/// </summary>
public sealed class WindowSmoothDirtyEvent : EntityEventArgs
{
public IEntity Sender { get; }
public WindowSmoothDirtyEvent(IEntity sender)
{
Sender = sender;
}
}
}