diff --git a/Content.Client/GameObjects/Components/Gravity/GravityGeneratorVisualizer.cs b/Content.Client/GameObjects/Components/Gravity/GravityGeneratorVisualizer.cs new file mode 100644 index 0000000000..0862d7725b --- /dev/null +++ b/Content.Client/GameObjects/Components/Gravity/GravityGeneratorVisualizer.cs @@ -0,0 +1,69 @@ +#nullable enable +using Content.Shared.GameObjects.Components.Gravity; +using Robust.Client.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Utility; +using System; +using System.Collections.Generic; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Gravity +{ + public class GravityGeneratorVisualizer : AppearanceVisualizer + { + private Dictionary _spriteMap = new Dictionary(); + + public override void InitializeEntity(IEntity entity) + { + base.InitializeEntity(entity); + + if (!entity.TryGetComponent(out SpriteComponent? sprite)) + return; + + sprite.LayerMapReserveBlank(GravityGeneratorVisualLayers.Base); + sprite.LayerMapReserveBlank(GravityGeneratorVisualLayers.Core); + } + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + // Get Sprites for each status + foreach (var status in (GravityGeneratorStatus[]) Enum.GetValues(typeof(GravityGeneratorStatus))) + { + if (node.TryGetNode(status.ToString().ToLower(), out var sprite)) + { + _spriteMap[status] = sprite.AsString(); + } + } + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + var sprite = component.Owner.GetComponent(); + + 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.CoreVisible, out bool visible)) + { + var layer = sprite.LayerMapGet(GravityGeneratorVisualLayers.Core); + sprite.LayerSetVisible(layer, visible); + } + } + + public enum GravityGeneratorVisualLayers + { + Base, + Core + } + } +} diff --git a/Content.IntegrationTests/Tests/GravityGridTest.cs b/Content.IntegrationTests/Tests/GravityGridTest.cs index ae2e53d836..4d67306fd7 100644 --- a/Content.IntegrationTests/Tests/GravityGridTest.cs +++ b/Content.IntegrationTests/Tests/GravityGridTest.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Content.Server.GameObjects.Components.Gravity; using Content.Server.GameObjects.Components.Power.ApcNetComponents; +using Content.Shared.GameObjects.Components.Gravity; using Content.Shared.Utility; using NUnit.Framework; using Robust.Shared.Interfaces.GameObjects; diff --git a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs index 4fc4896501..94da79a1f8 100644 --- a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs +++ b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs @@ -14,6 +14,7 @@ using Robust.Server.GameObjects.Components.UserInterface; using Robust.Server.Interfaces.GameObjects; using Robust.Server.Interfaces.Player; using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.ComponentDependencies; using Robust.Shared.Localization; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; @@ -23,6 +24,7 @@ namespace Content.Server.GameObjects.Components.Gravity [RegisterComponent] public class GravityGeneratorComponent : SharedGravityGeneratorComponent, IInteractUsing, IBreakAct, IInteractHand { + [ComponentDependency] private readonly AppearanceComponent? _appearance = default!; private bool _switchedOn; @@ -81,7 +83,7 @@ namespace Content.Server.GameObjects.Components.Gravity { base.ExposeData(serializer); - serializer.DataField(ref _switchedOn, "switched_on", true); + serializer.DataField(ref _switchedOn, "switchedOn", true); serializer.DataField(ref _intact, "intact", true); } @@ -167,52 +169,32 @@ namespace Content.Server.GameObjects.Components.Gravity { _status = GravityGeneratorStatus.Broken; - if (Owner.TryGetComponent(out SpriteComponent? sprite)) - { - sprite.LayerSetState(0, "broken"); - sprite.LayerSetVisible(1, false); - } + _appearance?.SetData(GravityGeneratorVisuals.State, Status); + _appearance?.SetData(GravityGeneratorVisuals.CoreVisible, false); } private void MakeUnpowered() { _status = GravityGeneratorStatus.Unpowered; - if (Owner.TryGetComponent(out SpriteComponent? sprite)) - { - sprite.LayerSetState(0, "off"); - sprite.LayerSetVisible(1, false); - } + _appearance?.SetData(GravityGeneratorVisuals.State, Status); + _appearance?.SetData(GravityGeneratorVisuals.CoreVisible, false); } private void MakeOff() { _status = GravityGeneratorStatus.Off; - if (Owner.TryGetComponent(out SpriteComponent? sprite)) - { - sprite.LayerSetState(0, "off"); - sprite.LayerSetVisible(1, false); - } + _appearance?.SetData(GravityGeneratorVisuals.State, Status); + _appearance?.SetData(GravityGeneratorVisuals.CoreVisible, false); } private void MakeOn() { _status = GravityGeneratorStatus.On; - if (Owner.TryGetComponent(out SpriteComponent? sprite)) - { - sprite.LayerSetState(0, "on"); - sprite.LayerSetVisible(1, true); - } + _appearance?.SetData(GravityGeneratorVisuals.State, Status); + _appearance?.SetData(GravityGeneratorVisuals.CoreVisible, true); } } - - public enum GravityGeneratorStatus - { - Broken, - Unpowered, - Off, - On - } } diff --git a/Content.Server/GameObjects/EntitySystems/GravitySystem.cs b/Content.Server/GameObjects/EntitySystems/GravitySystem.cs index 84a265b70c..06d4be417d 100644 --- a/Content.Server/GameObjects/EntitySystems/GravitySystem.cs +++ b/Content.Server/GameObjects/EntitySystems/GravitySystem.cs @@ -1,7 +1,8 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Content.Server.GameObjects.Components.Gravity; using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Gravity; using JetBrains.Annotations; using Robust.Server.GameObjects.EntitySystems; using Robust.Server.Interfaces.Player; diff --git a/Content.Shared/GameObjects/Components/Gravity/SharedGravityGeneratorComponent.cs b/Content.Shared/GameObjects/Components/Gravity/SharedGravityGeneratorComponent.cs index 344a6f68ce..de81cc0053 100644 --- a/Content.Shared/GameObjects/Components/Gravity/SharedGravityGeneratorComponent.cs +++ b/Content.Shared/GameObjects/Components/Gravity/SharedGravityGeneratorComponent.cs @@ -1,11 +1,11 @@ -using System; +using System; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.Serialization; namespace Content.Shared.GameObjects.Components.Gravity { - public class SharedGravityGeneratorComponent: Component + public class SharedGravityGeneratorComponent : Component { public override string Name => "GravityGenerator"; @@ -54,4 +54,20 @@ namespace Content.Shared.GameObjects.Components.Gravity Key } } + + [Serializable, NetSerializable] + public enum GravityGeneratorVisuals + { + State, + CoreVisible + } + + [Serializable, NetSerializable] + public enum GravityGeneratorStatus + { + Broken, + Unpowered, + Off, + On + } } diff --git a/Resources/Prototypes/Entities/Constructible/Power/gravity_generator.yml b/Resources/Prototypes/Entities/Constructible/Power/gravity_generator.yml index 02f4778b64..60d687e25f 100644 --- a/Resources/Prototypes/Entities/Constructible/Power/gravity_generator.yml +++ b/Resources/Prototypes/Entities/Constructible/Power/gravity_generator.yml @@ -8,9 +8,11 @@ sprite: Constructible/Power/gravity_generator.rsi layers: - state: on + map: ["enum.GravityGeneratorVisualLayers.Base"] - sprite: Constructible/Power/gravity_generator_core.rsi state: activated shader: unshaded + map: ["enum.GravityGeneratorVisualLayers.Core"] - type: SnapGrid offset: Center @@ -35,5 +37,13 @@ interfaces: - key: enum.GravityGeneratorUiKey.Key type: GravityGeneratorBoundUserInterface + - type: Appearance + visuals: + - type: GravityGeneratorVisualizer + broken: "broken" + unpowered: "off" + off: "off" + on: "on" + placement: mode: AlignTileAny