]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Decouple Lights from Toggleable Visuals (and headphone music notes bugfix) (#35341)
authorCentronias <me@centronias.com>
Fri, 30 May 2025 23:53:56 +0000 (16:53 -0700)
committerGitHub <noreply@github.com>
Fri, 30 May 2025 23:53:56 +0000 (19:53 -0400)
* - Combine enum keys `ToggleableLightVisuals` and `ToggleVisuals` into `ToggleableVisuals`
- Rename `ToggleableLightVisualsComponent` to `ToggleableVisualsComponent` and `ToggleableLightVisualsSystem` to `ToggleableVisualsSystem`
  - (The `SpriteLayer` field on the component is now required because the old default of `light` doesn't make sense anymore)
- Make it so that `ToggleableVisualsComponent` works even when there's not a light attached to the entity
  - (Amazingly this seems to have only applied to  Headphones, but I can only imagine there are many other things people would like to do with simple toggleable visuals)
- Explicitly make `ItemTogglePointLightComponent`'s purpose to make `ToggleVisualsComponent` apply to `PointLightComponent`s on the same entity.
  - Add field `ToggleableVisualsColorModulatesLights`, which makes the `Color` appearance value of `ToggleableVisuals` modulate the color of lights on the same entity
  - Lots of prototype updates to uptake the above

* fix bad merge

* unbork robust

* blindly letting rider reformat stuff

* I guess I never cleaned up these imports at all

48 files changed:
Content.Client/Light/HandheldLightSystem.cs
Content.Client/Toggleable/ToggleableLightVisualsComponent.cs [deleted file]
Content.Client/Toggleable/ToggleableLightVisualsSystem.cs [deleted file]
Content.Client/Toggleable/ToggleableVisualsComponent.cs [new file with mode: 0644]
Content.Client/Toggleable/ToggleableVisualsSystem.cs [new file with mode: 0644]
Content.Server/Atmos/EntitySystems/FlammableSystem.cs
Content.Shared/ContainerHeld/ContainerHeldComponent.cs
Content.Shared/ContainerHeld/ContainerHeldSystem.cs
Content.Shared/Item/ItemToggle/ItemToggleSystem.cs
Content.Shared/Light/Components/ItemTogglePointLightComponent.cs
Content.Shared/Light/EntitySystems/ItemTogglePointLightSystem.cs
Content.Shared/Light/SharedHandheldLightSystem.cs
Content.Shared/Toggleable/ToggleActionEvent.cs
Content.Shared/Toggleable/ToggleableLightVisuals.cs [deleted file]
Content.Shared/Weapons/Melee/EnergySword/EnergySwordSystem.cs
Content.Shared/Weapons/Misc/SharedTetherGunSystem.cs
Resources/Prototypes/Entities/Clothing/Hands/gloves.yml
Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml
Resources/Prototypes/Entities/Clothing/Head/eva-helmets.yml
Resources/Prototypes/Entities/Clothing/Head/hardhats.yml
Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml
Resources/Prototypes/Entities/Clothing/Head/helmets.yml
Resources/Prototypes/Entities/Clothing/Neck/misc.yml
Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml
Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml
Resources/Prototypes/Entities/Clothing/Shoes/misc.yml
Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml
Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml
Resources/Prototypes/Entities/Objects/Fun/spectral_locator.yml
Resources/Prototypes/Entities/Objects/Fun/toys.yml
Resources/Prototypes/Entities/Objects/Misc/arabianlamp.yml
Resources/Prototypes/Entities/Objects/Misc/candles.yml
Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml
Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml
Resources/Prototypes/Entities/Objects/Misc/land_mine.yml
Resources/Prototypes/Entities/Objects/Shields/shields.yml
Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml
Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml
Resources/Prototypes/Entities/Objects/Specific/Salvage/scanner.yml
Resources/Prototypes/Entities/Objects/Tools/decoys.yml
Resources/Prototypes/Entities/Objects/Tools/flashlights.yml
Resources/Prototypes/Entities/Objects/Tools/lantern.yml
Resources/Prototypes/Entities/Objects/Tools/lighters.yml
Resources/Prototypes/Entities/Objects/Tools/welders.yml
Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml
Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml
Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml
Resources/Prototypes/Entities/Objects/Weapons/security.yml

index d25b28756f8602c7594733a541264bf239e84913..2a5aa949ff26d624b0026da24ebbf09134819041 100644 (file)
@@ -44,7 +44,7 @@ public sealed class HandheldLightSystem : SharedHandheldLightSystem
             return;
         }
 
-        if (!_appearance.TryGetData<bool>(uid, ToggleableLightVisuals.Enabled, out var enabled, args.Component))
+        if (!_appearance.TryGetData<bool>(uid, ToggleableVisuals.Enabled, out var enabled, args.Component))
         {
             return;
         }
diff --git a/Content.Client/Toggleable/ToggleableLightVisualsComponent.cs b/Content.Client/Toggleable/ToggleableLightVisualsComponent.cs
deleted file mode 100644 (file)
index c42d5a7..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-using Content.Shared.Hands.Components;
-
-namespace Content.Client.Toggleable;
-
-/// <summary>
-///     Component that handles the toggling the visuals of some light emitting entity.
-/// </summary>
-/// <remarks>
-///     This will toggle the visibility of layers on an entity's sprite, the in-hand visuals, and the clothing/equipment
-///     visuals. This will modify the color of any attached point lights.
-/// </remarks>
-[RegisterComponent]
-public sealed partial class ToggleableLightVisualsComponent : Component
-{
-    /// <summary>
-    ///     Sprite layer that will have its visibility toggled when this item is toggled.
-    /// </summary>
-    [DataField("spriteLayer")]
-    public string? SpriteLayer = "light";
-
-    /// <summary>
-    ///     Layers to add to the sprite of the player that is holding this entity (while the component is toggled on).
-    /// </summary>
-    [DataField("inhandVisuals")]
-    public Dictionary<HandLocation, List<PrototypeLayerData>> InhandVisuals = new();
-
-    /// <summary>
-    ///     Layers to add to the sprite of the player that is wearing this entity (while the component is toggled on).
-    /// </summary>
-    [DataField("clothingVisuals")]
-    public Dictionary<string, List<PrototypeLayerData>> ClothingVisuals = new();
-}
diff --git a/Content.Client/Toggleable/ToggleableLightVisualsSystem.cs b/Content.Client/Toggleable/ToggleableLightVisualsSystem.cs
deleted file mode 100644 (file)
index ce94022..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-using Content.Client.Clothing;
-using Content.Client.Items.Systems;
-using Content.Shared.Clothing;
-using Content.Shared.Hands;
-using Content.Shared.Inventory;
-using Content.Shared.Item;
-using Content.Shared.Toggleable;
-using Robust.Client.GameObjects;
-using Robust.Shared.Utility;
-using System.Linq;
-
-namespace Content.Client.Toggleable;
-
-public sealed class ToggleableLightVisualsSystem : VisualizerSystem<ToggleableLightVisualsComponent>
-{
-    [Dependency] private readonly SharedItemSystem _itemSys = default!;
-    [Dependency] private readonly SharedPointLightSystem _lights = default!;
-
-    public override void Initialize()
-    {
-        base.Initialize();
-        SubscribeLocalEvent<ToggleableLightVisualsComponent, GetInhandVisualsEvent>(OnGetHeldVisuals, after: new[] { typeof(ItemSystem) });
-        SubscribeLocalEvent<ToggleableLightVisualsComponent, GetEquipmentVisualsEvent>(OnGetEquipmentVisuals, after: new[] { typeof(ClientClothingSystem) });
-    }
-
-    protected override void OnAppearanceChange(EntityUid uid, ToggleableLightVisualsComponent component, ref AppearanceChangeEvent args)
-    {
-        if (!AppearanceSystem.TryGetData<bool>(uid, ToggleableLightVisuals.Enabled, out var enabled, args.Component))
-            return;
-
-        var modulate = AppearanceSystem.TryGetData<Color>(uid, ToggleableLightVisuals.Color, out var color, args.Component);
-
-        // Update the item's sprite
-        if (args.Sprite != null && component.SpriteLayer != null && SpriteSystem.LayerMapTryGet((uid, args.Sprite), component.SpriteLayer, out var layer, false))
-        {
-            SpriteSystem.LayerSetVisible((uid, args.Sprite), layer, enabled);
-            if (modulate)
-                SpriteSystem.LayerSetColor((uid, args.Sprite), layer, color);
-        }
-
-        // Update any point-lights
-        if (TryComp(uid, out PointLightComponent? light))
-        {
-            DebugTools.Assert(!light.NetSyncEnabled, "light visualizers require point lights without net-sync");
-            _lights.SetEnabled(uid, enabled, light);
-            if (enabled && modulate)
-            {
-                _lights.SetColor(uid, color, light);
-            }
-        }
-
-        // update clothing & in-hand visuals.
-        _itemSys.VisualsChanged(uid);
-    }
-
-    /// <summary>
-    ///     Add the unshaded light overlays to any clothing sprites.
-    /// </summary>
-    private void OnGetEquipmentVisuals(EntityUid uid, ToggleableLightVisualsComponent component, GetEquipmentVisualsEvent args)
-    {
-        if (!TryComp(uid, out AppearanceComponent? appearance)
-            || !AppearanceSystem.TryGetData<bool>(uid, ToggleableLightVisuals.Enabled, out var enabled, appearance)
-            || !enabled)
-            return;
-
-        if (!TryComp(args.Equipee, out InventoryComponent? inventory))
-            return;
-        List<PrototypeLayerData>? layers = null;
-
-        // attempt to get species specific data
-        if (inventory.SpeciesId != null)
-            component.ClothingVisuals.TryGetValue($"{args.Slot}-{inventory.SpeciesId}", out layers);
-
-        // No species specific data.  Try to default to generic data.
-        if (layers == null && !component.ClothingVisuals.TryGetValue(args.Slot, out layers))
-            return;
-
-        var modulate = AppearanceSystem.TryGetData<Color>(uid, ToggleableLightVisuals.Color, out var color, appearance);
-
-        var i = 0;
-        foreach (var layer in layers)
-        {
-            var key = layer.MapKeys?.FirstOrDefault();
-            if (key == null)
-            {
-                key = i == 0 ? $"{args.Slot}-toggle" : $"{args.Slot}-toggle-{i}";
-                i++;
-            }
-
-            if (modulate)
-                layer.Color = color;
-
-            args.Layers.Add((key, layer));
-        }
-    }
-
-    private void OnGetHeldVisuals(EntityUid uid, ToggleableLightVisualsComponent component, GetInhandVisualsEvent args)
-    {
-        if (!TryComp(uid, out AppearanceComponent? appearance)
-            || !AppearanceSystem.TryGetData<bool>(uid, ToggleableLightVisuals.Enabled, out var enabled, appearance)
-            || !enabled)
-            return;
-
-        if (!component.InhandVisuals.TryGetValue(args.Location, out var layers))
-            return;
-
-        var modulate = AppearanceSystem.TryGetData<Color>(uid, ToggleableLightVisuals.Color, out var color, appearance);
-
-        var i = 0;
-        var defaultKey = $"inhand-{args.Location.ToString().ToLowerInvariant()}-toggle";
-        foreach (var layer in layers)
-        {
-            var key = layer.MapKeys?.FirstOrDefault();
-            if (key == null)
-            {
-                key = i == 0 ? defaultKey : $"{defaultKey}-{i}";
-                i++;
-            }
-
-            if (modulate)
-                layer.Color = color;
-
-            args.Layers.Add((key, layer));
-        }
-    }
-}
diff --git a/Content.Client/Toggleable/ToggleableVisualsComponent.cs b/Content.Client/Toggleable/ToggleableVisualsComponent.cs
new file mode 100644 (file)
index 0000000..cab8650
--- /dev/null
@@ -0,0 +1,30 @@
+using Content.Shared.Hands.Components;
+
+namespace Content.Client.Toggleable;
+
+/// <summary>
+/// Component that handles toggling the visuals of an entity, including layers on an entity's sprite,
+/// the in-hand visuals, and the clothing/equipment visuals.
+/// </summary>
+/// <see cref="ToggleableVisualsSystem"/>
+[RegisterComponent]
+public sealed partial class ToggleableVisualsComponent : Component
+{
+    /// <summary>
+    /// Sprite layer that will have its visibility toggled when this item is toggled.
+    /// </summary>
+    [DataField(required: true)]
+    public string? SpriteLayer;
+
+    /// <summary>
+    /// Layers to add to the sprite of the player that is holding this entity (while the component is toggled on).
+    /// </summary>
+    [DataField]
+    public Dictionary<HandLocation, List<PrototypeLayerData>> InhandVisuals = new();
+
+    /// <summary>
+    /// Layers to add to the sprite of the player that is wearing this entity (while the component is toggled on).
+    /// </summary>
+    [DataField]
+    public Dictionary<string, List<PrototypeLayerData>> ClothingVisuals = new();
+}
diff --git a/Content.Client/Toggleable/ToggleableVisualsSystem.cs b/Content.Client/Toggleable/ToggleableVisualsSystem.cs
new file mode 100644 (file)
index 0000000..3aacd9a
--- /dev/null
@@ -0,0 +1,140 @@
+using System.Linq;
+using Content.Client.Clothing;
+using Content.Client.Items.Systems;
+using Content.Shared.Clothing;
+using Content.Shared.Hands;
+using Content.Shared.Inventory;
+using Content.Shared.Item;
+using Content.Shared.Light.Components;
+using Content.Shared.Toggleable;
+using Robust.Client.GameObjects;
+using Robust.Shared.Utility;
+
+namespace Content.Client.Toggleable;
+
+/// <summary>
+/// Implements the behavior of <see cref="ToggleableVisualsComponent"/> by reacting to
+/// <see cref="AppearanceChangeEvent"/>, for the sprite directly; <see cref="OnGetHeldVisuals"/> for the
+/// in-hand visuals; and <see cref="OnGetEquipmentVisuals"/> for the clothing visuals.
+/// </summary>
+/// <see cref="ToggleableVisualsComponent"/>
+public sealed class ToggleableVisualsSystem : VisualizerSystem<ToggleableVisualsComponent>
+{
+    [Dependency] private readonly SharedItemSystem _item = default!;
+    [Dependency] private readonly SharedPointLightSystem _pointLight = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+        SubscribeLocalEvent<ToggleableVisualsComponent, GetInhandVisualsEvent>(OnGetHeldVisuals,
+            after: [typeof(ItemSystem)]);
+        SubscribeLocalEvent<ToggleableVisualsComponent, GetEquipmentVisualsEvent>(OnGetEquipmentVisuals,
+            after: [typeof(ClientClothingSystem)]);
+    }
+
+    protected override void OnAppearanceChange(EntityUid uid,
+        ToggleableVisualsComponent component,
+        ref AppearanceChangeEvent args)
+    {
+        if (!AppearanceSystem.TryGetData<bool>(uid, ToggleableVisuals.Enabled, out var enabled, args.Component))
+            return;
+
+        var modulateColor =
+            AppearanceSystem.TryGetData<Color>(uid, ToggleableVisuals.Color, out var color, args.Component);
+
+        // Update the item's sprite
+        if (args.Sprite != null && component.SpriteLayer != null &&
+            SpriteSystem.LayerMapTryGet((uid, args.Sprite), component.SpriteLayer, out var layer, false))
+        {
+            SpriteSystem.LayerSetVisible((uid, args.Sprite), layer, enabled);
+            if (modulateColor)
+                SpriteSystem.LayerSetColor((uid, args.Sprite), component.SpriteLayer, color);
+        }
+
+        // If there's a `ItemTogglePointLightComponent` that says to apply the color to attached lights, do so.
+        if (TryComp<ItemTogglePointLightComponent>(uid, out var toggleLights) &&
+            TryComp(uid, out PointLightComponent? light))
+        {
+            DebugTools.Assert(!light.NetSyncEnabled,
+                $"{typeof(ItemTogglePointLightComponent)} requires point lights without net-sync");
+            _pointLight.SetEnabled(uid, enabled, light);
+            if (modulateColor && toggleLights.ToggleableVisualsColorModulatesLights)
+            {
+                _pointLight.SetColor(uid, color, light);
+            }
+        }
+
+        // update clothing & in-hand visuals.
+        _item.VisualsChanged(uid);
+    }
+
+    private void OnGetEquipmentVisuals(EntityUid uid,
+        ToggleableVisualsComponent component,
+        GetEquipmentVisualsEvent args)
+    {
+        if (!TryComp(uid, out AppearanceComponent? appearance)
+            || !AppearanceSystem.TryGetData<bool>(uid, ToggleableVisuals.Enabled, out var enabled, appearance)
+            || !enabled)
+            return;
+
+        if (!TryComp(args.Equipee, out InventoryComponent? inventory))
+            return;
+        List<PrototypeLayerData>? layers = null;
+
+        // attempt to get species specific data
+        if (inventory.SpeciesId != null)
+            component.ClothingVisuals.TryGetValue($"{args.Slot}-{inventory.SpeciesId}", out layers);
+
+        // No species specific data.  Try to default to generic data.
+        if (layers == null && !component.ClothingVisuals.TryGetValue(args.Slot, out layers))
+            return;
+
+        var modulateColor = AppearanceSystem.TryGetData<Color>(uid, ToggleableVisuals.Color, out var color, appearance);
+
+        var i = 0;
+        foreach (var layer in layers)
+        {
+            var key = layer.MapKeys?.FirstOrDefault();
+            if (key == null)
+            {
+                key = i == 0 ? $"{args.Slot}-toggle" : $"{args.Slot}-toggle-{i}";
+                i++;
+            }
+
+            if (modulateColor)
+                layer.Color = color;
+
+            args.Layers.Add((key, layer));
+        }
+    }
+
+    private void OnGetHeldVisuals(EntityUid uid, ToggleableVisualsComponent component, GetInhandVisualsEvent args)
+    {
+        if (!TryComp(uid, out AppearanceComponent? appearance)
+            || !AppearanceSystem.TryGetData<bool>(uid, ToggleableVisuals.Enabled, out var enabled, appearance)
+            || !enabled)
+            return;
+
+        if (!component.InhandVisuals.TryGetValue(args.Location, out var layers))
+            return;
+
+        var modulateColor = AppearanceSystem.TryGetData<Color>(uid, ToggleableVisuals.Color, out var color, appearance);
+
+        var i = 0;
+        var defaultKey = $"inhand-{args.Location.ToString().ToLowerInvariant()}-toggle";
+        foreach (var layer in layers)
+        {
+            var key = layer.MapKeys?.FirstOrDefault();
+            if (key == null)
+            {
+                key = i == 0 ? defaultKey : $"{defaultKey}-{i}";
+                i++;
+            }
+
+            if (modulateColor)
+                layer.Color = color;
+
+            args.Layers.Add((key, layer));
+        }
+    }
+}
index 8681fc635cb5cef16cd3c803862599d94b75302a..0cb40627abfa4a494f85d293e6956e8bb0cf883c 100644 (file)
@@ -282,7 +282,7 @@ namespace Content.Server.Atmos.EntitySystems
             // This is intended so that matches & candles can re-use code for un-shaded layers on in-hand sprites.
             // However, this could cause conflicts if something is ACTUALLY both a toggleable light and flammable.
             // if that ever happens, then fire visuals will need to implement their own in-hand sprite management.
-            _appearance.SetData(uid, ToggleableLightVisuals.Enabled, flammable.OnFire, appearance);
+            _appearance.SetData(uid, ToggleableVisuals.Enabled, flammable.OnFire, appearance);
         }
 
         public void AdjustFireStacks(EntityUid uid, float relativeFireStacks, FlammableComponent? flammable = null, bool ignite = false)
index 3d7643b42c19e0ead42b45007446cd4b786ac2c1..e9b19d82622cc25d5a68acbd86d1a14373804bb0 100644 (file)
@@ -8,7 +8,7 @@ public sealed partial class ContainerHeldComponent: Component
     /// <summary>
     ///     The amount of weight needed to be in the container
     ///     in order for it to toggle it's appearance
-    ///     to ToggleVisuals.Toggled = true, and
+    ///     to ToggleableVisuals.Enabled = true, and
     ///     SetHeldPrefix() to "full" instead of "empty".
     /// </summary>
     [DataField("threshold")]
index f2ce5b44a54c61d9b9a1ce8d479a71220436db29..f09cd4443d4f13ed36d341eadab7dd182648b4b0 100644 (file)
@@ -32,12 +32,12 @@ public sealed class ContainerHeldSystem : EntitySystem
         if (_storage.GetCumulativeItemAreas(uid) >= comp.Threshold)
         {
             _item.SetHeldPrefix(uid, "full", component: item);
-            _appearance.SetData(uid, ToggleVisuals.Toggled, true, appearance);
+            _appearance.SetData(uid, ToggleableVisuals.Enabled, true, appearance);
         }
         else
         {
             _item.SetHeldPrefix(uid, "empty", component: item);
-            _appearance.SetData(uid, ToggleVisuals.Toggled, false, appearance);
+            _appearance.SetData(uid, ToggleableVisuals.Enabled, false, appearance);
         }
     }
 }
index 2c3e596a275895b6567c04847b3c62b04975e2bc..8008ecf9e5bc9cbad5c71c1f594440fabbac8f7b 100644 (file)
@@ -282,7 +282,7 @@ public sealed class ItemToggleSystem : EntitySystem
     {
         if (TryComp(ent, out AppearanceComponent? appearance))
         {
-            _appearance.SetData(ent, ToggleVisuals.Toggled, ent.Comp.Activated, appearance);
+            _appearance.SetData(ent, ToggleableVisuals.Enabled, ent.Comp.Activated, appearance);
         }
     }
 
index 6ac1bf236d73b15fbceb8b1a123baa1c96918af3..5024a07f2800ee2a7c5308c0d9dd0315e740d05b 100644 (file)
@@ -1,12 +1,18 @@
+using Content.Shared.Item.ItemToggle.Components;
 using Robust.Shared.GameStates;
+using Content.Shared.Toggleable;
 
 namespace Content.Shared.Light.Components;
 
 /// <summary>
-/// Toggles point light on an entity whenever ItemToggle hits.
+/// Makes <see cref="ItemToggledEvent"/> enable and disable point lights on this entity.
 /// </summary>
 [RegisterComponent, NetworkedComponent]
 public sealed partial class ItemTogglePointLightComponent : Component
 {
-
+    /// <summary>
+    /// When true, causes the color specified in <see cref="ToggleableVisuals.Color"/>
+    /// be used to modulate the color of lights on this entity.
+    /// </summary>
+    [DataField] public bool ToggleableVisualsColorModulatesLights = false;
 }
index e2ed6cfcc2c117823783dd1f5664000f29e87d64..8a9995d74e7f07a4b820a6bc8c98bc25ac255cd2 100644 (file)
@@ -1,16 +1,15 @@
 using Content.Shared.Item.ItemToggle.Components;
 using Content.Shared.Light.Components;
-using Content.Shared.Toggleable;
 using ItemTogglePointLightComponent = Content.Shared.Light.Components.ItemTogglePointLightComponent;
 
 namespace Content.Shared.Light.EntitySystems;
 
 /// <summary>
-/// Handles ItemToggle for PointLight
+/// Implements the behavior of <see cref="ItemTogglePointLightComponent"/>, causing <see cref="ItemToggledEvent"/>s to
+/// enable and disable lights on the entity.
 /// </summary>
 public sealed class ItemTogglePointLightSystem : EntitySystem
 {
-    [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
     [Dependency] private readonly SharedPointLightSystem _light = default!;
     [Dependency] private readonly SharedHandheldLightSystem _handheldLight = default!;
 
@@ -25,7 +24,6 @@ public sealed class ItemTogglePointLightSystem : EntitySystem
         if (!_light.TryGetLight(ent.Owner, out var light))
             return;
 
-        _appearance.SetData(ent, ToggleableLightVisuals.Enabled, args.Activated);
         _light.SetEnabled(ent.Owner, args.Activated, comp: light);
         if (TryComp<HandheldLightComponent>(ent.Owner, out var handheldLight))
         {
index 74c809797b0e49aa9c518c257d55e072bccb0666..e93ca0a041b04b0a95eea78dd4575fdbe53c0320 100644 (file)
@@ -80,7 +80,7 @@ public abstract class SharedHandheldLightSystem : EntitySystem
         if (component.ToggleActionEntity != null)
             _actionSystem.SetToggled(component.ToggleActionEntity, component.Activated);
 
-        _appearance.SetData(uid, ToggleableLightVisuals.Enabled, component.Activated, appearance);
+        _appearance.SetData(uid, ToggleableVisuals.Enabled, component.Activated, appearance);
     }
 
     private void AddToggleLightVerb(Entity<HandheldLightComponent> ent, ref GetVerbsEvent<ActivationVerb> args)
index f28e62e7dd1ca67b16557c7121cc045e934208f9..74b900562b3b334b830faabdc3224e1169111e3c 100644 (file)
@@ -15,8 +15,24 @@ public sealed partial class ToggleActionEvent : InstantActionEvent;
 ///     Generic enum keys for toggle-visualizer appearance data & sprite layers.
 /// </summary>
 [Serializable, NetSerializable]
-public enum ToggleVisuals : byte
+public enum ToggleableVisuals : byte
 {
-    Toggled,
-    Layer
+    Enabled,
+    Layer,
+    Color,
+}
+
+/// <summary>
+///     Generic sprite layer keys.
+/// </summary>
+[Serializable, NetSerializable]
+public enum LightLayers : byte
+{
+    Light,
+
+    /// <summary>
+    ///     Used as a key for generic unshaded layers. Not necessarily related to an entity with an actual light source.
+    ///     Use this instead of creating a unique single-purpose "unshaded" enum for every visualizer.
+    /// </summary>
+    Unshaded,
 }
diff --git a/Content.Shared/Toggleable/ToggleableLightVisuals.cs b/Content.Shared/Toggleable/ToggleableLightVisuals.cs
deleted file mode 100644 (file)
index 72e8ed4..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-using Robust.Shared.Serialization;
-
-namespace Content.Shared.Toggleable;
-
-// Appearance Data key
-[Serializable, NetSerializable]
-public enum ToggleableLightVisuals : byte
-{
-    Enabled,
-    Color
-}
-
-/// <summary>
-///     Generic sprite layer keys.
-/// </summary>
-[Serializable, NetSerializable]
-public enum LightLayers : byte
-{
-    Light,
-
-    /// <summary>
-    ///     Used as a key for generic unshaded layers. Not necessarily related to an entity with an actual light source.
-    ///     Use this instead of creating a unique single-purpose "unshaded" enum for every visualizer. 
-    /// </summary>
-    Unshaded,
-}
index 7ca3de9cc5c972b39ae54b654f5eda7127e2b665..f89ca2a28bd68b3203000412bad564c691f8715c 100644 (file)
@@ -33,7 +33,7 @@ public sealed class EnergySwordSystem : EntitySystem
         if (!TryComp(entity, out AppearanceComponent? appearanceComponent))
             return;
 
-        _appearance.SetData(entity, ToggleableLightVisuals.Color, entity.Comp.ActivatedColor, appearanceComponent);
+        _appearance.SetData(entity, ToggleableVisuals.Color, entity.Comp.ActivatedColor, appearanceComponent);
     }
 
     // Used to make the blade multicolored when using a multitool on it.
index 3d7f9df458ef98a3ebdf1679127f7737aa54c4a3..f6702569bfaad2a854b50dc974cd66129af89c6c 100644 (file)
@@ -204,7 +204,7 @@ public abstract partial class SharedTetherGunSystem : EntitySystem
 
         TryComp<AppearanceComponent>(gunUid, out var appearance);
         _appearance.SetData(gunUid, TetherVisualsStatus.Key, true, appearance);
-        _appearance.SetData(gunUid, ToggleableLightVisuals.Enabled, true, appearance);
+        _appearance.SetData(gunUid, ToggleableVisuals.Enabled, true, appearance);
 
         // Target updates
         TransformSystem.Unanchor(target, targetXform);
@@ -280,7 +280,7 @@ public abstract partial class SharedTetherGunSystem : EntitySystem
 
         TryComp<AppearanceComponent>(gunUid, out var appearance);
         _appearance.SetData(gunUid, TetherVisualsStatus.Key, false, appearance);
-        _appearance.SetData(gunUid, ToggleableLightVisuals.Enabled, false, appearance);
+        _appearance.SetData(gunUid, ToggleableVisuals.Enabled, false, appearance);
 
         RemComp<TetheredComponent>(component.Tethered.Value);
         _blocker.UpdateCanMove(component.Tethered.Value);
index dee1745e2e92e0fe08b6057478650f362b54f21a..9fd20a9791b9d6d6a18c2014f86448f042590a6b 100644 (file)
     sprite: Clothing/Hands/Gloves/spaceninja.rsi
     layers:
     - state: icon
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: Clothing
     sprite: Clothing/Hands/Gloves/spaceninja.rsi
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: {state: icon-green}
           False: {state: icon}
   - type: Insulated
     sprite: Clothing/Hands/Gloves/KnuckleDusters/electricknuckleduster.rsi
     layers:
     - state: knuckleduster_off
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: Clothing
     sprite: Clothing/Hands/Gloves/KnuckleDusters/electricknuckleduster.rsi
     equippedPrefix: on
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: {state: knuckleduster_on}
           False: {state: knuckleduster_off}
   - type: ToggleClothing
index 1898bb0038863523b346ec7ccdacc94952bfcb29..dac5a8946e19ede4c7dfff3a94a05cee39084141 100644 (file)
@@ -62,7 +62,9 @@
   - type: Item
     heldPrefix: off
     size: Normal
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
+    spriteLayer: light
+  - type: ItemTogglePointLight
   - type: PointLight
     enabled: false
     radius: 3
       map: [ "light" ]
   - type: Clothing
     equippedPrefix: off
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
+    spriteLayer: light
+  - type: ItemTogglePointLight
   - type: PointLight
     enabled: false
     radius: 3
index 3aec1f83c4fb029c431975f7aeaddb1c8035cda4..3920a8a7af837e3bba5c95102b23f8de0a11bfb6 100644 (file)
@@ -74,7 +74,7 @@
     sprite: Clothing/Head/Hardsuits/paramedhelm.rsi
   - type: HandheldLight
     addPrefix: false
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     spriteLayer: light
     clothingVisuals:
       head:
index ea987ddda1413c6cbeb90a96d7d462359c223764..8809ad4c46e1a39567fd026f138eddec34aca159 100644 (file)
     radiatingBehaviourId: radiating
   - type: LightBehaviour
     behaviours:
-      - !type:FadeBehaviour
-        id: radiating
-        interpolate: Linear
-        maxDuration: 2.0
-        startValue: 3.0
-        endValue: 2.0
-        isLooped: true
-        reverseWhenFinished: true
-      - !type:PulseBehaviour
-        id: blinking
-        interpolate: Nearest
-        maxDuration: 1.0
-        minValue: 0.1
-        maxValue: 2.0
-        isLooped: true
-  - type: ToggleableLightVisuals
+    - !type:FadeBehaviour
+      id: radiating
+      interpolate: Linear
+      maxDuration: 2.0
+      startValue: 3.0
+      endValue: 2.0
+      isLooped: true
+      reverseWhenFinished: true
+    - !type:PulseBehaviour
+      id: blinking
+      interpolate: Nearest
+      maxDuration: 1.0
+      minValue: 0.1
+      maxValue: 2.0
+      isLooped: true
+  - type: ToggleableVisuals
     spriteLayer: light
     inhandVisuals:
       left:
@@ -50,6 +50,7 @@
     clothingVisuals:
       head:
       - state: on-equipped-HELMET
+  - type: ItemTogglePointLight
   - type: PowerCellSlot
     cellSlotId: cell_slot
   - type: ItemSlots
@@ -68,8 +69,8 @@
   - type: HideLayerClothing
     layers:
       Hair: HEAD
-      HeadTop : HEAD
-      HeadSide : HEAD 
+      HeadTop: HEAD
+      HeadSide: HEAD
 
 - type: entity
   parent: ClothingHeadHatHardhatBase
index 7cd873643add79899f0a4a46d4f937bf9f013a0d..86a7286d8928301172d9d23f25b0e7f4460074d9 100644 (file)
@@ -24,7 +24,7 @@
       map: [ "light" ]
   - type: HandheldLight
     addPrefix: false
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     spriteLayer: light
     clothingVisuals:
       head:
@@ -90,7 +90,7 @@
       map: [ "light" ]
   - type: HandheldLight
     addPrefix: false
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     clothingVisuals:
       head:
       - state: equipped-head-light
       map: [ "light" ]
   - type: HandheldLight
     addPrefix: false
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     clothingVisuals:
       head:
       - state: equipped-head-light
index 4c38dde0d778db21ffd7d9d23be2d8e4418c406f..520733220e79cc278a4ab57d9d909fa7d6ed3dae 100644 (file)
     action: ActionToggleJusticeHelm
     mustEquip: false
   - type: ItemTogglePointLight
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
+    spriteLayer: light
     clothingVisuals:
       head:
       - state: on-equipped-HELMET
index b25f78e6a40b6510c45fd8e2c8280ab27f8ea89b..c8892bc0b580c8ddbc44946c67aa60edfc40d8d5 100644 (file)
@@ -8,20 +8,20 @@
     sprite: Clothing/Neck/Misc/headphones.rsi
     layers:
     - state: icon
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: Clothing
     equippedPrefix: off
     sprite: Clothing/Neck/Misc/headphones.rsi
-  - type: ToggleableLightVisuals
-    spriteLayer: enum.ToggleVisuals.Layer
+  - type: ToggleableVisuals
+    spriteLayer: enum.ToggleableVisuals.Layer
     clothingVisuals:
       neck:
       - state: on-equipped-NECK
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: {state: icon-on}
           False: {state: icon}
   - type: ItemToggle
index 07bf9ad35189fd70782189bbc4a608f1abff0235..c029c62afcbf980faffb0196bb4cb870e3c2866d 100644 (file)
     walkModifier: 0.9
     sprintModifier: 0.9
   #Shoulder mounted flashlight
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     spriteLayer: light
     clothingVisuals:
       outerClothing:
       outerClothing-vox:
       - state: equipped-OUTERCLOTHING-light-vox
         shader: unshaded
+  - type: ItemTogglePointLight
   - type: Appearance
   - type: HandheldLight
     addPrefix: false
index ad88dd1ae24b7355b61b267b1fc4f816dc78c65c..1a8d7fcf40e5159243f048d0ca48e590472855e0 100644 (file)
@@ -9,7 +9,7 @@
     sprite: Clothing/Shoes/Boots/magboots.rsi
     layers:
     - state: icon
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: Clothing
     sprite: Clothing/Shoes/Boots/magboots.rsi
   - type: ToggleClothing
@@ -29,8 +29,8 @@
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: {state: icon-on}
           False: {state: icon}
   - type: StaticPrice
index fafb9a084603850575b20c6c71e9951e70c73f8f..5ba1a63ea5e8f15277d1c3aae742ad0b4272496c 100644 (file)
     sprite: Clothing/Shoes/Boots/speedboots.rsi
     layers:
     - state: icon
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: Clothing
     sprite: Clothing/Shoes/Boots/speedboots.rsi
   - type: ToggleClothing
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: {state: icon-on}
           False: {state: icon}
   - type: StaticPrice
index 68e5a802e2ef60ec68c0ec9cdb9c927ac8ea62e4..d4182cd12fcb301b3e44bc304f18f9526294baaf 100644 (file)
       minValue: 0.1
       maxValue: 2.0
       isLooped: true
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
+    spriteLayer: light
   - type: PointLight
     enabled: false
     mask: /Textures/Effects/LightMasks/cone.png
index 63175dc89aaee7dbd9b804f2191c717902493344..3efba15f9392da094088a0afc5330410d1063b20 100644 (file)
@@ -8,7 +8,7 @@
     sprite: Objects/Fun/candy_bucket.rsi
     layers:
     - state: empty_icon
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: ContainerHeld
     threshold: 1
   - type: Item
@@ -17,8 +17,8 @@
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-     enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+     enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: {state: full_icon}
           False: {state: empty_icon}
   - type: Storage
index 5bae35c4ac5ebbfd909c889b23b7a1430b6754ca..194fd4d23306fd9404e9316c9e003d512f740e67 100644 (file)
       - state: screen
         shader: unshaded
         visible: false
-        map: ["enum.ToggleVisuals.Layer"]
+        map: ["enum.ToggleableVisuals.Layer"]
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: { visible: true }
           False: { visible: false }
   - type: ItemToggle
index ce57a8d93314887fd4f069d957224e104f5b625c..1d92b2de947911d867cf167aefc7a3e97bf7d56e 100644 (file)
       color: white
       netsync: false
     - type: Appearance
-    - type: ToggleableLightVisuals
+    - type: ToggleableVisuals
       spriteLayer: blade
       inhandVisuals:
         left:
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: { state: icon }
           False: { state: icon-off }
   - type: ItemToggle
index 844db3f765c4448d3ad64fe7e3ecd83e91dfead5..2b1c2940fe7f1eb5db3d3ddbf98cab6e8b30394b 100644 (file)
     - state: flame
       visible: false
       shader: unshaded
-      map: ["enum.ToggleVisuals.Layer"]
+      map: ["enum.ToggleableVisuals.Layer"]
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: { visible: true }
           False: { visible: false }
   - type: EntityStorageVisuals
     stateBaseClosed: lamp
     stateDoorOpen: lamp
     stateDoorClosed: lamptop
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     spriteLayer: flame
     inhandVisuals:
       left:
index 1220ea4051a07757e877951d64563636031a296c..f3167b1d9997310fe41989a22157274eb2cb86fb 100644 (file)
@@ -41,7 +41,7 @@
     - type: FireVisuals
       sprite: Objects/Misc/candles.rsi
       normalState: fire-big
-    - type: ToggleableLightVisuals
+    - type: ToggleableVisuals
       spriteLayer: null
       inhandVisuals:
         left:
index 495443911fef6af05d77fca33fe9c536675381fc..5d4ca1a7ee2631278cb666197b581048254dcd7c 100644 (file)
@@ -8,7 +8,7 @@
     sprite: Objects/Misc/fire_extinguisher.rsi
     layers:
     - state: fire_extinguisher_closed
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: Item
     sprite: Objects/Misc/fire_extinguisher.rsi
     size: Normal
@@ -67,8 +67,8 @@
       - FireExtinguisher
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: { state: fire_extinguisher_open }
           False: { state: fire_extinguisher_closed }
   - type: PhysicalComposition
index 676b875039eadf5effed9bbfcb59c113b24b0ab6..e2a200084472cc5671fbef2538e10fb490df42f8 100644 (file)
@@ -45,7 +45,9 @@
     radius: 3
     energy: 2
     netsync: false
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
+    spriteLayer: light
+  - type: ItemTogglePointLight
   - type: Appearance
   - type: Physics
     canCollide: false
index 08991ec11fa8146388a78dcfe6070262fb04e0ce..125245301964c5b9cafb3b7a5e8bd7f31cefac02 100644 (file)
     sprite: Objects/Misc/landmine.rsi
     layers:
     - state: landmine-inactive
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: {state: landmine}
           False: {state: landmine-inactive}
   - type: Damageable
index d1b0d9ca11ba68d6d1417f9ec7d405453b14222a..69da81853dc4420a2e796f7e316b91781590edcd 100644 (file)
       heldPrefix: eshield
     - type: UseDelay
       delay: 0.5
-    - type: ToggleableLightVisuals
+    - type: ToggleableVisuals
       spriteLayer: shield
       inhandVisuals:
         left:
       heldPrefix: teleriot
     - type: UseDelay
       delay: 0.5
-    - type: ToggleableLightVisuals
+    - type: ToggleableVisuals
       spriteLayer: shield
       inhandVisuals:
         left:
index 83cbd86bdf985d914a0cbbf7bc46ec9cb2379cd2..eb07b695aab350020f6b6d0cba6a3576c46d626a 100644 (file)
       layers:
         - state: icon
         - state: screen
-          map: [ "enum.ToggleVisuals.Layer" ]
+          map: [ "enum.ToggleableVisuals.Layer" ]
           visible: false
           shader: unshaded
     - type: Appearance
     - type: GenericVisualizer
       visuals:
-        enum.ToggleVisuals.Toggled:
-          enum.ToggleVisuals.Layer:
+        enum.ToggleableVisuals.Enabled:
+          enum.ToggleableVisuals.Layer:
             True: { visible: true }
             False: { visible: false }
     - type: Item
@@ -76,7 +76,7 @@
     layers:
       - state: icon
       - state: screen
-        map: [ "enum.ToggleVisuals.Layer" ]
+        map: [ "enum.ToggleableVisuals.Layer" ]
         visible: false
         shader: unshaded
       - state: ready
     layers:
       - state: icon
       - state: screen
-        map: [ "enum.ToggleVisuals.Layer" ]
+        map: [ "enum.ToggleableVisuals.Layer" ]
         visible: false
         shader: unshaded
       - state: ready
index 21971dda32787f316c6dfc91092c68485d0af810..f3a82abd729cb32205893626b1f7820534540940 100644 (file)
       - state: screen
         shader: unshaded
         visible: false
-        map: ["enum.ToggleVisuals.Layer"]
+        map: ["enum.ToggleableVisuals.Layer"]
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: { visible: true }
           False: { visible: false }
   - type: ItemToggle
index c9248553bccbc2a16a7a8fd18e0ca421350ffff1..ac2c44ff2ed6250d13c07e040ed4ed1d1905e304 100644 (file)
@@ -12,7 +12,7 @@
     - state: icon-o
       shader: unshaded
       visible: false
-      map: ["enum.ToggleVisuals.Layer"]
+      map: ["enum.ToggleableVisuals.Layer"]
   - type: ItemToggleActiveSound
     activeSound:
       path: /Audio/Ambience/Objects/light_hum.ogg
@@ -22,8 +22,8 @@
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: { visible: true }
           False: { visible: false }
   - type: ItemToggle
@@ -66,7 +66,7 @@
     - state: adv-o
       shader: unshaded
       visible: false
-      map: ["enum.ToggleVisuals.Layer"]
+      map: ["enum.ToggleableVisuals.Layer"]
   - type: Item
     storedRotation: -90
   - type: MiningScanner
index bea8c61cb950e9646d16ac95d9f6bd9657d8c731..1ea52c3f700ef202c2e2f279397db2102a075771 100644 (file)
@@ -36,7 +36,9 @@
     nameFormat: name-format-nukie-generic
   - type: Damageable
     damageContainer: Inorganic
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
+    spriteLayer: light
+  - type: ItemTogglePointLight
   - type: Foldable
     folded: true
   - type: PowerCellSlot
index 1a08f613bb5d934865d48fa202fb8330d3603e4f..c63265ef7d14edce13917e036a766c59224ae739 100644 (file)
@@ -27,7 +27,7 @@
         minValue: 0.1
         maxValue: 2.0
         isLooped: true
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     spriteLayer: light
     inhandVisuals:
       left:
@@ -36,6 +36,7 @@
       right:
       - state: inhand-right-light
         shader: unshaded
+  - type: ItemTogglePointLight
   - type: PowerCellSlot
     cellSlotId: cell_slot
   - type: ContainerContainer
@@ -91,7 +92,7 @@
   - type: HandheldLight
     addPrefix: false
     wattage: 0.5
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     inhandVisuals:
       left:
       - state: inhand-left-light
index f5ea2e6f271f90b0ee40ec8b78101b47e33f49c0..3d25957851b3cf02a32d0ecebb908ee55eccd4b5 100644 (file)
@@ -42,7 +42,9 @@
       color: "#FFC458"
       netsync: false
     - type: Appearance
-    - type: ToggleableLightVisuals
+    - type: ToggleableVisuals
+      spriteLayer: light
+    - type: ItemTogglePointLight
     - type: PowerCellSlot
       cellSlotId: cell_slot
     - type: ItemSlots
index 66da03cbba13ed773d13507c9a2c9aa6ce506195..a5e0afbc7fe17fdaae2ae405610861ad8228ad19 100644 (file)
           basic_icon_base-11: ""
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
+      enum.ToggleableVisuals.Enabled:
         flame:
           True: { visible: true }
           False: { visible: false }
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     spriteLayer: lighter_flame
     inhandVisuals:
       left:
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
+      enum.ToggleableVisuals.Enabled:
         flame:
           True: { visible: true }
           False: { visible: false }
     fuelConsumption: 0.01
     fuelLitCost: 0.1
     tankSafe: true
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     spriteLayer: lighter_flame
     inhandVisuals:
       left:
index 686bc6cd2dae8638a7c78130518140a7cc785022..a1f86131091c0a2214235ee54836966750387bdc 100644 (file)
     - state: welder_flame
       visible: false
       shader: unshaded
-      map: ["enum.ToggleVisuals.Layer"]
+      map: ["enum.ToggleableVisuals.Layer"]
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: { visible: true }
           False: { visible: false }
   - type: Item
@@ -59,7 +59,7 @@
     components:
     - type: DisarmMalus
       malus: 0.6
-  - type: ToggleableLightVisuals
+  - type: ToggleableVisuals
     spriteLayer: flame
     inhandVisuals:
       left:
index 2fcf294a73c1c7f542dbaad19c04b254c953d652..96afa6f219630829dbd5ffeea5733d691436cadf 100644 (file)
           map: [ "unshaded" ]
           shader: unshaded
           visible: false
-    - type: ToggleableLightVisuals
+    - type: ToggleableVisuals
       spriteLayer: unshaded
       inhandVisuals:
         left:
           map: [ "unshaded" ]
           shader: unshaded
           visible: false
-        - type: ToggleableLightVisuals
+        - type: ToggleableVisuals
           spriteLayer: unshaded
           inhandVisuals:
             left:
           map: [ "unshaded" ]
           shader: unshaded
           visible: false
-    - type: ToggleableLightVisuals
+    - type: ToggleableVisuals
       spriteLayer: unshaded
       inhandVisuals:
         left:
           map: [ "unshaded" ]
           shader: unshaded
           visible: false
-    - type: ToggleableLightVisuals
+    - type: ToggleableVisuals
       spriteLayer: unshaded
       inhandVisuals:
         left:
index dab155f02ea9a3df14cfc47e79dd08c0f6e2c0bb..0a514976968b1fa570cc4c57f57ba8ca46e8b0da 100644 (file)
@@ -23,6 +23,7 @@
   - type: ItemToggleSize
     activatedSize: Huge
   - type: ItemTogglePointLight
+    toggleableVisualsColorModulatesLights: true
   - type: ItemToggleMeleeWeapon
     activatedSoundOnHit:
       path: /Audio/Weapons/eblade1.ogg
@@ -59,7 +60,7 @@
     color: white
     netsync: false
   - type: Appearance
-  - type: ToggleableLightVisuals # Add support for multiple layers
+  - type: ToggleableVisuals # Add support for multiple layers
     spriteLayer: blade
     inhandVisuals:
       left:
index 7a3b298129f58c7c4c16615057850b258f78f3a6..295a7821907b4d8e23e0847a0c88782970fd6975 100644 (file)
@@ -8,7 +8,7 @@
     sprite: Objects/Weapons/Melee/stunprod.rsi
     layers:
     - state: stunprod_off
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: ItemToggle
     soundActivate:
       collection: sparks
@@ -59,8 +59,8 @@
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-      enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+      enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: {state: stunprod_on}
           False: {state: stunprod_off}
   - type: StaticPrice
index ff54af9518471774ba61dfc4d73e8ca5ff2afbb5..ade0107670a15be074430cbb8d88743d9483ff31 100644 (file)
@@ -8,7 +8,7 @@
     sprite: Objects/Weapons/Melee/stunbaton.rsi
     layers:
     - state: stunbaton_off
-      map: [ "enum.ToggleVisuals.Layer" ]
+      map: [ "enum.ToggleableVisuals.Layer" ]
   - type: Stunbaton
     energyPerUse: 50
   - type: ItemToggle
@@ -64,8 +64,8 @@
   - type: Appearance
   - type: GenericVisualizer
     visuals:
-     enum.ToggleVisuals.Toggled:
-        enum.ToggleVisuals.Layer:
+     enum.ToggleableVisuals.Enabled:
+        enum.ToggleableVisuals.Layer:
           True: {state: stunbaton_on}
           False: {state: stunbaton_off}
   - type: StaticPrice