]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add face bandanas (#24597)
authorthemias <89101928+themias@users.noreply.github.com>
Sun, 4 Feb 2024 00:52:44 +0000 (19:52 -0500)
committerGitHub <noreply@github.com>
Sun, 4 Feb 2024 00:52:44 +0000 (11:52 +1100)
* add face bandanas

* oops

* make face bandanas butcherable, also one bite

* oops

* Add mouth IdentityBlocker to bandanas

* refactor to use foldablecomponent

* remove some leftover bits

* remove HamsterWearable until face sprite updated

* oops

* review changes

* remove a few unneeded bits

31 files changed:
Content.Shared/Clothing/ClothingEvents.cs
Content.Shared/Clothing/Components/FoldableClothingComponent.cs [new file with mode: 0644]
Content.Shared/Clothing/Components/MaskComponent.cs
Content.Shared/Clothing/EntitySystems/ClothingSystem.cs
Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs [new file with mode: 0644]
Content.Shared/Clothing/EntitySystems/MaskSystem.cs
Content.Shared/Foldable/FoldableComponent.cs
Content.Shared/Foldable/FoldableSystem.cs
Resources/Prototypes/Entities/Clothing/Head/bandanas.yml
Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml [new file with mode: 0644]
Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml
Resources/Textures/Clothing/Head/Bandanas/black.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/black.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/black.rsi/meta.json
Resources/Textures/Clothing/Head/Bandanas/blue.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/blue.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/blue.rsi/meta.json
Resources/Textures/Clothing/Head/Bandanas/botany.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/botany.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/botany.rsi/meta.json
Resources/Textures/Clothing/Head/Bandanas/brown.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/brown.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/brown.rsi/meta.json
Resources/Textures/Clothing/Head/Bandanas/gold.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/gold.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/gold.rsi/meta.json
Resources/Textures/Clothing/Head/Bandanas/green.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/green.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/green.rsi/meta.json
Resources/Textures/Clothing/Head/Bandanas/grey.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/grey.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/grey.rsi/meta.json
Resources/Textures/Clothing/Head/Bandanas/merc.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/merc.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/merc.rsi/meta.json
Resources/Textures/Clothing/Head/Bandanas/red.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/red.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/red.rsi/meta.json
Resources/Textures/Clothing/Head/Bandanas/skull.rsi/equipped-MASK.png [moved from Resources/Textures/Clothing/Head/Bandanas/skull.rsi/mask-equipped-HELMET.png with 100% similarity]
Resources/Textures/Clothing/Head/Bandanas/skull.rsi/meta.json

index bb31c568e021952628e54f239eb26495a12e187e..1dcce2402aee5aac25b34a83ef6dc3a283b57341 100644 (file)
@@ -64,7 +64,7 @@ public sealed partial class ToggleMaskEvent : InstantActionEvent { }
 ///     Event raised on the mask entity when it is toggled.
 /// </summary>
 [ByRefEvent]
-public readonly record struct ItemMaskToggledEvent(EntityUid Wearer, bool IsToggled, bool IsEquip);
+public readonly record struct ItemMaskToggledEvent(EntityUid Wearer, string? equippedPrefix, bool IsToggled, bool IsEquip);
 
 /// <summary>
 ///     Event raised on the entity wearing the mask when it is toggled.
diff --git a/Content.Shared/Clothing/Components/FoldableClothingComponent.cs b/Content.Shared/Clothing/Components/FoldableClothingComponent.cs
new file mode 100644 (file)
index 0000000..61237b2
--- /dev/null
@@ -0,0 +1,20 @@
+using Content.Shared.Inventory;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Clothing.Components;
+
+[RegisterComponent, NetworkedComponent]
+public sealed partial class FoldableClothingComponent : Component
+{
+    /// <summary>
+    /// Which slots does this fit into when folded?
+    /// </summary>
+    [DataField]
+    public SlotFlags? FoldedSlots;
+
+    /// <summary>
+    /// Which slots does this fit into when unfolded?
+    /// </summary>
+    [DataField]
+    public SlotFlags? UnfoldedSlots;
+}
index e645524da733585180fade628a89725bb4093ada..5430417a8cdf2e378da209e3cc172416e52dc103 100644 (file)
@@ -1,4 +1,4 @@
-using Content.Shared.Clothing.EntitySystems;
+using Content.Shared.Clothing.EntitySystems;
 using Robust.Shared.GameStates;
 using Robust.Shared.Prototypes;
 
@@ -19,4 +19,7 @@ public sealed partial class MaskComponent : Component
 
     [DataField, AutoNetworkedField]
     public bool IsToggled;
+
+    [DataField, AutoNetworkedField]
+    public string EquippedPrefix = "toggled";
 }
index 92e31cfd8ea949d189e295993b5e98881ac86a4f..154171fc054633c8ef17984bc7fdf43ff7fb19c1 100644 (file)
@@ -113,7 +113,8 @@ public abstract class ClothingSystem : EntitySystem
     private void OnMaskToggled(Entity<ClothingComponent> ent, ref ItemMaskToggledEvent args)
     {
         //TODO: sprites for 'pulled down' state. defaults to invisible due to no sprite with this prefix
-        SetEquippedPrefix(ent, args.IsToggled ? "toggled" : null, ent);
+        if(args.equippedPrefix != null)
+            SetEquippedPrefix(ent, args.IsToggled ? args.equippedPrefix : null, ent);
     }
 
     private void OnEquipDoAfter(Entity<ClothingComponent> ent, ref ClothingEquipDoAfterEvent args)
diff --git a/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs
new file mode 100644 (file)
index 0000000..d0611c5
--- /dev/null
@@ -0,0 +1,42 @@
+using Content.Shared.Clothing.Components;
+using Content.Shared.Foldable;
+using Content.Shared.Inventory;
+
+namespace Content.Shared.Clothing.EntitySystems;
+
+public sealed class FoldableClothingSystem : EntitySystem
+{
+    [Dependency] private readonly ClothingSystem _clothingSystem = default!;
+    [Dependency] private readonly InventorySystem _inventorySystem = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+
+        SubscribeLocalEvent<FoldableClothingComponent, FoldAttemptEvent>(OnFoldAttempt);
+        SubscribeLocalEvent<FoldableClothingComponent, FoldedEvent>(OnFolded);
+    }
+
+    private void OnFoldAttempt(Entity<FoldableClothingComponent> ent, ref FoldAttemptEvent args)
+    {
+        if (args.Cancelled)
+            return;
+
+        // allow folding while equipped if allowed slots are the same:
+        // e.g. flip a hat backwards while on your head
+        if (_inventorySystem.TryGetContainingSlot(ent.Owner, out var slot) &&
+            !ent.Comp.FoldedSlots.Equals(ent.Comp.UnfoldedSlots))
+            args.Cancelled = true;
+    }
+
+    private void OnFolded(Entity<FoldableClothingComponent> ent, ref FoldedEvent args)
+    {
+        if (TryComp<ClothingComponent>(ent.Owner, out var clothingComp))
+        {
+            if (args.IsFolded && ent.Comp.FoldedSlots.HasValue)
+                _clothingSystem.SetSlots(ent.Owner, ent.Comp.FoldedSlots.Value, clothingComp);
+            else if (!args.IsFolded && ent.Comp.UnfoldedSlots.HasValue)
+                _clothingSystem.SetSlots(ent.Owner, ent.Comp.UnfoldedSlots.Value, clothingComp);
+        }
+    }
+}
index 2bbcad4bc4de0b1c0ffa5dc3ab4f82a98c56e006..aab2a172dc12bcb81948a7b3d2d8a2e5d67b1da6 100644 (file)
@@ -1,7 +1,9 @@
 using Content.Shared.Actions;
 using Content.Shared.Clothing.Components;
+using Content.Shared.Foldable;
 using Content.Shared.Inventory;
 using Content.Shared.Inventory.Events;
+using Content.Shared.Item;
 using Content.Shared.Popups;
 using Robust.Shared.Timing;
 
@@ -21,11 +23,12 @@ public sealed class MaskSystem : EntitySystem
         SubscribeLocalEvent<MaskComponent, ToggleMaskEvent>(OnToggleMask);
         SubscribeLocalEvent<MaskComponent, GetItemActionsEvent>(OnGetActions);
         SubscribeLocalEvent<MaskComponent, GotUnequippedEvent>(OnGotUnequipped);
+        SubscribeLocalEvent<MaskComponent, FoldedEvent>(OnFolded);
     }
 
     private void OnGetActions(EntityUid uid, MaskComponent component, GetItemActionsEvent args)
     {
-        if (!args.InHands)
+        if (_inventorySystem.InSlotWithFlags(uid, SlotFlags.MASK))
             args.AddAction(ref component.ToggleActionEntity, component.ToggleAction);
     }
 
@@ -46,7 +49,7 @@ public sealed class MaskSystem : EntitySystem
         else
             _popupSystem.PopupEntity(Loc.GetString("action-mask-pull-up-popup-message", ("mask", uid)), args.Performer, args.Performer);
 
-        ToggleMaskComponents(uid, mask, args.Performer);
+        ToggleMaskComponents(uid, mask, args.Performer, mask.EquippedPrefix);
     }
 
     // set to untoggled when unequipped, so it isn't left in a 'pulled down' state
@@ -59,15 +62,22 @@ public sealed class MaskSystem : EntitySystem
         Dirty(uid, mask);
         _actionSystem.SetToggled(mask.ToggleActionEntity, mask.IsToggled);
 
-        ToggleMaskComponents(uid, mask, args.Equipee, true);
+        ToggleMaskComponents(uid, mask, args.Equipee, mask.EquippedPrefix, true);
     }
 
-    private void ToggleMaskComponents(EntityUid uid, MaskComponent mask, EntityUid wearer, bool isEquip = false)
+    private void ToggleMaskComponents(EntityUid uid, MaskComponent mask, EntityUid wearer, string? equippedPrefix = null, bool isEquip = false)
     {
-        var maskEv = new ItemMaskToggledEvent(wearer, mask.IsToggled, isEquip);
+        var maskEv = new ItemMaskToggledEvent(wearer, equippedPrefix, mask.IsToggled, isEquip);
         RaiseLocalEvent(uid, ref maskEv);
 
         var wearerEv = new WearerMaskToggledEvent(mask.IsToggled);
         RaiseLocalEvent(wearer, ref wearerEv);
     }
+
+    private void OnFolded(Entity<MaskComponent> ent, ref FoldedEvent args)
+    {
+        ent.Comp.IsToggled = args.IsFolded;
+
+        ToggleMaskComponents(ent.Owner, ent.Comp, ent.Owner);
+    }
 }
index 1943327c0d793d7e04cb05052f91f69a4e23e0e3..c22095f3f296e765321d03a536c0ed32b0ce56f3 100644 (file)
@@ -1,5 +1,4 @@
 using Robust.Shared.GameStates;
-using Robust.Shared.Serialization;
 
 namespace Content.Shared.Foldable;
 
@@ -9,23 +8,13 @@ namespace Content.Shared.Foldable;
 /// <remarks>
 /// Will prevent any insertions into containers while this item is unfolded.
 /// </remarks>
-[RegisterComponent]
-[NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
 [Access(typeof(FoldableSystem))]
 public sealed partial class FoldableComponent : Component
 {
-    [DataField("folded")]
+    [DataField("folded"), AutoNetworkedField]
     public bool IsFolded = false;
-}
-
-// ahhh, the ol' "state thats just a copy of the component".
-[Serializable, NetSerializable]
-public sealed class FoldableComponentState : ComponentState
-{
-    public readonly bool IsFolded;
 
-    public FoldableComponentState(bool isFolded)
-    {
-        IsFolded = isFolded;
-    }
+    [DataField]
+    public bool CanFoldInsideContainer = false;
 }
index 6f2e9f3ee5e9ceb78a7a1cd4b66ce41004fb9f6e..374aba44c50963662572e225f8d224c158852185 100644 (file)
@@ -3,7 +3,6 @@ using Content.Shared.Buckle.Components;
 using Content.Shared.Storage.Components;
 using Content.Shared.Verbs;
 using Robust.Shared.Containers;
-using Robust.Shared.GameStates;
 using Robust.Shared.Serialization;
 using Robust.Shared.Utility;
 
@@ -20,8 +19,7 @@ public sealed class FoldableSystem : EntitySystem
         base.Initialize();
 
         SubscribeLocalEvent<FoldableComponent, GetVerbsEvent<AlternativeVerb>>(AddFoldVerb);
-        SubscribeLocalEvent<FoldableComponent, ComponentGetState>(OnGetState);
-        SubscribeLocalEvent<FoldableComponent, ComponentHandleState>(OnHandleState);
+        SubscribeLocalEvent<FoldableComponent, AfterAutoHandleStateEvent>(OnHandleState);
 
         SubscribeLocalEvent<FoldableComponent, ComponentInit>(OnFoldableInit);
         SubscribeLocalEvent<FoldableComponent, ContainerGettingInsertedAttemptEvent>(OnInsertEvent);
@@ -31,18 +29,9 @@ public sealed class FoldableSystem : EntitySystem
         SubscribeLocalEvent<FoldableComponent, BuckleAttemptEvent>(OnBuckleAttempt);
     }
 
-    private void OnGetState(EntityUid uid, FoldableComponent component, ref ComponentGetState args)
+    private void OnHandleState(EntityUid uid, FoldableComponent component, ref AfterAutoHandleStateEvent args)
     {
-        args.State = new FoldableComponentState(component.IsFolded);
-    }
-
-    private void OnHandleState(EntityUid uid, FoldableComponent component, ref ComponentHandleState args)
-    {
-        if (args.Current is not FoldableComponentState state)
-            return;
-
-        if (state.IsFolded != component.IsFolded)
-            SetFolded(uid, component, state.IsFolded);
+        SetFolded(uid, component, component.IsFolded);
     }
 
     private void OnFoldableInit(EntityUid uid, FoldableComponent component, ComponentInit args)
@@ -90,11 +79,14 @@ public sealed class FoldableSystem : EntitySystem
         Dirty(uid, component);
         _appearance.SetData(uid, FoldedVisuals.State, folded);
         _buckle.StrapSetEnabled(uid, !component.IsFolded);
+
+        var ev = new FoldedEvent(folded);
+        RaiseLocalEvent(uid, ref ev);
     }
 
     private void OnInsertEvent(EntityUid uid, FoldableComponent component, ContainerGettingInsertedAttemptEvent args)
     {
-        if (!component.IsFolded)
+        if (!component.IsFolded && !component.CanFoldInsideContainer)
             args.Cancel();
     }
 
@@ -108,8 +100,8 @@ public sealed class FoldableSystem : EntitySystem
         if (!Resolve(uid, ref fold))
             return false;
 
-        // Can't un-fold in any container (locker, hands, inventory, whatever).
-        if (_container.IsEntityInContainer(uid))
+        // Can't un-fold in any container unless enabled (locker, hands, inventory, whatever).
+        if (_container.IsEntityInContainer(uid) && !fold.CanFoldInsideContainer)
             return false;
 
         var ev = new FoldAttemptEvent();
@@ -167,3 +159,10 @@ public sealed class FoldableSystem : EntitySystem
 /// <param name="Cancelled"></param>
 [ByRefEvent]
 public record struct FoldAttemptEvent(bool Cancelled = false);
+
+/// <summary>
+/// Event raised on an entity after it has been folded.
+/// </summary>
+/// <param name="IsFolded"></param>
+[ByRefEvent]
+public readonly record struct FoldedEvent(bool IsFolded);
index 1d1d58786029695a052fa1bd4f9a63bebd9a6574..8ee6479ee6562d2da9a4465f1d84ff31a553724e 100644 (file)
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBaseButcherable, BaseFoldable]
+  id: ClothingHeadBandBase
+  abstract: true
+  components:
+  - type: Foldable
+    folded: true
+  - type: Mask
+    isToggled: true
+  - type: IngestionBlocker
+    enabled: false
+  - type: IdentityBlocker
+    enabled: false
+    coverage: MOUTH
+  - type: Sprite # needed for vendor inventory icons
+    layers:
+    - state: icon
+      map: ["foldedLayer"]
+      visible: true
+    - state: icon_mask
+      map: [ "unfoldedLayer" ]
+      visible: false
+
+- type: entity
+  parent: [ClothingHeadBandBase, ClothingMaskBandBlack]
   id: ClothingHeadBandBlack
   name: black bandana
-  description: A black bandana to make you look cool.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/black.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/black.rsi
 
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBandBase, ClothingMaskBandBlue]
   id: ClothingHeadBandBlue
   name: blue bandana
-  description: A blue bandana to make you look cool.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/blue.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/blue.rsi
 
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBandBase, ClothingMaskBandBotany]
   id: ClothingHeadBandBotany
   name: botany bandana
-  description: A botany bandana to make you look cool, made from natural fibers.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/botany.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/botany.rsi
-  - type: Tag
-    tags:
-    - ClothMade
-    - HamsterWearable
-    - WhitelistChameleon
 
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBandBase, ClothingMaskBandGold]
   id: ClothingHeadBandGold
   name: gold bandana
-  description: A gold bandana to make you look cool.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/gold.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/gold.rsi
 
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBandBase, ClothingMaskBandGreen]
   id: ClothingHeadBandGreen
   name: green bandana
-  description: A green bandana to make you look cool.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/green.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/green.rsi
 
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBandBase, ClothingMaskBandGrey]
   id: ClothingHeadBandGrey
   name: grey bandana
-  description: A grey bandana to make you look cool.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/grey.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/grey.rsi
 
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBandBase, ClothingMaskBandRed]
   id: ClothingHeadBandRed
   name: red bandana
-  description: A red bandana to make you look cool.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/red.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/red.rsi
 
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBandBase, ClothingMaskBandSkull]
   id: ClothingHeadBandSkull
   name: skull bandana
-  description: A bandana with a skull to make you look even cooler.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/skull.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/skull.rsi
 
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBandBase, ClothingMaskBandMerc]
   id: ClothingHeadBandMerc
   name: mercenary bandana
-  description: To protect the head from the sun, insects and other dangers of the higher path.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/merc.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/merc.rsi
 
 - type: entity
-  parent: ClothingHeadBaseButcherable
+  parent: [ClothingHeadBandBase, ClothingMaskBandBrown]
   id: ClothingHeadBandBrown
-  name: brown bandana
-  description: A brown bandana to make you look cool.
-  components:
-  - type: Sprite
-    sprite: Clothing/Head/Bandanas/brown.rsi
-  - type: Clothing
-    sprite: Clothing/Head/Bandanas/brown.rsi
+  name: brown bandana
\ No newline at end of file
diff --git a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml
new file mode 100644 (file)
index 0000000..c008a75
--- /dev/null
@@ -0,0 +1,138 @@
+- type: entity
+  parent: [ClothingMaskBaseButcherable, BaseFoldable]
+  id: ClothingMaskBandanaBase
+  abstract: true
+  components:
+  - type: Appearance
+  - type: Foldable
+    canFoldInsideContainer: true
+  - type: FoldableClothing
+    foldedSlots:
+    - HEAD
+    unfoldedSlots:
+    - MASK
+  - type: Mask
+  - type: IngestionBlocker
+  - type: IdentityBlocker
+    coverage: MOUTH
+  - type: Sprite
+    layers:
+    - state: icon_mask
+      map: [ "unfoldedLayer" ]
+    - state: icon
+      map: ["foldedLayer"]
+      visible: false
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandBlack
+  name: black bandana
+  description: A black bandana to make you look cool.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/black.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/black.rsi
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandBlue
+  name: blue bandana
+  description: A blue bandana to make you look cool.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/blue.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/blue.rsi
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandBotany
+  name: botany bandana
+  description: A botany bandana to make you look cool, made from natural fibers.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/botany.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/botany.rsi
+  - type: Tag
+    tags:
+    - ClothMade
+    - WhitelistChameleon
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandGold
+  name: gold bandana
+  description: A gold bandana to make you look cool.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/gold.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/gold.rsi
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandGreen
+  name: green bandana
+  description: A green bandana to make you look cool.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/green.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/green.rsi
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandGrey
+  name: grey bandana
+  description: A grey bandana to make you look cool.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/grey.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/grey.rsi
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandRed
+  name: red bandana
+  description: A red bandana to make you look cool.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/red.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/red.rsi
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandSkull
+  name: skull bandana
+  description: A bandana with a skull to make you look even cooler.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/skull.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/skull.rsi
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandMerc
+  name: mercenary bandana
+  description: To protect the head from the sun, insects and other dangers of the higher path.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/merc.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/merc.rsi
+
+- type: entity
+  parent: ClothingMaskBandanaBase
+  id: ClothingMaskBandBrown
+  name: brown bandana
+  description: A brown bandana to make you look cool.
+  components:
+  - type: Sprite
+    sprite: Clothing/Head/Bandanas/brown.rsi
+  - type: Clothing
+    sprite: Clothing/Head/Bandanas/brown.rsi
index d57065ba79ad92ead65ce2b3d01c71e303ef82de..3531a26a6c5bf2919c675c6fe1d3c35bd5770066 100644 (file)
     icon: { sprite: Clothing/Mask/gas.rsi, state: icon }
     iconOn: Interface/Default/blocked.png
     event: !type:ToggleMaskEvent
+
+- type: entity
+  id: ClothingMaskBaseButcherable
+  parent: ClothingMaskBase
+  abstract: true
+  components:
+  - type: Butcherable
+    butcheringType: Knife
+    spawned:
+    - id: MaterialCloth1
+      amount: 1
+  - type: Food
+    requiresSpecialDigestion: true
+  - type: SolutionContainerManager
+    solutions:
+      food:
+        maxVol: 10
+        reagents:
+        - ReagentId: Fiber
+          Quantity: 10
+  - type: Tag
+    tags:
+      - ClothMade
\ No newline at end of file
index 66dc616e5237b6490cc0a473ce2d78ecce27fde3..a55536903271a905ddc66d3ac9f7ecf7f3d164da 100644 (file)
@@ -18,7 +18,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {
index 66dc616e5237b6490cc0a473ce2d78ecce27fde3..a55536903271a905ddc66d3ac9f7ecf7f3d164da 100644 (file)
@@ -18,7 +18,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {
index 22a0c38fde553d2ec407fe0e9488def53c8b94be..a9b3b1556d9d64bcb86b75ac658f298e98e0c2a8 100644 (file)
@@ -22,7 +22,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {
index dc73ff464cd3e7e0713043c9c9d87109a15b9657..ae745625601efe74f54dabd6d13f6fc739dc8aa3 100644 (file)
@@ -18,7 +18,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {
index 66dc616e5237b6490cc0a473ce2d78ecce27fde3..a55536903271a905ddc66d3ac9f7ecf7f3d164da 100644 (file)
@@ -18,7 +18,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {
index 66dc616e5237b6490cc0a473ce2d78ecce27fde3..a55536903271a905ddc66d3ac9f7ecf7f3d164da 100644 (file)
@@ -18,7 +18,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {
index 66dc616e5237b6490cc0a473ce2d78ecce27fde3..a55536903271a905ddc66d3ac9f7ecf7f3d164da 100644 (file)
@@ -18,7 +18,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {
index 94ecdbc846bffe74157a152f647d606f694027c0..7912d1eb0f75daa6ff9e95877b52d43c90bdbcf0 100644 (file)
@@ -18,7 +18,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {
index 66dc616e5237b6490cc0a473ce2d78ecce27fde3..a55536903271a905ddc66d3ac9f7ecf7f3d164da 100644 (file)
@@ -18,7 +18,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {
index 66dc616e5237b6490cc0a473ce2d78ecce27fde3..a55536903271a905ddc66d3ac9f7ecf7f3d164da 100644 (file)
@@ -18,7 +18,7 @@
       "directions": 4
     },
     {
-      "name": "mask-equipped-HELMET",
+      "name": "equipped-MASK",
       "directions": 4
     },
     {