From d45835e863c421ca17219280b58d3934c561bb45 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Wed, 3 Feb 2021 22:07:13 +0000 Subject: [PATCH] Janitor trashbag upgrade + FANCY ANIMATIONS (#3058) * Janitor trashbag upgrade + FANCY ANIMATIONS * Review, Bug fixes and Sounds - Fixed hand-pickup animation playing if the entity originated from inside a container (e.g. bag on the ground) or from inside ourselves (e.g. something in our own inventory) * Fix/Change. Just log if AnimateEntityPickup is called with an entity that has no SpriteComponent. * More explicit log message. Error log. * Merge. Fix. --- .../Animations/ReusableAnimations.cs | 56 ++++++++ .../Components/Items/HandsComponent.cs | 28 +++- .../Storage/ClientStorageComponent.cs | 29 +++- .../Components/GUI/HandsComponent.cs | 9 +- .../Items/Storage/ServerStorageComponent.cs | 124 +++++++++++++++++- .../GameObjects/EntitySystems/HandsSystem.cs | 4 +- .../Components/Items/SharedHandsComponent.cs | 19 ++- .../Storage/SharedStorageComponent.cs | 20 ++- Resources/Audio/Effects/trashbag1.ogg | Bin 0 -> 11999 bytes Resources/Audio/Effects/trashbag2.ogg | Bin 0 -> 16979 bytes Resources/Audio/Effects/trashbag3.ogg | Bin 0 -> 16399 bytes .../Effects/Markers/clientsideclone.yml | 8 ++ .../Entities/Objects/Consumable/trash.yml | 13 +- .../Entities/Objects/Specific/janitor.yml | 15 +++ .../SoundCollections/storage_rustle.yml | 7 + .../Janitorial}/trashbag.rsi/icon-0.png | Bin .../Janitorial}/trashbag.rsi/icon-1.png | Bin .../Janitorial}/trashbag.rsi/icon-2.png | Bin .../Janitorial}/trashbag.rsi/icon-3.png | Bin .../Janitorial}/trashbag.rsi/icon.png | Bin .../Janitorial}/trashbag.rsi/meta.json | 0 21 files changed, 309 insertions(+), 23 deletions(-) create mode 100644 Content.Client/Animations/ReusableAnimations.cs create mode 100644 Resources/Audio/Effects/trashbag1.ogg create mode 100644 Resources/Audio/Effects/trashbag2.ogg create mode 100644 Resources/Audio/Effects/trashbag3.ogg create mode 100644 Resources/Prototypes/Entities/Effects/Markers/clientsideclone.yml rename Resources/Textures/Objects/{Consumable/Trash => Specific/Janitorial}/trashbag.rsi/icon-0.png (100%) rename Resources/Textures/Objects/{Consumable/Trash => Specific/Janitorial}/trashbag.rsi/icon-1.png (100%) rename Resources/Textures/Objects/{Consumable/Trash => Specific/Janitorial}/trashbag.rsi/icon-2.png (100%) rename Resources/Textures/Objects/{Consumable/Trash => Specific/Janitorial}/trashbag.rsi/icon-3.png (100%) rename Resources/Textures/Objects/{Consumable/Trash => Specific/Janitorial}/trashbag.rsi/icon.png (100%) rename Resources/Textures/Objects/{Consumable/Trash => Specific/Janitorial}/trashbag.rsi/meta.json (100%) diff --git a/Content.Client/Animations/ReusableAnimations.cs b/Content.Client/Animations/ReusableAnimations.cs new file mode 100644 index 0000000000..5b93efe5ae --- /dev/null +++ b/Content.Client/Animations/ReusableAnimations.cs @@ -0,0 +1,56 @@ +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.GameObjects.Components.Animations; +using Robust.Shared.Animations; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.GameObjects.Components; +using Robust.Shared.Log; +using Robust.Shared.Map; +using Robust.Shared.Maths; +using System; + +namespace Content.Client.Animations +{ + public static class ReusableAnimations + { + + public static void AnimateEntityPickup(IEntity entity, EntityCoordinates initialPosition, Vector2 finalPosition) + { + var animatableClone = entity.EntityManager.SpawnEntity("clientsideclone", initialPosition); + animatableClone.Name = entity.Name; + + if(!entity.TryGetComponent(out SpriteComponent sprite0)) + { + Logger.Error($"Entity ({0}) couldn't be animated for pickup since it doesn't have a {1}!", entity.Name, nameof(SpriteComponent)); + return; + } + var sprite = animatableClone.GetComponent(); + sprite.CopyFrom(sprite0); + + var animations = animatableClone.GetComponent(); + animations.AnimationCompleted += (s) => { + animatableClone.Delete(); + }; + + animations.Play(new Animation + { + Length = TimeSpan.FromMilliseconds(125), + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(ITransformComponent), + Property = nameof(ITransformComponent.WorldPosition), + InterpolationMode = AnimationInterpolationMode.Linear, + KeyFrames = + { + new AnimationTrackComponentProperty.KeyFrame(initialPosition.Position, 0), + new AnimationTrackComponentProperty.KeyFrame(finalPosition, 0.125f) + } + } + } + }, "fancy_pickup_anim"); + } + + } +} diff --git a/Content.Client/GameObjects/Components/Items/HandsComponent.cs b/Content.Client/GameObjects/Components/Items/HandsComponent.cs index 21f112d031..a59f0333f9 100644 --- a/Content.Client/GameObjects/Components/Items/HandsComponent.cs +++ b/Content.Client/GameObjects/Components/Items/HandsComponent.cs @@ -1,14 +1,23 @@ -#nullable enable +#nullable enable +using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; +using Content.Client.Animations; using Content.Client.UserInterface; using Content.Shared.GameObjects.Components.Items; +using Robust.Client.Animations; using Robust.Client.GameObjects; +using Robust.Client.GameObjects.Components.Animations; using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Animations; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; +using Robust.Shared.Log; +using Robust.Shared.Players; using Robust.Shared.ViewVariables; namespace Content.Client.GameObjects.Components.Items @@ -244,6 +253,23 @@ namespace Content.Client.GameObjects.Components.Items } } + public override void HandleNetworkMessage(ComponentMessage message, INetChannel netChannel, ICommonSession? session = null) + { + base.HandleNetworkMessage(message, netChannel, session); + + switch (message) + { + case AnimatePickupEntityMessage msg: + { + if (Owner.EntityManager.TryGetEntity(msg.EntityId, out var entity)) + { + ReusableAnimations.AnimateEntityPickup(entity, msg.EntityPosition, Owner.Transform.WorldPosition); + } + break; + } + } + } + public void SendChangeHand(string index) { SendNetworkMessage(new ClientChangedHandMsg(index)); diff --git a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs index 1d6043ff18..c97b1e2f91 100644 --- a/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs +++ b/Content.Client/GameObjects/Components/Storage/ClientStorageComponent.cs @@ -1,17 +1,23 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; +using Content.Client.Animations; using Content.Client.GameObjects.Components.Items; using Content.Shared.GameObjects.Components.Storage; using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.GameObjects.Components.Animations; using Robust.Client.Graphics.Drawing; using Robust.Client.Interfaces.GameObjects.Components; using Robust.Client.Player; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.Animations; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.GameObjects.Components; using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; using Robust.Shared.Maths; @@ -77,6 +83,9 @@ namespace Content.Client.GameObjects.Components.Storage case CloseStorageUIMessage _: CloseUI(); break; + case AnimateInsertingEntitiesMessage msg: + HandleAnimatingInsertingEntities(msg); + break; } } @@ -92,6 +101,24 @@ namespace Content.Client.GameObjects.Components.Storage Window.BuildEntityList(); } + /// + /// Animate the newly stored entities in flying towards this storage's position + /// + /// + private void HandleAnimatingInsertingEntities(AnimateInsertingEntitiesMessage msg) + { + for (var i = 0; msg.StoredEntities.Count > i; i++) + { + var entityId = msg.StoredEntities[i]; + var initialPosition = msg.EntityPositions[i]; + + if (Owner.EntityManager.TryGetEntity(entityId, out var entity)) + { + ReusableAnimations.AnimateEntityPickup(entity, initialPosition, Owner.Transform.WorldPosition); + } + } + } + /// /// Opens the storage UI if closed. Closes it if opened. /// diff --git a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs index 0182636f77..0139761d21 100644 --- a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs +++ b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs @@ -1,4 +1,4 @@ -#nullable enable +#nullable enable using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; @@ -176,9 +176,16 @@ namespace Content.Server.GameObjects.Components.GUI Dirty(); + var position = item.Owner.Transform.Coordinates; + var contained = item.Owner.IsInContainer(); var success = hand.Container.Insert(item.Owner); if (success) { + //If the entity isn't in a container, and it isn't located exactly at our position (i.e. in our own storage), then we can safely play the animation + if (position != Owner.Transform.Coordinates && !contained) + { + SendNetworkMessage(new AnimatePickupEntityMessage(item.Owner.Uid, position)); + } item.Owner.Transform.LocalPosition = Vector2.Zero; OnItemChanged?.Invoke(); } diff --git a/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs index fda487377c..b50a23bb4d 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs @@ -2,8 +2,10 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; +using Content.Server.GameObjects.EntitySystems.DoAfter; using Content.Server.Interfaces.GameObjects.Components.Items; using Content.Shared.Audio; using Content.Shared.GameObjects.Components.Storage; @@ -24,6 +26,7 @@ using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Network; using Robust.Shared.Log; +using Robust.Shared.Map; using Robust.Shared.Players; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; @@ -36,7 +39,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage [RegisterComponent] [ComponentReference(typeof(IActivate))] [ComponentReference(typeof(IStorageComponent))] - public class ServerStorageComponent : SharedStorageComponent, IInteractUsing, IUse, IActivate, IStorageComponent, IDestroyAct, IExAct + public class ServerStorageComponent : SharedStorageComponent, IInteractUsing, IUse, IActivate, IStorageComponent, IDestroyAct, IExAct, IAfterInteract { private const string LoggerName = "Storage"; @@ -44,6 +47,8 @@ namespace Content.Server.GameObjects.Components.Items.Storage private readonly Dictionary _sizeCache = new(); private bool _occludesLight; + private bool _quickInsert; //Can insert storables by "attacking" them with the storage entity + private bool _areaInsert; //"Attacking" with the storage entity causes it to insert all nearby storables after a delay private bool _storageInitialCalculated; private int _storageUsed; private int _storageCapacityMax; @@ -184,7 +189,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage /// /// The player to insert an entity from /// true if inserted, false otherwise - public bool PlayerInsertEntity(IEntity player) + public bool PlayerInsertHeldEntity(IEntity player) { EnsureInitialCalculated(); @@ -212,6 +217,24 @@ namespace Content.Server.GameObjects.Components.Items.Storage return true; } + /// + /// Inserts an Entity () in the world into storage, informing if it fails. + /// is *NOT* held, see . + /// + /// The player to insert an entity with + /// true if inserted, false otherwise + public bool PlayerInsertEntityInWorld(IEntity player, IEntity toInsert) + { + EnsureInitialCalculated(); + + if (!Insert(toInsert)) + { + Owner.PopupMessage(player, "Can't insert."); + return false; + } + return true; + } + /// /// Opens the storage UI for an entity /// @@ -343,6 +366,8 @@ namespace Content.Server.GameObjects.Components.Items.Storage serializer.DataField(ref _storageCapacityMax, "capacity", 10000); serializer.DataField(ref _occludesLight, "occludesLight", true); + serializer.DataField(ref _quickInsert, "quickInsert", false); + serializer.DataField(ref _areaInsert, "areaInsert", false); serializer.DataField(this, x => x.StorageSoundCollection, "storageSoundCollection", string.Empty); //serializer.DataField(ref StorageUsed, "used", 0); } @@ -418,7 +443,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage break; } - PlayerInsertEntity(player); + PlayerInsertHeldEntity(player); break; } @@ -449,7 +474,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage return false; } - return PlayerInsertEntity(eventArgs.User); + return PlayerInsertHeldEntity(eventArgs.User); } /// @@ -469,6 +494,97 @@ namespace Content.Server.GameObjects.Components.Items.Storage ((IUse) this).UseEntity(new UseEntityEventArgs { User = eventArgs.User }); } + /// + /// Allows a user to pick up entities by clicking them, or pick up all entities in a certain radius + /// arround a click. + /// + /// + /// + async Task IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs) + { + if (!eventArgs.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true)) return false; + + // Pick up all entities in a radius around the clicked location. + // The last half of the if is because carpets exist and this is terrible + if(_areaInsert && (eventArgs.Target == null || !eventArgs.Target.HasComponent())) + { + var validStorables = new List(); + foreach (var entity in Owner.EntityManager.GetEntitiesInRange(eventArgs.ClickLocation, 1)) + { + if (!entity.Transform.IsMapTransform + || entity == eventArgs.User + || !entity.HasComponent()) + continue; + validStorables.Add(entity); + } + + //If there's only one then let's be generous + if (validStorables.Count > 1) + { + var doAfterSystem = EntitySystem.Get(); + var doAfterArgs = new DoAfterEventArgs(eventArgs.User, 0.2f * validStorables.Count, CancellationToken.None, Owner) + { + BreakOnStun = true, + BreakOnDamage = true, + BreakOnUserMove = true, + NeedHand = true, + }; + var result = await doAfterSystem.DoAfter(doAfterArgs); + if (result != DoAfterStatus.Finished) return true; + } + + var successfullyInserted = new List(); + var successfullyInsertedPositions = new List(); + foreach (var entity in validStorables) + { + // Check again, situation may have changed for some entities, but we'll still pick up any that are valid + if (!entity.Transform.IsMapTransform + || entity == eventArgs.User + || !entity.HasComponent()) + continue; + var coords = entity.Transform.Coordinates; + if (PlayerInsertEntityInWorld(eventArgs.User, entity)) + { + successfullyInserted.Add(entity.Uid); + successfullyInsertedPositions.Add(coords); + } + } + + // If we picked up atleast one thing, play a sound and do a cool animation! + if (successfullyInserted.Count>0) + { + PlaySoundCollection(StorageSoundCollection); + SendNetworkMessage( + new AnimateInsertingEntitiesMessage( + successfullyInserted, + successfullyInsertedPositions + ) + ); + } + return true; + } + // Pick up the clicked entity + else if(_quickInsert) + { + if (eventArgs.Target == null + || !eventArgs.Target.Transform.IsMapTransform + || eventArgs.Target == eventArgs.User + || !eventArgs.Target.HasComponent()) + return false; + var position = eventArgs.Target.Transform.Coordinates; + if(PlayerInsertEntityInWorld(eventArgs.User, eventArgs.Target)) + { + SendNetworkMessage(new AnimateInsertingEntitiesMessage( + new List() { eventArgs.Target.Uid }, + new List() { position } + )); + return true; + } + return true; + } + return false; + } + void IDestroyAct.OnDestroy(DestructionEventArgs eventArgs) { var storedEntities = StoredEntities?.ToList(); diff --git a/Content.Server/GameObjects/EntitySystems/HandsSystem.cs b/Content.Server/GameObjects/EntitySystems/HandsSystem.cs index 471f9d369c..0450d0e459 100644 --- a/Content.Server/GameObjects/EntitySystems/HandsSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/HandsSystem.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; @@ -216,7 +216,7 @@ namespace Content.Server.GameObjects.EntitySystems if (heldItem != null) { - storageComponent.PlayerInsertEntity(plyEnt); + storageComponent.PlayerInsertHeldEntity(plyEnt); } else { diff --git a/Content.Shared/GameObjects/Components/Items/SharedHandsComponent.cs b/Content.Shared/GameObjects/Components/Items/SharedHandsComponent.cs index 83e24cdadb..e3fba91eb5 100644 --- a/Content.Shared/GameObjects/Components/Items/SharedHandsComponent.cs +++ b/Content.Shared/GameObjects/Components/Items/SharedHandsComponent.cs @@ -1,7 +1,8 @@ -#nullable enable +#nullable enable using System; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Map; using Robust.Shared.Serialization; namespace Content.Shared.GameObjects.Components.Items @@ -127,4 +128,20 @@ namespace Content.Shared.GameObjects.Components.Items Middle, Right } + + /// + /// Component message for displaying an animation of an entity flying towards the owner of a HandsComponent + /// + [Serializable, NetSerializable] + public class AnimatePickupEntityMessage : ComponentMessage + { + public readonly EntityUid EntityId; + public readonly EntityCoordinates EntityPosition; + public AnimatePickupEntityMessage(EntityUid entity, EntityCoordinates entityPosition) + { + Directed = true; + EntityId = entity; + EntityPosition = entityPosition; + } + } } diff --git a/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs b/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs index 2bdbc43363..6cc256d41c 100644 --- a/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs +++ b/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs @@ -1,12 +1,14 @@ -#nullable enable +#nullable enable using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.GameObjects.EntitySystems.ActionBlocker; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Map; using Robust.Shared.Serialization; namespace Content.Shared.GameObjects.Components.Storage @@ -100,6 +102,22 @@ namespace Content.Shared.GameObjects.Components.Storage } } + /// + /// Component message for displaying an animation of entities flying into a storage entity + /// + [Serializable, NetSerializable] + public class AnimateInsertingEntitiesMessage : ComponentMessage + { + public readonly List StoredEntities; + public readonly List EntityPositions; + public AnimateInsertingEntitiesMessage(List storedEntities, List entityPositions) + { + Directed = true; + StoredEntities = storedEntities; + EntityPositions = entityPositions; + } + } + /// /// Component message for removing a contained entity from the storage entity /// diff --git a/Resources/Audio/Effects/trashbag1.ogg b/Resources/Audio/Effects/trashbag1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2324af18c6a7329c9b70717ed30c11c603d3a38a GIT binary patch literal 11999 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/trashbag3.ogg b/Resources/Audio/Effects/trashbag3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..08719273b51030778a32411e1fae71afe923d933 GIT binary patch literal 16399 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 literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Entities/Effects/Markers/clientsideclone.yml b/Resources/Prototypes/Entities/Effects/Markers/clientsideclone.yml new file mode 100644 index 0000000000..a3c662c28a --- /dev/null +++ b/Resources/Prototypes/Entities/Effects/Markers/clientsideclone.yml @@ -0,0 +1,8 @@ +- type: entity + name: clientsideclone + id: clientsideclone + abstract: true + components: + - type: Sprite + - type: Physics + - type: AnimationPlayer diff --git a/Resources/Prototypes/Entities/Objects/Consumable/trash.yml b/Resources/Prototypes/Entities/Objects/Consumable/trash.yml index 71490e6b8b..deabc3b5df 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/trash.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/trash.yml @@ -152,18 +152,7 @@ components: - type: Sprite sprite: Objects/Consumable/Trash/tastybread.rsi - - -- type: entity - name: trash bag - parent: TrashBase - id: TrashBag - components: - - type: Sprite - sprite: Objects/Consumable/Trash/trashbag.rsi - - - type: Storage - capacity: 125 + - type: entity name: tray (trash) diff --git a/Resources/Prototypes/Entities/Objects/Specific/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/janitor.yml index a21de46789..2aea0da9b9 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/janitor.yml @@ -234,3 +234,18 @@ reagents: - ReagentId: chem.SpaceCleaner Quantity: 100 + + +- type: entity + name: trash bag + id: TrashBag + parent: BaseItem + components: + - type: Sprite + sprite: Objects/Specific/Janitorial/trashbag.rsi + state: icon + - type: Storage + capacity: 125 + quickInsert: true + areaInsert: true + storageSoundCollection: trashBagRustle diff --git a/Resources/Prototypes/SoundCollections/storage_rustle.yml b/Resources/Prototypes/SoundCollections/storage_rustle.yml index d7f6c09586..3fbfc80535 100644 --- a/Resources/Prototypes/SoundCollections/storage_rustle.yml +++ b/Resources/Prototypes/SoundCollections/storage_rustle.yml @@ -6,3 +6,10 @@ - /Audio/Effects/rustle3.ogg - /Audio/Effects/rustle4.ogg - /Audio/Effects/rustle5.ogg + +- type: soundCollection + id: trashBagRustle + files: + - /Audio/Effects/trashbag1.ogg + - /Audio/Effects/trashbag2.ogg + - /Audio/Effects/trashbag3.ogg \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon-0.png b/Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon-0.png similarity index 100% rename from Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon-0.png rename to Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon-0.png diff --git a/Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon-1.png b/Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon-1.png similarity index 100% rename from Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon-1.png rename to Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon-1.png diff --git a/Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon-2.png b/Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon-2.png similarity index 100% rename from Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon-2.png rename to Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon-2.png diff --git a/Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon-3.png b/Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon-3.png similarity index 100% rename from Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon-3.png rename to Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon-3.png diff --git a/Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon.png b/Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon.png similarity index 100% rename from Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/icon.png rename to Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/icon.png diff --git a/Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/meta.json b/Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/meta.json similarity index 100% rename from Resources/Textures/Objects/Consumable/Trash/trashbag.rsi/meta.json rename to Resources/Textures/Objects/Specific/Janitorial/trashbag.rsi/meta.json