From a231429cb40ebe14ce0296df763adf1ef59ec71b Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sat, 16 Apr 2022 17:11:48 +1200 Subject: [PATCH] Make energy swords use RgbLightController (#7344) --- .../Components/HandheldLightComponent.cs | 27 --- Content.Client/Light/HandheldLightSystem.cs | 72 +------- .../ToggleableLightVisualsComponent.cs | 33 ++++ .../ToggleableLightVisualsSystem.cs | 113 ++++++++++++ .../Weapons/Melee/EnergySwordVisualizer.cs | 96 ----------- Content.Server/Entry/IgnoredComponents.cs | 1 + .../EntitySystems/HandheldLightSystem.cs | 16 +- .../Components/EnergySwordComponent.cs | 11 +- .../Melee/EnergySword/EnergySwordSystem.cs | 50 +++--- Content.Shared/Item/SharedItemComponent.cs | 17 -- .../Toggleable/ToggleableLightVisuals.cs | 11 ++ .../Melee/SharedEnergySwordComponent.cs | 20 --- .../Clothing/Head/hardsuit-helmets.yml | 2 + .../Entities/Objects/Tools/flashlights.yml | 8 + .../Objects/Weapons/Melee/e_sword.yml | 24 ++- .../Weapons/Melee/e_dagger.rsi/e_sword_on.png | Bin 554 -> 0 bytes .../Melee/e_dagger.rsi/e_sword_rainbow_on.png | Bin 1356 -> 0 bytes ...-inhand-left.png => inhand-left-blade.png} | Bin .../{off-inhand-left.png => inhand-left.png} | Bin ...nhand-right.png => inhand-right-blade.png} | Bin ...{off-inhand-right.png => inhand-right.png} | Bin .../Weapons/Melee/e_dagger.rsi/meta.json | 160 +---------------- .../e_dagger.rsi/on-rainbow-inhand-left.png | Bin 1054 -> 0 bytes .../e_dagger.rsi/on-rainbow-inhand-right.png | Bin 1072 -> 0 bytes .../Weapons/Melee/e_sword.rsi/e_sword_on.png | Bin 460 -> 0 bytes .../Melee/e_sword.rsi/e_sword_rainbow_on.png | Bin 1522 -> 0 bytes .../Melee/e_sword.rsi/inhand-left-blade.png | Bin 0 -> 7094 bytes .../{off-inhand-left.png => inhand-left.png} | Bin .../Melee/e_sword.rsi/inhand-right-blade.png | Bin 0 -> 7218 bytes ...{off-inhand-right.png => inhand-right.png} | Bin .../Weapons/Melee/e_sword.rsi/meta.json | 162 +----------------- .../Melee/e_sword.rsi/on-inhand-left.png | Bin 1009 -> 0 bytes .../Melee/e_sword.rsi/on-inhand-right.png | Bin 984 -> 0 bytes .../e_sword.rsi/on-rainbow-inhand-left.png | Bin 2995 -> 0 bytes .../e_sword.rsi/on-rainbow-inhand-right.png | Bin 2896 -> 0 bytes 35 files changed, 240 insertions(+), 583 deletions(-) create mode 100644 Content.Client/Toggleable/ToggleableLightVisualsComponent.cs create mode 100644 Content.Client/Toggleable/ToggleableLightVisualsSystem.cs delete mode 100644 Content.Client/Weapons/Melee/EnergySwordVisualizer.cs create mode 100644 Content.Shared/Toggleable/ToggleableLightVisuals.cs delete mode 100644 Content.Shared/Weapons/Melee/SharedEnergySwordComponent.cs delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/e_sword_on.png delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/e_sword_rainbow_on.png rename Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/{on-inhand-left.png => inhand-left-blade.png} (100%) rename Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/{off-inhand-left.png => inhand-left.png} (100%) rename Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/{on-inhand-right.png => inhand-right-blade.png} (100%) rename Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/{off-inhand-right.png => inhand-right.png} (100%) delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/on-rainbow-inhand-left.png delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/on-rainbow-inhand-right.png delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/e_sword_on.png delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/e_sword_rainbow_on.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-left-blade.png rename Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/{off-inhand-left.png => inhand-left.png} (100%) create mode 100644 Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-right-blade.png rename Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/{off-inhand-right.png => inhand-right.png} (100%) delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/on-inhand-left.png delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/on-inhand-right.png delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/on-rainbow-inhand-left.png delete mode 100644 Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/on-rainbow-inhand-right.png diff --git a/Content.Client/Light/Components/HandheldLightComponent.cs b/Content.Client/Light/Components/HandheldLightComponent.cs index 448179e99a..c6bccac941 100644 --- a/Content.Client/Light/Components/HandheldLightComponent.cs +++ b/Content.Client/Light/Components/HandheldLightComponent.cs @@ -1,17 +1,10 @@ using Content.Client.Items.Components; -using Content.Shared.Hands.Components; using Content.Shared.Light.Component; using Robust.Client.Graphics; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; -using Robust.Shared.Analyzers; -using Robust.Shared.GameObjects; -using Robust.Shared.Maths; -using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.Timing; -using System.Collections.Generic; using static Robust.Client.UserInterface.Controls.BoxContainer; -using static Robust.Shared.GameObjects.SharedSpriteComponent; namespace Content.Client.Light.Components { @@ -32,26 +25,6 @@ namespace Content.Client.Light.Components [DataField("addPrefix")] public bool AddPrefix = false; - /// - /// Sprite layer that will have it's visibility toggled when this item is toggled. - /// - [DataField("layer")] - public string Layer = "light"; - - /// - /// Layers to add to the sprite of the player that is holding this entity. - /// - [DataField("inhandVisuals")] - public Dictionary> InhandVisuals = new(); - - /// - /// Layers to add to the sprite of the player that is wearing this entity. - /// - [DataField("clothingVisuals")] - public readonly Dictionary> ClothingVisuals = new(); - - public Color Color { get; internal set; } - public Control MakeControl() { return new StatusControl(this); diff --git a/Content.Client/Light/HandheldLightSystem.cs b/Content.Client/Light/HandheldLightSystem.cs index fdb2899db0..68f4438b20 100644 --- a/Content.Client/Light/HandheldLightSystem.cs +++ b/Content.Client/Light/HandheldLightSystem.cs @@ -1,13 +1,8 @@ -using Content.Client.Clothing; using Content.Client.Items.Systems; using Content.Client.Light.Components; -using Content.Shared.Clothing; -using Content.Shared.Hands; using Content.Shared.Item; using Content.Shared.Light.Component; -using Robust.Client.GameObjects; using Robust.Shared.GameStates; -using System.Linq; namespace Content.Client.Light; @@ -19,59 +14,6 @@ public sealed class HandheldLightSystem : EntitySystem { base.Initialize(); SubscribeLocalEvent(OnHandleState); - SubscribeLocalEvent(OnGetHeldVisuals, after: new[] { typeof(ItemSystem) } ); - SubscribeLocalEvent(OnGetEquipmentVisuals, after: new[] { typeof(ClothingSystem)}); - } - - /// - /// Add the unshaded light overlays to any clothing sprites. - /// - private void OnGetEquipmentVisuals(EntityUid uid, HandheldLightComponent component, GetEquipmentVisualsEvent args) - { - if (!component.Activated) - return; - - if (!component.ClothingVisuals.TryGetValue(args.Slot, out var layers)) - return; - - var i = 0; - foreach (var layer in layers) - { - var key = layer.MapKeys?.FirstOrDefault(); - if (key == null) - { - key = i == 0 ? $"{args.Slot}-light" : $"{args.Slot}-light-{i}"; - i++; - } - - args.Layers.Add((key, layer)); - } - } - - /// - /// Add the unshaded light overlays to any in-hand sprites. - /// - private void OnGetHeldVisuals(EntityUid uid, HandheldLightComponent component, GetInhandVisualsEvent args) - { - if (!component.Activated) - return; - - if (!component.InhandVisuals.TryGetValue(args.Location, out var layers)) - return; - - var i = 0; - var defaultKey = $"inhand-{args.Location.ToString().ToLowerInvariant()}-light"; - foreach (var layer in layers) - { - var key = layer.MapKeys?.FirstOrDefault(); - if (key == null) - { - key = i == 0 ? defaultKey : $"{defaultKey}-{i}"; - i++; - } - - args.Layers.Add((key, layer)); - } } private void OnHandleState(EntityUid uid, HandheldLightComponent component, ref ComponentHandleState args) @@ -85,21 +27,13 @@ public sealed class HandheldLightSystem : EntitySystem return; component.Activated = state.Activated; - _itemSys.VisualsChanged(uid); - - if (TryComp(component.Owner, out SpriteComponent? sprite)) - { - sprite.LayerSetVisible(component.Layer, state.Activated); - } - - if (TryComp(uid, out PointLightComponent? light)) - { - light.Enabled = state.Activated; - } // really hand-held lights should be using a separate unshaded layer. (see FlashlightVisualizer) // this prefix stuff is largely for backwards compatibility with RSIs/yamls that have not been updated. if (component.AddPrefix && TryComp(uid, out SharedItemComponent? item)) + { item.EquippedPrefix = state.Activated ? "on" : "off"; + _itemSys.VisualsChanged(uid); + } } } diff --git a/Content.Client/Toggleable/ToggleableLightVisualsComponent.cs b/Content.Client/Toggleable/ToggleableLightVisualsComponent.cs new file mode 100644 index 0000000000..58ec08f2b8 --- /dev/null +++ b/Content.Client/Toggleable/ToggleableLightVisualsComponent.cs @@ -0,0 +1,33 @@ +using Content.Shared.Hands.Components; +using static Robust.Shared.GameObjects.SharedSpriteComponent; + +namespace Content.Client.Toggleable; + +/// +/// Component that handles the toggling the visuals of some light emitting entity. +/// +/// +/// 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. +/// +[RegisterComponent] +public sealed class ToggleableLightVisualsComponent : Component +{ + /// + /// Sprite layer that will have it's visibility toggled when this item is toggled. + /// + [DataField("spriteLayer")] + public string SpriteLayer = "light"; + + /// + /// Layers to add to the sprite of the player that is holding this entity (while the component is toggled on). + /// + [DataField("inhandVisuals")] + public Dictionary> InhandVisuals = new(); + + /// + /// Layers to add to the sprite of the player that is wearing this entity (while the component is toggled on). + /// + [DataField("clothingVisuals")] + public readonly Dictionary> ClothingVisuals = new(); +} diff --git a/Content.Client/Toggleable/ToggleableLightVisualsSystem.cs b/Content.Client/Toggleable/ToggleableLightVisualsSystem.cs new file mode 100644 index 0000000000..56aba2a376 --- /dev/null +++ b/Content.Client/Toggleable/ToggleableLightVisualsSystem.cs @@ -0,0 +1,113 @@ +using Content.Client.Clothing; +using Content.Client.Items.Systems; +using Content.Shared.Clothing; +using Content.Shared.Hands; +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 +{ + [Dependency] private readonly SharedItemSystem _itemSys = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnGetHeldVisuals, after: new[] { typeof(ItemSystem) }); + SubscribeLocalEvent(OnGetEquipmentVisuals, after: new[] { typeof(ClothingSystem) }); + } + + protected override void OnAppearanceChange(EntityUid uid, ToggleableLightVisualsComponent component, ref AppearanceChangeEvent args) + { + if (!args.Component.TryGetData(ToggleableLightVisuals.Enabled, out bool enabled)) + return; + + var modulate = args.Component.TryGetData(ToggleableLightVisuals.Color, out Color color); + + // Update the item's sprite + if (TryComp(uid, out SpriteComponent? sprite) && sprite.LayerMapTryGet(component.SpriteLayer, out var layer)) + { + sprite.LayerSetVisible(layer, enabled); + if (modulate) + sprite.LayerSetColor(layer, color); + } + + // Update any point-lights + if (TryComp(uid, out PointLightComponent? light)) + { + DebugTools.Assert(!light.NetSyncEnabled, "light visualizers require point lights without net-sync"); + light.Enabled = enabled; + if (enabled && modulate) + light.Color = color; + } + + // update clothing & in-hand visuals. + _itemSys.VisualsChanged(uid); + } + + /// + /// Add the unshaded light overlays to any clothing sprites. + /// + private void OnGetEquipmentVisuals(EntityUid uid, ToggleableLightVisualsComponent component, GetEquipmentVisualsEvent args) + { + if (!TryComp(uid, out AppearanceComponent? appearance) + || !appearance.TryGetData(ToggleableLightVisuals.Enabled, out bool enabled) + || !enabled) + return; + + if (!component.ClothingVisuals.TryGetValue(args.Slot, out var layers)) + return; + + var modulate = appearance.TryGetData(ToggleableLightVisuals.Color, out Color color); + + 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) + || !appearance.TryGetData(ToggleableLightVisuals.Enabled, out bool enabled) + || !enabled) + return; + + if (!component.InhandVisuals.TryGetValue(args.Location, out var layers)) + return; + + var modulate = appearance.TryGetData(ToggleableLightVisuals.Color, out Color color); + + 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/Weapons/Melee/EnergySwordVisualizer.cs b/Content.Client/Weapons/Melee/EnergySwordVisualizer.cs deleted file mode 100644 index ad6373fa73..0000000000 --- a/Content.Client/Weapons/Melee/EnergySwordVisualizer.cs +++ /dev/null @@ -1,96 +0,0 @@ -using Content.Shared.Item; -using Content.Shared.Weapons.Melee; -using Robust.Client.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Maths; - -namespace Content.Client.Weapons.Melee; - -public sealed class EnergySwordVisualizer : AppearanceVisualizer -{ - public override void OnChangeData(AppearanceComponent component) - { - base.OnChangeData(component); - var entManager = IoCManager.Resolve(); - - component.TryGetData(EnergySwordVisuals.State, out EnergySwordStatus? status); - status ??= EnergySwordStatus.Off; - component.TryGetData(EnergySwordVisuals.Color, out Color? color); - color ??= Color.DodgerBlue; - entManager.TryGetComponent(component.Owner, out SpriteComponent? spriteComponent); - - if ((status & EnergySwordStatus.On) != 0x0) - { - TurnOn(component, status.Value, color.Value, entManager, spriteComponent); - } - else - { - TurnOff(component, status.Value, entManager, spriteComponent); - } - } - - private void TurnOn( - AppearanceComponent component, - EnergySwordStatus status, - Color color, - IEntityManager entManager, - SpriteComponent? spriteComponent = null) - { - if ((status & EnergySwordStatus.Hacked) != 0x0) - { - if (entManager.TryGetComponent(component.Owner, out SharedItemComponent? itemComponent)) - { - itemComponent.EquippedPrefix = "on-rainbow"; - } - - //todo: figure out how to use the RGBLightControllerSystem to phase out the rainbow sprite AND add lights. - spriteComponent?.LayerSetColor(1, Color.White); - spriteComponent?.LayerSetVisible(1, false); - spriteComponent?.LayerSetState(0, "e_sword_rainbow_on"); - } - else - { - if (entManager.TryGetComponent(component.Owner, out SharedItemComponent? itemComponent)) - { - itemComponent.EquippedPrefix = "on"; - itemComponent.Color = color; - } - - spriteComponent?.LayerSetColor(1, color); - spriteComponent?.LayerSetVisible(1, true); - - if (entManager.TryGetComponent(component.Owner, out PointLightComponent? pointLightComponent)) - { - pointLightComponent.Color = color; - pointLightComponent.Enabled = true; - } - } - } - - private void TurnOff( - AppearanceComponent component, - EnergySwordStatus status, - IEntityManager entManager, - SpriteComponent? spriteComponent = null) - { - if (entManager.TryGetComponent(component.Owner, out SharedItemComponent? itemComponent)) - { - itemComponent.EquippedPrefix = "off"; - } - - if ((status & EnergySwordStatus.Hacked) != 0x0) - { - spriteComponent?.LayerSetState(0, "e_sword"); - } - else - { - spriteComponent?.LayerSetVisible(1, false); - } - - if (entManager.TryGetComponent(component.Owner, out PointLightComponent? pointLightComponent)) - { - pointLightComponent.Enabled = false; - } - } -} diff --git a/Content.Server/Entry/IgnoredComponents.cs b/Content.Server/Entry/IgnoredComponents.cs index e3748402fb..41fd5e6514 100644 --- a/Content.Server/Entry/IgnoredComponents.cs +++ b/Content.Server/Entry/IgnoredComponents.cs @@ -20,6 +20,7 @@ namespace Content.Server.Entry "ItemCabinetVisuals", "DiseaseMachineVisuals", "HandheldGPS", + "ToggleableLightVisuals", "PotencyVisuals", "PaperVisuals" }; diff --git a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs index 4ce723592c..1f9e6d7a67 100644 --- a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs +++ b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs @@ -183,10 +183,13 @@ namespace Content.Server.Light.EntitySystems _actionSystem.SetToggled(component.ToggleAction, false); _activeLights.Remove(component); component.LastLevel = null; - component.Dirty(EntityManager); + Dirty(component); + + if (TryComp(component.Owner, out AppearanceComponent? appearance)) + appearance.SetData(ToggleableLightVisuals.Enabled, false); if (makeNoise) - SoundSystem.Play(Filter.Pvs(component.Owner), component.TurnOffSound.GetSound(), component.Owner); + SoundSystem.Play(Filter.Pvs(component.Owner, entityManager: EntityManager), component.TurnOffSound.GetSound(), component.Owner); return true; } @@ -197,7 +200,7 @@ namespace Content.Server.Light.EntitySystems if (!_powerCell.TryGetBatteryFromSlot(component.Owner, out var battery)) { - SoundSystem.Play(Filter.Pvs(component.Owner), component.TurnOnFailSound.GetSound(), component.Owner); + SoundSystem.Play(Filter.Pvs(component.Owner, entityManager: EntityManager), component.TurnOnFailSound.GetSound(), component.Owner); _popup.PopupEntity(Loc.GetString("handheld-light-component-cell-missing-message"), component.Owner, Filter.Entities(user)); return false; } @@ -207,7 +210,7 @@ namespace Content.Server.Light.EntitySystems // Simple enough. if (component.Wattage > battery.CurrentCharge) { - SoundSystem.Play(Filter.Pvs(component.Owner), component.TurnOnFailSound.GetSound(), component.Owner); + SoundSystem.Play(Filter.Pvs(component.Owner, entityManager: EntityManager), component.TurnOnFailSound.GetSound(), component.Owner); _popup.PopupEntity(Loc.GetString("handheld-light-component-cell-dead-message"), component.Owner, Filter.Entities(user)); return false; } @@ -219,7 +222,10 @@ namespace Content.Server.Light.EntitySystems component.LastLevel = GetLevel(component); Dirty(component); - SoundSystem.Play(Filter.Pvs(component.Owner), component.TurnOnSound.GetSound(), component.Owner); + if (TryComp(component.Owner, out AppearanceComponent? appearance)) + appearance.SetData(ToggleableLightVisuals.Enabled, true); + + SoundSystem.Play(Filter.Pvs(component.Owner, entityManager: EntityManager), component.TurnOnSound.GetSound(), component.Owner); return true; } diff --git a/Content.Server/Weapon/Melee/EnergySword/Components/EnergySwordComponent.cs b/Content.Server/Weapon/Melee/EnergySword/Components/EnergySwordComponent.cs index d3e2d52c38..455fb71aae 100644 --- a/Content.Server/Weapon/Melee/EnergySword/Components/EnergySwordComponent.cs +++ b/Content.Server/Weapon/Melee/EnergySword/Components/EnergySwordComponent.cs @@ -1,9 +1,5 @@ -using System.Collections.Generic; using Content.Shared.Damage; using Content.Shared.Sound; -using Robust.Shared.GameObjects; -using Robust.Shared.Maths; -using Robust.Shared.Serialization.Manager.Attributes; namespace Content.Server.Weapon.Melee.EnergySword { @@ -15,6 +11,13 @@ namespace Content.Server.Weapon.Melee.EnergySword public bool Hacked = false; public bool Activated = false; + + /// + /// RGB cycle rate for hacked e-swords. + /// + [DataField("cycleRate")] + public float CycleRate = 1f; + [DataField("hitSound")] public SoundSpecifier HitSound { get; set; } = new SoundPathSpecifier("/Audio/Weapons/eblade1.ogg"); diff --git a/Content.Server/Weapon/Melee/EnergySword/EnergySwordSystem.cs b/Content.Server/Weapon/Melee/EnergySword/EnergySwordSystem.cs index 4dfdc4c0dd..5321822a43 100644 --- a/Content.Server/Weapon/Melee/EnergySword/EnergySwordSystem.cs +++ b/Content.Server/Weapon/Melee/EnergySword/EnergySwordSystem.cs @@ -1,12 +1,11 @@ -using Content.Shared.ActionBlocker; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Item; +using Content.Shared.Light; +using Content.Shared.Light.Component; +using Content.Shared.Toggleable; using Content.Shared.Tools.Components; -using Content.Shared.Weapons.Melee; using Robust.Shared.Audio; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; using Robust.Shared.Player; using Robust.Shared.Random; @@ -15,6 +14,7 @@ namespace Content.Server.Weapon.Melee.EnergySword public sealed class EnergySwordSystem : EntitySystem { [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedRgbLightControllerSystem _rgbSystem = default!; public override void Initialize() { @@ -55,6 +55,8 @@ namespace Content.Server.Weapon.Melee.EnergySword { TurnOn(comp); } + + UpdateAppearance(comp); } private void TurnOff(EnergySwordComponent comp) @@ -67,10 +69,9 @@ namespace Content.Server.Weapon.Melee.EnergySword item.Size = 5; } - SoundSystem.Play(Filter.Pvs(comp.Owner), comp.DeActivateSound.GetSound(), comp.Owner); + SoundSystem.Play(Filter.Pvs(comp.Owner, entityManager: EntityManager), comp.DeActivateSound.GetSound(), comp.Owner); comp.Activated = false; - UpdateAppearance(comp, item); } private void TurnOn(EnergySwordComponent comp) @@ -83,43 +84,36 @@ namespace Content.Server.Weapon.Melee.EnergySword item.Size = 9999; } - SoundSystem.Play(Filter.Pvs(comp.Owner), comp.ActivateSound.GetSound(), comp.Owner); + SoundSystem.Play(Filter.Pvs(comp.Owner, entityManager: EntityManager), comp.ActivateSound.GetSound(), comp.Owner); comp.Activated = true; - UpdateAppearance(comp, item); } - private void UpdateAppearance(EnergySwordComponent component, SharedItemComponent? itemComponent = null) + private void UpdateAppearance(EnergySwordComponent component) { - if (!EntityManager.TryGetComponent(component.Owner, out AppearanceComponent? appearanceComponent)) return; + if (!TryComp(component.Owner, out AppearanceComponent? appearanceComponent)) + return; - appearanceComponent.SetData(EnergySwordVisuals.Color, component.BladeColor); - - var status = component.Activated ? EnergySwordStatus.On : EnergySwordStatus.Off; - if (component.Hacked) - status |= EnergySwordStatus.Hacked; - - appearanceComponent.SetData(EnergySwordVisuals.State, status); - // wew itemcomp - if (Resolve(component.Owner, ref itemComponent, false)) - { - itemComponent.EquippedPrefix = component.Activated ? "on" : "off"; - itemComponent.Color = component.BladeColor; - } + appearanceComponent.SetData(ToggleableLightVisuals.Enabled, component.Activated); + appearanceComponent.SetData(ToggleableLightVisuals.Color, component.BladeColor); } private void OnInteractUsing(EntityUid uid, EnergySwordComponent comp, InteractUsingEvent args) { if (args.Handled) return; - if (comp.Hacked) - return; - if (!TryComp(args.Used, out ToolComponent? tool) || !tool.Qualities.ContainsAny("Pulsing")) return; args.Handled = true; - comp.Hacked = true; - UpdateAppearance(comp); + comp.Hacked = !comp.Hacked; + + if (comp.Hacked) + { + var rgb = EnsureComp(uid); + _rgbSystem.SetCycleRate(uid, comp.CycleRate, rgb); + } + else + RemComp(uid); } } } diff --git a/Content.Shared/Item/SharedItemComponent.cs b/Content.Shared/Item/SharedItemComponent.cs index a54f00d55e..84a5832af3 100644 --- a/Content.Shared/Item/SharedItemComponent.cs +++ b/Content.Shared/Item/SharedItemComponent.cs @@ -64,23 +64,6 @@ namespace Content.Shared.Item [DataField("EquipSound")] public SoundSpecifier? EquipSound { get; set; } = default!; - // TODO REMOVE. Currently nonfunctional and only used by RGB system. #6253 Fixes this but requires #6252 - /// - /// Color of the sprite shown on the player when this item is in their hands. - /// - [ViewVariables(VVAccess.ReadWrite)] - public Color Color - { - get => _color; - set - { - _color = value; - Dirty(); - } - } - [DataField("color")] - private Color _color = Color.White; - /// /// Rsi of the sprite shown on the player when this item is in their hands. Used to generate a default entry for /// diff --git a/Content.Shared/Toggleable/ToggleableLightVisuals.cs b/Content.Shared/Toggleable/ToggleableLightVisuals.cs new file mode 100644 index 0000000000..ab96d16b26 --- /dev/null +++ b/Content.Shared/Toggleable/ToggleableLightVisuals.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Toggleable; + +// Appearance Data key +[Serializable, NetSerializable] +public enum ToggleableLightVisuals +{ + Enabled, + Color +} diff --git a/Content.Shared/Weapons/Melee/SharedEnergySwordComponent.cs b/Content.Shared/Weapons/Melee/SharedEnergySwordComponent.cs deleted file mode 100644 index 45fd78d689..0000000000 --- a/Content.Shared/Weapons/Melee/SharedEnergySwordComponent.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Robust.Shared.Serialization; - -namespace Content.Shared.Weapons.Melee; - - -[Serializable, NetSerializable, Flags] -public enum EnergySwordStatus : byte -{ - Off = 0, - On = 1 << 0, - Hacked = 1 << 1, -} - -[Serializable, NetSerializable] -public enum EnergySwordVisuals : byte -{ - State, - Color, -} diff --git a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml index 640891a6e3..dc20b0f707 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml @@ -17,6 +17,8 @@ map: [ "light" ] - type: HandheldLight addPrefix: false + - type: ToggleableLightVisuals + spriteLayer: light inhandVisuals: left: - state: inhand-left-light diff --git a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml index f509d799c7..c88b7b72cd 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml @@ -10,6 +10,14 @@ - DroneUsable - type: HandheldLight addPrefix: false + toggleAction: + name: action-name-toggle-light + description: action-description-toggle-light + icon: Objects/Tools/flashlight.rsi/flashlight.png + iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png + event: !type:ToggleActionEvent + - type: ToggleableLightVisuals + spriteLayer: light inhandVisuals: left: - state: inhand-left-light diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index 144de1e6d6..c58638167c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -19,6 +19,7 @@ color: "#FFFFFF" visible: false shader: unshaded + map: [ "blade" ] - type: MeleeWeapon damage: types: @@ -35,8 +36,15 @@ energy: 2 color: white - type: Appearance - visuals: - - type: EnergySwordVisualizer + - type: ToggleableLightVisuals + spriteLayer: blade + inhandVisuals: + left: + - state: inhand-left-blade + shader: unshaded + right: + - state: inhand-right-blade + shader: unshaded - type: entity name: pen @@ -59,6 +67,7 @@ color: "#FFFFFF" visible: false shader: unshaded + map: [ "blade" ] - type: MeleeWeapon damage: types: @@ -75,8 +84,15 @@ energy: 1.5 color: white - type: Appearance - visuals: - - type: EnergySwordVisualizer + - type: ToggleableLightVisuals + spriteLayer: blade + inhandVisuals: + left: + - state: inhand-left-blade + shader: unshaded + right: + - state: inhand-right-blade + shader: unshaded - type: Tag tags: - Write diff --git a/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/e_sword_on.png b/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/e_sword_on.png deleted file mode 100644 index f1c209165fb2c17ad3d96f1e538803bdbcec91c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)bPWBEwe9i5Zr}0f1&Oxo=sj4#uF^M81lHkwz{(sX9T`isM*{4p!h`CmgKC!LB%%5JCtJCR+Ot=heE=v`ct(J@mRA>3ovr%SG1{)5(|=T~FAygU00r-rhej8Vu3vc8F>bD){6#Od?A@ zP5XloKAnu$+Og<*%D01TK9R8^w(X!)DFXoR+igrIW96M7i*LzT5dZ=MU_PH||3l-a sd`s#iGD_Bb6B82?6B82?6O%ufFGR^ikr=t^y8r+H07*qoM6N<$f@7fQ;{X5v diff --git a/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/e_sword_rainbow_on.png b/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/e_sword_rainbow_on.png deleted file mode 100644 index 5a691ef5c234b8628dab9703ae4fcc9ac3ac6b26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1356 zcmYjRc~Fyg5dGzVd;u{~Ih4aM0mVSaf+I@hkN^osK?D_%;YvYJK?FsGN+2Ny4YkCP z8js?HfFM+nLj)@Ya){iA;)PfZNQ9uM8G?{-d^B{Xwln+o?Y`Na{bzUcf`fbw^vv}D z00#bk)LmMpYr%qawSM}q!;MKC2{z{=KTp!naev;Y7* z=}-0ClQHx$sy4{N)A*Wu2z6ZnZKBJFfhzSu=k@U)XR#eL`3pYB4;2hacMOnns3|RC zj`0PW32hTOG+Iw~wOKW!`!*|6olwd*B=){3%u4C6NoglKwjE5q-?F49W0vR+R&=;E zSW2IIaq{(aM3<}&UtFv1ut$}jST#Z?eq8vVa#w|(-h2$pv=BFJJaY$n^>VPQy(vrT ztt`~kJPbAxpHdTELL{%8mB)O5~}pNN>S((jGc z-+(-BkH}vbl5S~iK<7xA0BWn9uzFWEToyU{yh)dp4yqW*J>kJ0N96Y&PStOU$n-qb zpl=zC2HyZ1*dk4?2BiXgxFgKRx9lxFX-iE*PgzpMjog|FC(HcDr(AsksMNNDc#t=` zkAWPD{pI=0>f6pFb@w|3o%s564wu^@q3rF0H-__b12b|zb4ORZy1FV&IJB!miHN+a zZ?>mPa~+43JH29+%fVCHBYAor9mnJ^JjP&->4E0x{uO7vfjIU1r>35K8HsI{t?H1O z0b5>NXPDRatI^d5hT)|4l+~P?g)^Q|H@vuW;!aZR%CfN5`jME<#9IH9BS%t?9xblb z>x>b!B1p^r3IA+15&GA-?P6f~D0bUU9A zMRVM%)c5q8a~U5c&H73MJl4dIUj7YYH<+w>jew-}TTxC=cyIBJIMEjKwAs98xFx|0 zQ|}NUc7b6(j-99xiqF?nNGjc*z`Q>K;6Ut0Xa} zv651T{on_I5}RFpza|#xc(TsC-wq;anx}E=vNrF6(DRtc(n$iHNpV-ZAGwS5H2l{p zH?n7Ok359tLMBCry>ki7X)}5kVVPJ6YMLNq0tKAf|Bpb4UrrY>3V65+`?Z3;ERoU6 za&T4NHU%t3zzmM4ZKHf0V~DLazVUpgNbx?PO#gxNAG#0b%z{~Xw#LjDTjLNPsv?lL z*UT+07Sp&tNC@Mwp#sT13*AI?p3M*-8}?0Rj*2PmLQuT@(DAUkbFw<^q2UzKQJ=r_ zwhwEMs4g+UHoAz+5!4pbVy%C;zLIsxZx$E*h>IH3dki}H;o$~xn1brn-w2_;R$h!K`} vVUhs#^#3o|GF%kIUPMh2{@Zz|WI&CZSP@tB>0nyF_89_yS`f9$i_ZQV>AY#* diff --git a/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/on-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/inhand-left-blade.png similarity index 100% rename from Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/on-inhand-left.png rename to Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/inhand-left-blade.png diff --git a/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/off-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/inhand-left.png similarity index 100% rename from Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/off-inhand-left.png rename to Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/inhand-left.png diff --git a/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/on-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/inhand-right-blade.png similarity index 100% rename from Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/on-inhand-right.png rename to Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/inhand-right-blade.png diff --git a/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/off-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/inhand-right.png similarity index 100% rename from Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/off-inhand-right.png rename to Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/inhand-right.png diff --git a/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/meta.json index ace1544263..2dc66a0e7f 100644 --- a/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/meta.json @@ -11,40 +11,12 @@ "name": "e_sword" }, { - "name": "off-inhand-left", + "name": "inhand-left", "directions": 4 }, { - "name": "off-inhand-right", + "name": "inhand-right", "directions": 4 - }, - { - "name": "e_sword_rainbow_on", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "e_sword_on", - "delays": [ - [ - 0.1, - 0.1 - ] - ] }, { "name": "e_sword_blade", @@ -56,7 +28,7 @@ ] }, { - "name": "on-inhand-left", + "name": "inhand-left-blade", "directions": 4, "delays": [ [ @@ -78,7 +50,7 @@ ] }, { - "name": "on-inhand-right", + "name": "inhand-right-blade", "directions": 4, "delays": [ [ @@ -98,130 +70,6 @@ 0.1 ] ] - }, - { - "name": "on-rainbow-inhand-left", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "on-rainbow-inhand-right", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] } ] } diff --git a/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/on-rainbow-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/e_dagger.rsi/on-rainbow-inhand-left.png deleted file mode 100644 index b1fa49e19d8bf8415be3bfa533d78cbbd90a16cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1054 zcmeAS@N?(olHy`uVBq!ia0vp^4?viM4MO=u<5X=vX$A)7eV#6kAr-gY-rX3e>?q=T@%%AkJv+?_twl;4sZMNO4%`03 zxu4y3?S^j4k?f1le_Uz4Si`j@niXgq0<6ic&(VLscI&mMq<;Zdqe64`uhQBZue+mu z#k4#3uddv?ciW54=lA|U{BiG|`v2wza`CIPPCoX2TfgUz?go3g_=I|!ecP{}VN|>S z|MbVd8&%`~IX_^SX18zucmDhTZF`PyUmYC%>c^^8+j6^Q+-rq6**X8uv+wOeq z{oQ`&Gf?2@Z+@L8KY#ALxjkPV;Vfjn)<$GHte^tD+OW4&v{T*}N zN}p=GL%FvX{ol9bTci6D{`C9jQG)|+?}2)olBq8y*PZ<(uqbwKp?!$?tIYMWbCZ5| znnZ+#+S-P04SV@r{}y}C_ls#=(QJJMZ(ghR8Qgq6`{Cc&N|$zi5p3h$zT0Z6zN=pS z3BhH*8$Q~%Kc09q^w|KhsyCa$EzUmW z*#GR&k8j7P)%+CB-8+BcRqo|GfALSc$>;5V>WdU)UyAv> zd}WQ>Jwarf5$qp%$%&c?;mfaayRUSg@aA)9>hFq=b_qZJTGuly{9AA@$7WwhoX*YX z(*62@oL%1;r=Ne_$~^z^$G5Mp$i(N_Ptu6CG5Ec_zwE@&wG8x7iW4A+Z{s-dTPAd!XDcdE>A1Q+}r3@ULBW@zePo^(Soqr~G*ye7wBh z?!N0k?Sht{hv)5c<<3d>8)=utf0kgE9~Qg45|dO=u<5X=vX$A)73!W~HAr-gY-rX4ZI6 z?z2U>8EiJ@7K^!QwY;G=;#%v?7ps|o<{>~{So!zM+2wEh=kB^6TDzj_p1D#KiS&wd3P|GlflI>+UhQ zbKLto&wL_-b|6#zsJt={o^u0wfD<^*IbuKb}@dP z-1DM-af9m1!#m&G?w$Xf1=%_TyTE)-u5T>jyoO`+I^)xrLq8?QX}KW4c6 z`}$q0<>Z*+|C>Lao#qy+bN%Qrr$8>@$7f%$ET~EJDHZd>%4l>%Y7f25spA& zDL!-w4-NhGuUt5B`i_(TW^neXJXYHLd*gLA$?uUhHG9u`T{7+5z~8#?0LSIl`Dewq ziT!10_fUSDb{wefce1*1{KsQ+1>@3rJJ*#gdh^QSStTf1p3iWbvCF>KpmM)ejr^qu-Dm(Ran+QseSpHcUJQ|OX{xSV<4y?P90 zvQ=0AdF|Qk>bB$Ko>-d=J68wC-@RdcNPFME0{MUkU;ipD`IP~T{n~9Q^Yf)1ru}Ys z_&r~0p`F5l^UwDEuH#1XGZM2PeNyP6|J&@pg&26vnJ?awbU*mVzoiOOell5A*2jH_ z`XleZ{NO&LeJ*x7^WLwjaWTm4E&D?xi0>wflbl5SqH6LLQhTe;e$(@b{{@PVf8jckV)|5AEiCY>oX@ xa}XL}?;bDx-7s5LUSJXb^MBLc!-ISNUsje!#>#&VteXn5($m$?Wt~$(69Ckb-B17k diff --git a/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/e_sword_on.png b/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/e_sword_on.png deleted file mode 100644 index 521324817e51e6002dbfad07ba5177d9d744b5cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 zcmV;-0WU1>zXofg^ASxCNo0 z3MYWd6)l!KOKB)*g4c4Sm9?YH?))*#$}ibQkf3}*dtxS-C|0aJWQ9Pd>D zL3|ZC?);M)U>2VPy5kEKKqMXly6{>!fQUa$$M^H=p#UnryK-*x8UG9nz=-?1?}Eqv z{d(~O0p!O0ffyi(iviNO2!M!Z15oiS05YBoK*y5+8gVv2E6xIF##sQ(I2WK6PX)l^ zEWr80&Gz^4&1uA006$-Mmu~a&4UeA$)OCHRs>(G@Ga}lyeRkj>0Y2XM{TLs@3#T+u zKzQex@hHIR&Pjj|`>}{e0ajrWU_Av;0RICp{HwYR-w!`vuV#QLZnqyG;x_vMDsHkL zV8q8iGvW8I0!WF&0jY5)ASVt3-??Y*hx7l>J+N*~ zsJ-nhTL1v;Wl~8vm1C$-*;rHO(BqvARGPL+8kq_J%-fSeEAn7E0|28^CJFv}Puc78 zAjORJ?3@}G35~Htwv^_fY7^c14V0Vr64%_PRdu=E4si96|V%v+( zJ$>)T9`gc4NVddh`EygiwQYlY&3$~Uxln?l^+INYc=S}cVS0!qPBK7jspfRwL1)yH zD+16Wb1`b)L#GqzQy0Q++vvnXLQw74tu=6BybOV8U2*6W{oSM2S+CHu>_vPr+c?kQ zGuhoj^fM$Fa_#6^X=xr*OZG)Qz$=K8jN2I86gu?A=`U>x@G>(3D#tk$D$f?HF1ru z;$pEQAzwv1f&1d87a;9|mK91jcn4m3p79t;hDJtv{QcWcKPAXPvOg;jJ7Nmc#cBE& znHi9TWdO(Q+~yOBhncLGcY>9k;3|Ft^jI4 z2(+wLbTN|Gsf6w=T(+@e$S%JBxUhJlHhf~{(;*p@dZ)ed&zb~I_j^TGyy?iZwRNht z^wgDn*at*aRgM0!#1+oiA`i{W2LB2-s#&Mn4y9&=SG{_6kVaGxKQMeA`MSApZBTUO z>3E$F1$?!^6E2B_)Uykcig?-y((B%<({Eunu;n6&8nz}}A5S`pzFmC`i|(F6I1{8( zp|{QnAR=*YJ)JL(7R}!PV4U{20ZNO_gnT1S4Z0u#Zva1Q5^iHGYtDmQQ9#Gh>M=*- zya{h@p}vx1bVGD9W&Sb9^*jI)5+#0XXEGrl5VmYk27=)DSJ5G&+N(fwggI-WE==iT zSSh+r?1e@KNBk2gJxZv;^76=KawAY`wvdmDUE=|jCcxI!8(WV|!rM_<& z%@Ni<=fodc#MPi5zP!~x433sul5W5E^6;$ra=v)I2vpCFr4wA7+wS11Mg&N~ED9Mo z_W*^UJ91_Yg^qaXu}Kslf=Q&~r5XyoDa%e`7G7HB;F{rvhNLNj2W+&NMQbbF5g9l3 zvK~LcHVIoTR_B^~eiNan4>AQ4hERxx-w#C51xPj~4Dc1Vgg3X6S>=E6V(M)=SbiInSaR>|&vm}Xct%JGCwYxn?C8sh zr539){qW%V)?w9+JTgK#F^m-WH96zaDJJ37-1HU7ume!lvo{J|lAuUmIJeK9@S;@K z+-jVMp87_l&Di6M)k$@6DNOTz(n&yB=t-~I@Pz=8Wm+#2wcm|PS+h15iY4R~UVqJlGTd)g&}otPWxsdhfhWmRhYZ>||Zcm~<0-wg=(yU6323>NeEDDv1}3O!a%d o1y-g0UnsiLtQmek(#r^|Jh67=&ECL9>JtZKA!{TTmd9lM1Ix|sc>n+a diff --git a/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-left-blade.png b/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-left-blade.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc304a12fd102d0ffdfb6de7edc53452cd3c675 GIT binary patch literal 7094 zcmeHMc|4Ts+n++RBoQT*Y1B_*%$S8S8NwJ#js4iN&GL+yn8nO6IIS9Kk*ysqvLuBf z5)G|L;*^S{BC>?kQH11uhE6%}d*1VV&*$_0{_B~~EcbPPukUr;-{-pS=XpM}&&A1Z zf#Nbn2n4dg!Jg;_eg{e4^XGw|uaApx5QyTTXb*3p8$|@=@wp6EC;$~k@c<|g$znht zk*$NrH%Ay6s1T>LY!}W^g)UWTEP1CK{aJG4$o7>wmJO20rVIY1#p(0Z7H7ERwtXE9 zteHH3&|g)4xa6qk{vLyp$J8G3r^Lb<>}TO*Wo6wY;_G(7E5ej6e`8r4f%2+z{pj$0 zS@P)Qhmp#rs6zLl*mpb3;cG{_YSVu8lPpR3T&DA`%Db}mFYdu$oVn)Bb^B>q+HFW>EOIh&J zx{9SQMs2?0BD}-_Lu;>_k3F#TW{x!n7E(nGc|8L)ebMWPd1VtW&UV*c8uL^gujOb2 z)H!!c0t%}y@b4&4l`!&!eb!3J%+pD?6bb2<3j380!E?$o`3J+)!YaIMX$RDiF>(QJ zIM?iZd^al~CY86|VrY$DBfEK+k!v0$N2647bJH>(;OyCDez&j1@7lR-<*FmXm%}Ka4$84b8U(K`7XEpnoYR{XB~<)f5~sX;&uLfw{PB4 z-_3(?6RTT%1G4{x{F0YZ%;3I;frh;=?Uth+)n+QM2*2`B@8bzpw@*$3{`r7`kx$mt zx{WXLF639<-s8A_@cR9y{-WoTH%fH%PHwGx=LTRX2oanI8EIV-3Z9agR%9*6+WL-}Vj^#sjhK%UfkE}WEsdkTkEy9VS{O(Ka?s7BD+U#!)e z_4?Ui*4)Su=C+|?8nKVR!abKne1f${(Vt56WKYH28P$-qMqaOVYUo8>(NXqfTGtVRD&;9i=esmBB?tbq`b4?UuYVxd|b?+s$nWd(*ivd2>_Vj+YFq=6c4| z1-)u~(rDUiQwD-m)YNoBuJYp=^Q}ln!w2!peerK`8y&-Gel5<6pq02zNK^sLYeY8b zpytMUx?Lvycp3iH_B|fNgctix1eWjAa5EWB-w_dhYH;M-prV>i za_iE~J}<;NPj;e`%EkRKNGi|&eqH*a$CR>xF!5br&Y zZ#t53av*oS)_+l)E|1s}2iHT!^tSym~Obym#09ll7f3COWS8 z+-C6{G7PvBsv0-2WkI%N@m6~C7E}&7M9N11D5gUS9gdp;TO^bn*2=u zy#3cGto)|N!gtPkUw32-`C}3FdWUPb;oRakX+Kmnf8@CuI-y0l@nW9~Y-vAWPz=|| zOVvyoZ2UdJHfzFV3D;p??xVe*k~2fz?acG5_g9GJ=Dcq)DHeBmSzqQK?C+w$NRD~8 z`xabphbrYycpSt%G*s2m_mAH9ud$JA2`^9?x#)A2OVwl6s9$dX8@WohoKs@?urc71 z)q6JfQgE0D{q9TGWxw?sRuG(yIN3T)mgZ?at&@3j+&%xrz~x1Ct192qMV`8zm2b3; zbu%1E68RJ2gr-A9hvJ|dy>ou@i9cq8j_3YszDtlRnb6Jv9_U&|*SCEUKuH{)gHcZ@wK zoy*>$9b3BW%KQNH1$1K^sWWCmYxR@lx839Ftoj3LwFwGl_fR;odW`QnPpvq+(?wfO z93h80%jnaME%Q5$>h{ufFEL%=6+V_PqIW^n|dH^C)s*M+b&ks{Z;h z@;sDBv{Bx4rYi2JYKr_k{CVrP`|i~8SM*TyZkdI_8!t97eLEgs-fHb?bi+k=jmX|? z%gfY+v$Y{g{-h;AXPm{mvgQs95Zc}My0MO_K5XnFN9z*xR}rtQx~C>kH8a)3mVM6C z_Z4Y3+-k~jA}%;Pz6*AjUwZ+o9TCsDwkP(w?0Dk~w3T>wTIFfY4>FC1R957X(miT^ zaf+su+PdCdu#&OkhQcV8RT=R3)LC4XaXrqsc6vp_!J`cdJgOk z(p+nAe>sXftfeMK?O~kj7`ll^(Xa?KL$2Tg-7Wq71+n3UHB4|-{yIYs- zZL6B!UAkHt{gw}=&?Wn`b{N#Xn%L0M_ts(s&#@~1z!N#e?fDpVw%dtYIgh-YfAX?_a$cnX8g9ZiH+vs>y`Z zP)i;2S+r{FXMRg$C;48eOVIB4YI>s9lbr64wi;_QZy4h3Ga^MrpYs4=I!ZaI{NS_G z$xC+Nlt<$*sdmNe!lGo-WtGr)<;fHuOi!QN)?&4ohZ~kDG^^ZtnIDHXKx><@7zZ)I z+al!iDZ<$%0oEbL%R-(z#O@)lNvpbO58|i8`XDbA6rE) z-ZvtE8_qx0IuSXq$251_x&5oJ@5Hj>lIr^|hU|7s%wap6Be@1;XVYWVTD^Bk#zTm= zEU1&@iTDj{+5~%Fz7Ty7(#$~lU<-TTs{EB7-5W%aN9^$1PW%M z2sP)^8F)7$=^F(&BEXnJArFs0h(sbI5!#5$4@MZ9nVBJwCT4A|RmgSv(<&%YjNcDO7H_kN|^$^U!bP;4IBH5;T4bARSNB3xsrp1318d>j41> z6cUMpBT;aa8Dh3SI7=pf_vQ$`sR-(ch@|ik#zsg4oBbybfzUSMN4&rE5O{!32?#ep zzzyfq0NV(FBh;N8louKn}*07y;Kd56*&2r#MX$g_Ry9LO%;eWWr5v)H_84=H*! zl1}@Mr!jOI0tf}zU?KvL+4xU*(Eq!`UoK~wd|D_xkxL7gvN#Y4FlhpKI+wQgvVNg+UDh+K4r=w|D9MuGaqZ`v^Q8{n~LJEflNU1<_BNoVm z#Tir46aWpUGB9*FhC;=`&1irr97)HZ=~OBMKw&YnD4h8$u(TCZ`VtQzf_&f0bU~*@2MV$W|&kyK#7Aw9`#N~%L^PQ<%0GjacdHxFgoyiT{r36BL zl*7MS)PKX7&(x(o=*#6t&5G|1gw2d*wvtfRv{X>&bo=5dG^vUNn1B)i(5FuUsN>8O zjY;7I1K>XStx5i{v;Lx9F<30a!~{u!(@aq~IK~V^g`1fI6u2>ifuu1gD8Sfcrlh{J z3%CrSh{6Y~g265V&okIV)8`qw_FI|h|2Z2G6Oh&r65J(`XgC__filKpjqw;PZ02l3 z%@NX_@sHJ-OZN^k89!SObLrlKcaRpGdpM65$^!U**6EMB`Co9e{J+)czjL1roAI{c z@}j_IWeS}|oWBkK7r+^YO)MI~5pe%5_1TaaS!P{8z?^4n;Drgi&LO^E=)P5nw2}UU z$G7VH4@Ll~e+KzS`u>#br(FL?fqw-4SzSNn`bP@0eGR&6Pv6SECfN)xzlIHA`t?!h5^P{?zKFow$S~tVB{YcE9Kf`*~~BDR|yk;@i_b z&q~=LpeaSKqkK3sqP67fie^*x@W!~L?6Ft*Uc-ScU+nswo_`7V-%KC2Y@QnIcGxyI zdI~70f|;ypMnWQf95O(im}gD8jVkzWgsX z_QvOYv0@LKTTiU*%`*Jgh%a`2u&gq~OiiWjn2d>k(74?+Lp&f-cU)_F{v-uc@g+8C zeO$YV$_ybypFBJ@E@E&0sN?HQ06eJ;Zu6~GV^qaZao#Foy)CJ^iacL3dI?KxUKkAX hS$a!#F6emvy3A3?iKmC2Iq#R!IM_N73#@};{tFMYPqF|2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/off-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-left.png similarity index 100% rename from Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/off-inhand-left.png rename to Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-left.png diff --git a/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-right-blade.png b/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-right-blade.png new file mode 100644 index 0000000000000000000000000000000000000000..456e7428927417116e36c9a67b822ec36a33b2ca GIT binary patch literal 7218 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 AlK=n! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/off-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-right.png similarity index 100% rename from Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/off-inhand-right.png rename to Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/inhand-right.png diff --git a/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/meta.json index 5aae86289b..2dc66a0e7f 100644 --- a/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/meta.json @@ -11,40 +11,12 @@ "name": "e_sword" }, { - "name": "off-inhand-left", + "name": "inhand-left", "directions": 4 }, { - "name": "off-inhand-right", + "name": "inhand-right", "directions": 4 - }, - { - "name": "e_sword_rainbow_on", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "e_sword_on", - "delays": [ - [ - 0.1, - 0.1 - ] - ] }, { "name": "e_sword_blade", @@ -56,7 +28,7 @@ ] }, { - "name": "on-inhand-left", + "name": "inhand-left-blade", "directions": 4, "delays": [ [ @@ -78,7 +50,7 @@ ] }, { - "name": "on-inhand-right", + "name": "inhand-right-blade", "directions": 4, "delays": [ [ @@ -98,130 +70,6 @@ 0.1 ] ] - }, - { - "name": "on-rainbow-inhand-left", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "on-rainbow-inhand-right", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/on-inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/on-inhand-left.png deleted file mode 100644 index b0c4c243593ffd082daf543f95eb928fc7b7c284..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V9d{Sb`Ho)PG(@xm{>Z|*86aR zNUOj7l0{SbtUL-&1RP!1x=5if=%C)!g=-V8s(MZi^GNatTC#&nkB^o8;?ea7>ldtk zuu6fWOX1NI{twv`h5TvG1;zkpfk$L90|Va?5N4dJ%_q&kz@*{n;uum9_x6rsUbBHfYvPsH z2c~^4;Cjcb?rX~JE;5lr-MDVsZ}(MNt_J7-9aD|GANo!Wl?Ip=kQeH+xS80;+naoqjl$6b2=grW}CUv1eC8o8(- z`$xF1#zT=whUY(jzTNj|X8pPIb5o*hc76{n{cGa8X?+>n#839FFCQ5n2z#`gLGJs? z&$iDd#5&u)T=8ecuA2wm=LPT^S=sN}mu;-khUN)uTnEp_tn-XZ{(e+7^h&>4VfHYy zApLtmros6=YTs6VyVauh;d0jNwVb{Wzh7%n`*_~>Lk-{bHCIjkZRAwFxMx$8{p<%% z71mzX>V8BZ_Xa>C9 zSEcH;GUx06>)R{;wSVT;|9$hQ-RYp!rdsW4E+^BjEajAp2%LVYMdN1AE)zv&?N^tI zg++cV^&ej;@-uMT_SehQZp8h$ZEhK#;T!PG+FyPDoT{fQKYu>T^gbYY#b@Ts_tV3a mSA2f&U8ss0y$wDO#M9R8-je$=r4g8r7(8A5T-G@yGywpS%DS}x diff --git a/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/on-inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/e_sword.rsi/on-inhand-right.png deleted file mode 100644 index 6585cdc73dc014f1a4fec4ea87ba94d12c4f11a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 984 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U@XXVb`Ho)PG(@xm{>Z|*86aP zNZb874_9s35`of=fTIgr7b)}w9n`zJaBad>)t$akik^pkyF|hd9$olAVb>4SAN(bv zF`_Jvf-ZCZFxKe?J=*EJ(DjzE-?_up=c{*EGXBY&D_Lg1D6#CY@yaDzX2nl-djCPu z!?LSz=FMwCWrpqRK7RI?E5cuBxVk$2_zV3NX3RBvk8D2ki0`9KVb$r4Ebj&RH%^LC zuv6?S+@v zu5mm;xmje=gar$ld|wm@EYG@h&g!=i?|q|FPZGau3t&}u7gYUp%wz3^kg2QOc6s&p zt-A61f9#W!R=IzS+%fqpU;dO=u<5X=vX$A%+K2I0NkczmscMldGG7w-5 z@W0il{WXB~ufx)lZyY6=7+WUnIc9VI$)p?izWzS+OyTI|6lI4721X_p4gm!yGxL6k9>Q|s!s6s#|j_rg;(OMRT5>-ZJf&ZUsSx-YVNYXb@sVtvo#-24tV8W zoXx8kbJ%>&ZeBLeL(S{U%j86k-Ey+nKX29T-2%V* z)-2Pvn6CJyZ1+w1zURv7i|f`)%$mPawdHM@wRPRj9~pL=>-q&&ukD~>Mx{(VJ#y*j!V;C_KJ_*vJK?{E%D+hZG&bLZiH z%OAbVv+Q!dnC`oCV}<66XIsO1YJQx3y#4Qii^1o5Yn1<&&yD?UAY1a}1Z#y`oomM8 zcRvmJKfk=HF8cS{yQ0Yb-*$w)70+g$CGJo%LF23SoL9B}6K$0(cmE45DmF23@2z$= z+WqhBy=NIYeNy?I|M!_2&J~7*F1pje0sp|5<;-gTGdHVQgg!3bQaSA;BS#`5BZni$ zex}9Zr8+IY%B1IUa(A4lW)Tx{diMWg{NZYrxUNe*Pp1F)C8yJ~Z=P?uu#@oYW<(?c etx4cyvfuZ5_ZE?a@0`Ho!rht@ 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 Q^cD`mop81e-D1n4T3@sEI z+)`v0qygK?sq7MIfv^P+xKYL@eZ~4-LAK9S~^w*c2Y82D-o84k2tzn-DHoxI`l<(Su zT7Ll@?SuLJ4Tp{AR_tB2y2@_LvqXybgsyD6RsZm5(bE)AfYgyWA2Rgz>9!3dvW(YGbJv-*qDKTdbO9$9S&1{>rwj0;ru+bvFR5sFzShT` zK_loGK(IZHvqu0NdMU9plIC6?o(>S*Y#9LPw|WiWJ{`dQ6&Gk(HE4?pBQuR-E)gk$ zhy$;8h-LU@Qpa6g^B1u-2L$R|==z6(5?yF%t8C3=X1vz&2`+|WsU@x91;8-!X}UIw zS!|tQc1lPl{S8KW-}~Wo`%%DK7;$3%d@t{PU~L8un0(Co{K|J7&>_GT8UrkbRO1x= z0Bso3TW3Uq6QrU9imC(;FigFLWTU*(kI1IV=KHGP;;CY42Gy3HF%ndzVh|p(Y&-}b zlRPaur+_R0Zwflie?ak;;&GtbKAotY&3RMMMy_ju@l_k7$Cdp`UEAfRAT^;+Z+?5J{c zn~S3RO9(y9C1(+}?}@~9lHiX0oOyS^3CmK8}>0W%$pIKJbazp8YUYH8zSX zQ)NRiFV)G4%4V7VZN4<6rsUf5&LprcCO6d#I4rlA^C(H;)U_<>kxX9+gdb^eUkvh!<@u0 zb?RXPy?N17_lsY<28cPkg@G8gQ;7LV3Cve0hhZp;cj;^!NU4Ibr>wzUn8Ltj{A2SE z|{vAWp>y*3_@3g0I%gNeOn7{s>PDYNzwLLVN z%+kNZfHJIHre3VMYFKfw6MCA$q=fIU9Ha^4l)((e)cG81@09W$%+K3IG1B^+H>rG+ zIHNi=G^V@Z?ZW_w^>RYbl(G>ywt>n%YS-XJpI&xRT_K~h>x&uNq;z3iAmCoK^JPUH$`!yvZlL?ayp4ZuLk@CCB3{%R3Fn^}~$fDy! z$oRXda~MUp%PW^#LGDaW4O+<6wt;5LBAU6S@_W$~7gXk1SN^vy{XfvYM)YYdmb@gC z{YX@Q8QF8Bwe?(0ZK*TD%v(L&_AYs3h8L5d95dS(teKJs#H7v+pl-B1CeQiA`EL(D zCsUyzYiug@M&wCtV&l1lI|IQRZ`tAE(vNAQ<9A5Qx_6RyTzt;kwi6%K3bObyht1d& zPFF&^i`wZ~H1u6{7h(B|^l#zJr<5w)LTZmLZ<+q+EXBJGKb*j+-+c|+MS$>E-rgi_ zwn{T(=^QpzWlo=?PQX^zm!EY~Hv3_W-YfTZ;q|2!9&eMkQe~M;d50%RGLAw82~v}R zD4dy5XYtx0VwI8w_MHr_?GkUu$c>0nS?mt4J2)Pvi^kn2#+A#d_pMTxk7-p(!#H&c zP-A;(p)PJ#T!l55m9v(??#x;ZOy9ldH*Dd5gMZ1>?D=p`Cxz|<>9pK- zblToC1RwJ5rZvjI?wT7iyT5cpnkeIOpKb5t;u}|_JBTY#pUMsMSO(`Ignl8q0ipHT z4~TEp$5Av?^GAh&px&(KURI3>Z2EK|$5IXR%NB3*sce;n&hz^Bv@!BQDR_rM)ZUah z+G^%wHX-UEhiOL&0p(2zE^i9%1fjm_ODe zM?|;;GK<%)d!g(9*nNM7xxx+cVdEi_*UnuE2%~Hq%h=KEHxk3A67OZS9$BbdoGv%a zfY21U#cS;=n(lnF5}O zi*L17DP1f2I{<$YjpnZ)qrM?08s;rx&rz}Z&Nd*y3x zgF-Fq_2{k1Wy!zoxm3BV5kemk1ulG35R_z$?v}U!U82^lte4j%8GB%3DbwLTkIXZD z0|SiK`Gp0OXD1~YcGw*EkPAW?JQmD9Rbg^(1h;9xjXKV*yd+-?XnF#x0>gfVaWdJHQrE;=X={a?k1F6W;(^b;G~}gGd!weLUM>KV6Dwd ze!7-TMbiNW9p*F~;`&k$_~O2J?y`IhCRkO<^i(@Zma{6L5k%qdv_0zW(p+crBEhqB tNmQq3-n;_J8FjS;HT^Vn{u&!I5pcQBJfTn9fQ-nfsPI@?-LB-^{{T}kmU93A