+++ /dev/null
-using System.Linq;
-using Content.Shared.Gravity;
-using JetBrains.Annotations;
-using Robust.Client.GameObjects;
-
-namespace Content.Client.Gravity
-{
- [UsedImplicitly]
- public sealed class GravityGeneratorVisualizer : AppearanceVisualizer
- {
- [DataField("spritemap")]
- private Dictionary<string, string> _rawSpriteMap
- {
- get => _spriteMap.ToDictionary(x => x.Key.ToString().ToLower(), x => x.Value);
- set
- {
- _spriteMap.Clear();
- // Get Sprites for each status
- foreach (var status in (GravityGeneratorStatus[]) Enum.GetValues(typeof(GravityGeneratorStatus)))
- {
- if (value.TryGetValue(status.ToString().ToLower(), out var sprite))
- {
- _spriteMap[status] = sprite;
- }
- }
- }
- }
-
- private Dictionary<GravityGeneratorStatus, string> _spriteMap = new();
-
- [Obsolete("Subscribe to your component being initialised instead.")]
- public override void InitializeEntity(EntityUid entity)
- {
- base.InitializeEntity(entity);
-
- if (!IoCManager.Resolve<IEntityManager>().TryGetComponent(entity, out SpriteComponent? sprite))
- return;
-
- sprite.LayerMapReserveBlank(GravityGeneratorVisualLayers.Base);
- sprite.LayerMapReserveBlank(GravityGeneratorVisualLayers.Core);
- }
-
- [Obsolete("Subscribe to AppearanceChangeEvent instead.")]
- public override void OnChangeData(AppearanceComponent component)
- {
- base.OnChangeData(component);
-
- var sprite = IoCManager.Resolve<IEntityManager>().GetComponent<SpriteComponent>(component.Owner);
-
- if (component.TryGetData(GravityGeneratorVisuals.State, out GravityGeneratorStatus state))
- {
- if (_spriteMap.TryGetValue(state, out var spriteState))
- {
- var layer = sprite.LayerMapGet(GravityGeneratorVisualLayers.Base);
- sprite.LayerSetState(layer, spriteState);
- }
- }
-
- if (component.TryGetData(GravityGeneratorVisuals.Charge, out float charge))
- {
- var layer = sprite.LayerMapGet(GravityGeneratorVisualLayers.Core);
- switch (charge)
- {
- case < 0.2f:
- sprite.LayerSetVisible(layer, false);
- break;
- case >= 0.2f and < 0.4f:
- sprite.LayerSetVisible(layer, true);
- sprite.LayerSetState(layer, "startup");
- break;
- case >= 0.4f and < 0.6f:
- sprite.LayerSetVisible(layer, true);
- sprite.LayerSetState(layer, "idle");
- break;
- case >= 0.6f and < 0.8f:
- sprite.LayerSetVisible(layer, true);
- sprite.LayerSetState(layer, "activating");
- break;
- default:
- sprite.LayerSetVisible(layer, true);
- sprite.LayerSetState(layer, "activated");
- break;
- }
- }
- }
-
- public enum GravityGeneratorVisualLayers : byte
- {
- Base,
- Core
- }
- }
-}
using Content.Shared.Gravity;
+using Robust.Client.GameObjects;
namespace Content.Client.Gravity;
public sealed partial class GravitySystem : SharedGravitySystem
{
+ [Dependency] private readonly AppearanceSystem _appearanceSystem = default!;
public override void Initialize()
{
base.Initialize();
+ SubscribeLocalEvent<SharedGravityGeneratorComponent, AppearanceChangeEvent>(OnAppearanceChange);
InitializeShake();
}
+
+ /// <summary>
+ /// Ensures that the visible state of gravity generators are synced with their sprites.
+ /// </summary>
+ private void OnAppearanceChange(EntityUid uid, SharedGravityGeneratorComponent comp, ref AppearanceChangeEvent args)
+ {
+ if (args.Sprite == null)
+ return;
+
+ if (_appearanceSystem.TryGetData<GravityGeneratorStatus>(uid, GravityGeneratorVisuals.State, out var state, args.Component))
+ {
+ if (comp.SpriteMap.TryGetValue(state, out var spriteState))
+ {
+ var layer = args.Sprite.LayerMapGet(GravityGeneratorVisualLayers.Base);
+ args.Sprite.LayerSetState(layer, spriteState);
+ }
+ }
+
+ if (_appearanceSystem.TryGetData<float>(uid, GravityGeneratorVisuals.Charge, out var charge, args.Component))
+ {
+ var layer = args.Sprite.LayerMapGet(GravityGeneratorVisualLayers.Core);
+ switch (charge)
+ {
+ case < 0.2f:
+ args.Sprite.LayerSetVisible(layer, false);
+ break;
+ case >= 0.2f and < 0.4f:
+ args.Sprite.LayerSetVisible(layer, true);
+ args.Sprite.LayerSetState(layer, comp.CoreStartupState);
+ break;
+ case >= 0.4f and < 0.6f:
+ args.Sprite.LayerSetVisible(layer, true);
+ args.Sprite.LayerSetState(layer, comp.CoreIdleState);
+ break;
+ case >= 0.6f and < 0.8f:
+ args.Sprite.LayerSetVisible(layer, true);
+ args.Sprite.LayerSetState(layer, comp.CoreActivatingState);
+ break;
+ default:
+ args.Sprite.LayerSetVisible(layer, true);
+ args.Sprite.LayerSetState(layer, comp.CoreActivatedState);
+ break;
+ }
+ }
+ }
+}
+
+public enum GravityGeneratorVisualLayers : byte
+{
+ Base,
+ Core
}
[Virtual]
public class SharedGravityGeneratorComponent : Component
{
+ /// <summary>
+ /// A map of the sprites used by the gravity generator given its status.
+ /// </summary>
+ [DataField("spriteMap")]
+ [Access(typeof(SharedGravitySystem))]
+ public Dictionary<GravityGeneratorStatus, string> SpriteMap = new();
+
+ /// <summary>
+ /// The sprite used by the core of the gravity generator when the gravity generator is starting up.
+ /// </summary>
+ [DataField("coreStartupState")]
+ [ViewVariables(VVAccess.ReadWrite)]
+ public string CoreStartupState = "startup";
+
+ /// <summary>
+ /// The sprite used by the core of the gravity generator when the gravity generator is idle.
+ /// </summary>
+ [DataField("coreIdleState")]
+ [ViewVariables(VVAccess.ReadWrite)]
+ public string CoreIdleState = "idle";
+
+ /// <summary>
+ /// The sprite used by the core of the gravity generator when the gravity generator is activating.
+ /// </summary>
+ [DataField("coreActivatingState")]
+ [ViewVariables(VVAccess.ReadWrite)]
+ public string CoreActivatingState = "activating";
+
+ /// <summary>
+ /// The sprite used by the core of the gravity generator when the gravity generator is active.
+ /// </summary>
+ [DataField("coreActivatedState")]
+ [ViewVariables(VVAccess.ReadWrite)]
+ public string CoreActivatedState = "activated";
+
/// <summary>
/// Sent to the server to set whether the generator should be on or off
/// </summary>
private void OnGravityChange(ref GravityChangedEvent ev)
{
- foreach (var (comp, xform) in EntityQuery<AlertsComponent, TransformComponent>(true))
+ var alerts = AllEntityQuery<AlertsComponent, TransformComponent>();
+ while(alerts.MoveNext(out var uid, out var comp, out var xform))
{
if (xform.GridUid != ev.ChangedGridIndex) continue;
if (!ev.HasGravity)
{
- _alerts.ShowAlert(comp.Owner, AlertType.Weightless);
+ _alerts.ShowAlert(uid, AlertType.Weightless);
}
else
{
- _alerts.ClearAlert(comp.Owner, AlertType.Weightless);
+ _alerts.ClearAlert(uid, AlertType.Weightless);
}
}
}
private void OnAlertsParentChange(EntityUid uid, AlertsComponent component, ref EntParentChangedMessage args)
{
- if (IsWeightless(component.Owner))
+ if (IsWeightless(uid))
{
_alerts.ShowAlert(uid, AlertType.Weightless);
}
activePower: 2500
lightRadiusMin: 0.75
lightRadiusMax: 2.5
+ spritemap:
+ broken: "broken"
+ unpowered: "off"
+ off: "off"
+ on: "on"
- type: UserInterface
interfaces:
- key: enum.GravityGeneratorUiKey.Key
type: GravityGeneratorBoundUserInterface
- type: Appearance
- visuals:
- - type: GravityGeneratorVisualizer
- spritemap:
- broken: "broken"
- unpowered: "off"
- off: "off"
- on: "on"
- type: PointLight
radius: 2.5
energy: 0.5