From ab8488467765d41ffbcfc5f0c12f094c33479096 Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 24 Jul 2023 20:41:09 +0100 Subject: [PATCH] Update HDSkins --- gradle.properties | 4 +- .../client/hdskins/DummyPony.java | 8 +- .../client/hdskins/GuiSkinsMineLP.java | 61 ++++------ .../client/hdskins/LegendOverlayWidget.java | 65 +++++++++++ .../client/hdskins/MineLPHDSkins.java | 4 +- .../hdskins/PonifiedDualCarouselWidget.java | 49 ++++++++ .../client/hdskins/PonyPreview.java | 105 ------------------ .../textures/gui/skin_type/antlers.png | Bin 0 -> 4477 bytes .../textures/gui/skin_type/crown.png | Bin 0 -> 4515 bytes .../textures/gui/skin_type/hat.png | Bin 0 -> 4544 bytes .../textures/gui/skin_type/muffin.png | Bin 0 -> 4540 bytes .../gui/skin_type/saddle_bags_both.png | Bin 0 -> 4538 bytes .../gui/skin_type/saddle_bags_left.png | Bin 0 -> 4564 bytes .../gui/skin_type/saddle_bags_right.png | Bin 0 -> 4575 bytes .../textures/gui/skin_type/stetson.png | Bin 0 -> 4544 bytes .../minelp/textures/gui/skin_type/seapony.png | Bin 0 -> 4805 bytes 16 files changed, 144 insertions(+), 152 deletions(-) create mode 100644 src/main/java/com/minelittlepony/client/hdskins/LegendOverlayWidget.java create mode 100644 src/main/java/com/minelittlepony/client/hdskins/PonifiedDualCarouselWidget.java delete mode 100644 src/main/java/com/minelittlepony/client/hdskins/PonyPreview.java create mode 100644 src/main/resources/assets/minelittlepony/textures/gui/skin_type/antlers.png create mode 100644 src/main/resources/assets/minelittlepony/textures/gui/skin_type/crown.png create mode 100644 src/main/resources/assets/minelittlepony/textures/gui/skin_type/hat.png create mode 100644 src/main/resources/assets/minelittlepony/textures/gui/skin_type/muffin.png create mode 100644 src/main/resources/assets/minelittlepony/textures/gui/skin_type/saddle_bags_both.png create mode 100644 src/main/resources/assets/minelittlepony/textures/gui/skin_type/saddle_bags_left.png create mode 100644 src/main/resources/assets/minelittlepony/textures/gui/skin_type/saddle_bags_right.png create mode 100644 src/main/resources/assets/minelittlepony/textures/gui/skin_type/stetson.png create mode 100644 src/main/resources/assets/minelp/textures/gui/skin_type/seapony.png diff --git a/gradle.properties b/gradle.properties index 94ebddfb..1d67e849 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,6 +21,6 @@ org.gradle.daemon=false # Dependencies modmenu_version=7.1.0 - kirin_version=1.15.1 - hd_skins_version=6.9.3-beta.2 + kirin_version=1.15.2 + hd_skins_version=6.10.0+1.20 mson_version=1.8.1 diff --git a/src/main/java/com/minelittlepony/client/hdskins/DummyPony.java b/src/main/java/com/minelittlepony/client/hdskins/DummyPony.java index 0005b529..51f80906 100644 --- a/src/main/java/com/minelittlepony/client/hdskins/DummyPony.java +++ b/src/main/java/com/minelittlepony/client/hdskins/DummyPony.java @@ -6,7 +6,9 @@ import com.minelittlepony.api.pony.IPony; import com.minelittlepony.api.pony.IPonyManager; import com.minelittlepony.client.IPreviewModel; import com.minelittlepony.client.render.EquineRenderManager; -import com.minelittlepony.hdskins.client.dummy.*; +import com.minelittlepony.hdskins.client.VanillaModels; +import com.minelittlepony.hdskins.client.gui.player.*; +import com.minelittlepony.hdskins.client.gui.player.skins.PlayerSkins; import java.util.UUID; @@ -33,12 +35,12 @@ class DummyPony extends DummyPlayer implements IPreviewModel, IPonyManager.Force @Override public String getModel() { if (getTextures().getPosture().getActiveSkinType() == MineLPHDSkins.seaponySkinType) { - return getTextures().usesThinSkin() ? "slimseapony" : "seapony"; + return VanillaModels.isSlim(getTextures().getSkinVariant()) ? "slimseapony" : "seapony"; } return IPony.getManager() .getPony(this) .metadata() .getRace() - .getModelId(getTextures().usesThinSkin()); + .getModelId(VanillaModels.isSlim(getTextures().getSkinVariant())); } } diff --git a/src/main/java/com/minelittlepony/client/hdskins/GuiSkinsMineLP.java b/src/main/java/com/minelittlepony/client/hdskins/GuiSkinsMineLP.java index 76d9259e..05d484cd 100644 --- a/src/main/java/com/minelittlepony/client/hdskins/GuiSkinsMineLP.java +++ b/src/main/java/com/minelittlepony/client/hdskins/GuiSkinsMineLP.java @@ -3,24 +3,21 @@ package com.minelittlepony.client.hdskins; import com.minelittlepony.api.pony.IPony; import com.minelittlepony.client.GuiPonySettings; import com.minelittlepony.client.MineLittlePony; +import com.minelittlepony.common.client.gui.dimension.Bounds; import com.minelittlepony.common.client.gui.element.Button; import com.minelittlepony.common.client.gui.sprite.TextureSprite; -import com.minelittlepony.hdskins.client.dummy.PlayerPreview; +import com.minelittlepony.hdskins.client.gui.DualCarouselWidget; import com.minelittlepony.hdskins.client.gui.GuiSkins; import com.minelittlepony.hdskins.server.SkinServerList; import com.minelittlepony.hdskins.profile.SkinType; -import com.mojang.authlib.minecraft.MinecraftProfileTexture; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.Identifier; -import org.lwjgl.glfw.GLFW; - /** * Skin uploading GUI. Usually displayed over the main menu. */ class GuiSkinsMineLP extends GuiSkins { - private static final String[] PANORAMAS = new String[] { "minelittlepony:textures/cubemap/sugarcubecorner", "minelittlepony:textures/cubemap/quillsandsofas", @@ -29,14 +26,24 @@ class GuiSkinsMineLP extends GuiSkins { public GuiSkinsMineLP(Screen parent, SkinServerList servers) { super(parent, servers); + chooser.addSkinChangedEventListener(type -> { + MineLittlePony.logger.debug("Invalidating old local skin, checking updated local skin"); + if (type == SkinType.SKIN) { + IPony.getManager().removePony(previewer.getLocal().getSkins().get(SkinType.SKIN).getId()); + } + }); + uploader.addSkinLoadedEventListener((type, location, profileTexture) -> { + MineLittlePony.logger.debug("Invalidating old remote skin, checking updated remote skin"); + if (type == SkinType.SKIN) { + IPony.getManager().removePony(location); + } + }); } @Override - public void init() { - super.init(); - + protected void initServerPreviewButtons(Bounds area) { if (!(parent instanceof GuiPonySettings)) { - addButton(new Button(width - 25, height - 90, 20, 20)) + addButton(new Button(area.right() - 20, area.bottom() + 5, 20, 20)) .onClick(sender -> client.setScreen(new GuiPonySettings(this))) .getStyle() .setIcon(new TextureSprite() @@ -45,21 +52,15 @@ class GuiSkinsMineLP extends GuiSkins { .setTextureSize(16, 16) .setSize(16, 16)) .setTooltip("minelp.options.title", 0, 10); + super.initServerPreviewButtons(new Bounds(area.top, area.left, area.width - 25, area.height)); + } else { + super.initServerPreviewButtons(area); } } - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (modifiers == (GLFW.GLFW_MOD_ALT | GLFW.GLFW_MOD_CONTROL) && keyCode == GLFW.GLFW_KEY_R) { - client.reloadResources(); - return true; - } - - return super.keyPressed(keyCode, scanCode, modifiers); - } - @Override - public PlayerPreview createPreviewer() { - return new PonyPreview(); + public DualCarouselWidget createPreviewer() { + return new PonifiedDualCarouselWidget(this); } @Override @@ -68,24 +69,4 @@ class GuiSkinsMineLP extends GuiSkins { return new Identifier(PANORAMAS[i]); } - - @Override - public void onSetLocalSkin(SkinType type) { - super.onSetLocalSkin(type); - - MineLittlePony.logger.debug("Invalidating old local skin, checking updated local skin"); - if (type == SkinType.SKIN) { - previewer.getLocal().ifPresent(local -> IPony.getManager().removePony(local.getTextures().get(SkinType.SKIN).getId())); - } - } - - @Override - public void onSetRemoteSkin(SkinType type, Identifier location, MinecraftProfileTexture profileTexture) { - super.onSetRemoteSkin(type, location, profileTexture); - - MineLittlePony.logger.debug("Invalidating old remote skin, checking updated remote skin"); - if (type == SkinType.SKIN) { - IPony.getManager().removePony(location); - } - } } diff --git a/src/main/java/com/minelittlepony/client/hdskins/LegendOverlayWidget.java b/src/main/java/com/minelittlepony/client/hdskins/LegendOverlayWidget.java new file mode 100644 index 00000000..0a9545bb --- /dev/null +++ b/src/main/java/com/minelittlepony/client/hdskins/LegendOverlayWidget.java @@ -0,0 +1,65 @@ +package com.minelittlepony.client.hdskins; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.text.Text; + +import com.minelittlepony.api.pony.*; +import com.minelittlepony.common.client.gui.ITextContext; +import com.minelittlepony.common.client.gui.dimension.Bounds; +import com.minelittlepony.hdskins.client.gui.Carousel; +import com.minelittlepony.hdskins.client.gui.player.DummyPlayer; + +import java.util.List; +import java.util.stream.Collectors; + +class LegendOverlayWidget implements Carousel.Element, ITextContext { + private static final Bounds LEGEND_BLOCK_BOUNDS = new Bounds(0, 0, 10, 10); + + @Override + public void render(DummyPlayer player, DrawContext context, int mouseX, int mouseY) { + IPonyData data = IPony.getManager().getPony(player).metadata(); + int[] index = new int[1]; + data.getTriggerPixels().forEach((key, value) -> { + context.getMatrices().push(); + int i = index[0]++; + int x = 0;//frame.left; + int y = 0/*frame.top*/ + (i * 10 + 20); + context.getMatrices().translate(x, y, 1); + drawLegendBlock(context, 0, 0, 0, mouseX - x, mouseY - y, key, value); + context.getMatrices().pop(); + }); + MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers().draw(); + } + + private void drawLegendBlock(DrawContext context, int index, int x, int y, int mouseX, int mouseY, String key, TriggerPixelType value) { + context.fill(0, 0, LEGEND_BLOCK_BOUNDS.width, LEGEND_BLOCK_BOUNDS.height, 0xFF003333); + context.fill(1, 1, LEGEND_BLOCK_BOUNDS.width - 1, LEGEND_BLOCK_BOUNDS.height - 1, value.getColorCode() | 0xFF000000); + + char symbol = value.name().charAt(0); + if (symbol == '[') { + symbol = key.charAt(0); + } + + context.drawTextWithShadow(getFont(), Text.literal(String.valueOf(symbol).toUpperCase()), 2, 1, 0xFFFFFFFF); + + if (LEGEND_BLOCK_BOUNDS.contains(mouseX, mouseY)) { + List lines = value.getOptions().stream().map(option -> { + boolean selected = value.matches(option); + return Text.literal((selected ? "* " : " ") + option.name()).styled(s -> { + int color = option.getChannelAdjustedColorCode(); + return (color == 0 ? s : s.withColor(color)).withItalic(selected); + }); + }).collect(Collectors.toList()); + + lines.add(0, Text.of(key.toUpperCase() + ": " + value.getHexValue())); + if (lines.size() == 1) { + lines.add(Text.literal(value.name()).styled(s -> { + int color = value.getChannelAdjustedColorCode(); + return color == 0 ? s : s.withColor(value.getColorCode()); + })); + } + context.drawTooltip(getFont(), lines, 2, 10); + } + } +} diff --git a/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java b/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java index c7428a98..06ca330d 100644 --- a/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java +++ b/src/main/java/com/minelittlepony/client/hdskins/MineLPHDSkins.java @@ -9,9 +9,9 @@ import com.minelittlepony.common.client.gui.ScrollContainer; import com.minelittlepony.common.client.gui.element.Button; import com.minelittlepony.common.event.ClientReadyCallback; import com.minelittlepony.hdskins.client.*; -import com.minelittlepony.hdskins.client.dummy.DummyPlayer; -import com.minelittlepony.hdskins.client.dummy.PlayerSkins.PlayerSkin; import com.minelittlepony.hdskins.client.gui.GuiSkins; +import com.minelittlepony.hdskins.client.gui.player.DummyPlayer; +import com.minelittlepony.hdskins.client.gui.player.skins.PlayerSkins.PlayerSkin; import com.minelittlepony.hdskins.profile.SkinType; import com.mojang.authlib.GameProfile; diff --git a/src/main/java/com/minelittlepony/client/hdskins/PonifiedDualCarouselWidget.java b/src/main/java/com/minelittlepony/client/hdskins/PonifiedDualCarouselWidget.java new file mode 100644 index 00000000..ea3b794d --- /dev/null +++ b/src/main/java/com/minelittlepony/client/hdskins/PonifiedDualCarouselWidget.java @@ -0,0 +1,49 @@ +package com.minelittlepony.client.hdskins; + +import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.Identifier; + +import com.minelittlepony.api.pony.meta.*; +import com.minelittlepony.client.render.entity.SeaponyRenderer; +import com.minelittlepony.hdskins.client.gui.DualCarouselWidget; +import com.minelittlepony.hdskins.client.gui.GuiSkins; +import com.minelittlepony.hdskins.client.gui.player.DummyPlayer; +import com.minelittlepony.hdskins.client.gui.player.skins.PlayerSkins; +import com.minelittlepony.hdskins.client.resources.NativeImageFilters; +import com.minelittlepony.hdskins.client.resources.TextureLoader; +import com.minelittlepony.hdskins.profile.SkinType; + +class PonifiedDualCarouselWidget extends DualCarouselWidget { + + public PonifiedDualCarouselWidget(GuiSkins screen) { + super(screen); + local.addElement(new LegendOverlayWidget()); + remote.addElement(new LegendOverlayWidget()); + } + + @Override + protected DummyPlayer createEntity(ClientWorld world, PlayerSkins textures) { + return new DummyPony(world, textures); + } + + @Override + public Identifier getDefaultSkin(SkinType type, String modelVariant) { + if (type == MineLPHDSkins.seaponySkinType) { + return NativeImageFilters.GREYSCALE.load(SeaponyRenderer.SEAPONY, SeaponyRenderer.SEAPONY, getExclusion()); + } + + Wearable wearable = MineLPHDSkins.wearableTypes.getOrDefault(type, Wearable.NONE); + + if (wearable != Wearable.NONE) { + return NativeImageFilters.GREYSCALE.load(wearable.getDefaultTexture(), wearable.getDefaultTexture(), getExclusion()); + } + + return super.getDefaultSkin(type, modelVariant); + } + + @Override + public TextureLoader.Exclusion getExclusion() { + return TriggerPixel::isTriggerPixelCoord; + } + +} diff --git a/src/main/java/com/minelittlepony/client/hdskins/PonyPreview.java b/src/main/java/com/minelittlepony/client/hdskins/PonyPreview.java deleted file mode 100644 index 0f1d3732..00000000 --- a/src/main/java/com/minelittlepony/client/hdskins/PonyPreview.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.minelittlepony.client.hdskins; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import org.jetbrains.annotations.Nullable; - -import com.minelittlepony.api.pony.*; -import com.minelittlepony.api.pony.meta.*; -import com.minelittlepony.client.render.entity.SeaponyRenderer; -import com.minelittlepony.common.client.gui.dimension.Bounds; -import com.minelittlepony.hdskins.client.dummy.*; -import com.minelittlepony.hdskins.client.resources.DefaultSkinGenerator; -import com.minelittlepony.hdskins.client.resources.TextureLoader; -import com.minelittlepony.hdskins.profile.SkinType; - -import java.util.List; -import java.util.Optional; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -class PonyPreview extends PlayerPreview { - private static final Bounds LEGEND_BLOCK_BOUNDS = new Bounds(0, 0, 10, 10); - - @Override - protected DummyPlayer createEntity(ClientWorld world, PlayerSkins textures) { - return new DummyPony(world, textures); - } - - @Override - public Identifier getDefaultSkin(SkinType type, boolean slim) { - if (type == MineLPHDSkins.seaponySkinType) { - return DefaultSkinGenerator.generateGreyScale(SeaponyRenderer.SEAPONY, SeaponyRenderer.SEAPONY, getExclusion()); - } - - Wearable wearable = MineLPHDSkins.wearableTypes.getOrDefault(type, Wearable.NONE); - - if (wearable != Wearable.NONE) { - return DefaultSkinGenerator.generateGreyScale(wearable.getDefaultTexture(), wearable.getDefaultTexture(), getExclusion()); - } - - return super.getDefaultSkin(type, slim); - } - - @Override - protected TextureLoader.Exclusion getExclusion() { - return TriggerPixel::isTriggerPixelCoord; - } - - @Override - public void renderWorldAndPlayer(Optional thePlayer, - Bounds frame, - int horizon, int mouseX, int mouseY, int ticks, float partialTick, float scale, - DrawContext context, @Nullable Consumer postAction) { - super.renderWorldAndPlayer(thePlayer, frame, horizon, mouseX, mouseY, ticks, partialTick, scale, context, postAction); - thePlayer.ifPresent(p -> { - IPonyData data = IPony.getManager().getPony(p).metadata(); - int[] index = new int[1]; - data.getTriggerPixels().forEach((key, value) -> { - context.getMatrices().push(); - int i = index[0]++; - int x = frame.left; - int y = frame.top + (i * 10 + 20); - context.getMatrices().translate(x, y, 1); - drawLegendBlock(context, 0, 0, 0, mouseX - x, mouseY - y, key, value); - context.getMatrices().pop(); - }); - MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers().draw(); - }); - } - - private void drawLegendBlock(DrawContext context, int index, int x, int y, int mouseX, int mouseY, String key, TriggerPixelType value) { - context.fill(0, 0, LEGEND_BLOCK_BOUNDS.width, LEGEND_BLOCK_BOUNDS.height, 0xFF003333); - context.fill(1, 1, LEGEND_BLOCK_BOUNDS.width - 1, LEGEND_BLOCK_BOUNDS.height - 1, value.getColorCode() | 0xFF000000); - - char symbol = value.name().charAt(0); - if (symbol == '[') { - symbol = key.charAt(0); - } - - context.drawTextWithShadow(getFont(), Text.literal(String.valueOf(symbol).toUpperCase()), 2, 1, 0xFFFFFFFF); - - if (LEGEND_BLOCK_BOUNDS.contains(mouseX, mouseY)) { - List lines = value.getOptions().stream().map(option -> { - boolean selected = value.matches(option); - return Text.literal((selected ? "* " : " ") + option.name()).styled(s -> { - int color = option.getChannelAdjustedColorCode(); - return (color == 0 ? s : s.withColor(color)).withItalic(selected); - }); - }).collect(Collectors.toList()); - - lines.add(0, Text.of(key.toUpperCase() + ": " + value.getHexValue())); - if (lines.size() == 1) { - lines.add(Text.literal(value.name()).styled(s -> { - int color = value.getChannelAdjustedColorCode(); - return color == 0 ? s : s.withColor(value.getColorCode()); - })); - } - context.drawTooltip(getFont(), lines, 2, 10); - } - } -} diff --git a/src/main/resources/assets/minelittlepony/textures/gui/skin_type/antlers.png b/src/main/resources/assets/minelittlepony/textures/gui/skin_type/antlers.png new file mode 100644 index 0000000000000000000000000000000000000000..3eeb6c0edfaf972748dd259b7b0fc2f6e80caf57 GIT binary patch literal 4477 zcmeHKYitx%6rQE5lp0VGloW(vDoVlGdG7A)*p?WFr+ciL`A zMMa}%38ENLz<>{kQc?r>0AGNDAV`8})o6nFKtUcwdBhl{o|)ZlTQxC_@~^Xd_uhN% zIp00!yXT&E9;qlV9g&xxM-aq_K$*W1`peChdkOqbJkyP!JAi8fS|Bi$$b|`L+J+J~ zQwN%@&v=L}hsXihL(oRS*wiswzRhm+i(x!2Gky}rQ!+ZH4QCrdjDUU>G#lC@yD&DNTy~+u_M18Q_-RJtpUsT=G%&p(~zv27eT&%=hm8+}qmvPTQFchkm>; ze$s2T-1h57UH>%ta_6|6!phfow5*oi+q-FYYk3hmXn$nl){fNgA8h@8({`aia|ySM zpLEsDb2k{=w3Ycki}U7m8hfu!OlV*AhSbn0H+;Qp8(VYWwx_n1Cr20F5E?$pKjozt z7ETTC)H?$kmp=E0dRh0Pu7d z?f$uII^(Oll->HX#D%)Uv%7w62-coocDAIn?HZf!tL?iQORLV`x9=MAH+9dt6SEhr zn6)wY?bRQ2PF=~QyWF;1HAT<`kj#MOW9vD$HJrzev12)JIuG6Dls_U(76sfCT z>NaPP4aR-AUN4)Uz*Y0htCjf;ibtiU-;`IBk^vxs4Me6Q;b>A$c_|B5hOsGTDAH0f z8oX2uG5k2GB=oqU$D*W(i9)eP!%I=HPWJd0i3fvO_-Hc2 z0`S44P@Lf$EE9<^eJzqkaT9=K9QsF#WOYj%GnF_QYfLD(xCuv%g1!){lC_UFCc;)Y zs>0wfj(}gSueVujP!5irl<_S5c(-BJdv zU{LnQlt$CNfZt1*`^#!f(N)PXc48Ne5Er6F#VOJrQIcr43vsNQ=Mc}i`alJu zNdrX{Y(fFJLkAocYm!qGIGX1Kg%(2|jz%ucMYG7Iuu{n5LA=@r;+BLCS&71Zy)vOx zfRbFQC`eeK0nr0cqDF^Q4@*0pZb5LncvW?#p;SdKi6tTkj#H1II?TkQb=Dpx;quIi zfS2MOY_Fsuj0_D7ywn^$+L-EHsMaI6%0MQYoXf-Vyh{{WiDlhvI&2H?R-8yeCYqR5 z?X=9zW04^kAQqW<3ILWIVv&6bjEq>KIu;9ischBFE(hT{smMTnWMBZz*5T@&Iy{Z# zWH#--2^Wm1y4Lb<+UDgUi$EWayi8BR{wn{{J#X6`$i?ghDb3Has0SKd6H_eIFoJ$rYne}7{V=jJ(tm5K5 ztfJ9wNkx#NNTEHv6VaNcYEIV4OKv69-|7DnA}{_mCo&-xF=kopIn*NNZ^xci=u=05 znzRh+Gn9KKTkkWR0m&Eh$)wxG+=3(rHyIGWgLDnjH6R8Cq&%2igLDmufdMHGX4n5l zS6=TMBaXs9dd=`YSTbU0C%j8u61ut6PkchWLJ&vz7u!KHJYIHtk|2goHk)nT#zVtF zILrtHi--LzF86oLs$KXeyV&B| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/gui/skin_type/crown.png b/src/main/resources/assets/minelittlepony/textures/gui/skin_type/crown.png new file mode 100644 index 0000000000000000000000000000000000000000..5d644d9b2313d7c4794105d6a40f4ec4eb0daf13 GIT binary patch literal 4515 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/gui/skin_type/muffin.png b/src/main/resources/assets/minelittlepony/textures/gui/skin_type/muffin.png new file mode 100644 index 0000000000000000000000000000000000000000..302e9cc1b60e20cd2f6402ec6e54239ecffe57cd GIT binary patch literal 4540 zcmeHLeQ*=i7T-{jQpG0~)K?L<%VVVAX1|lo(x8x(HieYhb{_RPJi6Jvo9=6pjmfr6 zu_~gYXc-?Ljw12~RPcjh89v^7R(+3FK@>kmQE*1*RUV4pP(;Cx5%BCLOXuNV{JS@)a5RK9HwoY^*hmV+1w^`gPD) zkjFv48Jd1qdawV2Y`t>r_YQz9f>B>z8VFY6tdpUg91rVhmXm0=#PT>xON>Wi8Q9;k zq2D75X<29YeDLoM-RG+e_>c~~cFIxzOjN51Fb^ympR+X=zlXka?5YRRtAVNl@7{O3t*!rQ z`)W(i$7d!K{p#$hi*Oo><#Ur@adG1 ztFJxV_Cf1%$88HY9Eh*$Rrc!tz|MpZmG^$z5Ue}3`s+ERZC5&c?{)2IEUiAZzNpySfYMzdrKC$%(xaKRI^v zeeUR)Td=y%6YHNmRq+~zU37z9Q)|`+=ShkYb;_y{Le5k)ZUqc0z9toyl?G(uAr#hQ zUZVHeT?DSHUSfd|q=RuEs@KaFCs6g`iW+5cgW^$%Yi8yZrz8M~B2&gw(MT*QrM!fV zD}ijODFU}m%myz}3wh)-5(wv=yptwNQhF0h%*?}!6RIXv`R8OHVB{t0O*1Z0RC9B) zvzc=mi7>@@JRXW>DV8O{f=sr=OgTlyl9MfnG=?7~m4qHQbt8sbm~zNyG`$1?^LU?s z(ReVJg^wjOEC3%=N{&;Elcu6kYT$~bS<(a`8HavxMY5(Pj;Jb>G#V2MDrrJ7bMin4 zRmrZ8Hzp$Xaa4su5flZ}B<#uz+S0ml*%cNAVLckRR{`0BEKObOCu@*z){K3efsVlP zEbbudzO&oLU=<8XenV-r+za@6k%3-WP%1!)E|up*#F3gPcmRsm$dKxxNkMRPoZH2!s-W6Xsv^xX5>Xk#sYm57 zqT;czJz)_p&8iG|3D!yXYbqnMslfs-F;9;*rurvp^eCz}Ws6P5<)K;D#km+a&3i zKpJrtiGvul{H zAu%u{$F}v12IVL-5G)z>@ule2UBo<%#&>&i#@FGnZVTztCv@j~L=_jbLWH+F3P$|JOUZE@j@t5;3vdezse zy>6f-H*I?E`Ul55mTcI(ar45|3CA5%N|tY%@v?CNKjV1Mf^VJ@X1;l_0INIp-Rfts YzjZwM$HiOo^T7iwP*UOVm|eH@M+x-_p8x;= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/gui/skin_type/saddle_bags_both.png b/src/main/resources/assets/minelittlepony/textures/gui/skin_type/saddle_bags_both.png new file mode 100644 index 0000000000000000000000000000000000000000..0efdff552757631b77125da8f6a5abc5aada83fb GIT binary patch literal 4538 zcmeHKYj6}*7VhRDAuEaqYJ~_*v#bQ|>Gw=eS4M@IJO-GUO;Q@xLetZIJ83g7yF1B* zWnGAhXcQ4FTqV2U@+j6&p@3x(Sv6=7g?;$gXzgxQpz!^G_yR3mVNdr=CdsZJX9j6uGmn zL601y4XgGY2mkIdg2BpgFi51#q;A9zhNU}x@kpTj#TyF`-(J0qr1DQy_RI=4?P-5N zdUM{?Cl~CP_OmADz?VOILill!XH8q|?i28@nrycz{`T*}BKkpTboIfg^7PmM?#{ z{fnJ_@1HB2wXcrtzGlibzf%6uGrfo3_=iKSo1_Jj7D*tz->3;VxrjMSZ7|7B@e`_*{xpWTO>%Bs(HP6B+Yu7_51xa!_gc^fd*x@CTt~5C9K&FL-EY&npwvkK_4yF=KHrWA^gmq%T zzj!JV$-yVAEDOK~omNsb>tX14oF2NvvP+r)BzJG$I(<8#ZVknEwIWCGwIy8+zy9=dLy24cLCYMG;Kp4Bx{&&&Wd}Sp^m`z z9PTjffwQ~HpcRS8p`_a6xEBruNXNdcB~?R{-J#@XMW2Ygl%lXvN>D|C@(Yqg`Me6t z_&8SKSnm+1aKf^cgo+#}0QVSx6V-U#$7&kIYq~}W5-(B;uPankjEW+|b3TFb4S~4H zG$1RL*if$=C=H+_uO{#k;wfDc{geznkH&4l%~q1Ni(iMIE}bc zkLXmQ-d%7Am*-c810?5R1|^j-#nxd%fLv@On$m*{HAWm&+ls>`>-94n=k-d0$O=A* z8&tX(nHFTCgXz{zcf|>d42J&tz?H*U++QkqeQVZh2PsSQe^9zpfUrt5&*_?}b{Bt5F@JV%K-D^P-_KwgQ6qoSUk^M2SCF3WFBCD?4OEfKSx&p90Xb0s!YIZ^u|f^&m3c{K z{8_^23x7loikBcUI_1;+JSDJ-N=cj-QAmPB)fKN7MfKrM|1U@6g#XNm>=BD;rz{Qx zwV3{|uxAv8)KQ=&BZK-3<(|&f`z&Wb@`e0l)9pfTBjR_Iu2H&1#K4G@N3&~` zt`RXXBIVKS`oGbYKlsLo67WZ_1>OfAU&B5G?~)fq7nOyuH?Un8_Aa-z6C@K;6G1q^4o6BRyg%Wp%dfhw;@~j@MDVsTzeYNCYTd!hRuGdzUlmqW6>RqH z4BxROziWkvkGU5=($jtAXG>e~JdIO7JD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/gui/skin_type/saddle_bags_left.png b/src/main/resources/assets/minelittlepony/textures/gui/skin_type/saddle_bags_left.png new file mode 100644 index 0000000000000000000000000000000000000000..517b5085ea6e6be2fca3c535af5cc669b8e18de4 GIT binary patch literal 4564 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 H%BG(HxC0xt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/gui/skin_type/stetson.png b/src/main/resources/assets/minelittlepony/textures/gui/skin_type/stetson.png new file mode 100644 index 0000000000000000000000000000000000000000..8c9105f3fe939520d3fc5783be15ca6737ad2bf9 GIT binary patch literal 4544 zcmeHKeQ*>-7M}$}KCVEBsAohN1~>>hJDt3;hzNz2z`dE>Y?3>xu2OgW zm)Yv=*RNmy`n_Mje!H`>sREg5ss1ANYE{ZRtU0XW3?hjj@_>U`NoX=B*-%|Hr5)(F#;P6eLFN3 zly2F_cT$dqx1(BhfO-1q`Cn;kJKl z-pNhT+}s@#CSP~^g4ayu=I4se@QdahHuqhhoY>j^mKZ)Pg^#U%kFGm#_nK{$#`xk} zLivUM885%IY-XfeKOET9_QFN=>dPy>eR}Wuw$2fA9?$u-V|LTU;}3qfeSW9tIx#J0 z^{mUSe_yi7@z8>f!-@7@Wsm+mcB%gO+};b};KK8(f0$F=dXvNV`Oe*qN!cO4RT?wU;B_u|QO6MH9qefrcf z?$o6Ru!Y|y*S>PT@)HajGheT*GwXu$Bqbho%4$4>oT+HSIxwu{wp2n^!pOu!s9ukG ziQet+5xA~;iMw4vI+*aG2EAf&64flOtW_3=6^}~Xc56XNN&KolAZSx+$@kB6dJie*W#AdQxoDW}MoF~x#NWB8GwB=v-;$78sKDTm^Xrk5aK9`Exn zng|B7@G&F90`Nhl=;DFY!? zCA&V+n2gxrs0xK5C<>+q?8*$<(zk_!G+wUEHfdJS6n>l;YE=Y+%iK8 zEF-gwdjM1*W|(qJK^7E%J9WU(1kLSHJQ~Ss3J(wrN6JDdL@Ee*5R2RzE4v0j+>z8F zE9J;QuPi7PphUOIb0XqMO>}ukKE!KeNcGU9%O!A};AU0TrP@%cBF%{>qcR+)9+m46 zm59~b6Bgmp?5cp5V4ZZorYa(v8Z7V<^YmC_s(+$ZkD?k=w%BCc9-3v{f*^_!ix2?3Yah zpxHWH+gFEgrWuJ&yKlh-E06h6Z~sA8M5taWn(vQ7aABWZzT_*%v-aiTS}SNDXNM$s>^?L##_A-I`nUaBde(GsL^f?)?=8Qupw%J&?Ccgazq+spmfU$BiB_9eTn6EyjWihB$U zyK0)%92++E-MQ1{q0=$kIz4hjU9(Ao&M5(Jil`+Rk4I6>D)7KQ=_ZreZQvNc=O{8?zL_D)Puh}cIe*lGagNQq$B@q?vVw{pBmM9@WhV! c-|s(@8(#jz(F^&D1n>e2lvVn>N*6Bs7v|g!=Kufz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelp/textures/gui/skin_type/seapony.png b/src/main/resources/assets/minelp/textures/gui/skin_type/seapony.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9ec4897535860828ee153affd6694d994091f3 GIT binary patch literal 4805 zcmeHLeQ*=U6+hX07z2$-1I+-1%Ml7TobFR6-Hin{mca@UI9LReHiJ)hd-BziPL|HL zAR#fP4Q}y}ap{z#LmMcDA%w3KQVLC*P(w)Lr0tZpDU%6dJZ+qzF&?K0rJdCD-AR_^ zX=XZ}hW=$~R{QSld%u0}w{LePeXDxSs_BKZ3o#6v?yvH#gTBaW1(V=&{@-rP(ES$G z`Zd451S^0Cuyjno9F`35A;W%={wSM{Q_j`RbanQ0c0qHe=NCY|BAyiA8De`emwR2r|&Oz?rLi|fBxxjIVz5pwYU$qV7k& zD}S9gFz!GcU~j+t_bj3pOX5NQk_N-7CGZt6x1w=m_9 z(PVlF0><&-_@ePZAPXN$W>^3|sFWP17$;3dqg1X((yVL-kW4_I>5&X>jw5OvN*YZG z1yweqn7JSqLRGT<@uoz?PDfQJ6hToiO~S0qs41--m-VnH251pks(#2Ntesbac+TCRaY8HRiu?h zA}Ygj>QOn2sCX=F&tVZRl~?<{1nZOFJ&I~f*nLs$ey~{;Q(wW zRW@axY$5>7p2NZ6b9f2ONOU>?3oc-&y0-bhSzDV2F9my8@+v(E^KZ6Q=^a&r8q-hd z$B1rkB^t=^>?Fj)f7N9+`3-*6W{93cN=PX&T3pE{)+ys0yen z7h=f}qcX67G~!UYnzHCgLo-|C1S$^$kH8g_r+q`=i|vIfwmHjMx6~tR6@W03c9RSr zWCV%xNVJ$CjJoqFa;!`%oXCfoA0pqTQa)J4O5J$LJJGDeL4PuG>=TKPo$I zkaJbQ>Zf&Z1;LF*Wv{eMSwJ1#$ya7a-N`9%e0-8I@jFh}I9+36U`)p2)iqAnm>3w7 z@pyH8Zgdrn{3u2-_%7Q5KY8Cg(`fxUGAXorl@Gg&oxrfauw5^JW=gzjV-mwAEVP>A z(2G~6fO4|w4^&R>n|$vV7cM#Ho@Ih+uisZ5^zVJw2wcjWc4^J>xl7B! zckSaFcl8WTNV(_U`>XFw^HC1$z^6>!Y)@ZDao!9E)?U!w{y=e5`lMi4|7(v8d`Pq! z9i2bvK6h5_ipCe{KfF*jOALQ)<)P<`50^09^Vhe|TJg;M1KXbc$E3F(`MdX4&+91v zu@jBH#LJzBufIGLerdEHkO*emb9_phnH7SDYBPgB~e&Udi`r~%@{{FQ5b$5+&~ F{Tn0`SULaz literal 0 HcmV?d00001