From a8337172ca9976135702482b599bc6c13f64424c Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Mon, 5 Jun 2023 04:11:45 -0700 Subject: [PATCH] More gendered sprite masks (#14735) --- .../Clothing/ClientClothingSystem.cs | 88 ++++++++++++------ .../Clothing/Components/ClothingComponent.cs | 12 ++- .../Prototypes/Entities/Mobs/Species/base.yml | 32 +++---- .../Prototypes/Entities/Mobs/Species/vox.yml | 2 +- .../masking_helpers.rsi/female_none.png | Bin 0 -> 1568 bytes .../masking_helpers.rsi/full.png | Bin 0 -> 1625 bytes .../masking_helpers.rsi/male_full.png | Bin 0 -> 1625 bytes .../masking_helpers.rsi/male_none.png | Bin 0 -> 1568 bytes .../masking_helpers.rsi/male_top.png | Bin 0 -> 1568 bytes .../masking_helpers.rsi/meta.json | 57 +++++++++++- .../Customization/masking_helpers.rsi/top.png | Bin 0 -> 1625 bytes .../masking_helpers.rsi/unisex_full.png | Bin 0 -> 1625 bytes .../masking_helpers.rsi/unisex_none.png | Bin 0 -> 1568 bytes .../masking_helpers.rsi/unisex_top.png | Bin 0 -> 1568 bytes 14 files changed, 140 insertions(+), 51 deletions(-) create mode 100644 Resources/Textures/Mobs/Customization/masking_helpers.rsi/female_none.png create mode 100644 Resources/Textures/Mobs/Customization/masking_helpers.rsi/full.png create mode 100644 Resources/Textures/Mobs/Customization/masking_helpers.rsi/male_full.png create mode 100644 Resources/Textures/Mobs/Customization/masking_helpers.rsi/male_none.png create mode 100644 Resources/Textures/Mobs/Customization/masking_helpers.rsi/male_top.png create mode 100644 Resources/Textures/Mobs/Customization/masking_helpers.rsi/top.png create mode 100644 Resources/Textures/Mobs/Customization/masking_helpers.rsi/unisex_full.png create mode 100644 Resources/Textures/Mobs/Customization/masking_helpers.rsi/unisex_none.png create mode 100644 Resources/Textures/Mobs/Customization/masking_helpers.rsi/unisex_top.png diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index 22d639fc2f..81220e650d 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -60,26 +60,15 @@ public sealed class ClientClothingSystem : ClothingSystem private void OnAppearanceUpdate(EntityUid uid, InventoryComponent component, ref AppearanceChangeEvent args) { // May need to update jumpsuit stencils if the sex changed. Also required to properly set the stencil on init - // when sex is first loaded from the profile. - if (!TryComp(uid, out SpriteComponent? sprite) || !sprite.LayerMapTryGet(HumanoidVisualLayers.StencilMask, out var layer)) + // This is when sex is first loaded from the profile. + + if (!TryComp(uid, out SpriteComponent? sprite) || + !TryComp(uid, out HumanoidAppearanceComponent? humanoid) || + !_inventorySystem.TryGetSlotEntity(uid, "jumpsuit", out var suit, component) || + !TryComp(suit, out ClothingComponent? clothing)) return; - if (!TryComp(uid, out HumanoidAppearanceComponent? humanoid) - || humanoid.Sex != Sex.Female - || !_inventorySystem.TryGetSlotEntity(uid, "jumpsuit", out var suit, component) - || !TryComp(suit, out ClothingComponent? clothing)) - { - sprite.LayerSetVisible(layer, false); - return; - } - - sprite.LayerSetState(layer, clothing.FemaleMask switch - { - FemaleClothingMask.NoMask => "female_none", - FemaleClothingMask.UniformTop => "female_top", - _ => "female_full", - }); - sprite.LayerSetVisible(layer, true); + SetGenderedMask(sprite, humanoid, clothing); } private void OnGetVisuals(EntityUid uid, ClothingComponent item, GetEquipmentVisualsEvent args) @@ -225,20 +214,12 @@ public sealed class ClientClothingSystem : ClothingSystem return; } - if (slot == "jumpsuit" && sprite.LayerMapTryGet(HumanoidVisualLayers.StencilMask, out var suitLayer)) + if (slot == "jumpsuit") { - if (TryComp(equipee, out HumanoidAppearanceComponent? humanoid) && humanoid.Sex == Sex.Female) - { - sprite.LayerSetState(suitLayer, clothingComponent.FemaleMask switch - { - FemaleClothingMask.NoMask => "female_none", - FemaleClothingMask.UniformTop => "female_top", - _ => "female_full", - }); - sprite.LayerSetVisible(suitLayer, true); - } - else - sprite.LayerSetVisible(suitLayer, false); + if (!TryComp(equipee, out HumanoidAppearanceComponent? humanoid)) + return; + + SetGenderedMask(sprite, humanoid, clothingComponent); } if (!_inventorySystem.TryGetSlot(equipee, slot, out var slotDef, inventory)) @@ -315,4 +296,49 @@ public sealed class ClientClothingSystem : ClothingSystem RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true); } + + + /// + /// Sets a sprite's gendered mask based on gender (obviously). + /// + /// Sprite to modify + /// Humanoid, to get gender from + /// Clothing component, to get mask sprite type + private static void SetGenderedMask(SpriteComponent sprite, HumanoidAppearanceComponent humanoid, ClothingComponent clothing) + { + if (!sprite.LayerMapTryGet(HumanoidVisualLayers.StencilMask, out var layer)) + return; + + ClothingMask? mask = null; + var prefix = ""; + + switch (humanoid.Sex) + { + case Sex.Male: + mask = clothing.MaleMask; + prefix = "male_"; + break; + case Sex.Female: + mask = clothing.FemaleMask; + prefix = "female_"; + break; + case Sex.Unsexed: + mask = clothing.UnisexMask; + prefix = "unisex_"; + break; + } + + if (mask != null) + { + sprite.LayerSetState(layer, mask switch + { + ClothingMask.NoMask => $"{prefix}none", + ClothingMask.UniformTop => $"{prefix}top", + _ => $"{prefix}full", + }); + sprite.LayerSetVisible(layer, true); + } + else + sprite.LayerSetVisible(layer, false); + } } diff --git a/Content.Shared/Clothing/Components/ClothingComponent.cs b/Content.Shared/Clothing/Components/ClothingComponent.cs index 3f6925fd24..a748e2348e 100644 --- a/Content.Shared/Clothing/Components/ClothingComponent.cs +++ b/Content.Shared/Clothing/Components/ClothingComponent.cs @@ -53,9 +53,17 @@ public sealed class ClothingComponent : Component [DataField("sprite")] public string? RsiPath; + [ViewVariables(VVAccess.ReadWrite)] + [DataField("maleMask")] + public ClothingMask MaleMask = ClothingMask.UniformFull; + [ViewVariables(VVAccess.ReadWrite)] [DataField("femaleMask")] - public FemaleClothingMask FemaleMask = FemaleClothingMask.UniformFull; + public ClothingMask FemaleMask = ClothingMask.UniformFull; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("unisexMask")] + public ClothingMask UnisexMask = ClothingMask.UniformFull; public string? InSlot; } @@ -71,7 +79,7 @@ public sealed class ClothingComponentState : ComponentState } } -public enum FemaleClothingMask : byte +public enum ClothingMask : byte { NoMask = 0, UniformFull, diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 96ba3c4261..173256ec5c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -111,16 +111,16 @@ # sprite refactor when state: l_leg - shader: StencilMask - map: [ "enum.HumanoidVisualLayers.StencilMask" ] + map: ["enum.HumanoidVisualLayers.StencilMask"] sprite: Mobs/Customization/masking_helpers.rsi - state: female_full + state: unisex_full visible: false - - map: [ "jumpsuit" ] - - map: [ "enum.HumanoidVisualLayers.LHand" ] - - map: [ "enum.HumanoidVisualLayers.RHand" ] - - map: [ "enum.HumanoidVisualLayers.LFoot" ] - - map: [ "enum.HumanoidVisualLayers.RFoot" ] - - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + - map: ["jumpsuit"] + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] color: "#ffffff" sprite: Objects/Misc/handcuffs.rsi state: body-overlay-2 @@ -334,16 +334,16 @@ sprite: Mobs/Species/Human/parts.rsi state: l_leg - shader: StencilMask - map: [ "enum.HumanoidVisualLayers.StencilMask" ] + map: ["enum.HumanoidVisualLayers.StencilMask"] sprite: Mobs/Customization/masking_helpers.rsi - state: female_full + state: unisex_full visible: false - - map: [ "jumpsuit" ] - - map: [ "enum.HumanoidVisualLayers.LHand" ] - - map: [ "enum.HumanoidVisualLayers.RHand" ] - - map: [ "enum.HumanoidVisualLayers.LFoot" ] - - map: [ "enum.HumanoidVisualLayers.RFoot" ] - - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + - map: ["jumpsuit"] + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] color: "#ffffff" sprite: Objects/Misc/handcuffs.rsi state: body-overlay-2 diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index c4f957f799..be6e170c41 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -37,7 +37,7 @@ # sprite: Mobs/Species/Vox/parts.rsi # state: l_leg #- shader: StencilMask - # map: [ "enum.HumanoidVisualLayers.StencilMask" ] + # map: [ "enum.HumanoidVisualLayers.FemaleStencilMask" ] # sprite: Mobs/Customization/masking_helpers.rsi # state: female_full # visible: false diff --git a/Resources/Textures/Mobs/Customization/masking_helpers.rsi/female_none.png b/Resources/Textures/Mobs/Customization/masking_helpers.rsi/female_none.png new file mode 100644 index 0000000000000000000000000000000000000000..44e0c1358d805be4b575d5a9acf1fd4f0e4ff5bf GIT binary patch literal 1568 zcmV+*2H*LKP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_Zk|ZY#{pS=u0+Im1ao7~$8~FHskV|hh?XLFx zOhhM91xbphW2 z3Gqp%Q^g- zb7$FmS(FQR@j?=u1PNrUQe;RLmd;ZIyL{V1TW{IwI%Oyx1W6`<5l-ykuEqZy4}r}3 z3K7BkD^{?JdC@>Cin9J81wzQKJc>KO*LZ({SbzjbtuSXeSbaMnTBMiU61RyK2u94| zIIQCYK!~6_!Wa@T;1fxtL|&Pd2yx8dr^0d;7r21}ijfDbXOy-qM?SVu zLLeea5(PCyD!2+E2Gp8{j2x;_Vu&%Os4>S9YmyXFOetwvwOCa&Xw;;tS&P;zIpmmA z)|_+6)fFy+T8$+YExD9ZE0k6sSDdc7Vxw`B7FuknY0Is&+L1mz^w?9^o_p!l4IVPW zh$9Uhd6ZEnO{CHcGtM-1=2>Pnq?(BZi;IDRYZoBagj4pZwpE5Js9sQh5SY1gh6F!1yJrvl z0R34&ZFrefw1;7qqYCn65O#8;`4XbSDXjXX~NO!xA~*MjhPalAhUPsh|^Pu ze*Ha~-LD>a_z7zSh6ux=(Z;%`YDXmBr=~m7>3iAqDlx&@XPiDU{{a0KAVELG*T%nv zTU}7`>gR|600Dz(LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~PLN<}IT?I7Zip>?t# zD&i2R|084ld5RI=Bjg;0K7Si<6>@l=#1-&?3fz z<9@um_qclp2(21Z&AMYAac;(;P(-OGqIN5i%O6q6Q0b zS~XHkWN1I(;U97QX>!Trs)CVY0d=U596$IU{O;B)O-;H<3+`T*pptK}Qu;1C!qQ}(*YyZd{4`}a(zzaK9ea*XFW7M%b900~e`R7C&) zH2?qr|NsAahD9d;0004WQchCF6XU=)l3@&Et?KmY+L Sjp0=Q0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ca^pA*{O2k52n0azaU8x-H8J213q+{qsxli z!;N!9Xm8CkdOvETScR6yvm8LCe1S?kM=-yKiWn3NeW{3N)ya(cFEf4i^JY zPUx9C%bv@UxNsLQB*96LK*mXm49UXMd5U0`FJEY{TlR9DG8P^LOD2F3p4iQugMZuJ z1TyO@Lkgq&vW8dwD@vfCN~rFlP{~z8w%v>3434+d>Nr z6@54!PU8lE5MgbFGbB*JM-rt-J~1aE#4$sk3eQJte^ocWSI#ZzzC$^;q=QW0R@ z*A0r^g0~#83nkek?Pk%{gql#rT97$xDt@*O=q52PK#SC*;LaF~8}m<2yN_AmtiE`l zx*SYSA{PzU)?2`*Sm5R44I1u_$1-`2$A_w2l-6mxDCKccS{`kGnopb59Ha zT7|Ks+nEKHt0=bf$U4d*T+4b@MH6RV&&UVj?zzL}1@XtSj8`}tu7JXfal^o7z0VDu zo`U-I^>pvnAZ`A0$j%92_%qr#=BU~c($}f^kWcPRs3-I3E;(PFB40axet^CUNRUni ze+&KrpXr8K1+H=f0004lX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$i(@I4u4(%Y~ zkfC+5AS&W0RV;#q(pG5I!Q|2}Xws0RxHt-~1qVMCs}3&Cx;nTDg5U>;tBaGOi0F(9}L zw41j5eQew96TtrrTxnf@y#>sElHTlU(Ia4J8@RacYVsa%xdRM8>5?HilAoqfDgp0j z^i2gIdpp00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=K~V}2m}o+O)3BY01`<=K~y-)V_+BsqhJ(_0`dR= X1V8`*DUIP(00000NkvXXu0mjfh;rUK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/masking_helpers.rsi/male_full.png b/Resources/Textures/Mobs/Customization/masking_helpers.rsi/male_full.png new file mode 100644 index 0000000000000000000000000000000000000000..f78008f58a26fea7acd3c9fce0f5eb8280549e6a GIT binary patch literal 1625 zcmV-f2B!ImP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ca^pA*{O2k52n0azaU8x-H8J213q+{qsxli z!;N!9Xm8CkdOvETScR6yvm8LCe1S?kM=-yKiWn3NeW{3N)ya(cFEf4i^JY zPUx9C%bv@UxNsLQB*96LK*mXm49UXMd5U0`FJEY{TlR9DG8P^LOD2F3p4iQugMZuJ z1TyO@Lkgq&vW8dwD@vfCN~rFlP{~z8w%v>3434+d>Nr z6@54!PU8lE5MgbFGbB*JM-rt-J~1aE#4$sk3eQJte^ocWSI#ZzzC$^;q=QW0R@ z*A0r^g0~#83nkek?Pk%{gql#rT97$xDt@*O=q52PK#SC*;LaF~8}m<2yN_AmtiE`l zx*SYSA{PzU)?2`*Sm5R44I1u_$1-`2$A_w2l-6mxDCKccS{`kGnopb59Ha zT7|Ks+nEKHt0=bf$U4d*T+4b@MH6RV&&UVj?zzL}1@XtSj8`}tu7JXfal^o7z0VDu zo`U-I^>pvnAZ`A0$j%92_%qr#=BU~c($}f^kWcPRs3-I3E;(PFB40axet^CUNRUni ze+&KrpXr8K1+H=f0004lX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$i(@I4u4(%Y~ zkfC+5AS&W0RV;#q(pG5I!Q|2}Xws0RxHt-~1qVMCs}3&Cx;nTDg5U>;tBaGOi0F(9}L zw41j5eQew96TtrrTxnf@y#>sElHTlU(Ia4J8@RacYVsa%xdRM8>5?HilAoqfDgp0j z^i2gIdpp00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=K~V}2m}o+O)3BY01`<=K~y-)V_+BsqhJ(_0`dR= X1V8`*DUIP(00000NkvXXu0mjfh;rUK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/masking_helpers.rsi/male_none.png b/Resources/Textures/Mobs/Customization/masking_helpers.rsi/male_none.png new file mode 100644 index 0000000000000000000000000000000000000000..44e0c1358d805be4b575d5a9acf1fd4f0e4ff5bf GIT binary patch literal 1568 zcmV+*2H*LKP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_Zk|ZY#{pS=u0+Im1ao7~$8~FHskV|hh?XLFx zOhhM91xbphW2 z3Gqp%Q^g- zb7$FmS(FQR@j?=u1PNrUQe;RLmd;ZIyL{V1TW{IwI%Oyx1W6`<5l-ykuEqZy4}r}3 z3K7BkD^{?JdC@>Cin9J81wzQKJc>KO*LZ({SbzjbtuSXeSbaMnTBMiU61RyK2u94| zIIQCYK!~6_!Wa@T;1fxtL|&Pd2yx8dr^0d;7r21}ijfDbXOy-qM?SVu zLLeea5(PCyD!2+E2Gp8{j2x;_Vu&%Os4>S9YmyXFOetwvwOCa&Xw;;tS&P;zIpmmA z)|_+6)fFy+T8$+YExD9ZE0k6sSDdc7Vxw`B7FuknY0Is&+L1mz^w?9^o_p!l4IVPW zh$9Uhd6ZEnO{CHcGtM-1=2>Pnq?(BZi;IDRYZoBagj4pZwpE5Js9sQh5SY1gh6F!1yJrvl z0R34&ZFrefw1;7qqYCn65O#8;`4XbSDXjXX~NO!xA~*MjhPalAhUPsh|^Pu ze*Ha~-LD>a_z7zSh6ux=(Z;%`YDXmBr=~m7>3iAqDlx&@XPiDU{{a0KAVELG*T%nv zTU}7`>gR|600Dz(LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~PLN<}IT?I7Zip>?t# zD&i2R|084ld5RI=Bjg;0K7Si<6>@l=#1-&?3fz z<9@um_qclp2(21Z&AMYAac;(;P(-OGqIN5i%O6q6Q0b zS~XHkWN1I(;U97QX>!Trs)CVY0d=U596$IU{O;B)O-;H<3+`T*pptK}Qu;1C!qQ}(*YyZd{4`}a(zzaK9ea*XFW7M%b900~e`R7C&) zH2?qr|NsAahD9d;0004WQchCF6XU=)l3@&Et?KmY+L Sjp0=Q0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_Zk|ZY#{pS=u0+Im1ao7~$8~FHskV|hh?XLFx zOhhM91xbphW2 z3Gqp%Q^g- zb7$FmS(FQR@j?=u1PNrUQe;RLmd;ZIyL{V1TW{IwI%Oyx1W6`<5l-ykuEqZy4}r}3 z3K7BkD^{?JdC@>Cin9J81wzQKJc>KO*LZ({SbzjbtuSXeSbaMnTBMiU61RyK2u94| zIIQCYK!~6_!Wa@T;1fxtL|&Pd2yx8dr^0d;7r21}ijfDbXOy-qM?SVu zLLeea5(PCyD!2+E2Gp8{j2x;_Vu&%Os4>S9YmyXFOetwvwOCa&Xw;;tS&P;zIpmmA z)|_+6)fFy+T8$+YExD9ZE0k6sSDdc7Vxw`B7FuknY0Is&+L1mz^w?9^o_p!l4IVPW zh$9Uhd6ZEnO{CHcGtM-1=2>Pnq?(BZi;IDRYZoBagj4pZwpE5Js9sQh5SY1gh6F!1yJrvl z0R34&ZFrefw1;7qqYCn65O#8;`4XbSDXjXX~NO!xA~*MjhPalAhUPsh|^Pu ze*Ha~-LD>a_z7zSh6ux=(Z;%`YDXmBr=~m7>3iAqDlx&@XPiDU{{a0KAVELG*T%nv zTU}7`>gR|600Dz(LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~PLN<}IT?I7Zip>?t# zD&i2R|084ld5RI=Bjg;0K7Si<6>@l=#1-&?3fz z<9@um_qclp2(21Z&AMYAac;(;P(-OGqIN5i%O6q6Q0b zS~XHkWN1I(;U97QX>!Trs)CVY0d=U596$IU{O;B)O-;H<3+`T*pptK}Qu;1C!qQ}(*YyZd{4`}a(zzaK9ea*XFW7M%b900~e`R7C&) zZU6uP|NsA3RQPHD0004WQchCF6XU=)l3@&Et?KmY+L Sjp0=Q0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ca^pA*{O2k52n0azaU8x-H8J213q+{qsxli z!;N!9Xm8CkdOvETScR6yvm8LCe1S?kM=-yKiWn3NeW{3N)ya(cFEf4i^JY zPUx9C%bv@UxNsLQB*96LK*mXm49UXMd5U0`FJEY{TlR9DG8P^LOD2F3p4iQugMZuJ z1TyO@Lkgq&vW8dwD@vfCN~rFlP{~z8w%v>3434+d>Nr z6@54!PU8lE5MgbFGbB*JM-rt-J~1aE#4$sk3eQJte^ocWSI#ZzzC$^;q=QW0R@ z*A0r^g0~#83nkek?Pk%{gql#rT97$xDt@*O=q52PK#SC*;LaF~8}m<2yN_AmtiE`l zx*SYSA{PzU)?2`*Sm5R44I1u_$1-`2$A_w2l-6mxDCKccS{`kGnopb59Ha zT7|Ks+nEKHt0=bf$U4d*T+4b@MH6RV&&UVj?zzL}1@XtSj8`}tu7JXfal^o7z0VDu zo`U-I^>pvnAZ`A0$j%92_%qr#=BU~c($}f^kWcPRs3-I3E;(PFB40axet^CUNRUni ze+&KrpXr8K1+H=f0004lX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$i(@I4u4(%Y~ zkfC+5AS&W0RV;#q(pG5I!Q|2}Xws0RxHt-~1qVMCs}3&Cx;nTDg5U>;tBaGOi0F(9}L zw41j5eQew96TtrrTxnf@y#>sElHTlU(Ia4J8@RacYVsa%xdRM8>5?HilAoqfDgp0j z^i2gIdpp00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=K~V}2m}o+O)3BY01`<=K~y-)V_+BsqhJ(_0`dR= X1V8`*DUIP(00000NkvXXu0mjfh;rUK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/masking_helpers.rsi/unisex_full.png b/Resources/Textures/Mobs/Customization/masking_helpers.rsi/unisex_full.png new file mode 100644 index 0000000000000000000000000000000000000000..1b69c04a7a3fef8e75bd6a789149a9bac380174f GIT binary patch literal 1625 zcmV-f2B!ImP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|ca^pA*{O2k52n0azaU8x-H8J213q+{qsxli z!;N!9Xm8CkdOvETScR6yvm8LCe1S?kM=-yKiWn3NeW{3N)ya(cFEf4i^JY zPUx9C%bv@UxNsLQB*96LK*mXm49UXMd5U0`FJEY{TlR9DG8P^LOD2F3p4iQugMZuJ z1TyO@Lkgq&vW8dwD@vfCN~rFlP{~z8w%v>3434+d>Nr z6@54!PU8lE5MgbFGbB*JM-rt-J~1aE#4$sk3eQJte^ocWSI#ZzzC$^;q=QW0R@ z*A0r^g0~#83nkek?Pk%{gql#rT97$xDt@*O=q52PK#SC*;LaF~8}m<2yN_AmtiE`l zx*SYSA{PzU)?2`*Sm5R44I1u_$1-`2$A_w2l-6mxDCKccS{`kGnopb59Ha zT7|Ks+nEKHt0=bf$U4d*T+4b@MH6RV&&UVj?zzL}1@XtSj8`}tu7JXfal^o7z0VDu zo`U-I^>pvnAZ`A0$j%92_%qr#=BU~c($}f^kWcPRs3-I3E;(PFB40axet^CUNRUni ze+&KrpXr8K1+H=f0004lX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$i(@I4u4(%Y~ zkfC+5AS&W0RV;#q(pG5I!Q|2}Xws0RxHt-~1qVMCs}3&Cx;nTDg5U>;tBaGOi0F(9}L zw41j5eQew96TtrrTxnf@y#>sElHTlU(Ia4J8@RacYVsa%xdRM8>5?HilAoqfDgp0j z^i2gIdL;#2d9Y_EG010qNS#tmY z3ljhU3ljkVnw%H_000McNliru=K~V}2oCM|q%;5k01`<=K~y-)V_+BsqhJ(_0`dR= X1V8`*DUIP(00000NkvXXu0mjfT3g>8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/masking_helpers.rsi/unisex_none.png b/Resources/Textures/Mobs/Customization/masking_helpers.rsi/unisex_none.png new file mode 100644 index 0000000000000000000000000000000000000000..44e0c1358d805be4b575d5a9acf1fd4f0e4ff5bf GIT binary patch literal 1568 zcmV+*2H*LKP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_Zk|ZY#{pS=u0+Im1ao7~$8~FHskV|hh?XLFx zOhhM91xbphW2 z3Gqp%Q^g- zb7$FmS(FQR@j?=u1PNrUQe;RLmd;ZIyL{V1TW{IwI%Oyx1W6`<5l-ykuEqZy4}r}3 z3K7BkD^{?JdC@>Cin9J81wzQKJc>KO*LZ({SbzjbtuSXeSbaMnTBMiU61RyK2u94| zIIQCYK!~6_!Wa@T;1fxtL|&Pd2yx8dr^0d;7r21}ijfDbXOy-qM?SVu zLLeea5(PCyD!2+E2Gp8{j2x;_Vu&%Os4>S9YmyXFOetwvwOCa&Xw;;tS&P;zIpmmA z)|_+6)fFy+T8$+YExD9ZE0k6sSDdc7Vxw`B7FuknY0Is&+L1mz^w?9^o_p!l4IVPW zh$9Uhd6ZEnO{CHcGtM-1=2>Pnq?(BZi;IDRYZoBagj4pZwpE5Js9sQh5SY1gh6F!1yJrvl z0R34&ZFrefw1;7qqYCn65O#8;`4XbSDXjXX~NO!xA~*MjhPalAhUPsh|^Pu ze*Ha~-LD>a_z7zSh6ux=(Z;%`YDXmBr=~m7>3iAqDlx&@XPiDU{{a0KAVELG*T%nv zTU}7`>gR|600Dz(LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~PLN<}IT?I7Zip>?t# zD&i2R|084ld5RI=Bjg;0K7Si<6>@l=#1-&?3fz z<9@um_qclp2(21Z&AMYAac;(;P(-OGqIN5i%O6q6Q0b zS~XHkWN1I(;U97QX>!Trs)CVY0d=U596$IU{O;B)O-;H<3+`T*pptK}Qu;1C!qQ}(*YyZd{4`}a(zzaK9ea*XFW7M%b900~e`R7C&) zH2?qr|NsAahD9d;0004WQchCF6XU=)l3@&Et?KmY+L Sjp0=Q0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_Zk|ZY#{pS=u0+Im1ao7~$8~FHskV|hh?XLFx zOhhM91xbphW2 z3Gqp%Q^g- zb7$FmS(FQR@j?=u1PNrUQe;RLmd;ZIyL{V1TW{IwI%Oyx1W6`<5l-ykuEqZy4}r}3 z3K7BkD^{?JdC@>Cin9J81wzQKJc>KO*LZ({SbzjbtuSXeSbaMnTBMiU61RyK2u94| zIIQCYK!~6_!Wa@T;1fxtL|&Pd2yx8dr^0d;7r21}ijfDbXOy-qM?SVu zLLeea5(PCyD!2+E2Gp8{j2x;_Vu&%Os4>S9YmyXFOetwvwOCa&Xw;;tS&P;zIpmmA z)|_+6)fFy+T8$+YExD9ZE0k6sSDdc7Vxw`B7FuknY0Is&+L1mz^w?9^o_p!l4IVPW zh$9Uhd6ZEnO{CHcGtM-1=2>Pnq?(BZi;IDRYZoBagj4pZwpE5Js9sQh5SY1gh6F!1yJrvl z0R34&ZFrefw1;7qqYCn65O#8;`4XbSDXjXX~NO!xA~*MjhPalAhUPsh|^Pu ze*Ha~-LD>a_z7zSh6ux=(Z;%`YDXmBr=~m7>3iAqDlx&@XPiDU{{a0KAVELG*T%nv zTU}7`>gR|600Dz(LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~PLN<}IT?I7Zip>?t# zD&i2R|084ld5RI=Bjg;0K7Si<6>@l=#1-&?3fz z<9@um_qclp2(21Z&AMYAac;(;P(-OGqIN5i%O6q6Q0b zS~XHkWN1I(;U97QX>!Trs)CVY0d=U596$IU{O;B)O-;H<3+`T*pptK}Qu;1C!qQ}(*YyZd{4`}a(zzaK9ea*XFW7M%b900~e`R7C&) zH2?qr|NsAahD9d;0004WQchCF6XU=)l3@&Et?KmY+L Sjp0=Q0000