From 60a6a3860944aef1e75d592e6d93870a0f3170a1 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 27 Mar 2026 04:26:10 -0300 Subject: [PATCH] feat: New TextureConfig to automatically get the skin tone variant --- .../dev/hardaway/wardrobe/WardrobePlugin.java | 4 +- .../cosmetic/ModelAttachmentCosmetic.java | 4 ++ .../cosmetic/texture/SkinTextureConfig.java | 51 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dev/hardaway/wardrobe/impl/cosmetic/texture/SkinTextureConfig.java diff --git a/src/main/java/dev/hardaway/wardrobe/WardrobePlugin.java b/src/main/java/dev/hardaway/wardrobe/WardrobePlugin.java index f5c4ed3..b430fb8 100644 --- a/src/main/java/dev/hardaway/wardrobe/WardrobePlugin.java +++ b/src/main/java/dev/hardaway/wardrobe/WardrobePlugin.java @@ -27,6 +27,7 @@ import dev.hardaway.wardrobe.impl.cosmetic.appearance.ModelAssetVariantAppearance; import dev.hardaway.wardrobe.impl.cosmetic.appearance.VariantAppearance; import dev.hardaway.wardrobe.impl.cosmetic.texture.GradientTextureConfig; +import dev.hardaway.wardrobe.impl.cosmetic.texture.SkinTextureConfig; import dev.hardaway.wardrobe.impl.cosmetic.texture.StaticTextureConfig; import dev.hardaway.wardrobe.impl.cosmetic.texture.VariantTextureConfig; import dev.hardaway.wardrobe.impl.menu.WardrobePage; @@ -87,7 +88,8 @@ protected void setup() { this.getCodecRegistry(TextureConfig.CODEC) .register(Priority.DEFAULT, "Static", StaticTextureConfig.class, StaticTextureConfig.CODEC) .register(Priority.NORMAL, "Gradient", GradientTextureConfig.class, GradientTextureConfig.CODEC) - .register(Priority.NORMAL, "Variant", VariantTextureConfig.class, VariantTextureConfig.CODEC); + .register(Priority.NORMAL, "Variant", VariantTextureConfig.class, VariantTextureConfig.CODEC) + .register(Priority.NORMAL, "Skin", SkinTextureConfig.class, SkinTextureConfig.CODEC); this.getCodecRegistry(CosmeticAsset.CODEC) .register(Priority.DEFAULT, "ModelAttachment", ModelAttachmentCosmetic.class, ModelAttachmentCosmetic.CODEC) diff --git a/src/main/java/dev/hardaway/wardrobe/impl/cosmetic/ModelAttachmentCosmetic.java b/src/main/java/dev/hardaway/wardrobe/impl/cosmetic/ModelAttachmentCosmetic.java index 0ea80cb..287c17d 100644 --- a/src/main/java/dev/hardaway/wardrobe/impl/cosmetic/ModelAttachmentCosmetic.java +++ b/src/main/java/dev/hardaway/wardrobe/impl/cosmetic/ModelAttachmentCosmetic.java @@ -26,6 +26,7 @@ import dev.hardaway.wardrobe.impl.cosmetic.appearance.VariantAppearanceEntry; import dev.hardaway.wardrobe.impl.cosmetic.builtin.HytaleCosmetic; import dev.hardaway.wardrobe.impl.cosmetic.texture.GradientTextureConfig; +import dev.hardaway.wardrobe.impl.cosmetic.texture.SkinTextureConfig; import dev.hardaway.wardrobe.impl.cosmetic.texture.VariantTextureConfig; import javax.annotation.Nullable; @@ -211,6 +212,9 @@ public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, Pl if (appearance.getTextureConfig(option).getTexture(variant) == null) { variant = appearance.getTextureConfig(option).collectVariants()[0]; } + if (appearance.getTextureConfig(option) instanceof SkinTextureConfig) { + variant = context.getPlayerModel().getGradientId(); + } TextureConfig textureConfig = appearance.getTextureConfig(option); context.addAttachment(slot.getId(), new ModelAttachment( diff --git a/src/main/java/dev/hardaway/wardrobe/impl/cosmetic/texture/SkinTextureConfig.java b/src/main/java/dev/hardaway/wardrobe/impl/cosmetic/texture/SkinTextureConfig.java new file mode 100644 index 0000000..19140f3 --- /dev/null +++ b/src/main/java/dev/hardaway/wardrobe/impl/cosmetic/texture/SkinTextureConfig.java @@ -0,0 +1,51 @@ +package dev.hardaway.wardrobe.impl.cosmetic.texture; + +import com.hypixel.hytale.codec.Codec; +import com.hypixel.hytale.codec.KeyedCodec; +import com.hypixel.hytale.codec.builder.BuilderCodec; +import com.hypixel.hytale.codec.schema.metadata.ui.UIPropertyTitle; +import com.hypixel.hytale.server.core.asset.common.CommonAssetValidator; +import dev.hardaway.wardrobe.api.cosmetic.appearance.TextureConfig; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class SkinTextureConfig implements TextureConfig { + + public static final BuilderCodec CODEC = BuilderCodec.builder(SkinTextureConfig.class, SkinTextureConfig::new) + .append(new KeyedCodec<>("GrayscaleTexture", Codec.STRING, true), + (t, value) -> t.grayscaleTexture = value, + t -> t.grayscaleTexture + ) + .addValidator(CommonAssetValidator.TEXTURE_CHARACTER_ATTACHMENT) + .metadata(new UIPropertyTitle("Grayscale Texture")).documentation("The Grayscale Texture to use. The Texture will be colored according to the Skin Tone.") + .add() + + .build(); + + private String grayscaleTexture; + + private SkinTextureConfig() { + } + + public SkinTextureConfig(String grayscaleTexture) { + this.grayscaleTexture = grayscaleTexture; + } + + @Nonnull + @Override + public String getTexture(@Nullable String variantId) { + return grayscaleTexture; + } + + @Nonnull + @Override + public String getGradientSet() { + return "Skin"; + } + + @Override + public String[] collectVariants() { + return new String[0]; + } +}