Add FTL arrival visuals (#29402)
* Add FTL arrival visuals * weh * Update Content.Shared/Shuttles/Components/FTLComponent.cs Co-authored-by: Tayrtahn <tayrtahn@gmail.com> --------- Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
This commit is contained in:
82
Content.Client/Shuttles/FtlArrivalOverlay.cs
Normal file
82
Content.Client/Shuttles/FtlArrivalOverlay.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
using System.Numerics;
|
||||
using Content.Shared.Shuttles.Components;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Shared.Enums;
|
||||
using Robust.Shared.Map.Components;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Client.Shuttles;
|
||||
|
||||
/// <summary>
|
||||
/// Plays a visualization whenever a shuttle is arriving from FTL.
|
||||
/// </summary>
|
||||
public sealed class FtlArrivalOverlay : Overlay
|
||||
{
|
||||
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowEntities;
|
||||
|
||||
private EntityLookupSystem _lookups;
|
||||
private SharedMapSystem _maps;
|
||||
private SharedTransformSystem _transforms;
|
||||
private SpriteSystem _sprites;
|
||||
[Dependency] private readonly IEntityManager _entManager = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly IPrototypeManager _protos = default!;
|
||||
|
||||
private readonly HashSet<Entity<FtlVisualizerComponent>> _visualizers = new();
|
||||
|
||||
private ShaderInstance _shader;
|
||||
|
||||
public FtlArrivalOverlay()
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
_lookups = _entManager.System<EntityLookupSystem>();
|
||||
_transforms = _entManager.System<SharedTransformSystem>();
|
||||
_maps = _entManager.System<SharedMapSystem>();
|
||||
_sprites = _entManager.System<SpriteSystem>();
|
||||
|
||||
_shader = _protos.Index<ShaderPrototype>("unshaded").Instance();
|
||||
}
|
||||
|
||||
protected override bool BeforeDraw(in OverlayDrawArgs args)
|
||||
{
|
||||
_visualizers.Clear();
|
||||
_lookups.GetEntitiesOnMap(args.MapId, _visualizers);
|
||||
|
||||
return _visualizers.Count > 0;
|
||||
}
|
||||
|
||||
protected override void Draw(in OverlayDrawArgs args)
|
||||
{
|
||||
args.WorldHandle.UseShader(_shader);
|
||||
|
||||
foreach (var (uid, comp) in _visualizers)
|
||||
{
|
||||
var grid = comp.Grid;
|
||||
|
||||
if (!_entManager.TryGetComponent(grid, out MapGridComponent? mapGrid))
|
||||
continue;
|
||||
|
||||
var texture = _sprites.GetFrame(comp.Sprite, TimeSpan.FromSeconds(comp.Elapsed), loop: false);
|
||||
comp.Elapsed += (float) _timing.FrameTime.TotalSeconds;
|
||||
|
||||
// Need to manually transform the viewport in terms of the visualizer entity as the grid isn't in position.
|
||||
var (_, _, worldMatrix, invMatrix) = _transforms.GetWorldPositionRotationMatrixWithInv(uid);
|
||||
args.WorldHandle.SetTransform(worldMatrix);
|
||||
var localAABB = invMatrix.TransformBox(args.WorldBounds);
|
||||
|
||||
var tilesEnumerator = _maps.GetLocalTilesEnumerator(grid, mapGrid, localAABB);
|
||||
|
||||
while (tilesEnumerator.MoveNext(out var tile))
|
||||
{
|
||||
var bounds = _lookups.GetLocalBounds(tile, mapGrid.TileSize);
|
||||
|
||||
args.WorldHandle.DrawTextureRect(texture, bounds);
|
||||
}
|
||||
}
|
||||
|
||||
args.WorldHandle.UseShader(null);
|
||||
args.WorldHandle.SetTransform(Matrix3x2.Identity);
|
||||
}
|
||||
}
|
||||
@@ -38,9 +38,8 @@ public sealed partial class ShuttleSystem : SharedShuttleSystem
|
||||
private bool _enableShuttlePosition;
|
||||
private EmergencyShuttleOverlay? _overlay;
|
||||
|
||||
public override void Initialize()
|
||||
private void InitializeEmergency()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeNetworkEvent<EmergencyShuttlePositionMessage>(OnShuttlePosMessage);
|
||||
}
|
||||
|
||||
|
||||
21
Content.Client/Shuttles/Systems/ShuttleSystem.cs
Normal file
21
Content.Client/Shuttles/Systems/ShuttleSystem.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using Robust.Client.Graphics;
|
||||
|
||||
namespace Content.Client.Shuttles.Systems;
|
||||
|
||||
public sealed partial class ShuttleSystem
|
||||
{
|
||||
[Dependency] private readonly IOverlayManager _overlays = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
InitializeEmergency();
|
||||
_overlays.AddOverlay(new FtlArrivalOverlay());
|
||||
}
|
||||
|
||||
public override void Shutdown()
|
||||
{
|
||||
base.Shutdown();
|
||||
_overlays.RemoveOverlay<FtlArrivalOverlay>();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user