--- /dev/null
+using Robust.Shared.GameStates;
+
+namespace Content.Client.Shuttles;
+
+/// <summary>
+/// A component that emits a visible exhaust plume if the entity is an active thruster.
+/// Managed by <see cref="ThrusterSystem"/>
+/// </summary>
+[RegisterComponent, NetworkedComponent, Access(typeof(ThrusterSystem))]
+public sealed class ThrusterComponent : Component
+{
+}
--- /dev/null
+using Content.Shared.Shuttles.Components;
+using Robust.Client.GameObjects;
+
+namespace Content.Client.Shuttles;
+
+/// <summary>
+/// Handles making a thruster visibly turn on/emit an exhaust plume according to its state.
+/// </summary>
+public sealed class ThrusterSystem : VisualizerSystem<ThrusterComponent>
+{
+ /// <summary>
+ /// Updates whether or not the thruster is visibly active/thrusting.
+ /// </summary>
+ protected override void OnAppearanceChange(EntityUid uid, ThrusterComponent comp, ref AppearanceChangeEvent args)
+ {
+ if (args.Sprite == null
+ || !AppearanceSystem.TryGetData<bool>(uid, ThrusterVisualState.State, out var state, args.Component))
+ return;
+
+ args.Sprite.LayerSetVisible(ThrusterVisualLayers.ThrustOn, state);
+ SetThrusting(
+ uid,
+ state && AppearanceSystem.TryGetData<bool>(uid, ThrusterVisualState.Thrusting, out var thrusting, args.Component) && thrusting,
+ args.Sprite
+ );
+ }
+
+ /// <summary>
+ /// Sets whether or not the exhaust plume of the thruster is visible or not.
+ /// </summary>
+ private static void SetThrusting(EntityUid _, bool value, SpriteComponent sprite)
+ {
+ if (sprite.LayerMapTryGet(ThrusterVisualLayers.Thrusting, out var thrustingLayer))
+ {
+ sprite.LayerSetVisible(thrustingLayer, value);
+ }
+
+ if (sprite.LayerMapTryGet(ThrusterVisualLayers.ThrustingUnshaded, out var unshadedLayer))
+ {
+ sprite.LayerSetVisible(unshadedLayer, value);
+ }
+ }
+}
+
+public enum ThrusterVisualLayers : byte
+{
+ Base,
+ ThrustOn,
+ Thrusting,
+ ThrustingUnshaded,
+}
+++ /dev/null
-using Content.Shared.Shuttles.Components;
-using Robust.Client.GameObjects;
-using Robust.Shared.GameObjects;
-using Robust.Shared.IoC;
-
-namespace Content.Client.Shuttles
-{
- public sealed class ThrusterVisualizer : AppearanceVisualizer
- {
- [Obsolete("Subscribe to AppearanceChangeEvent instead.")]
- public override void OnChangeData(AppearanceComponent component)
- {
- base.OnChangeData(component);
-
- var entities = IoCManager.Resolve<IEntityManager>();
- if (!entities.TryGetComponent(component.Owner, out SpriteComponent? spriteComponent)) return;
-
- component.TryGetData(ThrusterVisualState.State, out bool state);
-
- switch (state)
- {
- case true:
- spriteComponent.LayerSetVisible(ThrusterVisualLayers.ThrustOn, true);
-
- if (component.TryGetData(ThrusterVisualState.Thrusting, out bool thrusting) && thrusting)
- {
- if (spriteComponent.LayerMapTryGet(ThrusterVisualLayers.Thrusting, out _))
- {
- spriteComponent.LayerSetVisible(ThrusterVisualLayers.Thrusting, true);
- }
-
- if (spriteComponent.LayerMapTryGet(ThrusterVisualLayers.ThrustingUnshaded, out _))
- {
- spriteComponent.LayerSetVisible(ThrusterVisualLayers.ThrustingUnshaded, true);
- }
- }
- else
- {
- DisableThrusting(component, spriteComponent);
- }
-
- break;
- case false:
- spriteComponent.LayerSetVisible(ThrusterVisualLayers.ThrustOn, false);
- DisableThrusting(component, spriteComponent);
- break;
- }
- }
-
- private void DisableThrusting(AppearanceComponent component, SpriteComponent spriteComponent)
- {
- if (spriteComponent.LayerMapTryGet(ThrusterVisualLayers.Thrusting, out _))
- {
- spriteComponent.LayerSetVisible(ThrusterVisualLayers.Thrusting, false);
- }
-
- if (spriteComponent.LayerMapTryGet(ThrusterVisualLayers.ThrustingUnshaded, out _))
- {
- spriteComponent.LayerSetVisible(ThrusterVisualLayers.ThrustingUnshaded, false);
- }
- }
- }
-
- public enum ThrusterVisualLayers : byte
- {
- Base,
- ThrustOn,
- Thrusting,
- ThrustingUnshaded,
- }
-}
using Content.Server.Shuttles.Systems;
using Content.Shared.Construction.Prototypes;
using Content.Shared.Damage;
+using Robust.Shared.GameStates;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Shuttles.Components
{
- [RegisterComponent]
+ [RegisterComponent, NetworkedComponent]
[Access(typeof(ThrusterSystem))]
public sealed class ThrusterComponent : Component
{
- type: Sprite
netsync: false
- type: Appearance
- visuals:
- - type: ThrusterVisualizer
+ - type: ThrusterVisuals
- type: ApcPowerReceiver
powerLoad: 1500
- type: ExtensionCableReceiver
- state: thrust
map: ["enum.ThrusterVisualLayers.ThrustOn"]
shader: unshaded
+ visible: false
- state: thrust_burn_unshaded
map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
shader: unshaded
+ visible: false
offset: 0, 1
- type: entity
- state: thrust
map: ["enum.ThrusterVisualLayers.ThrustOn"]
shader: unshaded
+ visible: false
- state: thrust_burn_unshaded
map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
shader: unshaded
+ visible: false
offset: 0, 1
- type: entity
- state: thrust
map: ["enum.ThrusterVisualLayers.ThrustOn"]
shader: unshaded
+ visible: false
- state: thrust_burn
map: [ "enum.ThrusterVisualLayers.Thrusting" ]
+ visible: false
- state: thrust_burn_unshaded
map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
shader: unshaded
+ visible: false
- type: PointLight
radius: 1.3
energy: 0.8
- state: thrust
map: ["enum.ThrusterVisualLayers.ThrustOn"]
shader: unshaded
+ visible: false
- state: thrust_burn_unshaded
map: ["enum.ThrusterVisualLayers.ThrustingUnshaded"]
shader: unshaded
+ visible: false
offset: 0, 1